> 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 <- v0.13 Updated with updates from PDPTube F: P"bugfix%=: Error in OS_GetEnv Z) pr::Close_All:" at line ";: d@A$=OS_GetEnv:ver$="0.13":debug%=0:Init:A%=_DEBUG(debug%) nSbugfix%:>&FFFFF:ș "GetCommandLine" name%:$$name%,"bbcwin.exe")=0:A$="-" x A$="-":A$="" quiet%=A$<>"" = A$="":"6809 Emulator v"ver$" (C)2014-2015 J.G.Harston" U 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$="" T IF A$<>"":IFLEFT$(A$,1)="*":PROCcmd(MID$(A$,2),0) ELSE IF A$<>"":A%=FN_RUN(A$)  A$<>"":A%=_RUN(A$)  run%:Go  quiet%:A%=_QUIT("")  Error:A$="" *quiet%=: "6809> "A$:cmd(A$,0):0 ' Should this line be here instead: ? A$<>"":A$,1)="*":cmd(A$,2),0) A$<>"":A%=_RUN(A$)  :  Init "6d$=".":s$="/":os%40:d$="/":s$=".":os%>31:d$="\" ,%bugfix%:>&FFFFF:run$=@dir$+"*" 6Hrunpath$=run$: runpath$,1)="""":runpath$=runpath$,2, runpath$-2) @1 runpath$=runpath$): d$+":",runpath$,1)) JRos%=32:mx%=@vdu%!208:my%=@vdu%!212:mw%=@vdu%!216:mh%=@vdu%!220:mc%=@vdu%?73+1 TKmz%=memsize:mm%=mz%-1:mtop%=mz%:mbot%=0:run%=:trace0%=0:trace1%=&FFFF ^G ctrl% 31,name% 255,mem% mz%:zp%=name%:hdr%=zp%:X%=ctrl%:Y%=X%256 hP d_path$(3):d_drv%=-1:d_chn%=0:prog%=&F800:err%=&FF00:escflg%=&FF80:osw0%= rDra%=0:rb%=0:rx%=0:ry%=0:rp%=0:rdp%=0:rs%=0:ru%=0:rpc%=0:errpc%=0 | Initial state: X IF os%>31:OSCLI"Load """+FNf_name(runpath$+"Client09.bin")+""" "+STR$~(mem%+&F800) U IF os%<32:OSCLI"Load """+FNf_name(runpath$+"Client09*")+""" "+STR$~(mem%+&F800) Qbasic$="": os%>31:basic$=@dir$+"6809bas.bin" os%=6:basic$="<6809$Basic>" Bclient: client$<>"": "Load """+client$+""" "+~(mem%+&F800) EscInit: : >ݤmemsize:A%=2^((--1024)/2): A%<&10000:=A% =&10000 client:client$="":pc%=0: 6client$="Tube ClientSerial",pc%*6+1,6+2*(pc%=0)) a os%>31:client$=f_name(runpath$+client$+"09.bin") client$=f_name(runpath$+client$+"09*") -in%=(client$):pc%=pc%+1: pc%=3 in%<>0 " in%:#in%:in%=0 client$=""  : 7Error:X%=ctrl%:Y%=X%256:errpc%=rpc%: -1:run%= K run%:pr::Close_All:" at line "+Þ,<128 <>17): -1:RegDump &I =25:run%: os%=32:run%=: 23,22,mx%;my%;mw%,mh%,mc%,128:run%=: 0> =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$("6809Em: ",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 D run%:mem%!err%=:mem%?(err%+4)=&3F:mem%?(err%+5)=:A%=<128 <>17:$(mem%+err%+6)="6809Em at $"+h0(rpc%,4)+": ",A%)+$+" at line "+Þ,A%(>0))+0:rp%=rp%2:rx%=err%+5:rpc%=err%+4:=17:mem%?escflg%=&FF N Xpr:?(P-3): : b: l5cmd(A$,link%)::A$=s(A$):A$,1)="*":A$=A$,2) v( A$,1)<>"*" A$,1)<>" ":reset%=0 N IF A$<>"":IF LEFT$(A$,1)=" ":REPEAT A$=MID$(A$,2):UNTIL LEFT$(A$,1)<>" "  A$=""A$,1)="|": 1 IF LEFT$(A$,1)="*":OSCLI MID$(A$,2):ENDPROC : A$,1)=".": "."+A$,2)+"\",A$>2)+"*.*",os%=32): ! 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)):T$=A$,A%+1) iA%=" BASIC CORE DEBUG FLEX GO HELP LOAD MDUMP MDIS MEDIT MOUNT QUIT RUN RESET REG SAVE "," "+C$+" ")  A%:A%=("FN_"+C$+"(T$)"): A%=_run(C$+" "+T$,): : <ݤ_HELP(A$):'"6809 Emulator ";ver$: uc(A$)<>"6809":=0 w" BASIC"'" CORE "'" DEBUG ( ( ))"'" FLEX ()"'" GO ()"'" HELP" " LOAD "'" MDUMP "'" MDIS "'" MOUNT "'" QUIT"'" RESET ()"'" RUN "  >" SAVE |+ ( ())" =0  : *ݤ_MDIS(A$): N%,P%,C% 4-addrs:P%=start%:N%=16: num%<2:size%=256 >(:C%=16:o0(P%,6);" ";:A$=dis(P%) H7 A%=0 N%-1 2:o0(mem%!(P%+A%)&FFFF,6);" ";: RA(21-3.5*N%);: A%=0 N%-1:c(mem%?(P%+A%));::(7-N%);A$ \RP%=(P%+N%)&FFFF:C%=C%-1:size%=size%-N%: C%=0 size%<0: size%>0:A%= A%=0 f A%=27 size%<0:=0 p: zݤ_MDUMP(A$): N%,P%,C% -addrs:P%=start%:N%=16: num%<2:size%=256 :C%=16:h0(P%,4);" "; - A%=0 N%-1:h0(mem%?(P%+A%),2);" ";: ( A%=0 N%-1:c(mem%?(P%+A%));:: RP%=(P%+N%)&FFFF:C%=C%-1:size%=size%-N%: C%=0 size%<0: size%>0:A%= A%=0  A%=27 size%<0:=0 : ݤ_MEDIT(A$):=0 : ݤ_SAVE(A$) fname:addrs  num%<2: 252,"Bad address" ( start%>=0:start%=mem%+(start%mm%) N "SAVE """+f_name(F$)+""" "+~start%+"+"+~size%+" "+~exec%+" "+~load% =0 : $ݤ_LOAD(A$) .#fname:addrs: num%=0:load%=-1 8=_load(F$,load%,) B: L!ݤ_QUIT(A$): A$:halt%=:=0 V1d_chn%=d_chn%:d_chn%:A%=d_chn%:d_chn%=0:#A% `=Close_All: IF os%=31:PRINT"Press SPACE to exit";:A%=GET j"QUIT":=0 t: ~3ݤ_BASIC(A$):A%=_basic(A$):rp%=1:rpc%=A%:=_go 7ݤ_basic(A$): A$="":A$=basic$: A$="":A$="EXBAS09" Oin%=(f_name(A$)): in%:#in%:in%=0:A%=_LOAD(A$) A%=_LOAD(A$+s$+"bin") =A% : ݤ_RESET(A$)::A%=-1 P uc(A$)="TUBE": client$<>"":"Load """+client$+""" "+~(mem%+&F800):A$="" 9'$(mem%+&F817)''"Econet Station 128"':A%=_basic(A$) (B%=mem%+A%+9:?B%:B%=B%+1:?B%=0:' rp%=0:rpc%=A%:A$="":=_go : ݤ_load( F$,A%,F%) in%=0:size%=0: A%=-1 >in%=f_openin(F$): in%=0:F$=F$+s$+"bin":in%=f_openin(F$)  in% T A%<0: <&FFFFF:ș"XOS_File",5,F$,-1 ,,A%:(A%&FFFFFF00)=&FFFBBC00:A%=&8000 'size%=#in%:gbpb(4,in%,hdr%,256,0) ( hdr%!(hdr%?7)=&29432800 2IA%=&8000: (hdr%?6 32):A%=hdr%?7:A%=A%+1:hdr%?A%=0:A%=hdr%!(A%+1) < F PA%=-2: Not found Z d n" in%: F% A%=-1:#in%:in%=0 x' A%=-2: F%: 214,"File not found" 0 A%=-1 (A%+size%>mm%): 252,"Bad address" 1 F%:"Load """+f_name(F$)+""" "+~(mem%+A%) =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 6@A%=fdc_disk(&53,mem%+&C100,drv%,0,0,0,2): Load boot loader @d_exec%=mem%!&C20A &FFFF Jrpc%=d_exec%:Go:=0 T: ^%syscmd(cli$): os%<>32: cli$: h% ch%,err$,tmp$:tmp$=@tmp$+Ñ+"." r- : : : =214: cli$: ,$: |+ cli$+" 2>"+tmp$:ch%=(tmp$): ch%=0: @err$=#ch%:#ch%:"Delete "+tmp$: err$,1)=",":err$,1)="."  254,err$: : ݤ_RUN(A$) Y <&FFFFF:ș"XOS_File",5,A$ ,,A%:A%=A%&FFF00: A%=&FFB00 A%=&1C700:=_BASIC(A$) =_run(A$,) (ݤ_run(A$,osc%):A$=s(A$): A$="":=0 IC$=A$:fname:hdr%=zp%:A%=_load(F$,-1,): A%<0: osc%:syscmd(C$):=0 ! A%<0: 214,"File not found" rp%=1:=_go  ݤ_go ) A% = entry address as 6809 address 7 F$ =file being loaded or "" if already in memory / hdr%=>Acorn ROM header in mem%+A% address ra%=0:rpc%=A%:hdr%=mem%+A%  hdr%!(hdr%?7)=&29432800 &0 (hdr%?6 64)=0 : 249,"Not a language":=0 0/ (hdr%?6 15)<>3: 249,"Not 6809 code":=0 :/M%=hdr%-mem%+9::M%=M%+1:mem%?M%=0:A%=M%+1 DRmem%?&FF82=A%256:mem%?&FF83=A% : Point to version string NKra%=1 : Enter with A=1 X b[B%=256*mem%?&FFBA+mem%?&FFBB:A%=B%-2:A%=256*mem%?A%+mem%?(A%+1) : A%=>CLI_WAIT lN:A%=A%+1: mem%?A%=&34 (mem%!A% &FFFFFF)=&8CFFBE : A%=>EXECUTE v_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 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 rx%=B%:PROCGo:=0 :REM Point X=>command line, start execution erx%=B%:Go:=0 : Point X=>command line, start execution : #ݤ_REG(A$):A%=A$,"="):A%=0:=0 $R%=A$,A%-1):A%=hex(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 *: 4ݤ_GO(A$): A$="":=0 >QA%=&FF90:A$<>"":"[(",A$,1)):A%=hex(A$,2)) A$<>"":rpc%=hex(A$):A%=-1 H(A%<>-1:rpc%=256*mem%?A%+mem%?(A%+1) R)A%=A$,";"): A%:A$=A$,A%+1) A$="" \*F$="":A%=rpc%:hdr%=mem%+A%:rp%=1:=_go f: pݤ_CORE(A$): Dump core z8A$=f_name(s(A$,A$+" "," ")-1))):A$="":A$="core" $"Save "+A$+" "+~mem%+"+"+~mz% SetType(A$,&FFD) =0 : oݤ_DEBUG(A$):A$="":"1=Register Dump"'"3=Single Step"'"4=Don't emulate MOS calls"'"8=Display MOS calls":=0 7debug%=0:trace0%=0:trace1%=&FFFF: uc(A$)="OFF":=0 ,debug%=(A$):(debug%1): <9: : >8 9A%=A$," "): A%:trace0%=hex(A$,A%+1)):A$=A$,A%+1) ,A%=A$," "): A%:trace1%=hex(A$,A%+1)) =0 : SetType(A$,A%): os%>8: "SetType "+A$+" "+~A%  :  ݤhex(A$) $Cuc(A$,2))="&O":=("&"+h0(oct(A$,3)),8)) =("&"+uc(A$)) .ݤoct(A$): A%: 80 A$>"/" A$<":":A%=A%*8+ A$,1):A$=A$,2) B (A$>"/" A$<":"):=A% L: V fname `RA$,1)="""":A%=A$+"""","""",2):F$=A$,2,A%-2) A%=A$+" "," "):F$=A$,A%-1) jA$=s(A$,A%+1)): t: ~ addrs +num%=0:start%=0:size%=0:load%=0:exec%=0 A$=s(A$): A$="": ,num%=A$,"+"): num%=0:num%=A$+" "," ") Wstart%=hex(A$,num%-1)):load%=start%:exec%=load%:A$=s(A$,num%)):num%=1: A$="": 5 A$,1)="+":size%=0:A$=s(A$,2)) size%=start% Wnum%=A$+" "," "):size%=hex(A$,num%-1))-size%:A$=s(A$,num%+1)):num%=2: A$="": Qnum%=A$+" "," "):exec%=hex(A$,num%-1)):A$=s(A$,num%+1)):num%=3: A$="": Gnum%=A$+" "," "):load%=hex(A$,num%-1)):A$=s(A$,num%+1)):num%=4  : 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);::" "  " X=&";:DumpLine(rx%):  " Y=&";:DumpLine(ry%): ( " U=&";:DumpLine(ru%): 2 " S=&";:DumpLine(rs%): < "PC=&";:DumpLine(rpc%) Fdis(rpc%);(66-) P Z: d"DumpLine(m%): h0(m%,4)" "; n' B%=m% m%+7: c(mem%?B%);::32 x3 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% ? DEFFNstr0(A%):A$="":REPEAT IF?A%>31:A$=A$+CHR$?A%:A%=A%+1 # UNTIL?A%<32 OR LEN 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 SLDR R12,escb%:STRB R11,[R12]:MOV PC,R14:.escb%:EQUD mem%+escflg%:]::escho%=0: "$EscOff:escho%=escho%:escho%: ,Kos%<32:ș "OS_ChangeEnvironment",9,esch%,0,0 ,escho%,escRo%,escbo%: 6:"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": h: rClose_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) ;(debug%8):"cmd:";h0(cmd%,2);" add:";~add%-mem%;" "; U(debug%8):"drv:";drv%;" trk:";trk%;" sid:";sid%;" sec:";sec%;" num:";num%;" "; &\ drv%<>d_drv%: d_chn%:#d_chn%:d_chn%=0 : Different drive, close current drive 0 d_chn%=0 :e 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 bSd_drv%=drv%: num%=0:=0 : Just refresh disk info l d_chn%=0:=&1E vsec%=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%)  16-26 Volume name in ASCII # 27-28 Volume number in binary *7 29-30 Address of first data sector (Track-Sector) 46 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 f#d_chn%=0 p# #d_chn%+256*#d_chn%=&6B64 z 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 d_trk% =#d_chn% d_sec% =#d_chn% $# d_sec%>19:d_sid%=2 d_sid%=1 .d_num% =d_sec% d_sid% 8d_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 j=0 > 6809 < 16-Feb-2015 CMPY #nnnn fixed, probably also CMPD #nnnn H 21-Sep-2017 CMPU #nnnn, CMPS #nnnn fixed, added more address modes (: 2(Go:abort%=:halt%=0:run%=:EscOff =trace0% rpc%<=trace1%:x%=:y%=:30:RegDump:31,x%,y%:(debug%2): FY B%=mem%?rpc%:rpc%=rpc%+1:UNTIL EVAL("FNm"+STR$~(B%AND&30)+"+FN_"+STR$~(B%AND&CF)) PB%=mem%?rpc%:rpc%=rpc%+1 ZP PRINT;~rpc%;" ";~B%;": FNm"+STR$~(B%AND&F0)+"+FN_"+STR$~(B%AND&FF):IFGET d+ ("FNm"+~(B%&F0)+"+FN_"+~(B%&FF)) n-EscOn:run%=: quiet% abort%:RegDump x : :  Set flags from result  --------------------- =flg8(A%):rp%=(rp%&F1)(((A%255)=0)4)((A%128)16): Lcmp8(A%):rp%=(rp%&F0)(((A%255)=0)4)((A%128)16)((A%256)256):   DEFPROCsub8(A%,B%,R%)  PRINT"{";~rp%; 2 rp%=rp%AND&F0 :REM Drop NZVC : rp%=rp%OR((R%AND128)DIV16) :REM Neg: copy b7 to N - rp%=rp%OR(((R%AND255)=0)AND4) :REM Zero < rp%=rp%OR((R%AND256)DIV256) :REM Carry: copy b8 to C & A%=((A%EORB%)AND(A%EORR%))AND128 1 rp%=rp%OR(V%DIV64) :REM Overflow  PRINT":";~rp%;"}"; " ENDPROC , 6 DEFPROCadd8(A%,B%,R%) @2 rp%=rp%AND&F0 :REM Drop NZVC J: rp%=rp%OR(R%DIV16) :REM Neg: copy b7 to N T- rp%=rp%OR(((R%AND255)=0)AND4) :REM Zero ^< rp%=rp%OR(R%DIV256) :REM Carry: copy b8 to C h+ A%=((NOT(A%EORB%))AND(A%EORR%))AND128 r1 rp%=rp%OR(V%DIV64) :REM Overflow | ENDPROC   Dflg16(A%):rp%=(rp%&F1)(((A%65535)=0)4)((A%32768)4096): Wcmp16(A%):rp%=(rp%&F0)(((A%65535)=0)4)((A%32768)4096)((A%65536)65536): :  8-bit relative branches  ----------------------- "ݤbr8(A%):rpc%=rpc%+1:A%=0:=0 9mem%?(rpc%-1)<128:rpc%=(rpc%+mem%?(rpc%-1))&FFFF:=0 *rpc%=(rpc%+mem%?(rpc%-1)-256)&FFFF:=0 :  16-bit relative branches  ----------------------- #ݤbr16(A%):rpc%=rpc%+2:A%=0:=0 Kmem%?(rpc%-2)<128:rpc%=(rpc%+256*mem%?(rpc%-2)+mem%?(rpc%-1))&FFFF:=0 >rpc%=(rpc%+256*mem%?(rpc%-2)+mem%?(rpc%-1)-65536)&FFFF:=0 &: 0: :G Address modes. Sets A% pointing to the data for the opcode to use DG ----------------------------------------------------------------- N ݤm10 X ݤm20 b ݤm30 l ݤm40 v ݤm50 =0 :  ݤm80  ݤmC0 DA%=rpc%:rpc%=rpc%+1:=0 : #imm : ݤm0  ݤm90  ݤmD0 CA%=rdp%+mem%?rpc%:rpc%=rpc%+1:=0 : ext :  ݤm60 * ݤmA0 4 ݤmE0 >?A%=mem%?rpc%:rpc%=rpc%+1:M%=A%31:N%=A%96 : idx HN%=0 :R%=rx% RN%=32:R%=ry% \N%=64:R%=ru% fN%=96:R%=rs% p: z B%=base opcode  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++ 8?N%=32:ry%=(ry%+2)&FFFF:=0 : ,Y++ B?N%=64:ru%=(ru%+2)&FFFF:=0 : ,U++ L?N%=96:rs%=(rs%+2)&FFFF:=0 : ,S++ V ` M%=2 jM%=1 t IF(B%AND&BF)=&A3:M%=2 ~ 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%+256*(rb%>127))&FFFF:=0 : B,R  @M%=6:A%=(ra%+R%+256*(ra%>127))&FFFF:=0 : A,R :M%=7:"[M07:";~rpc%-2;"]";:A%=rpc%:=0 : : ( M%=mode 2 N%=register number < R%=register contents F: P M%=8 ZN%=mem%?rpc%:rpc%=rpc%+1 d@A%=(R%+N%+256*(N%>127))&FFFF:=0 : n8,R n x M%=9 .N%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2 AA%=(R%+N%+65536*(N%>32767))&FFFF:=0 : n16,R  :M%=10:"[M10:";~rpc%-2;"]";:A%=rpc%:=0 : @M%=11:A%=(ra%*256+rb%+R%)&FFFF:=0 : D,R  M%=12 N%=mem%?rpc%:rpc%=rpc%+1 AA%=(rpc%+N%+256*(N%>127))&FFFF:=0 : n8,PC   M%=13 .N%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2 BA%=(rpc%+N%+65536*(N%>32767))&FFFF:=0 : n16,PC  :M%=14:"[M14:";~rpc%-2;"]";:A%=rpc%:=0 : :M%=15:"[M15:";~rpc%-2;"]";:A%=rpc%:=0 : :M%=16:"[M16:";~rpc%-2;"]";:A%=rpc%:=0 : " M%=17 ,A%=256*mem%?R%+mem%?(R%+1) 6AN%=0 :rx%=(rx%+2)&FFFF:=0 : [,X++] @AN%=32:ry%=(ry%+2)&FFFF:=0 : [,Y++] JAN%=64:ru%=(ru%+2)&FFFF:=0 : [,U++] TAN%=96:rs%=(rs%+2)&FFFF:=0 : [,S++] ^ h:M%=18:"[M18:";~rpc%-2;"]";:A%=rpc%:=0 : r M%=19 |AN%=0 :rx%=(rx%-2)&FFFF:R%=rx% : [,--X] AN%=32:ry%=(ry%-2)&FFFF:R%=ry% : [,--Y] AN%=64:ru%=(ru%-2)&FFFF:R%=ru% : [,--U] AN%=96:rs%=(rs%-2)&FFFF:R%=rs% : [,--S] !A%=256*mem%?R%+mem%?(R%+1):=0  CM%=20:A%=256*mem%?R%+mem%?(R%+1):=0 : [,R]  M%=21 AA%=(R%+rb%+256*(rb%>127))&FFFF : [B,R] !A%=256*mem%?A%+mem%?(A%+1):=0   M%=22 AA%=(R%+ra%+256*(ra%>127))&FFFF : [A,R] !A%=256*mem%?A%+mem%?(A%+1):=0  +M%=23:"[M23:";~rpc%-2;"]";:A%=rpc%:=0  &AM%=24:"[M24:";~rpc%-2;"]";:A%=rpc%:=0 : [n8,R] 0BM%=25:"[M25:";~rpc%-2;"]";:A%=rpc%:=0 : [n16,R] :+M%=26:"[M26:";~rpc%-2;"]";:A%=rpc%:=0 D@M%=27:"[M27:";~rpc%-2;"]";:A%=rpc%:=0 : [D,R] NBM%=28:"[M28:";~rpc%-2;"]";:A%=rpc%:=0 : [n8,PC] XCM%=29:"[M29:";~rpc%-2;"]";:A%=rpc%:=0 : [n16,PC] b+M%=30:"[M30:";~rpc%-2;"]";:A%=rpc%:=0 l vbM%=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 # ----------------------------- P Specified by a post-byte, after the opcode and before any additional data.  F postbyte data assembler postbyte data assembler ( 0rrnnnnn n,R | 2 1rr00000 ,R+ | 1??10000 C 1rr00001 ,R++ | 1rr10001 [,R++] 2 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] 42 1??01010 | 1??11010 >B 1rr01011 D,R | 1rr11011 [D,R] HD 1xx01100 nn n,PCR | 1xx11100 nn [n,PCR] RF 1xx01101 hh ll n16,PCR | 1xx11101 hh ll [n16,PCR] \2 1??01110 | 1??11110 fB 1??01111 | 10011111 hh ll [n16] p2 | 10111111 z2 | 11011111 2 | 11111111  " rr=00,01,10,11 for R=X,Y,U,S  =0 : Yݤ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 :  opcode execution  ---------------- 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 8 ݤ_18:=0 B 19:REM DAA L: VNݤ_1A:N%=mC0:rp%=rp%(mem%?A%):=0 : ORRCC #nn ` ݤ_1B:=0 jMݤ_1C:N%=mC0:rp%=rp%(mem%?A%):=0 : ANDCC #nn tFݤ_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% (N%&F0)=&10:A%=rx% (N%&F0)=&20:A%=ry% (N%&F0)=&30:A%=ru% (N%&F0)=&40:A%=rs% (N%&F0)=&50:A%=rpc% (N%&F0)=&60:A%=0 (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 2(N%&F0)=&F0:A%=0 <4(N%&F)=&0:M%=256*ra%+rb%:ra%=A%256:rb%=A%255 F(N%&F)=&1:M%=rx%:rx%=A% P(N%&F)=&2:M%=ry%:ry%=A% Z(N%&F)=&3:M%=ru%:ru%=A% d(N%&F)=&4:M%=rs%:rs%=A% n(N%&F)=&5:M%=rpc%:rpc%=A% x(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% (N%&F)=&A:M%=rp%:rp%=A% '(N%&F)=&B:M%=rdp%256:rdp%=256*A% (N%&F)=&C:M%=0:A%=0 (N%&F)=&D:M%=0:A%=0 (N%&F)=&E:M%=0:A%=0 (N%&F)=&F:M%=0:A%=0 '(N%&F0)=&00:ra%=M%256:rb%=M%255 (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% 6(N%&F0)=&90:rb%=M% @(N%&F0)=&A0:rp%=M% J(N%&F0)=&B0:rdp%=M%*256 T(N%&F0)=&C0:A%=0 ^(N%&F0)=&D0:A%=0 h(N%&F0)=&E0:A%=0 r(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% (N%&F0)=&20:A%=ry% (N%&F0)=&30:A%=ru% (N%&F0)=&40:A%=rs% (N%&F0)=&50:A%=rpc% (N%&F0)=&60:A%=0 (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 0-(N%&F)=&0:ra%=(A%&FF00)256:rb%=A%255 :(N%&F)=&1:rx%=A% D(N%&F)=&2:ry%=A% N(N%&F)=&3:ru%=A% X(N%&F)=&4:rs%=A% b(N%&F)=&5:rpc%=A% l(N%&F)=&6:A%=0 v(N%&F)=&7:A%=0 (N%&F)=&8:ra%=A% (N%&F)=&9:rb%=A% (N%&F)=&A:rp%=A% (N%&F)=&B:rdp%=256*A% (N%&F)=&C:A%=0 (N%&F)=&D:A%=0 (N%&F)=&E:A%=0 (N%&F)=&F:A%=0 =0 : Lݤ_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 4Hݤ_28:=br8((rp%2)2) : BVC >Jݤ_29:=br8(rp%2) : BVS HHݤ_2A:=br8((rp%8)8) : BPL RJݤ_2B:=br8(rp%8) : BMI \Qݤ_2C:"{";~rpc%-1;"}";:=br8(((((rp%8)2)(rp%2))2)) : BGE (N EOR V)=0 fSݤ_2D:"[";~rpc%-1;"]";:=br8(((rp%8)2)(rp%2)) : BLT (N EOR V)=1 pbݤ_2E:(rp%4)=0:=br8(1) : BGT Z AND (N EOR V)=0 z "@"; 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 "#"; Z=br8((((rp%4)2)(((rp%8)2)(rp%2)))) : BLE Z AND (N EOR V)=1 : Iݤ_30:N%=mE0:rx%=A%:rp%=(rp%&FB)((rx%=0)4):=0 : LEAX idx Iݤ_31:N%=mE0:ry%=A%:rp%=(rp%&FB)((ry%=0)4):=0 : LEAY idx Nݤ_32:N%=mE0:rs%=A%:=0 : LEAS idx Nݤ_33:N%=mE0:ru%=A%:=0 : LEAU idx : Kݤ_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% 8"(A%1):rs%=rs%-1:mem%?rs%=rp% B=0 LKݤ_35:A%=mem%?rpc%:rpc%=rpc%+1 : PULS V"(A%1):rp%=mem%?rs%:rs%=rs%+1 `"(A%2):ra%=mem%?rs%:rs%=rs%+1 j"(A%4):rb%=mem%?rs%:rs%=rs%+1 t'(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 =0 Kݤ_36:A%=mem%?rpc%:rpc%=rpc%+1 : PSHU ;(A%128):ru%=ru%-2:mem%?ru%=rpc%256:mem%?(ru%+1)=rpc% 8(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% 8(A%16):ru%=ru%-2:mem%?ru%=rx%256:mem%?(ru%+1)=rx% '(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 2"(A%4):rb%=mem%?ru%:ru%=ru%+1 <'(A%8):rdp%=256*mem%?ru%:ru%=ru%+1 F4(A%16):rx%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 P4(A%32):ry%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 Z4(A%64):ru%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 d6(A%128):rpc%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2 n=0 x:  38:REM (cwai) : Xݤ_39:rpc%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2:=0 : RTS Vݤ_3A:rx%=(rx%+rb%)&FFFF:=0 : ABX :  3B:REM RTI  3C:REM CWAI #imm : Zݤ_3D:A%=ra%*rb%:ra%=A%256:rb%=A%255:rp%=(rp%&FA)((A%=0)4)(rb%128):=0: MUL A,B :  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 ,: 6Yݤ_0:N%=0-mem%?A%:cmp8(N%):mem%?A%=N%:=0 : NEG ext h NB: V not set correctly r: |[ݤ_1:N%=0-mem%?A%:cmp8(N%):mem%?A%=N%:=0 : (NEG ext)  NB: V not set correctly : Xݤ_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 0: :Tݤ_4:N%=mem%?A%:rp%=(rp%&FE)(N%1):N%=N%2:mem%?A%=N%:flg8(N%):=0 : LSR ext l V should be preserved v: Vݤ_5:N%=mem%?A%:rp%=(rp%&FE)(N%1):N%=N%2:mem%?A%=N%:flg8(N%):=0 : (LSR ext)  V should be preserved : `ݤ_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 H: RTݤ_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 ext  Is V set correctly? : Yݤ_A:mem%?A%=mem%?A%-1:flg8(mem%?A%):=0 : DEC ext : [ݤ_B:mem%?A%=mem%?A%-1:flg8(mem%?A%):=0 : (DEC ext) L: VYݤ_C:mem%?A%=mem%?A%+1:flg8(mem%?A%):=0 : INC ext : Yݤ_D:flg8(mem%?A%):=0 : TST ext : \ݤ_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 P: ZYݤ_80:ra%=ra%-mem%?A%:cmp8(ra%):ra%=ra%255:=0 : SUBA #imm dXݤ_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 : [ݤ_81:A%=ra%-mem%?A%:cmp8(A%):=0 : CMPA #imm Zݤ_91:A%=ra%-mem%?A%:cmp8(A%):=0 : CMPA ext : [ݤ_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 JVݤ_D2:rb%=rb%-mem%?A%-(rp%1):cmp8(rb%):rb%=rb%255:=0 : SBCB ext h: rtݤ_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 tݤ_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 : Yݤ_84:ra%=ra%mem%?A%:flg8(ra%):=0 : ANDA #imm Xݤ_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 0Xݤ_95:A%=ra%mem%?A%:flg8(A%):=0 : BITA ext NYݤ_C5:A%=rb%mem%?A%:flg8(A%):=0 : BITB #imm XXݤ_D5:A%=rb%mem%?A%:flg8(A%):=0 : BITB ext v: 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 Yݤ_D6:rb%=mem%?A%:flg8(rb%):=0 : LDB ext :  ݤ_87:=0 Yݤ_97:mem%?A%=ra%:flg8(ra%):=0 : STA ext  ݤ_C7:=0  Yݤ_D7:mem%?A%=rb%:flg8(rb%):=0 : STB ext *: 4Yݤ_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 fXݤ_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 ext Wݤ_C9:rb%=rb%+mem%?A%+(rp%1):cmp8(rb%):rb%=rb%255:=0 : ADCB #imm Vݤ_D9:rb%=rb%+mem%?A%+(rp%1):cmp8(rb%):rb%=rb%255:=0 : ADCB ext : Yݤ_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 8: BYݤ_8B:ra%=ra%+mem%?A%:cmp8(ra%):ra%=ra%255:=0 : ADDA #imm LXݤ_9B:ra%=ra%+mem%?A%:cmp8(ra%):ra%=ra%255:=0 : ADDA ext jYݤ_CB:rb%=rb%+mem%?A%:cmp8(rb%):rb%=rb%255:=0 : ADDB #imm tXݤ_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 Zݤ_9C:A%=rx%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPX ext Vݤ_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 2Yݤ_DD:mem%?A%=ra%:mem%?(A%+1)=rb%:flg16(256*ra%+rb%):=0 : STD ext P: ZZݤ_8E:rx%=imm16a:flg16(rx%):=0 : LDX #nnnn dYݤ_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 :  ݤ_8F:=0 Wݤ_9F:mem%?A%=rx%256:mem%?(A%+1)=rx%:flg16(rx%):=0 : STX ext  ݤ_CF:=0 Wݤ_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 6(B%&87)=&85:=0 @(B%&E0)<&20:=0 J(B%&F0)=&30:B%<>&3F:=0 T=("FNg10_"+~B%) ^: hQݤg10_20:=br16(1) : LBRA rQݤ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 Oݤg10_27:=br16(rp%4) : LBEQ Mݤg10_28:=br16((rp%2)2) : LBVC Oݤg10_29:=br16(rp%2) : LBVS Mݤg10_2A:=br16((rp%8)8) : LBPL Oݤg10_2B:=br16(rp%8) : LBMI Tݤg10_2C:=br16(((((rp%8)2)(rp%2))2)) : LBGE (N EOR V)=0 Vݤ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 0: :[ݤg10_83:N%=mF0:A%=256*ra%+rb%-A%:cmp16(A%):=0 : CMPD #nnnn DYݤg10_93:N%=mD0:A%=256*ra%+rb%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPD ext b: l[ݤg10_8C:N%=mF0:A%=ry%-A%:cmp16(A%):=0 : CMPY #nnnn vYݤ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 Xݤg10_9E:N%=mD0:ry%=256*mem%?A%+mem%?(A%+1):flg16(ry%):=0 : LDY ext : Zݤg10_CE:N%=mF0:rs%=A%:flg16(rs%):=0 : LDS #nnnn Xݤ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 Wݤg10_FF:N%=mF0:mem%?A%=rs%256:mem%?(A%+1)=rs%:flg16(rs%):=0 : STS >ext H: R: \ Group 11 opcodes f"ݤ_11:B%=mem%?rpc%:rpc%=rpc%+1 p(B%&C0)<>&80:=0 z"(B%&0F)<>3 (B%&0F)<>12:=0 =("FNg11_"+~B%) :  &3F - SWI3 : [ݤg11_83:N%=mF0:A%=ru%-A%:cmp16(A%):=0 : CMPU #nnnn Yݤg11_93:N%=mD0:A%=ru%-256*mem%?A%-mem%?(A%+1):cmp16(A%):=0 : CMPU ext : [ݤg11_8C:N%=mF0:A%=rs%-A%:cmp16(A%):=0 : CMPS #nnnn Yݤ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%&FF00)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) U debug%8:"OSFILE ";ra%;" ";~fn%-mem%;" ";~X%!2;" ";~X%!6;" ";~X%!10;" ";~X%!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 6$ os%>31: A%=0: Y%=0:ra%=29:=0 @% A%=0: Y%=0:ra%=(&FFDA)&FF:=0 JX%=mem%+X%:swap(0) T Y%=0 Y%=&FFFF ^ Ȏ A% h" 0:!X%=0 : =PTR#0/-1 r" 1: : PTR#0/-1= |" 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 & 0!X%=args(A%,Y%,!X%) : Dswap(0):=0 N: Xݤmos_bget: Y%=0:ra%=:=0 bos%>31:ra%=#Y%:=0 l/A%=&FFD7:ra%=A%&FF:carry(A%&1000000):=0 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 *: 4%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.01 - 24Sep2007 - 6809 disassembly routines @ PSH/PUL shows U or S instead of U/S, shows R, and ,R modes : (ݤDis_Name(A%)="6809" 2$ݤDis_Code(A%,Ptr%,Data%):num%=1 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" 0num%=0:="" :#ݤgrp10:num%=num%+1:op%=Data%?1 D~(op%&E0)=&20:num%=num%+1:="LB"+"RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%15)*2+1,2)+" &"+h0(ljr(256*Data%?1+Data%?2),4) Nop%=&3F:="SWI2" X/(op%&CF)=&83:="CMPD "+mde2((op%&30)16) b/(op%&CF)=&8C:="CMPY "+mde2((op%&30)16) l/(op%&CF)=&8E:="LDY "+mde2((op%&30)16) vop%=&8F;num%=0:="" /(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) 4-ݤidx(A%):R$=reg1((A%&60)32):A%=A%&9F >A%<16:=(A%15)+","+R$ H A%<32:=((A%15)-16)+","+R$ R&O$="":C$="":(A%16):O$="[":C$="]" \ A%=A%15 fA%=0:O$<>"":num%=0:="" pA%=0:=O$+R$+"+,"+C$ zA%=1:=O$+R$+"++,"+C$ A%=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) 8ݤreg2(A%)="XYSU",A%+1,1) BGݤr(A%)="D X Y U S PC????A B CCDP????????",A%*2+1,1-(A%=5 A%>9)) L0ݤjr(A%):A%<128:=Ptr%+2+A% =Ptr%+2-256+A% V5ݤljr(A%):A%<32768:=Ptr%+3+A% =Ptr%+3-65536+A% `ݤstk(A%):A$="" j(A%1):A$=",CC" t(A%2):A$=A$+",A" ~(A%4):A$=A$+",B" (A%8):A$=A$+",DP" (A%16):A$=A$+",X" (A%32):A$=A$+",Y" +(A%64):A$=A$+",U,S",(Data%?02)+1,2) (A%128):A$=A$+",PC"  =A$,2) ! > BLib.Close 1.00 09Aug1998 :  Close Handling ( ~~~~~~~~~~~~~~ 2: <Close_All 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.06 20Apr2020 : # Program Environment Functions (# ============================= 2: 31:>&FFFFF:X%256:ș"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$ nCA%=&600-&7B00*(>&8000)-&3F00*(>&C000):!(-&108)=@%:A%=-&208 x;?(P-3)=0:A%=&100:<&FFFF:A%=-&300:!(+512)=@%:A%= cA$=$A%:=&8F00:run$=A$:ș16A$,,A%:ș72,"",A%:A$=A$,1+A$+" "," ",1+A$," "))):A$=0:A$=run$ UY%=-10:A$=" "+A$:A$=A$,2):A$<>32:A$=34:A%=A$,"""",2)+1 A%=A$+" "," ") 9Y%:run$=A$,1-(A$=34),A%-1+2*(A$=34)):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 ( ---------------------------------- Fexit(A%):"FX1,"+(A%255):quit$=quit$:A$=quit$:quit$="":os(A$) >&FFFFF:Ș A%  ": * > BLib.Generic.FileIO 1.05 22Mar2008 0 v1.05 22Mar2009 Optimised CDIR in FNfile() , v1.04 22Mar2008 FNf_scan strips spaces (7 v1.03 15Feb2008 Add veneer functions in f_ domain 2K v1.02 28Apr2007 Added functions to FNfile on DOS, PROCcdir, FNopenout <7 v1.01 07Sep2006 FNargs avoid zero page on RISC OS F% v1.00 09Aug1988 Initial version P: Z% General File Interface Routines d% =============================== n: x8 FNfile(), PROCgbpb(), FNfs are callable on Windows 8 -------------------------------------------------- : , Returns file type, file info in X%!... , -------------------------------------- Sݤfile(A$,A%):A%<>8:<&FFFFF:$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:=0 -(os%-24):A$="mkdir "+A$ A$="cdir "+A$ >&FFFF: : :=0  A$:=2 :  General OSGBPB call " ------------------- ,%f_gbpb(A%,chn%,addr%,num%,ptr%) 6>?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:<&FFFFF:&FFD1: @A%=1A%=3:#?X%=X%!9 J5:A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% T5X%!1=X%!1+1:X%!5=X%!5-1:(#?X% A%>2) X%!5<1: ^: h#gbpb(A%,chn%,addr%,num%,ptr%) r>?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:<&FFFFF:&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%):>&FFFFF:="" 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%):>&FFFFF:="" 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%):>&FFFFF:="" 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% 0: :7 OSARGS call with data. Returns any returned data D7 ------------------------------------------------- N6ݤf_args(A%,Y%,ptr%): X%,E%:?(P-3)=0:E%=Y%:Y%=0 X b& !&70:X%=&70:!X%=ptr%:&FFDA:=!X% l 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%  : *ݤargsA(A%): 4( X%,Y%,E%,!&70:X%=&70:=(&FFDA)&FF > Hș"OS_Args",A% A% R :=A% \: f& Get current filing system number p& -------------------------------- z.ݤfs:(os%-32)=0: A%,Y%,E%:=(&FFDA)&FF =29 :  Delete an object  ----------------