> Startup ) 6809 Tube Emulator written in BASIC ) v0.10 Initial program based on 65Em (& v0.11 Added *FLEX, *MOUNT, FNfdc 2* v0.12 Uses big-endian file addresses <: F) pr::Close_All:" at line ";: P@A$=OS_GetEnv:ver$="0.12":debug%=0:Init:A%=_DEBUG(debug%) Z A$="-":A$="" dquiet%=A$<>"" n= A$="":"6809 Emulator v"ver$" (C)2014-2015 J.G.Harston" xU A$="":"Memory start: &"h0(mem%,8)" MemSz: &"h0(mz%,6)" MemMsk: &"h0(mm%,6) W A$="":"Program space: &"h0(mbot%,6)"-&"h0(mtop%,6)" ";(mtop%-mbot%);" bytes"'  Error:A$="" 6 A$<>"":A$,1)="*":cmd(A$,2),0) A%=_RUN(A$)  run%:Go  quiet%:A%=_QUIT("") ! "6809> "A$:cmd(A$,0):0  : Init 6d$=".":s$="/":os%40:d$="/":s$=".":os%>31:d$="\" Hrunpath$=run$: runpath$,1)="""":runpath$=runpath$,2, runpath$-2) 1 runpath$=runpath$): d$+":",runpath$,1)) Ros%>31:mx%=@vdu%!208:my%=@vdu%!212:mw%=@vdu%!216:mh%=@vdu%!220:mc%=@vdu%?73+1 3mz%=memsize:mm%=mz%-1:mtop%=mz%:mbot%=0:run%= R ctrl% 31,name% 255,zp% 7,mem% mz%:trace0%=0:trace1%=&FFFF:X%=ctrl%:Y%=X%256 P d_path$(3):d_drv%=-1:d_chn%=0:prog%=&F800:err%=&FF00:escflg%=&FF80:osw0%= "Dra%=0:rb%=0:rx%=0:ry%=0:rp%=0:rdp%=0:rs%=0:ru%=0:rpc%=0:errpc%=0 , Initial state: 6M os%>31:"Load """+f_name(runpath$+"Client09.bin")+""" "+~(mem%+&F800) @J os%<32:"Load """+f_name(runpath$+"Client09*")+""" "+~(mem%+&F800) JEscInit: T: ^>ݤmemsize:A%=2^((--1024)/2): A%<&10000:=A% =&10000 h: r*Error:X%=ctrl%:Y%=X%256:errpc%=rpc% | -1:run%= K run%:pr::Close_All:" at line "+Þ,<128 <>17): -1:RegDump I =25:run%: os%>31:run%=: 23,22,mx%;my%;mw%,mh%,mc%,128:run%=: > =17:mem%?escflg%=255:rp%=rp%(osw0%1):osw0%:osw0%=:  IF run%:mem%!err%=ERR:mem%?(err%+4)=&3F:mem%?(err%+5)=ERR:A%=ERR<128 AND ERR<>17:$(mem%+err%+6)=LEFT$("PDPEm: ",A%)+REPORT$+LEFT$(" at line "+STR$ERL,A%AND(ERL>0))+CHR$0:rp%=rp%OR2:rx%=err%+5:rpc%=err%+4:IFERR=17:mem%?escflg%=&FF  run%:mem%!err%=:mem%?(err%+4)=&3F:mem%?(err%+5)=:A%=<128 <>17:$(mem%+err%+6)="PDPEm at $"+h0(rpc%,4)+": ",A%)+$+" at line "+Þ,A%(>0))+0:rp%=rp%2:rx%=err%+5:rpc%=err%+4:=17:mem%?escflg%=&FF  pr:>&FFFFF:: : Ccmd(A$,link%): A$<>"": A$,1)=" ": A$=A$,2): A$,1)<>" "  A$=""A$,1)="|":  A$,1)="*": A$,2):  A$,1)=".": "."+A$,2): ! A$,1)="/":A$="RUN "+A$,2) 7 uc(A$,2))="FX": A$,3) (A$,3,1)="0"):A$: 2A%=A$+" "," "):C$=uc(A$,A%-1)):A$=A$,A%+1) hA%=" BASIC CORE DEBUG FLEX GO HELP LOAD MDUMP MDIS MEDIT MOUNT QUIT RUN RESET JMP REG "," "+C$+" ") & A%:A%=("FN_"+C$+"(A$)"): 0A%=_run(C$+" "+A$,): :: D<ݤ_HELP(A$):'"6809 Emulator ";ver$: uc(A$)<>"6809":=0 Nr" BASIC"'" CORE "'" DEBUG [ [ ]]"'" FLEX ()"'" GO ()"'" HELP" Xk" LOAD "'" MDUMP "'" MDIS "'" MOUNT "'" QUIT"'" RUN " b=0 l: v3ݤ_BASIC(A$):A%=_basic(A$):rp%=1:rpc%=A%:=_go %ݤ_basic(A$): A$="":A$="EXBAS09" Oin%=(f_name(A$)): in%:#in%:in%=0:A%=_LOAD(A$) A%=_LOAD(A$+s$+"bin") =A% : ݤ_MOUNT(A$) K A$="": A%=0 3:;A%;" ";d_path$(A%);":"+(A%),d_path$(A%)="")::=0 . A$="*": drv%=0 3:fdc_info(drv%)::=0 4 A$,2,1)<>" " A$,1)<"0" A$,3)>"3":A$:=0 (A%=A$,1):d_path$(A%)=s(A$,3)):=0 : ݤ_FLEX(A$) M A$="": d_path$(0)="": os%=6 :A$="0":d_path$(0)="^.Flex09.Flex301/vdk" P A$="": d_path$(0)="": os%>31:A$="0":d_path$(0)="..\BBCFlex\BBCFLEX6.dsd"  A$="":A$="0"  A$>1:d_path$(0)=A$:A$="0" 3 A$<>1 (A$<0 A$>3): 205,"Bad drive":=0  Odrv%=A$: d_path$(drv%)="": 214,"Only disk images currently supported":=0 *Nfdc_info(drv%) : Refresh disk info and display it 4@A%=fdc_disk(&53,mem%+&C100,drv%,0,0,0,2): Load boot loader >d_exec%=mem%!&C20A &FFFF Hrpc%=d_exec%:Go:=0 R: \ݤ_RESET(A$) f;:'$(mem%+&F817)''"Econet Station 128"':A%=_basic(A$) p(B%=mem%+A%+9:?B%:B%=B%+1:?B%=0:' zrp%=0:rpc%=A%:A$="":=_go : &ݤ_MDIS(A$): N%,P%,C%: PROCEscOn :P%=("&"+uc(A$))::C%=14:h0(P%,4);" ";:A$=dis(P%) - A%=0 N%-1:h0(mem%?(P%+A%),2);" ";: ?(17-3*N%);: A%=0 N%-1:c(mem%?(P%+A%));::(7-N%);A$ #P%=P%+N%:C%=C%-1:C%=0:=27:=0 : 'ݤ_MDUMP(A$): N%,P%,C%: PROCEscOn 4P%=("&"+uc(A$)):N%=16::C%=16:h0(P%,4);" "; - A%=0 N%-1:h0(mem%?(P%+A%),2);" ";: ( A%=0 N%-1:c(mem%?(P%+A%));:: #P%=P%+N%:C%=C%-1:C%=0:=27:=0 : ݤ_MEDIT(A$):=0 : !ݤ_QUIT(A$): A$:halt%=:=0 $1d_chn%=d_chn%:d_chn%:A%=d_chn%:d_chn%=0:#A% .=Close_All: IF os%>31:PRINT"Press SPACE to exit";:A%=GET 8"QUIT":=0 B: Lݤ_RUN(A$):=_run(A$,) V6ݤ_run(A$,osc%):ȕ A$,1)=" ":A$=A$):: A$="":=0 `] osc%=0 - called from *RUN, */, must attempt to load file; osc%=TRUE - called from *name jN A$,1)="""":A%=A$,"""",2):F$=A$,2,A%-2) A%=A$+" "," "):F$=A$,A%-1) t0C$=A$:A$=A$,A%+1):ȕ A$,1)=" ":A$=A$,2): ~= Can't use FNf_info() as name% past bottom 64K of memory X <&FFFFF:ș"XOS_File",5,F$ ,,A% A%=-1:in%=(f_name(F$)):in%:#in%:in%=0:A%=0  A%=-1 j <&FFFFF:ș"XOS_File",5,F$+s$+"bin" ,,A% A%=-1:in%=(f_name(F$+s$+"bin")):in%:#in%:in%=0:A%=0  A%<>-1:F$=F$+s$+"bin"  & A%=load or 0=dos or -1=not found : \A%=_addr(A%):A%=-1: "/",osc%)+C$:=0: If not found or I/O, pass to OSCLI and return Yrp%=1:rpc%=_load(A%):=_go : Check file header and load file : ݤ_LOAD(A$):A%=A$," ") N A%=0:F$=f_name(A$) F$=f_name(A$,A%-1)):A%=("&"+uc(s(A$,A%+1)))) = Can't use FNf_info() as name% past bottom 64K of memory  -A%=0: <&FFFFF:ș"XOS_File",5,F$ ,,A% CA%=0: >&FFFFF:A%=-1:in%=(f_name(F$)):in%:#in%:in%=0:A%=0 & A%=load or 0=dos or -1=not found (U=_load(_addr(A%)) : Check file header and load file 2: <ݤ_load(A%) FV A%=0:in%=(f_name(F$)):gbpb(4,in%,name%,80,0):#in%:in%=0:A%=_header(name%,) P2A%=A%mm%:"Load "+f_name(F$)+" "+~(mem%+A%) Z=A% d: nݤ_addr(A%) x>(A%&FFFFFF00)=&FFFBBC00:=&8000 : ROM image P(A%&FFFFFF00)=&FFFFFD00:=&0 : Data file, check for header R(A%&FFF00000)=&FFF00000:=-1 : Attempt to load to I/O memory =A% : ݤ_header(M%,F%) A%=M%?7:M%!A%=&29432800 UA%=A%+1:M%?A%=0:A%=M%!(A%+1): Note, this is little-endian as it is Host header 3 F%: (M%?6 64)=0 : 249,"Not a language":=0 2 F%: (M%?6 15)<>3: 249,"Not 6809 code":=0 ! (M%?6 32)=0 :=&8000 =A%   F%=0: 252,"Bad address" =0 :  ݤ_GO(A$) ]A%=&FF90:A$<>"":"[(",A$,1)):A%=("&"+uc(A$,2))) A$<>"":rpc%=("&"+uc(A$)):A%=-1 "(A%<>-1:rpc%=256*mem%?A%+mem%?(A%+1) ,,rp%=1:A%=A$,";"):A%:A$=A$,A%+1)A$="" 6 ݤ_go @ _header(mem%+rpc%,) J!A%=rpc%+8:A%=A%+1:mem%?A%=0 TRmem%?&FF82=A%256:mem%?&FF83=A% : Point to version string ^Kra%=1 : Enter with A=1 h r[B%=256*mem%?&FFBA+mem%?&FFBB:A%=B%-2:A%=256*mem%?A%+mem%?(A%+1) : A%=>CLI_WAIT |N:A%=A%+1: mem%?A%=&34 (mem%!A% &FFFFFF)=&8CFFBE : A%=>EXECUTE _mem%!&FF8C=0:mem%?&FF8C=rpc%256:mem%?&FF8D=rpc%:rpc%=A% : Set address and PC PB%=B%+1:mem%!B%=&39303836:B%=B%+7:B%=256*mem%?B%+mem%?(B%+1) : B%=>CLIBUF U mem%?&FF90=rpc%DIV256:mem%?&FF91=rpc% :REM Set current program X IF rpc%>&7FFF:mem%?&FF8A=rpc%DIV256:mem%?&FF8B=rpc% :REM Set top of user memory f link%=0:rs%=rpc%-2:rs%>prog%:rs%=prog% : Put stack at entry point or top of RAM c link%=0:rs%=rs%-2:mem%?rs%=&FF:mem%?(rs%+1)=&A7 : Initialise registers to enter code [$(mem%+B%)=A$,63):mem%?&FF86=B%256:mem%?&FF87=B% : Store command string and pointer erx%=B%:Go:=0 : Point X=>command line, start execution : ݤ_CORE(A$): Dump core 8A$=f_name(s(A$,A$+" "," ")-1))):A$="":A$="core" $"Save "+A$+" "+~mem%+"+"+~mz% SetType(A$,&FFD) =0 : Yݤ_DEBUG(A$):A$="":"1=Register Dump"'"3=Single Step"'"4=Don't emulate MOS calls":=0 &7debug%=0:trace0%=0:trace1%=&FFFF: uc(A$)="OFF":=0 0,debug%=(A$):(debug%1): <9: : >8 :?A%=A$," "): A%:trace0%=("&"+uc(A$,A%+1))):A$=A$,A%+1) D2A%=A$," "): A%:trace1%=("&"+uc(A$,A%+1))) N=0 X: b/ݤ_JMP(A$):A%=("&"+uc(A$)):rpc%=A%:Go:=0 l#ݤ_REG(A$):A%=A$,"="):A%=0:=0 v*R%=A$,A%-1):A%=("&"+uc(A$,A%+1))) R%=0:ra%=A% R%=1:rb%=A% R%=2:rx%=A% R%=3:ry%=A% R%=4:ru%=A% R%=5:rs%=A% R%=6:rdp%=A% R%=7:rp%=A% RegDump:=0 : SetType(A$,A%): os%>8: "SetType "+A$+" "+~A%  :  RegDump \"A=&"h0(ra%,2)" X=&"h0(rx%,4)" U=&"h0(ru%,4)" DP=&"h0(rdp%256,2)" PC=&"h0(rpc%,4)  J"B=&"h0(rb%,2)" Y=&"h0(ry%,4)" S=&"h0(rs%,4)" CC=&"h0(rp%,2);" "; *J A%=7 0 -1:"-CVZNIHFE",(((rp%(2^A%))<>0)(A%+1))+1,1);::" " 4 " X=&";:DumpLine(rx%): > " Y=&";:DumpLine(ry%): H " U=&";:DumpLine(ru%): R " S=&";:DumpLine(rs%): \ "PC=&";:DumpLine(rpc%) fdis(rpc%);(56-) p z: "DumpLine(m%): h0(m%,4)" "; ' B%=m% m%+7: c(mem%?B%);::32 3 B%=m% m%+7: h0(mem%?(B%mm%)&FF,2)" ";:  : Sݤdis(A%): X%,Y%:X%=ctrl%:Y%=X%256:N%=Dis_Code(68,A%,mem%+(A%mm%)):=$(X%+4) : 3ݤc(A%):A%=A%255: A%<32 A%>126:="." = A% 1ݤstr0(A%):A$="": ?A%>31:A$=A$+?A%:A%=A%+1 ?A%<32 A$>254:=A$ : "EscInit:esch%=esch%:esch%:  os%>31 C P% 36, L% -1:[OPT 8:.escyes:mov byte [edi-1],0:mov eax,-1:ret 8.esch%:mov ecx,256:mov edi,[@vdu%-148]:mov al,27:cld >repnz scasb:jz escyes:xor eax,eax:ret:.escb%:dw 0:dw 0:]: $ .= esch% 31: P=0 1:P%=esch%:[OPT P*2:MOV R11,R11,LSL #1 8SLDR R12,escb%:STRB R11,[R12]:MOV PC,R14:.escb%:EQUD mem%+escflg%:]::escho%=0: B$EscOff:escho%=escho%:escho%: LKos%<32:ș "OS_ChangeEnvironment",9,esch%,0,0 ,escho%,escRo%,escbo%: V:"ESC OFF":escho%=: esch%:mem%?escflg%=&FF: ` j%EscOn:escho%=escho%:escho%=0: tGos%<32:ș "OS_ChangeEnvironment",9,escho%,escRo%,escbo%:escho%=0: ~ :escho%=0:"ESC ON": : Close_All "in%=in%:in%:A%=in%:in%=0:#A% 'out%=out%:out%:A%=out%:out%=0:#A%  : fdc_info(drv%) NA%=fdc_disk(&53,mem%+&C100,drv%,0,0,0,0): A%:"No disk in drive ";drv%: 2"System Information Record for ";d_title$;":" ]"Disk shape:";d(d_trk%+1,5);" tracks ";d(d_sec%,3);" sectors ";d_sid%;" sides" \"Disk used: ";d(d_used%,5);" sectors ";d(d_used%*256,8);" bytes ";d(d_used%/4,5);"K" \"Disk free: ";d(d_free%,5);" sectors ";d(d_free%*256,8);" bytes ";d(d_free%/4,5);"K" \"Disk size: ";d(d_size%,5);" sectors ";d(d_size%*256,8);" bytes ";d(d_size%/4,5);"K"  : 9ݤfdc_disk(cmd%,add%,drv%,trk%,sid%,sec%,num%): ptr% (# drv%>3:drv%=(drv%2)+(drv%1) 2;(debug%8):"cmd:";h0(cmd%,2);" add:";~add%-mem%;" "; d_drv%: d_chn%:#d_chn%:d_chn%=0 : Different drive, close current drive P d_chn%=0 Ze d_path$(drv%)="":=&1E : If no mount path, return Drive not present dXd_chn%=d_path$(drv%): d_chn%=0:=&1E : No drive, return Drive not present n x\ drv%<>d_drv%:d_drv%=-1: fdc_exam(drv%):=&1E : No info, return Drive not present Sd_drv%=drv%: num%=0:=0 : Just refresh disk info  d_chn%=0:=&1E sec%=sec%-d_sec0% > d_sid%=1:ptr%=((sid%*80+trk%)*d_num%+sec%)*d_bps%+d_off% > d_sid%=2:ptr%=((trk%*2 +sid%)*d_num%+sec%)*d_bps%+d_off% E IF(debug%AND8):PRINT"cmd:";FNh0(cmd%,2);" add:";~add%-mem%;" "; ^ IF(debug%AND8):PRINT"drv:";drv%;" trk:";trk%;" sid:";sid%;" sec:";sec%;" num:";num%;" "; $(debug%8):"ptr:&";h0(ptr%,6)  cmd%=&4B:cmd%=1  cmd%=&53:cmd%=3  cmd%=&57:cmd%=3 C cmd%=&5B: A%=0 d_num%+2:add%!(A%*4)=(A%d_num%)*65536::=0 ' IF(debug%AND8):PRINTd_path$(drv%) i IF(debug%AND8):PRINT"cmd:";cmd%;" chn:";d_chn%;" add:";~add%-mem%;" num:";num%*d_bps%;" ptr:";~ptr% 5 cmd%<5:gbpb(cmd%,d_chn%,add%,num%*d_bps%,ptr%) =0 ": ,ݤfdc_exam(drv%) 6 16-26 Volume name in ASCII @# 27-28 Volume number in binary J7 29-30 Address of first data sector (Track-Sector) T6 31-32 Address of last data sector (Track-Sector) ^2 33-34 Total number of data sectors in binary h3 35-37 Current date (Month-Day-Year) in binary r2 38 Highest track number on disk in binary |6 39 Highest sector number on a track in binary #d_chn%=0 # #d_chn%+256*#d_chn%=&6B64 d_off%=#d_chn%+256*#d_chn% #d_chn%=8 d_trk%=#d_chn% d_sid%=#d_chn% 2d_sec%=(#d_chn%-d_off%) (d_trk%*d_sid%*256)  d_off%=0 d_trk%=#d_chn% 2560 d_sid%=1 d_sec%=10  &d_num%=d_sec%:d_bps%=256:d_sec0%=0 #d_chn%=&221 !d_free%=256*#d_chn%+#d_chn% &#d_chn%=&226 0d_trk% =#d_chn% :d_sec% =#d_chn% D# d_sec%>19:d_sid%=2 d_sid%=1 Nd_num% =d_sec% d_sid% Xd_size%=(d_trk%+1)*d_sec% bd_used%=d_size%-d_free% l#d_chn%=&210:d_title$="" v,:A%=#d_chn%: A%:d_title$=d_title$+A% A%=0 d_title$=12 =0 > 6809 < 16-Feb-2015 CMPY #nnnn fixed, probably also CMPD #nnnn : ((Go:abort%=:halt%=0:run%=:EscOff 2a:(debug%1): rpc%>=trace0% rpc%<=trace1%:x%=:y%=:30:RegDump:31,x%,y%:(debug%2): rpc%=(rpc%+256*mem%?(rpc%-2)+mem%?(rpc%-1)-65536)&FFFF:=0 : &: 0G Address modes. Sets A% pointing to the data for the opcode to use :G ----------------------------------------------------------------- D ݤm10 N ݤm20 X ݤm30 b ݤm40 l ݤm50 v=0 :  ݤm80  ݤmC0 DA%=rpc%:rpc%=rpc%+1:=0 : #imm : ݤm0  ݤm90  ݤmD0 CA%=rdp%+mem%?rpc%:rpc%=rpc%+1:=0 : ext  :  ݤm60  ݤmA0 * ݤmE0 4?A%=mem%?rpc%:rpc%=rpc%+1:M%=A%31:N%=A%96 : idx >N%=0 :R%=rx% HN%=32:R%=ry% RN%=64:R%=ru% \N%=96:R%=rs% f: p B%=base opcode z M%=mode  N%=register number*32  R%=register contents : FA%<128:M%<16:A%=(R%+M%)&FFFF:=0 : n,R n +ve FA%<128:M%>15:A%=(R%+M%-32)&FFFF:=0 : n,R n -ve  M%=0 A%=R%:M%=1 " IF(B%AND&BF)=&A3:M%=2 " IF(B%AND&BC)=&AC:M%=2 >N%=0 :rx%=(rx%+M%)&FFFF:=0 : ,X+ >N%=32:ry%=(ry%+M%)&FFFF:=0 : ,Y+ >N%=64:ru%=(ru%+M%)&FFFF:=0 : ,U+ >N%=96:rs%=(rs%+M%)&FFFF:=0 : ,S+   M%=1  A%=R% $?N%=0 :rx%=(rx%+2)&FFFF:=0 : ,X++ .?N%=32:ry%=(ry%+2)&FFFF:=0 : ,Y++ 8?N%=64:ru%=(ru%+2)&FFFF:=0 : ,U++ B?N%=96:rs%=(rs%+2)&FFFF:=0 : ,S++ L V M%=2 `M%=1 j IF(B%AND&BF)=&A3:M%=2 t IF(B%AND&BC)=&AC:M%=2 ~>N%=0 :rx%=(rx%-M%)&FFFF:A%=rx%:=0 : ,-X >N%=32:ry%=(ry%-M%)&FFFF:A%=ry%:=0 : ,-Y >N%=64:ru%=(ru%-M%)&FFFF:A%=ru%:=0 : ,-U >N%=96:rs%=(rs%-M%)&FFFF:A%=rs%:=0 : ,-S   M%=3 ?N%=0 :rx%=(rx%-2)&FFFF:A%=rx%:=0 : ,--X ?N%=32:ry%=(ry%-2)&FFFF:A%=ry%:=0 : ,--Y ?N%=64:ru%=(ru%-2)&FFFF:A%=ru%:=0 : ,--U ?N%=96:rs%=(rs%-2)&FFFF:A%=rs%:=0 : ,--S  AM%=4:A%=R%:=0 : ,R [M%=5:A%=(rb%+R%)&FFFF:=0 : B,R :REM rb% should be signed [M%=6:A%=(ra%+R%)&FFFF:=0 : A,R :REM ra% should be signed  >M%=7:A%=rpc%:=0 : :  M%=mode ( N%=register number 2 R%=register contents <: F M%=8 PN%=mem%?rpc%:rpc%=rpc%+1 ZGN%<128:A%=(R%+N%)&FFFF:=0 : n8,R n8 +ve dGN%>127:A%=(R%+N%-256)&FFFF:=0 : n8,R n8 -ve n x M%=9 .N%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2 IN%<32768:A%=(R%+N%)&FFFF:=0 : n16,R n16 +ve IN%>32767:A%=(R%+N%-65536)&FFFF:=0 : n16,R n16 -ve  >M%=10:A%=rpc%:=0 : @M%=11:A%=(ra%*256+rb%+R%)&FFFF:=0 : D,R  M%=12 N%=mem%?rpc%:rpc%=rpc%+1 HN%<128:A%=(rpc%+N%)&FFFF:=0 : n8,PC n8 +ve HN%>127:A%=(rpc%+N%-256)&FFFF:=0 : n8,PC n8 -ve   M%=13 .N%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2 JN%<32768:A%=(rpc%+N%)&FFFF:=0 : n16,PC n16 +ve JN%>32767:A%=(rpc%+N%-65536)&FFFF:=0 : n16,PC n16 -ve  ">M%=14:A%=rpc%:=0 : ,>M%=15:A%=rpc%:=0 : 6>M%=16:A%=rpc%:=0 : @)M%=17:"[M17:";~rpc%;"]";:A%=rpc%:=0 J)M%=18:"[M18:";~rpc%;"]";:A%=rpc%:=0 T)M%=19:"[M19:";~rpc%;"]";:A%=rpc%:=0 ^CM%=20:A%=256*mem%?R%+mem%?(R%+1):=0 : [,R] h5 IFM%=21:PRINT"[M21:";~rpc%;"]";:A%=rpc%:=0 r M%=21 |@rb%<128:A%=(rx%+rb%)&FFFF : [B,X] #rb%>127:A%=(rx%+rb%-256)&FFFF !A%=256*mem%?A%+mem%?(A%+1):=0  )M%=22:"[M22:";~rpc%;"]";:A%=rpc%:=0 )M%=23:"[M23:";~rpc%;"]";:A%=rpc%:=0 )M%=24:"[M24:";~rpc%;"]";:A%=rpc%:=0 )M%=25:"[M25:";~rpc%;"]";:A%=rpc%:=0 )M%=26:"[M26:";~rpc%;"]";:A%=rpc%:=0 )M%=27:"[M27:";~rpc%;"]";:A%=rpc%:=0 )M%=28:"[M28:";~rpc%;"]";:A%=rpc%:=0 )M%=29:"[M29:";~rpc%;"]";:A%=rpc%:=0 )M%=30:"[M30:";~rpc%;"]";:A%=rpc%:=0  bM%=31:N%=0:A%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2:A%=256*mem%?A%+mem%?(A%+1):=0 : [n16] M%=31:A%=rpc%:=0  &# Indexed (idx) addressing mode 0# ----------------------------- :P Specified by a post-byte, after the opcode and before any additional data. D NF postbyte data assembler postbyte data assembler X( 0rrnnnnn n,R | b2 1rr00000 ,R+ | 1??10000 lC 1rr00001 ,R++ | 1rr10001 [,R++] v2 1rr00010 ,-R | 1??10010 C 1rr00011 ,--R | 1rr10011 [,--R] A 1rr00100 ,R | 1rr10100 [,R] B 1rr00101 B,R | 1rr10101 [B,R] B 1rr00110 A,R | 1rr10110 [A,R] 2 1??00111 | 1??10111 B 1rr01000 nn n,R | 1rr11000 nn [n,R] D 1rr01001 hh ll n16,R | 1rr11001 hh ll [n16,R] 2 1??01010 | 1??11010 B 1rr01011 D,R | 1rr11011 [D,R] D 1xx01100 nn n,PCR | 1xx11100 nn [n,PCR] F 1xx01101 hh ll n16,PCR | 1xx11101 hh ll [n16,PCR] 2 1??01110 | 1??11110 B 1??01111 | 10011111 hh ll [n16] 2 | 10111111  2 | 11011111 2 | 11111111   *" rr=00,01,10,11 for R=X,Y,U,S 4 >=0 H: RYݤimm16a:A%=256*mem%?A%+mem%?rpc%:rpc%=rpc%+1:=A% : #imm16 after #imm8 \Mݤimm16b:A%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2:=A% : #imm16 f: p opcode execution z ---------------- Jݤ_12:=0 : NOP :  13:REM SYNC  ݤ_14:=0  ݤ_15:=0 Zݤ_16:=br16(1) : LBRA rel Tݤ_17:rs%=rs%-2:mem%?rs%=(rpc%+2)256:mem%?(rs%+1)=(rpc%+2):=br16(1): LBSR rel  ݤ_18:=0  19:REM DAA : Nݤ_1A:N%=mC0:rp%=rp%(mem%?A%):=0 : ORRCC #nn  ݤ_1B:=0 Mݤ_1C:N%=mC0:rp%=rp%(mem%?A%):=0 : ANDCC #nn Fݤ_1D:rb%<128:ra%=0 ra%=255 : SEX %A%=rp%2:flg8(ra%):rp%=rp%A%:=0 : $Pݤ_1E:N%=mem%?rpc%:rpc%=rpc%+1 : EXG r0,r1 . (N%&F0)=&00:A%=256*ra%+rb% 8(N%&F0)=&10:A%=rx% B(N%&F0)=&20:A%=ry% L(N%&F0)=&30:A%=ru% V(N%&F0)=&40:A%=rs% `(N%&F0)=&50:A%=rpc% j(N%&F0)=&60:A%=0 t(N%&F0)=&70:A%=0 ~(N%&F0)=&80:A%=ra% (N%&F0)=&90:A%=rb% (N%&F0)=&A0:A%=rp% (N%&F0)=&B0:A%=rdp%256 (N%&F0)=&C0:A%=0 (N%&F0)=&D0:A%=0 (N%&F0)=&E0:A%=0 (N%&F0)=&F0:A%=0 4(N%&F)=&0:M%=256*ra%+rb%:ra%=A%256:rb%=A%255 (N%&F)=&1:M%=rx%:rx%=A% (N%&F)=&2:M%=ry%:ry%=A% (N%&F)=&3:M%=ru%:ru%=A% (N%&F)=&4:M%=rs%:rs%=A% (N%&F)=&5:M%=rpc%:rpc%=A% (N%&F)=&6:M%=0:A%=0 (N%&F)=&7:M%=0:A%=0 (N%&F)=&8:M%=ra%:ra%=A% ((N%&F)=&9:M%=rb%:rb%=A% 2(N%&F)=&A:M%=rp%:rp%=A% <'(N%&F)=&B:M%=rdp%256:rdp%=256*A% F(N%&F)=&C:M%=0:A%=0 P(N%&F)=&D:M%=0:A%=0 Z(N%&F)=&E:M%=0:A%=0 d(N%&F)=&F:M%=0:A%=0 n'(N%&F0)=&00:ra%=M%256:rb%=M%255 x(N%&F0)=&10:rx%=M% (N%&F0)=&20:ry%=M% (N%&F0)=&30:ru%=M% (N%&F0)=&40:rs%=M% (N%&F0)=&50:rpc%=M% (N%&F0)=&60:A%=0 (N%&F0)=&70:A%=0 (N%&F0)=&80:ra%=M% (N%&F0)=&90:rb%=M% (N%&F0)=&A0:rp%=M% (N%&F0)=&B0:rdp%=M%*256 (N%&F0)=&C0:A%=0 (N%&F0)=&D0:A%=0 (N%&F0)=&E0:A%=0 (N%&F0)=&F0:A%=0 =0 Pݤ_1F:N%=mem%?rpc%:rpc%=rpc%+1 : TFR r0,r1 " (N%&F0)=&00:A%=256*ra%+rb% ,(N%&F0)=&10:A%=rx% 6(N%&F0)=&20:A%=ry% @(N%&F0)=&30:A%=ru% J(N%&F0)=&40:A%=rs% T(N%&F0)=&50:A%=rpc% ^(N%&F0)=&60:A%=0 h(N%&F0)=&70:A%=0 r(N%&F0)=&80:A%=ra% |(N%&F0)=&90:A%=rb% (N%&F0)=&A0:A%=rp% (N%&F0)=&B0:A%=rdp%256 (N%&F0)=&C0:A%=0 (N%&F0)=&D0:A%=0 (N%&F0)=&E0:A%=0 (N%&F0)=&F0:A%=0 -(N%&F)=&0:ra%=(A%&FF00)256:rb%=A%255 (N%&F)=&1:rx%=A% (N%&F)=&2:ry%=A% (N%&F)=&3:ru%=A% (N%&F)=&4:rs%=A% (N%&F)=&5:rpc%=A% (N%&F)=&6:A%=0 (N%&F)=&7:A%=0 (N%&F)=&8:ra%=A% (N%&F)=&9:rb%=A% &(N%&F)=&A:rp%=A% 0(N%&F)=&B:rdp%=256*A% :(N%&F)=&C:A%=0 D(N%&F)=&D:A%=0 N(N%&F)=&E:A%=0 X(N%&F)=&F:A%=0 b=0 l: vLݤ_20:=br8(1) : BRA Lݤ_21:=br8(0) : BRN Oݤ_22:=br8(((rp%1)((rp%4)4))1) : BHI (C OR Z)=0 Qݤ_23:=br8((rp%1)((rp%4)4)) : BLS (C OR Z)=1 Hݤ_24:=br8((rp%1)1) : BCC Nݤ_25:=br8(rp%1) : BCS/BLO Hݤ_26:=br8((rp%4)4) : BNE Jݤ_27:=br8(rp%4) : BEQ Hݤ_28:=br8((rp%2)2) : BVC Jݤ_29:=br8(rp%2) : BVS Hݤ_2A:=br8((rp%8)8) : BPL Jݤ_2B:=br8(rp%8) : BMI Qݤ_2C:"{";~rpc%-1;"}";:=br8(((((rp%8)2)(rp%2))2)) : BGE (N EOR V)=0 Sݤ_2D:"[";~rpc%-1;"]";:=br8(((rp%8)2)(rp%2)) : BLT (N EOR V)=1 bݤ_2E:(rp%4)=0:=br8(1) : BGT Z AND (N EOR V)=0 "@"; X=br8((((rp%4)2)(((rp%8)2)(rp%2)))2) : BGT Z AND (N EOR V)=0 bݤ_2F:(rp%4)=0:=br8(0) : BLE Z AND (N EOR V)=1 * "#"; 4Z=br8((((rp%4)2)(((rp%8)2)(rp%2)))) : BLE Z AND (N EOR V)=1 >: HIݤ_30:N%=mE0:rx%=A%:rp%=(rp%&FB)((rx%=0)4):=0 : LEAX idx RIݤ_31:N%=mE0:ry%=A%:rp%=(rp%&FB)((ry%=0)4):=0 : LEAY idx \Nݤ_32:N%=mE0:rs%=A%:=0 : LEAS idx fNݤ_33:N%=mE0:ru%=A%:=0 : LEAU idx p: zKݤ_34:A%=mem%?rpc%:rpc%=rpc%+1 : PSHS ;(A%128):rs%=rs%-2:mem%?rs%=rpc%256:mem%?(rs%+1)=rpc% 8(A%64):rs%=rs%-2:mem%?rs%=ru%256:mem%?(rs%+1)=ru% 8(A%32):rs%=rs%-2:mem%?rs%=ry%256:mem%?(rs%+1)=ry% 8(A%16):rs%=rs%-2:mem%?rs%=rx%256:mem%?(rs%+1)=rx% '(A%8):rs%=rs%-1:mem%?rs%=rdp%256 "(A%4):rs%=rs%-1:mem%?rs%=rb% "(A%2):rs%=rs%-1:mem%?rs%=ra% "(A%1):rs%=rs%-1:mem%?rs%=rp% =0 Kݤ_35:A%=mem%?rpc%:rpc%=rpc%+1 : PULS "(A%1):rp%=mem%?rs%:rs%=rs%+1 "(A%2):ra%=mem%?rs%:rs%=rs%+1 "(A%4):rb%=mem%?rs%:rs%=rs%+1 '(A%8):rdp%=256*mem%?rs%:rs%=rs%+1 4(A%16):rx%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2 4(A%32):ry%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2 $4(A%64):ru%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2 .6(A%128):rpc%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2 8=0 BKݤ_36:A%=mem%?rpc%:rpc%=rpc%+1 : PSHU L;(A%128):ru%=ru%-2:mem%?ru%=rpc%256:mem%?(ru%+1)=rpc% V8(A%64):ru%=ru%-2:mem%?ru%=rs%256:mem%?(ru%+1)=rs% `8(A%32):ru%=ru%-2:mem%?ru%=ry%256:mem%?(ru%+1)=ry% j8(A%16):ru%=ru%-2:mem%?ru%=rx%256:mem%?(ru%+1)=rx% t'(A%8):ru%=ru%-1:mem%?ru%=rdp%256 ~"(A%4):ru%=ru%-1:mem%?ru%=rb% "(A%2):ru%=ru%-1:mem%?ru%=ra% "(A%1):ru%=ru%-1:mem%?ru%=rp% =0 Kݤ_37:A%=mem%?rpc%:rpc%=rpc%+1 : PULU "(A%1):rp%=mem%?ru%:ru%=ru%+1 "(A%2):ra%=mem%?ru%:ru%=ru%+1 "(A%4):rb%=mem%?ru%:ru%=ru%+1 '(A%8):rdp%=256*mem%?ru%:ru%=ru%+1 4(A%16):rx%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 4(A%32):ry%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 4(A%64):ru%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 6(A%128):rpc%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 =0  :  38:REM (cwai) : (Xݤ_39:rpc%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2:=0 : RTS 2Vݤ_3A:rx%=(rx%+rb%)&FFFF:=0 : ABX <: F 3B:REM RTI P 3C:REM CWAI #imm Z: dZݤ_3D:A%=ra%*rb%:ra%=A%256:rb%=A%255:rp%=(rp%&FA)((A%=0)4)(rb%128):=0: MUL A,B n: x 3E:REM (reset) : c DEFFN_3F:PRINT'"Error: ";$$(mem%+rpc%+1)+" @ "+STR$ERL:rpc%=errpc%:quiet%=FALSE:=TRUE:REM SWI eݤ_3F:rs%=rs%-12:rp%=rp%128:mem%?rs%=rp%:mem%?(rs%+1)=ra%:mem%?(rs%+2)=rb%:mem%?(rs%+3)=rdp%256 Omem%?(rs%+4)=rx%256:mem%?(rs%+5)=rx%:mem%?(rs%+6)=ry%256:mem%?(rs%+7)=ry% Smem%?(rs%+8)=ru%256:mem%?(rs%+9)=ru%:mem%?(rs%+10)=rpc%256:mem%?(rs%+11)=rpc% [rpc%=256*mem%?&FEFA+mem%?&FEFB:=0 : SWI : Yݤ_0:N%=0-mem%?A%:cmp8(N%):mem%?A%=N%:=0 : NEG ext  NB: V not set correctly : [ݤ_1:N%=0-mem%?A%:cmp8(N%):mem%?A%=N%:=0 : (NEG ext) @ NB: V not set correctly J: TXݤ_2:mem%?A%=mem%?A%255:flg8(mem%?A%):rp%=rp%1:=0 : (COM ext) : Vݤ_3:mem%?A%=mem%?A%255:flg8(mem%?A%):rp%=rp%1:=0 : COM ext : Tݤ_4:N%=mem%?A%:rp%=(rp%&FE)(N%1):N%=N%2:mem%?A%=N%:flg8(N%):=0 : LSR ext  V should be preserved : Vݤ_5:N%=mem%?A%:rp%=(rp%&FE)(N%1):N%=N%2:mem%?A%=N%:flg8(N%):=0 : (LSR ext) D V should be preserved N: X`ݤ_6:N%=mem%?A%+256*(rp%1):rp%=(rp%&FE)(N%1):N%=N%2:mem%?A%=N%:flg8(N%):=0 : ROR ext  V should be preserved : _ݤ_7:N%=mem%?A%:rp%=(rp%&FE)(N%1):N%=(N%2)(N%128):mem%?A%=N%:flg8(N%):=0 : LSR ext  V should be preserved : Tݤ_8:N%=mem%?A%*2:mem%?A%=N%:flg8(N%):rp%=(rp%&FE)(N%256):=0 : ASL ext  V not set correctly  : *uݤ_9:N%=mem%?A%*2+(rp%1):mem%?A%=N%:flg8(N%):rp%=(rp%&FC)(N%256)((((N%(N%2))128))64):=0 : ROL pݤ_59:rb%=rb%*2+(rp%1):flg8(rb%):rp%=(rp%&FC)(rb%256)((((rb%(rb%2))128))64):rb%=rb%255:=0 : ROLB Huݤ_69:N%=mem%?A%*2+(rp%1):mem%?A%=N%:flg8(N%):rp%=(rp%&FC)(N%256)((((N%(N%2))128))64):=0 : ROL idx Rvݤ_79:N%=mem%?A%*2+(rp%1):mem%?A%=N%:flg8(N%):rp%=(rp%&FC)(N%256)((((N%(N%2))128))64):=0 : ROL >ext \ Is V set correctly? f: pYݤ_A:mem%?A%=mem%?A%-1:flg8(mem%?A%):=0 : DEC ext : [ݤ_B:mem%?A%=mem%?A%-1:flg8(mem%?A%):=0 : (DEC ext) : Yݤ_C:mem%?A%=mem%?A%+1:flg8(mem%?A%):=0 : INC ext : $Yݤ_D:flg8(mem%?A%):=0 : TST ext V: `\ݤ_E:rpc%=A%:=0 : JMP ext ` N%<>&FFF7:A%=_39:=mos(N%) : Do MOS call aA%=mos(N%):=_39 : Do MOS call : Yݤ_F:mem%?A%=0:rp%=(rp%&F0)4:=0 : CLR ext : Yݤ_80:ra%=ra%-mem%?A%:cmp8(ra%):ra%=ra%255:=0 : SUBA #imm Xݤ_90:ra%=ra%-mem%?A%:cmp8(ra%):ra%=ra%255:=0 : SUBA ext Yݤ_C0:rb%=rb%-mem%?A%:cmp8(rb%):rb%=rb%255:=0 : SUBB #imm Xݤ_D0:rb%=rb%-mem%?A%:cmp8(rb%):rb%=rb%255:=0 : SUBB ext <: F[ݤ_81:A%=ra%-mem%?A%:cmp8(A%):=0 : CMPA #imm PZݤ_91:A%=ra%-mem%?A%:cmp8(A%):=0 : CMPA ext n: x[ݤ_C1:A%=rb%-mem%?A%:cmp8(A%):=0 : CMPB #imm Zݤ_D1:A%=rb%-mem%?A%:cmp8(A%):=0 : CMPB ext : Wݤ_82:ra%=ra%-mem%?A%-(rp%1):cmp8(ra%):ra%=ra%255:=0 : SBCA #imm Vݤ_92:ra%=ra%-mem%?A%-(rp%1):cmp8(ra%):ra%=ra%255:=0 : SBCA ext Wݤ_C2:rb%=rb%-mem%?A%-(rp%1):cmp8(rb%):rb%=rb%255:=0 : SBCB #imm Vݤ_D2:rb%=rb%-mem%?A%-(rp%1):cmp8(rb%):rb%=rb%255:=0 : SBCB ext : tݤ_83:rb%=256*ra%+rb%:rb%=rb%-imm16a:cmp16(rb%):ra%=(rb%&FF00)256:rb%=rb%255:=0 : SUBD #imm tݤ_93:rb%=256*ra%+rb%:rb%=rb%-256*mem%?A%-mem%?(A%+1):cmp16(rb%):ra%=(rb%&FF00)256:rb%=rb%255:=0 : SUBD ext ,tݤ_C3:rb%=256*ra%+rb%:rb%=rb%+imm16a:cmp16(rb%):ra%=(rb%&FF00)256:rb%=rb%255:=0 : ADDD #imm 6tݤ_D3:rb%=256*ra%+rb%:rb%=rb%+256*mem%?A%+mem%?(A%+1):cmp16(rb%):ra%=(rb%&FF00)256:rb%=rb%255:=0 : ADDD ext T: ^Yݤ_84:ra%=ra%mem%?A%:flg8(ra%):=0 : ANDA #imm hXݤ_94:ra%=ra%mem%?A%:flg8(ra%):=0 : ANDA ext Yݤ_C4:rb%=rb%mem%?A%:flg8(rb%):=0 : ANDB #imm Xݤ_D4:rb%=rb%mem%?A%:flg8(rb%):=0 : ANDB ext : Yݤ_85:A%=ra%mem%?A%:flg8(A%):=0 : BITA #imm Xݤ_95:A%=ra%mem%?A%:flg8(A%):=0 : BITA ext Yݤ_C5:A%=rb%mem%?A%:flg8(A%):=0 : BITB #imm Xݤ_D5:A%=rb%mem%?A%:flg8(A%):=0 : BITB ext : Yݤ_86:ra%=mem%?A%:flg8(ra%):=0 : LDA #nn Yݤ_96:ra%=mem%?A%:flg8(ra%):=0 : LDA ext :Zݤ_C6:rb%=mem%?A%:flg8(rb%):=0 : LDB #imm DYݤ_D6:rb%=mem%?A%:flg8(rb%):=0 : LDB ext b: l ݤ_87:=0 vYݤ_97:mem%?A%=ra%:flg8(ra%):=0 : STA ext  ݤ_C7:=0 Yݤ_D7:mem%?A%=rb%:flg8(rb%):=0 : STB ext : Yݤ_88:ra%=ra%mem%?A%:flg8(ra%):=0 : EORA #imm Xݤ_98:ra%=ra%mem%?A%:flg8(ra%):=0 : EORA ext Yݤ_C8:rb%=rb%mem%?A%:flg8(rb%):=0 : EORB #imm Xݤ_D8:rb%=rb%mem%?A%:flg8(rb%):=0 : EORB ext :  Wݤ_89:ra%=ra%+mem%?A%+(rp%1):cmp8(ra%):ra%=ra%255:=0 : ADCA #imm *Vݤ_99:ra%=ra%+mem%?A%+(rp%1):cmp8(ra%):ra%=ra%255:=0 : ADCA Wݤ_B9:ra%=ra%+mem%?A%+(rp%1):cmp8(ra%):ra%=ra%255:=0 : ADCA >ext HWݤ_C9:rb%=rb%+mem%?A%+(rp%1):cmp8(rb%):rb%=rb%255:=0 : ADCB #imm RVݤ_D9:rb%=rb%+mem%?A%+(rp%1):cmp8(rb%):rb%=rb%255:=0 : ADCB ext p: zYݤ_8A:ra%=ra%mem%?A%:flg8(ra%):=0 : ORA #imm Xݤ_9A:ra%=ra%mem%?A%:flg8(ra%):=0 : ORA ext Yݤ_CA:rb%=rb%mem%?A%:flg8(rb%):=0 : ORB #imm Xݤ_DA:rb%=rb%mem%?A%:flg8(rb%):=0 : ORB ext : Yݤ_8B:ra%=ra%+mem%?A%:cmp8(ra%):ra%=ra%255:=0 : ADDA #imm Xݤ_9B:ra%=ra%+mem%?A%:cmp8(ra%):ra%=ra%255:=0 : ADDA ext Yݤ_CB:rb%=rb%+mem%?A%:cmp8(rb%):rb%=rb%255:=0 : ADDB #imm Xݤ_DB:rb%=rb%+mem%?A%:cmp8(rb%):rb%=rb%255:=0 : ADDB ext $: .aFN_8C:N%=FNmF0:A%=rx%-A%:PROCcmp16(A%):=0 :REM CMPX #imm .Zݤ_8C:A%=rx%-imm16a:cmp16(A%):=0 : CMPX #imm 8Zݤ_9C:A%=rx%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPX ext VVݤ_CC:A%=imm16a:rb%=A%255:ra%=A%256:flg16(A%):=0 : LDD #nnnn `Uݤ_DC:A%=256*mem%?A%+mem%?(A%+1):rb%=A%255:ra%=A%256:flg16(A%):=0 : LDD ext ~: Yݤ_8D:rs%=rs%-2:mem%?rs%=rpc%256:mem%?(rs%+1)=rpc%:rpc%=rpc%-1:=br8(1) : BSR rel Zݤ_9D:rs%=rs%-2:mem%?rs%=rpc%256:mem%?(rs%+1)=rpc%:rpc%=A%:=0 : JSR ext  ݤ_CD:=0 Yݤ_DD:mem%?A%=ra%:mem%?(A%+1)=rb%:flg16(256*ra%+rb%):=0 : STD ext : Zݤ_8E:rx%=imm16a:flg16(rx%):=0 : LDX #nnnn Yݤ_9E:rx%=256*mem%?A%+mem%?(A%+1):flg16(rx%):=0 : LDX ext  Zݤ_CE:ru%=imm16a:flg16(ru%):=0 : LDU #nnnn Yݤ_DE:ru%=256*mem%?A%+mem%?(A%+1):flg16(ru%):=0 : LDU ext 2: < ݤ_8F:=0 FWݤ_9F:mem%?A%=rx%256:mem%?(A%+1)=rx%:flg16(rx%):=0 : STX ext d ݤ_CF:=0 nWݤ_DF:mem%?A%=ru%256:mem%?(A%+1)=ru%:flg16(ru%):=0 : STU ext : :  Group 10 opcodes 3ݤ_10:B%=mem%?rpc%:rpc%=rpc%+1:(B%&C0)=&40:=0 (B%&80):(B%7)<3:=0 (B%&87)=&85:=0 (B%&E0)<&20:=0 (B%&F0)=&30:B%<>&3F:=0 =("FNg10_"+~B%) : Qݤg10_20:=br16(1) : LBRA Qݤg10_21:=br16(0) : LBRN Tݤg10_22:=br16(((rp%1)((rp%4)4))1) : LBHI (C OR Z)=0 Vݤg10_23:=br16((rp%1)((rp%4)4)) : LBLS (C OR Z)=1 Mݤg10_24:=br16((rp%1)1) : LBCC "Sݤg10_25:=br16(rp%1) : LBCS/BLO ,Mݤg10_26:=br16((rp%4)4) : LBNE 6Oݤg10_27:=br16(rp%4) : LBEQ @Mݤg10_28:=br16((rp%2)2) : LBVC JOݤg10_29:=br16(rp%2) : LBVS TMݤg10_2A:=br16((rp%8)8) : LBPL ^Oݤg10_2B:=br16(rp%8) : LBMI hTݤg10_2C:=br16(((((rp%8)2)(rp%2))2)) : LBGE (N EOR V)=0 rVݤg10_2D:=br16(((rp%8)2)(rp%2)) : LBLT (N EOR V)=1 |!ݤg10_2E:(rp%4)=0:=br16(1)  "@"; K=br16((((rp%4)2)(((rp%8)2)(rp%2)))2): LBGT Z AND (N EOR V)=0 Vݤg10_2F:=br16((((rp%4)2)(((rp%8)2)(rp%2)))) : LBLE Z AND (N EOR V)=1 :  &3F - SWI2 : [ݤg10_83:N%=mF0:A%=256*ra%+rb%-A%:cmp16(A%):=0 : CMPD #nnnn Yݤg10_93:N%=mD0:A%=256*ra%+rb%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPD ext : [ݤg10_8C:N%=mF0:A%=ry%-A%:cmp16(A%):=0 : CMPY #nnnn Yݤg10_9C:N%=mD0:A%=ry%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPY ext : &Zݤg10_8E:N%=mF0:ry%=A%:flg16(ry%):=0 : LDY #nnnn 0Xݤg10_9E:N%=mD0:ry%=256*mem%?A%+mem%?(A%+1):flg16(ry%):=0 : LDY ext N: XZݤg10_CE:N%=mF0:rs%=A%:flg16(rs%):=0 : LDS #nnnn bXݤg10_DE:N%=mD0:rs%=256*mem%?A%+mem%?(A%+1):flg16(rs%):=0 : LDS ext : Vݤg10_9F:N%=mD0:mem%?A%=ry%256:mem%?(A%+1)=ry%:flg16(ry%):=0 : STY ext : Vݤg10_DF:N%=mD0:mem%?A%=rs%256:mem%?(A%+1)=rs%:flg16(rs%):=0 : STS ext : :  Group 11 opcodes "ݤ_11:B%=mem%?rpc%:rpc%=rpc%+1 (B%&C0)<>&80:=0 "(B%&0F)<>3 (B%&0F)<>12:=0  =("FNg11_"+~B%) :   &3F - SWI3 *: 4\ݤg11_83:N%=mF0:A%=ru%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPU #imm16 >Yݤg11_93:N%=mD0:A%=ru%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPU ext \: f\ݤg11_8C:N%=mF0:A%=rs%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPS #imm16 pYݤg11_9C:N%=mD0:A%=rs%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPS ext :  > MOS for 6809 * v0.12 Uses big-endian file addresses : (ݤmos(m%): X%,Y% 2%A%=ra%:X%=rx%:Y%=ry%:C%=rp%:rp%=0 < Ȏ m% F &13,&FFF4:=mos_byte P &33,&FFEE: A%:=0 Z &FFEC: 13:=0 d &FFE7: &FFE7:=0 n &FFE3: &FFE3:=0 x' &43,&FFE0:ra%=:rp%=(ra%=27)1:=0  &73,&FFD7:=mos_bget  &83,&FFD4:=mos_bput  &A3,&FFCE:=mos_find  &63,&FFDA:=mos_args  &B3:=mos_quit  &C3:=mos_lang  X%=X%+mem%:Y%=X%256 Ȏ m%  &03,&FFF7:=mos_cli  &23,&FFF1:=mos_word  &53,&FFDD:=mos_file  &93,&FFD1:=mos_gbpb  =0 : "ݤmos_cli:cmd($X%,):=0 ,: 6ݤmos_byte @Q A%=&82:rx%=0:ry%=0:=0 : high order address JT A%=&83:rx%=256*mem%?&FF88+mem%?&FF89:ry%=mem%?&FF88:=0: bottom of user memory TQ A%=&84:rx%=256*mem%?&FF8A+mem%?&FF8B:ry%=mem%?&FF8A:=0: top of user memory ^L A%>123:A%<127:mem%?escflg%=128*(A%1):"FX15" : Clear/Set/Ack Escape hF A%=&7F:rx%=0 rx%=&FFFF:rx%=0:=0 : =EOF#0/-1 rC A%=&A0:os%=6:vdu:=0 : =VDU(n) |j os%<32:X%=X%255:A%=&FFF4:rx%=(A%&FFFF00)256:ry%=(A%&FF0000)65536:rp%=(A%&1000000)&1000000:=0  Windows OSBYTE calls: 4 A%=128:rx%=7:ȗ rx%,A%,A%:ry%=(rx%>>8)255:=0 4 A%=128:rx%=8:ȗ A%,rx%,A%:ry%=(rx%>>8)255:=0 4 A%=128:rx%=9:ȗ A%,A%,rx%:ry%=(rx%>>8)255:=0  Ȏ A%  0:rx%=32:=0  127:rx%=#rx%:=0 ^ 128:A%=(255(rx%>&FFFD))-((rx%255)+256*ry%((ry%>&7F)&FFFF0000)):rx%=A%:ry%=A%256:=0 ւ 129:A%=((rx%255)+256*ry%((ry%>&7F)&FFFF0000)):carry(A%=-1 ry%<&80):rx%=A%&FFFF:ry%=(A%&FFFF00)256:carry(A%=-1):=0  134:rx%=:ry%=:=0  135:rx%=(,):ry%=:=0  160:  Ȏ rx% 2 0,128:ș "GetRgnBox",@vdu%!60,zp%:rx%=zp%!0 2 2,129:ș "GetRgnBox",@vdu%!60,zp%:rx%=zp%!4 2 4,130:ș "GetRgnBox",@vdu%!60,zp%:rx%=zp%!8 &3 6,131:ș "GetRgnBox",@vdu%!60,zp%:rx%=zp%!12 0% 8,132:rx%=@vdu%!24 @vdu%!216 :' 9,133:rx%=@vdu%!36 @vdu%!220-1 D' 10,134:rx%=@vdu%!28 @vdu%!216-1 N% 11,135:rx%=@vdu%!32 @vdu%!220 X 12,136:rx%=2*@vdu%!0 b 14,137:rx%=2*@vdu%!4 l 16,138:rx%=2*@vdu%!8 vB 18,139:ș "GetRgnBox",@vdu%!60,zp%:rx%=2*(zp%!12-@vdu%!12-1)  20,142:r%(1)=@vdu%!16 @ 22,143:ș "GetRgnBox",@vdu%!60,zp%:rx%=(zp%!12-@vdu%!20-1)  36:rx%=@vdu%!8 < 38:ș "GetRgnBox",@vdu%!60,zp%:rx%=(zp%!12-@vdu%!12-1)  87,155:rx%=@vdu%?70  88,156:rx%=@vdu%?71  89,153:rx%=@vdu%?65  90,154:rx%=@vdu%?67 . 91,151:rx%=3-(@vdu%?64-7)2:rx%<0:rx%=1 . 92,152:rx%=3-(@vdu%?66-7)2:rx%<0:rx%=1  96,3:rx%=@vdu%?73   rx%=0   ry%=rx%256:=0   =0 *ݤvdu:os%<>6:=0 4rx%<16:rx%<>3:=0 > H=0 R \% ARM and R1>15 or ARM and R1=3 frx%=3:rx%=96 p Ȏ rx% z 16:A%=138  18:A%=139  20:A%=142  22:A%=143  36:A%=144  38:A%=145  77:A%=148  80:A%=149  83:A%=150  87:A%=155  88:A%=156  89:A%=153  90:A%=154  91:A%=151  92:A%=152  96:A%=3  $"A%=rx%: A%<128:rx%=0:rx%=0:= . 87!zp%=A%:zp%!4=-1:ș "OS_ReadVduVariables",zp%,zp%+8 Brx%=zp%!8:ry%=rx%256 L= V: `ݤmos_word jgA%=0:A%=256*?X%+X%?1:mem%?escflg%=0:osw0%=:EscOn:""A$:EscOff:$(mem%+A%)=A$:osw0%=:ry%=A$:=0 t: A%=190: X%?2=9: ?X%>8:A%=Dis_Code(9,X%!4,X%!8):=0 ~5 A%=190: X%?2=9: ?X%<9:$(X%+4)=Dis_Name(9):=0 " A%=127: d_chn%:=mos_word7F  os%<32 A%=10: &FFF1:=0  Ȏ A%  1:mem%!rx%=:=0  2:=mem%!rx%:=0 T 7: mem%!rx%&FFFF,mem%!(2+rx%)&FFFF,mem%!(4+rx%)&FFFF,mem%!(6+rx%)&FFFF:=0  8: mem%?rx%,mem%?(1+rx%),mem%?(2+rx%),mem%?(3+rx%),mem%?(4+rx%),mem%?(5+rx%),mem%?(6+rx%),mem%?(7+rx%),mem%?(8+rx%),mem%?(9+rx%),mem%?(10+rx%),mem%?(11+rx%),mem%?(12+rx%),mem%?(13+rx%):=0 8 9:mem%?(rx%+4)=mem%!rx%&FFFF,mem%!(2+rx%)&FFFF)  14:$(mem%+rx%)=$:=0  15:$=$(mem%+rx%+1):=0  =0 :  ݤmos_word7F (debug%8):"OSW7F: ";?X%;" ";~X%!1;" ";X%?5;" ";~X%?6;" ";X%?7;" ";X%?8;" "h0(X%?9,2)" "h0(X%?10,2)" "h0(X%?11,2)" "h0(X%?12,2)" "h0(X%?13,2)" "h0(X%?14,2)" "h0(X%?15,2) !A$="":A%=014:A$=A$+X%?A%: (Q FNfdc_disk(cmd%, add%, drv%, trk%, sid%, sec%, num%) 2MA% =fdc_disk(X%?6,mem%+X%!1,X%?0 5,X%?7,(X%?0 2) 1,X%?8,X%?9 31) <+B%=X%?15:$X%=A$:X%?15=B%:X%?(X%?5+7)=A% F(debug%8):"RESULT:";?X%;" ";~X%!1;" ";X%?5;" ";~X%?6;" ";X%?7;" ";X%?8;" "h0(X%?9,2)" "h0(X%?10,2)" "h0(X%?11,2)" "h0(X%?12,2)" "h0(X%?13,2)" "h0(X%?14,2)" "h0(X%?15,2) P(debug%10)=10:A%= Z=0 d: nswap(S%): x1A%=X%?(S%+0):X%?(S%+0)=X%?(S%+3):X%?(S%+3)=A% 1A%=X%?(S%+1):X%?(S%+1)=X%?(S%+2):X%?(S%+2)=A% S%=S%-4:S%<0  -addr(A%):X%!A%<&10000:X%!A%=mem%+A%!X%  : ݤmos_file #fn%=mem%+256*?X%+X%?1:swap(14)  ra%=255:addr(2) ! ra%=0 :addr(10):addr(14) l os%<32 :ș "OS_File",ra%,$fn%,X%!2,X%!6,X%!10,X%!14 ra%,,X%!2,X%!6,X%!10,X%!14 ra%=file($fn%,ra%) 6 A%=2 14 4:mem%!(rx%+A%)=X%!A%::swap(14):=0 : ݤmos_args  A%=function  X%=>data " Y%=handle ,$ os%>31: A%=0: Y%=0:ra%=29:=0 6% A%=0: Y%=0:ra%=(&FFDA)&FF:=0 @X%=mem%+X%:swap(0) J Y%=0 Y%=&FFFF T Ȏ A% ^" 0:!X%=0 : =PTR#0/-1 h" 1: : PTR#0/-1= r" 2:!X%=0 : =EXT#0/-1 |" 3: : EXT#0/-1= $ 4:!X%=0 : =Alloc#0/-1 " 5:!X%=0 : =EOF#0/-1 $ 6: : Alloc#0/-1=  swap(0):=0   Ȏ A%  0:!X%=#Y%  1:#Y%=!X%  2:!X%=#Y%  3:#Y%=!X%  4:!X%=#Y%  5:!X%=#Y%  6:#Y%=!X%  255:os%>31  &!X%=args(A%,Y%,!X%) 0 :swap(0):=0 D: Nݤmos_bget: Y%=0:ra%=:=0 Xos%>31:ra%=#Y%:=0 b/A%=&FFD7:ra%=A%&FF:carry(A%&1000000):=0 l: v*ݤmos_bput: Y%=0: A%:=0 #Y%,A%:=0 : ݤmos_gbpb &swap(9):B%=(X%!1<&10000):addr(1) 8 ?X%=0:A%=1A%=2:mem%?(X%!1):X%!5=X%!5-1:X%!5<1 9 ?X%=0:A%=3A%=4:mem%?(X%!1)=:X%!5=X%!5-1:X%!5<1 ) ?X%:f_gbpb(A%,X%?0,X%!1,X%!5,X%!9)  B%:X%!1=X%!1-mem% swap(9):=0 : ݤmos_find:A%=0:#Y%:=0 - (A%&C0)=&40:ra%=openin($(mem%+X%)):=0 . (A%&C0)=&80:ra%=openout($(mem%+X%)):=0 - (A%&C0)=&C0:ra%=openup($(mem%+X%)):=0 :  ݤmos_quit:= ݤmos_lang:=0  : *%carry(C%):rp%=(rp%-2)(C%1): > IO : 6 Access absolute memory, checking for I/O devices (6 ------------------------------------------------ 2io_reset: <: F+ݤio_rd(A%):(A%&FFF0)<>&FEE0:=mem%?A% P X%,Y% ZGA%=&FEE0:=&7F : TubeS1 - VDU output d" PRINT;~rpc%;": TubeRd: ";~A% nA%=&FEE1:=&80 x:A%=&FEE2:=&C0 : TubeS2 A%=&FEE3:=&80 LA%=&FEE8:=(((-2)<>0)2)+(((-3)<>0)1) : RxStatus b1=RxRDY, b0=TxRDY =A%=&FEE9:A%=145:X%=1:=((&FFF4)&FF0000)65536 : RxData =&7F : 2io_wr(A%,B%):(A%&FFE0)<>&FEE0:mem%?A%=B%: X%,Y% KA%=&FEE1: B%: : TubeR1 - VDU output * PRINT;~rpc%;": TubeWr: ";~A%;",";~B% 4A%=&FEE8:"FX7,8":"FX8,8":"FX2,2": : TxCtrl =A%=&FEE9:A%=138:X%=2:Y%=B%:&FFF4: : TxData  : ; > Dis09 1.00a - 24Sep2007 - 6809 disassembly routines : ݤDis_Name(A%)="6809" ($ݤDis_Code(A%,Ptr%,Data%):num%=1 2HX%!0=0:$(X%+4)=_diss:num%<1:num%=1:$(X%+4)="EQUB &"+h0(Data%?0,2) <X%?3=num%:=num% Fݤ_diss:op%=?Data%:num%=1 P/(op%&CF)=&83:="SUBD "+mde2((op%&30)16) Z/(op%&CF)=&C3:="ADDD "+mde2((op%&30)16) dop%=&87:num%=0:="" nop%=&C7:num%=0:="" xB(op%&CF)=&87:="ST"+(65+(op%64)64)+" "+mde((op%&30)16) /(op%&CF)=&8C:="CMPX "+mde2((op%&30)16) /(op%&CF)=&CC:="LDD "+mde2((op%&30)16) 1op%=&8D:num%=2:="BSR &"+h0(jr(Data%?1),4) .(op%&CF)=&8D:="JSR "+mde((op%&30)16) op%=&CD:num%=0:="" /(op%&CF)=&CD:="STD "+mde2((op%&30)16) /(op%&CF)=&8E:="LDX "+mde2((op%&30)16) /(op%&CF)=&CE:="LDU "+mde2((op%&30)16) op%=&8F:num%=0:="" /(op%&CF)=&8F:="STX "+mde2((op%&30)16) op%=&CF:num%=0:="" /(op%&CF)=&CF:="STU "+mde2((op%&30)16) ](op%&80)=&80:=alu(op%15)+(65+(op%64)64)+" "+" ",(op%&8E)=&86)+mde((op%&30)16) 2(op%&E0)=&40:=rot(op%15)+(65+(op%16)16) /(op%&EF)=&6E:="JMP "+mde2((op%&30)16) 8(op%&E0)=&60:=rot(op%15)+" "+mde((op%&30)16) "q(op%&F0)=&20:num%=num%+1:="B"+"RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%15)*2+1,2)+" &"+h0(jr(Data%?1),4) ,op%=&0E:="JMP "+mde(1) 6-(op%&F0)=&00:=rot(op%15)+" "+mde(1) @op%=&10:=grp10 Jop%=&11:=grp11 Top%=&12:="NOP" ^op%=&13:="SYNC" hop%=&19:="DAA" rop%=&1A:="ORCC "+mde(0) |op%=&1C:="ANDCC "+mde(0) op%=&1D:="SEX" a(op%&FE)=&1E:num%=num%+1:="EXGTFR",(op%1)*3+1,3)+" "+r(Data%?1 16)+","+r(Data%?1 15) 2(op%&FC)=&30:="LEA"+reg2(op%3)+" "+mde(2) /op%=&34:num%=num%+1:="PSHS "+stk(Data%?1) /op%=&35:num%=num%+1:="PULS "+stk(Data%?1) /op%=&36:num%=num%+1:="PSHU "+stk(Data%?1) /op%=&37:num%=num%+1:="PULS "+stk(Data%?1) op%=&39:="RTS" op%=&3A:="ABX" op%=&3B:="RTI" op%=&3C:="CWAI" op%=&3D:="MUL" op%=&3F:="SWI" >op%=&16:num%=3:="LBRA &"+h0(ljr(256*Data%?1+Data%?2),4) >op%=&17:num%=3:="LBSR &"+h0(ljr(256*Data%?1+Data%?2),4) op%=&3E:="RESET" &num%=0:="" 0#ݤgrp10:num%=num%+1:op%=Data%?1 :~(op%&E0)=&20:num%=num%+1:="LB"+"RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%15)*2+1,2)+" &"+h0(ljr(256*Data%?1+Data%?2),4) Dop%=&3F:="SWI2" N/(op%&CF)=&83:="CMPD "+mde2((op%&30)16) X/(op%&CF)=&8C:="CMPY "+mde2((op%&30)16) b/(op%&CF)=&8E:="LDY "+mde2((op%&30)16) lop%=&8F;num%=0:="" v/(op%&CF)=&8F:="STY "+mde2((op%&30)16) /(op%&CF)=&CE:="LDS "+mde2((op%&30)16) op%=&CF:num%=0:="" /(op%&CF)=&CF:="STS "+mde2((op%&30)16) num%=0:="" #ݤgrp11:num%=num%+1:op%=Data%?1 op%=&3F:="SWI3" /(op%&CF)=&83:="CMPU "+mde2((op%&30)16) /(op%&CF)=&8C:="CMPS "+mde2((op%&30)16) num%=0:="" Uݤalu(A%)="SUBCMPSBCxxxANDBITLD ST EORADCOR ADD",A%*3+1,3+(A%=6 A%=7 A%=10)) 5ݤrot(A%):A%=1A%=2A%=5A%=11A%=14:num%=-9:="" B="NEGxxxxxxCOMLSRxxxRORASRASLROLDECxxxINCTSTxxxCLR",A%*3+1,3) Rݤmde2(A%):A%=0:num%=num%+2:="#&"+h0(Data%?(num%-2),2)+h0(Data%?(num%-1),2) ;ݤmde(A%):A%=0:num%=num%+1:="#&"+h0(Data%?(num%-1),2)  0A%=1:num%=num%+1:="&"+h0(Data%?(num%-1),2) +A%=2:num%=num%+1:=idx(Data%?(num%-1))  FA%=3:num%=num%+2:="&"+h0(Data%?(num%-2),2)+h0(Data%?(num%-1),2) *-ݤidx(A%):R$=reg1((A%&60)32):A%=A%&9F 4A%<16:=(A%15)+","+R$ > A%<32:=((A%15)-16)+","+R$ H&O$="":C$="":(A%16):O$="[":C$="]" R A%=A%15 \A%=0:O$<>"":num%=0:="" fA%=0:=O$+R$+"+"+C$ pA%=1:=O$+R$+"++"+C$ zA%=2:O$<>"":num%=0:="" A%=2:=O$+"-"+R$+C$ A%=3:=O$+"--"+R$+C$ A%=4:=O$+R$+C$ A%=5:=O$+"B,"+R$+C$ A%=6:=O$+"A,"+R$+C$ A%=7:num%=0:"" =A%=8:num%=num%+1:=O$+"&"+h0(Data%?(num%-1),2)+","+R$+C$ SA%=9:num%=num%+2:=O$+"&"+h0(Data%?(num%-2),2)+h0(Data%?(num%-1),2)+","+R$+C$ A%=10:num%=0:="" A%=11:=O$+"D,"+R$+C$ =A%=12:num%=num%+1:=O$+"&"+h0(Data%?(num%-1),2)+",PC"+C$ SA%=13:num%=num%+2:=O$+"&"+h0(Data%?(num%-2),2)+h0(Data%?(num%-1),2)+",PC"+C$ A%=14:num%=0:="" A%=14:O$="":num%=0:="" MA%=15:num%=num%+2:=O$+"&"+h0(Data%?(num%-2),2)+h0(Data%?(num%-1),2)+C$ ="" $ݤreg1(A%)="XYUS",A%+1,1) $ݤreg2(A%)="XYSU",A%+1,1) .Gݤr(A%)="D X Y U S PC????A B CCDP????????",A%*2+1,1-(A%=5 A%>9)) 80ݤjr(A%):A%<128:=Ptr%+2+A% =Ptr%+2-256+A% B5ݤljr(A%):A%<32768:=Ptr%+3+A% =Ptr%+3-65536+A% Lݤstk(A%):A$="" V(A%1):A$="CC" `(A%2):A$=A$+",A" j(A%4):A$=A$+",B" t(A%8):A$=A$+",DP" ~(A%16):A$=A$+",X" (A%32):A$=A$+",Y" (A%64):A$=A$+",S/U" (A%128):A$=A$+",PC" A$,1)=",":A$=A$,2) =A$ ! > BLib.Close 1.00 09Aug1998 :  Close Handling ( ~~~~~~~~~~~~~~ 2: <Close_All:*EXEC F"in%=in%:in%:A%=in%:in%=0:#A% P'out%=out%:out%:A%=out%:out%=0:#A% Z " > BLib.String 1.00 09Aug1998 : # String Manipulation Functions (# ============================= 2: <7 FNs() - strip spaces from start and end of string F7 ------------------------------------------------- P/ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " Z+A$,1)=" ":A$=A$,A$-1):A$,1)<>" " d=A$ n: x+ FNuc() - convert string to upper case + ------------------------------------- ݤuc(A$): B$:A$="":="" 5B$=B$+(A$((A$<"@")&DF)):A$=A$,2):A$="":=B$ : + FNlc() - convert string to lower case + ------------------------------------- ݤlc(A$): B$:A$="":="" 5B$=B$+(A$((A$<"_")&20)):A$=A$,2):A$="":=B$ : " > BLib.Number 1.01 09Aug1988 ( v1.00 09Aug1988 JGH: First version 1 v1.01 12Feb1992 JGH: Added Octal and Binary (? v1.02 15Sep2009 JGH: Octal and Binary works for &8xxxxxxx 2: < Number Output Routines F ~~~~~~~~~~~~~~~~~~~~~~ P: Z# Hexadecimal padded with zeros d$ݤh0(A%,N%):="0000000"+~A%,N%) n: x$ Hexadecimal padded with spaces #ݤh(A%,N%):=" "+~A%,N%) :  Decimal padded with zeros $ݤd0(A%,N%):="00000000"+A%,N%) : Decimal padded with spaces $ݤd(A%,N%):=" "+A%,N%) :  Octal padded with zeros 5ݤo0(A%,N%): A$,B%,L%:A%<0:B%=2:A%=A%&7FFFFFFF ;A$=(A%7)+A$:A%=A%8:L%=L%+3:L%>27:=(A%+B%)+A$,N%) :  Octal padded with spaces %ݤo(A%,N%): A$:A%<0:=o0(A%,N%) 2A$=(A%7)+A$:A%=A%8:A%=0:=N%," ")+A$,N%) : " Binary padded with zeros ,>ݤb0(A%,N%): A$,B$,L%:B$="0":A%<0:B$="1":A%=A%&7FFFFFFF 65A$=(A%1)+A$:A%=A%2:L%=L%+1:L%>30:=B$+A$,N%) @: J Binary padded with spaces T%ݤb(A%,N%): A$:A%<0:=b0(A%,N%) ^2A$=(A%1)+A$:A%=A%2:A%=0:=N%," ")+A$,N%) h: r) Drive character for supplied number | ݤdrv(A%):=(48+A%-7*(A%>9)) : ) Drive number for supplied character #ݤDrv(A$):=A$-48+7*(A$>"9")31 : # > BLib.ProgEnv 1.05 09Jan2007 : # Program Environment Functions (# ============================= 2: &FFFF:X%256:ș"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$ xos%=32:A$=$&100 gA$=0:>&FFFF:run$=$&8100:ș16A$,,A%:ș72,"",A%:A$=A$,1+A$+" "," ",1+A$," "))):A$=0:A$=run$ 2A$=0:?(P-3):A$=$&600 A$=0:A$=$(-&300) *Y%=-10:A$=" "+A$:A$=A$,2):A$<>32 6Y%:A$=34:A%=A$,"""",2)+1 Y%:A%=A$+" "," ") -Y%:run$=A$,A%-1):run$<>"":A$=A$,A%+1) :=A$ : . Run a program, passing it a command line = If program is *Command, called with OSCLI, else CHAINed = ------------------------------------------------------- &os(A$):A$=42:A$ A$<>"":A$  : ( Exit program, setting return value ( ---------------------------------- @exit(A%):"FX1,"+A%:quit$=quit$:A$=quit$:quit$="":os(A$) "os%=32:Ș A% ,os%<6: *Quit 6 @: * > BLib.Generic.FileIO 1.04 22Mar2008 1 v1.04 22Mar2008 JGH: FNf_scan strips spaces < v1.03 15Feb2008 JGH: Add veneer functions in f_ domain (P v1.02 28Apr2007 JGH: Added functions to FNfile on DOS, PROCcdir, FNopenout 2< v1.01 07Sep2006 JGH: FNargs avoid zero page on RISC OS <* v1.00 09Aug1988 JGH: Initial version F: P% General File Interface Routines Z% =============================== d: n8 FNfile(), PROCgbpb(), FNfs are callable on Windows x8 -------------------------------------------------- : , Returns file type, file info in X%!... , -------------------------------------- ݤfile(A$,A%) @(os%32)=0:$name%=A$:?X%=name%:X%?1=name%256:=(&FFDD)&FF TA$=f_name(A$):A%=255 A%=5:X%!14=(A$):X%!14:X%!10=#X%!14:#X%!14:X%!14=&33 1A%=255:X%?6=0:"LOAD """+A$+""" "+~X%!2:=1 A%=5:X%!14:=1 A%=5:=0 FA%=0:"SAVE """+A$+""" "+~X%!10+" "+~X%!14:X%!10=X%!14-X%!10:=1 BA%=7:"SAVE """+A$+""" "+~+"+"+~X%!10:X%!10=X%!14-X%!10:=1 A%=8  : :=2 "mkdir "+A$:=2  =0 : " General OSGBPB call , ------------------- 6%f_gbpb(A%,chn%,addr%,num%,ptr%) @@?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:(os%32)=0:&FFD1: JA%=1A%=3:#?X%=X%!9 T5:A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% ^5X%!1=X%!1+1:X%!5=X%!5-1:(#?X% A%>2) X%!5<1: h: r#gbpb(A%,chn%,addr%,num%,ptr%) |@?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:(os%32)=0:&FFD1: A%=1A%=3:#?X%=X%!9 5:A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% 5X%!1=X%!1+1:X%!5=X%!5-1:(#?X% A%>2) X%!5<1: : @ Return current disk (5), directory (6) or library (7) name @ ---------------------------------------------------------- ݤgbpb(A%):os%32:="" NX%!1=name%:&FFD1:A%=name%+((1+?name%)((A%-2)=6)):A%?(1+?A%)=13:=$(A%+1) : B Returns entry in current directory, or null string if at end B ------------------------------------------------------------ ݤf_scan(ptr%):os%32:="" 7X%!1=name%:X%!5=1:X%!9=ptr%:A%=8:&FFD1:X%!5=1:="" 7A%=name%+1:A%!(A%?-1)=&D20:A%?($A%," ")-1)=13:=$A% : ݤgbpb8(ptr%):os%32:="" &7X%!1=name%:X%!5=1:X%!9=ptr%:A%=8:&FFD1:X%!5=1:="" 07A%=name%+1:A%!(A%?-1)=&D20:A%?($A%," ")-1)=13:=$A% :: D7 OSARGS call with data. Returns any returned data N7 ------------------------------------------------- X6ݤf_args(A%,Y%,ptr%): X%,E%:?(P-3)=0:E%=Y%:Y%=0 b l& !&70:X%=&70:!X%=ptr%:&FFDA:=!X% v #ș"OS_Args",A%,Y%,ptr% ,,ptr%  :=ptr% : 4ݤargs(A%,Y%,ptr%): X%,E%:?(P-3)=0:E%=Y%:Y%=0  & !&70:X%=&70:!X%=ptr%:&FFDA:=!X%  #ș"OS_Args",A%,Y%,ptr% ,,ptr%  :=ptr% : ' OSARGS call ignoring X, returns A ' --------------------------------- ݤf_argsA(A%): ( X%,Y%,E%,!&70:X%=&70:=(&FFDA)&FF   ș"OS_Args",A% A%  :=A% *: 4ݤargsA(A%): >( X%,Y%,E%,!&70:X%=&70:=(&FFDA)&FF H Rș"OS_Args",A% A% \ :=A% f: p& Get current filing system number z& -------------------------------- -ݤfs:(os%32)=0: A%,Y%,E%:=(&FFDA)&FF =29 :  Delete an object  ---------------- ;f_delete(A$):(os%40):A$="del "+A$ A$="delete "+A$  A$: :  Select a directory  ------------------ 4f_dir(A$):(os%40):A$="cd "+A$ A$="dir "+A$  A$: : 1 Create a directory only if it doesn't exist 1 ------------------------------------------- 9f_cdir(A$):(os%40):A$="mkdir "+A$ A$="cdir "+A$ $ . A$: 8 B : : LA$ V `: j. Open an input file ensuring no extension t. ---------------------------------------- ~!ݤf_openin(A$)=(f_name(A$)) : / Open an output file ensuring no extension / ----------------------------------------- "ݤf_openout(A$)=(f_name(A$)) : / Open an update file ensuring no extension / ----------------------------------------- !ݤf_openup(A$)=(f_name(A$)) : Vݤf_name(A$):os%32:A%,B%:B%=A%:A%=A$,"\",A%+1):A%=0:A$,".",B%)=0:A$=A$+"." =A$