10 REM > Startup
   20 REM 6809 Tube Emulator written in BASIC
   30 REM v0.10 Initial program based on 65Em
   40 REM v0.11 Added *FLEX, *MOUNT, FNfdc
   50 REM v0.12 Uses big-endian file addresses
   60 REM v0.13 Updated with updates from PDPTube
   70 :
   80 bugfix%=FALSE:REM Error in OS_GetEnv
   90 ON ERROR PROCpr:REPORT:PROCClose_All:PRINT" at line ";ERL:END
  100 A$=FNOS_GetEnv:ver$="0.13":debug%=0:PROCInit:A%=FN_DEBUG(STR$debug%)
  110 IFbugfix%:IFPAGE>&FFFFF:SYS "GetCommandLine" TO name%:IFINSTR($$name%,"bbcwin.exe")=0:A$="-"
  120 IF A$="-":A$=""
  130 quiet%=A$<>""
  140 IF A$="":PRINT"6809 Emulator v"ver$" (C)2014-2015 J.G.Harston"
  150 IF A$="":PRINT"Memory start:  &"FNh0(mem%,8)" MemSz: &"FNh0(mz%,6)" MemMsk: &"FNh0(mm%,6)
  160 IF A$="":PRINT"Program space: &"FNh0(mbot%,6)"-&"FNh0(mtop%,6)"  ";(mtop%-mbot%);" bytes"'
  170 ON ERROR PROCError:A$=""
  180 REM IF A$<>"":IFLEFT$(A$,1)="*":PROCcmd(MID$(A$,2),0) ELSE IF A$<>"":A%=FN_RUN(A$)
  190 IF A$<>"":A%=FN_RUN(A$)
  200 IF run%:PROCGo
  210 IF quiet%:A%=FN_QUIT("")
  220 ON ERROR PROCError:A$=""
  230 quiet%=TRUE:REPEAT INPUT LINE"6809> "A$:PROCcmd(A$,0):UNTIL0
  240 REM Should this line be here instead:
  250 IF A$<>"":IFLEFT$(A$,1)="*":PROCcmd(MID$(A$,2),0) ELSE IF A$<>"":A%=FN_RUN(A$)
  260 END
  270 :
  280 DEFPROCInit
  290 d$=".":s$="/":IFos%AND40:d$="/":s$=".":IFos%>31:d$="\"
  300 IFbugfix%:IFPAGE>&FFFFF:run$=@dir$+"*"
  310 runpath$=run$:IF LEFT$(runpath$,1)="""":runpath$=MID$(runpath$,2,LEN runpath$-2)
  320 REPEAT runpath$=LEFT$(runpath$):UNTIL INSTR(d$+":",RIGHT$(runpath$,1))
  330 IFos%=32:mx%=@vdu%!208:my%=@vdu%!212:mw%=@vdu%!216:mh%=@vdu%!220:mc%=@vdu%?73+1
  340 mz%=FNmemsize:mm%=mz%-1:mtop%=mz%:mbot%=0:run%=FALSE:trace0%=0:trace1%=&FFFF
  350 DIM ctrl% 31,name% 255,mem% mz%:zp%=name%:hdr%=zp%:X%=ctrl%:Y%=X%DIV256
  360 DIM d_path$(3):d_drv%=-1:d_chn%=0:prog%=&F800:err%=&FF00:escflg%=&FF80:osw0%=FALSE
  370 ra%=0:rb%=0:rx%=0:ry%=0:rp%=0:rdp%=0:rs%=0:ru%=0:rpc%=0:errpc%=0
  380 REM Initial state:
  390 REM IF os%>31:OSCLI"Load """+FNf_name(runpath$+"Client09.bin")+""" "+STR$~(mem%+&F800)
  400 REM IF os%<32:OSCLI"Load """+FNf_name(runpath$+"Client09*")+""" "+STR$~(mem%+&F800)
  410 basic$="":IF os%>31:basic$=@dir$+"6809bas.bin" ELSE IF os%=6:basic$="<6809$Basic>"
  420 PROCclient:IF client$<>"":OSCLI "Load """+client$+""" "+STR$~(mem%+&F800)
  430 PROCEscInit:ENDPROC
  440 :
  450 DEFFNmemsize:A%=2^INT(LN(HIMEM-LOMEM-1024)/LN2):IF A%<&10000:=A% ELSE =&10000
  460 DEFPROCclient:client$="":pc%=0:REPEAT
  470   client$=MID$("Tube  ClientSerial",pc%*6+1,6+2*(pc%=0))
  480   IF os%>31:client$=FNf_name(runpath$+client$+"09.bin"ELSE client$=FNf_name(runpath$+client$+"09*")
  490 in%=OPENIN(client$):pc%=pc%+1:UNTIL pc%=3 OR in%<>0
  500 IF in%:CLOSE#in%:in%=0 ELSE client$=""
  510 ENDPROC
  520 :
  530 DEFPROCError:X%=ctrl%:Y%=X%DIV256:errpc%=rpc%:IF INKEY-1:run%=FALSE
  540 IF NOTrun%:PROCpr:REPORT:PROCClose_All:PRINTLEFT$(" at line "+STR$ERL,ERR<128 AND ERR<>17):IF INKEY-1:PROCRegDump
  550 IF ERR=25:IFrun%:IF os%=32:run%=FALSE:VDU 23,22,mx%;my%;mw%,mh%,mc%,128:run%=TRUE:ENDPROC
  560 IF ERR=17:mem%?escflg%=255:rp%=rp%OR(osw0%AND1):IFosw0%:osw0%=FALSE:ENDPROC
  570 REM 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
  580 IF run%:mem%!err%=ERR:mem%?(err%+4)=&3F:mem%?(err%+5)=ERR:A%=ERR<128 AND ERR<>17:$(mem%+err%+6)=LEFT$("6809Em at $"+FNh0(rpc%,4)+": ",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
  590 ENDPROC
  600 DEFPROCpr:IF?(TOP-3):ENDPROC ELSE PRINT:ENDPROC
  610 :
  620 DEFPROCcmd(A$,link%):REPEAT:A$=FNs(A$):IFLEFT$(A$,1)="*":A$=MID$(A$,2)
  630 UNTIL LEFT$(A$,1)<>"*" AND LEFT$(A$,1)<>" ":reset%=0
  640 REM IF A$<>"":IF LEFT$(A$,1)=" ":REPEAT A$=MID$(A$,2):UNTIL LEFT$(A$,1)<>" "
  650 IF A$=""ORLEFT$(A$,1)="|":ENDPROC
  660 REM IF LEFT$(A$,1)="*":OSCLI MID$(A$,2):ENDPROC
  670 IF LEFT$(A$,1)=".":OSCLI "."+MID$(A$,2)+LEFT$(LEFT$("\",LENA$>2)+"*.*",os%=32):ENDPROC
  680 IF LEFT$(A$,1)="/":A$="RUN "+MID$(A$,2)
  690 IF FNuc(LEFT$(A$,2))="FX":IF VALMID$(A$,3) OR (MID$(A$,3,1)="0"):OSCLIA$:ENDPROC
  700 A%=INSTR(A$+" "," "):C$=FNuc(LEFT$(A$,A%-1)):T$=MID$(A$,A%+1)
  710 A%=INSTR(" BASIC CORE DEBUG FLEX GO HELP LOAD MDUMP MDIS MEDIT MOUNT QUIT RUN RESET REG SAVE "," "+C$+" ")
  720 IF A%:A%=EVAL("FN_"+C$+"(T$)"):ENDPROC
  730 A%=FN_run(C$+" "+T$,TRUE):ENDPROC
  740 :
  750 DEFFN_HELP(A$):PRINT'"6809 Emulator ";ver$:IF FNuc(A$)<>"6809":=0
  760 PRINT"  BASIC"'"  CORE  <fsp>"'"  DEBUG (<value> (<lowaddr> <highaddr>))"'"  FLEX  (<drv>)"'"  GO    (<addr>)"'"  HELP"
  770 PRINT"  LOAD  <afsp> <addr>"'"  MDUMP <addr>"'"  MDIS  <addr>"'"  MOUNT <drv> <afsp>"'"  QUIT"'"  RESET (<afsp>)"'"  RUN   <afsp>"
  780 PRINT"  SAVE  <fsp> <start> <end>|+<length> (<exec> (<load>))"
  790 =0
  800 :
  810 DEFFN_MDIS(A$):LOCAL N%,P%,C%
  820 PROCaddrs:P%=start%:N%=16:IF num%<2:size%=256
  830 REPEAT:C%=16:REPEATPRINTFNo0(P%,6);" ";:A$=FNdis(P%)
  840     FOR A%=0 TO N%-1 STEP 2:PRINTFNo0(mem%!(P%+A%)AND&FFFF,6);" ";:NEXT
  850     PRINTSPC(21-3.5*N%);:FOR A%=0 TO N%-1:PRINTFNc(mem%?(P%+A%));:NEXT:PRINTSPC(7-N%);A$
  860   P%=(P%+N%)AND&FFFF:C%=C%-1:size%=size%-N%:UNTIL C%=0 OR size%<0:IF size%>0:A%=GET ELSE A%=0
  870 UNTIL A%=27 OR size%<0:=0
  880 :
  890 DEFFN_MDUMP(A$):LOCAL N%,P%,C%
  900 PROCaddrs:P%=start%:N%=16:IF num%<2:size%=256
  910 REPEAT:C%=16:REPEATPRINTFNh0(P%,4);" ";
  920     FOR A%=0 TO N%-1:PRINTFNh0(mem%?(P%+A%),2);" ";:NEXT
  930     FOR A%=0 TO N%-1:PRINTFNc(mem%?(P%+A%));:NEXT:PRINT
  940   P%=(P%+N%)AND&FFFF:C%=C%-1:size%=size%-N%:UNTIL C%=0 OR size%<0:IF size%>0:A%=GET ELSE A%=0
  950 UNTIL A%=27 OR size%<0:=0
  960 :
  970 DEFFN_MEDIT(A$):=0
  980 :
  990 DEFFN_SAVE(A$)
 1000 PROCfname:PROCaddrs
 1010 IF num%<2:ERROR 252,"Bad address"
 1020 IF start%>=0:start%=mem%+(start%ANDmm%)
 1030 OSCLI "SAVE """+FNf_name(F$)+""" "+STR$~start%+"+"+STR$~size%+" "+STR$~exec%+" "+STR$~load%
 1040 =0
 1050 :
 1060 DEFFN_LOAD(A$)
 1070 PROCfname:PROCaddrs:IF num%=0:load%=-1
 1080 =FN_load(F$,load%,TRUE)
 1090 :
 1100 DEFFN_QUIT(A$):IF VAL A$:halt%=TRUE:=0
 1110 d_chn%=d_chn%:IFd_chn%:A%=d_chn%:d_chn%=0:CLOSE#A%
 1120 PROCClose_All:REM IF os%=31:PRINT"Press SPACE to exit";:A%=GET
 1130 OSCLI"QUIT":=0
 1140 :
 1150 DEFFN_BASIC(A$):A%=FN_basic(A$):rp%=1:rpc%=A%:=FN_go
 1160 DEFFN_basic(A$):IF A$="":A$=basic$:IF A$="":A$="EXBAS09"
 1170 in%=OPENIN(FNf_name(A$)):IF in%:CLOSE#in%:in%=0:A%=FN_LOAD(A$) ELSE A%=FN_LOAD(A$+s$+"bin")
 1180 =A%
 1190 :
 1200 DEFFN_RESET(A$):CLS:A%=-1
 1210 IF FNuc(A$)="TUBE":IF client$<>"":OSCLI"Load """+client$+""" "+STR$~(mem%+&F800):A$=""
 1220 PRINT'$(mem%+&F817)''"Econet Station 128"':A%=FN_basic(A$)
 1230 B%=mem%+A%+9:REPEATVDU?B%:B%=B%+1:UNTIL?B%=0:PRINT'
 1240 rp%=0:rpc%=A%:A$="":=FN_go
 1250 :
 1260 DEFFN_load(RETURN F$,A%,F%)
 1270 in%=0:size%=0:IF A%=-1 THEN
 1280   in%=FNf_openin(F$):IF in%=0:F$=F$+s$+"bin":in%=FNf_openin(F$)
 1290   IF in% THEN
 1300     IF A%<0:IF PAGE<&FFFFF:SYS"XOS_File",5,F$,-1 TO ,,A%:IF(A%AND&FFFFFF00)=&FFFBBC00:A%=&8000
 1310     size%=EXT#in%:PROCgbpb(4,in%,hdr%,256,0)
 1320     IF hdr%!(hdr%?7)=&29432800 THEN
 1330       A%=&8000:IF (hdr%?6 AND 32):A%=hdr%?7:REPEATA%=A%+1:UNTILhdr%?A%=0:A%=hdr%!(A%+1)
 1340     ENDIF
 1350   ELSE
 1360     A%=-2:REM Not found
 1370   ENDIF
 1380 ENDIF
 1390 IF in%:IF F% OR A%=-1:CLOSE#in%:in%=0
 1400 IF A%=-2:IF F%:ERROR 214,"File not found"
 1410 IF A%=-1 OR (A%+size%>mm%):ERROR 252,"Bad address"
 1420 IF F%:OSCLI"Load """+FNf_name(F$)+""" "+STR$~(mem%+A%)
 1430 =A%
 1440 :
 1450 DEFFN_MOUNT(A$)
 1460 IF A$="":FOR A%=0 TO 3:PRINT;A%;" ";d_path$(A%);LEFT$(":"+STR$(A%),d_path$(A%)=""):NEXT:=0
 1470 IF A$="*":FOR drv%=0 TO 3:PROCfdc_info(drv%):NEXT:=0
 1480 IF MID$(A$,2,1)<>" " OR LEFT$(A$,1)<"0" OR LEFT$(A$,3)>"3":OSCLIA$:=0
 1490 A%=VALLEFT$(A$,1):d_path$(A%)=FNs(MID$(A$,3)):=0
 1500 :
 1510 DEFFN_FLEX(A$)
 1520 IF A$="":IF d_path$(0)="":IF os%=6 :A$="0":d_path$(0)="^.Flex09.Flex301/vdk"
 1530 IF A$="":IF d_path$(0)="":IF os%>31:A$="0":d_path$(0)="..\BBCFlex\BBCFLEX6.dsd"
 1540 IF A$="":A$="0"
 1550 IF LENA$>1:d_path$(0)=A$:A$="0"
 1560 IF LENA$<>1 OR (VALA$<0 OR VALA$>3):ERROR 205,"Bad drive":=0
 1570 drv%=VALA$:IF d_path$(drv%)="":ERROR 214,"Only disk images currently supported":=0
 1580 PROCfdc_info(drv%)                        :REM Refresh disk info and display it
 1590 A%=FNfdc_disk(&53,mem%+&C100,drv%,0,0,0,2):REM Load boot loader
 1600 d_exec%=mem%!&C20A AND &FFFF
 1610 rpc%=d_exec%:PROCGo:=0
 1620 :
 1630 DEFPROCsyscmd(cli$):IF os%<>32:OSCLI cli$:ENDPROC
 1640 LOCAL ch%,err$,tmp$:tmp$=@tmp$+STR$TIME+"."
 1650 LOCAL ERROR:ON ERROR LOCAL:RESTORE ERROR:IF ERR=214:OSCLI cli$:ENDPROC ELSE ERROR ERR,REPORT$:ENDPROC
 1660 OSCLI cli$+" 2>"+tmp$:ch%=OPENIN(tmp$):IF ch%=0:ENDPROC
 1670 err$=GET$#ch%:CLOSE#ch%:OSCLI"Delete "+tmp$:IF RIGHT$(err$,1)=",":RIGHT$(err$,1)="."
 1680 ERROR 254,err$:ENDPROC
 1690 :
 1700 DEFFN_RUN(A$)
 1710 IF PAGE<&FFFFF:SYS"XOS_File",5,A$ TO ,,A%:A%=A%AND&FFF00:IF A%=&FFB00 OR A%=&1C700:=FN_BASIC(A$)
 1720 =FN_run(A$,FALSE)
 1730 DEFFN_run(A$,osc%):A$=FNs(A$):IF A$="":=0
 1740 C$=A$:PROCfname:hdr%=zp%:A%=FN_load(F$,-1,FALSE):IF A%<0:IF osc%:PROCsyscmd(C$):=0
 1750 IF A%<0:ERROR 214,"File not found"
 1760 rp%=1:=FN_go
 1770 DEFFN_go
 1780 REM A%  = entry address as 6809 address
 1790 REM F$  =file being loaded or "" if already in memory
 1800 REM hdr%=>Acorn ROM header in mem%+A% address
 1810 ra%=0:rpc%=A%:hdr%=mem%+A%
 1820 IF hdr%!(hdr%?7)=&29432800 THEN
 1830   IF (hdr%?6 AND 64)=0 :ERROR 249,"Not a language":=0
 1840   IF (hdr%?6 AND 15)<>3:ERROR 249,"Not 6809 code":=0
 1850   M%=hdr%-mem%+9:REPEAT:M%=M%+1:UNTILmem%?M%=0:A%=M%+1
 1860   mem%?&FF82=A%DIV256:mem%?&FF83=A%                     :REM Point to version string
 1870   ra%=1                                                 :REM Enter with A=1
 1880 ENDIF
 1890 B%=256*mem%?&FFBA+mem%?&FFBB:A%=B%-2:A%=256*mem%?A%+mem%?(A%+1)         :REM A%=>CLI_WAIT
 1900 REPEAT:A%=A%+1:UNTIL mem%?A%=&34 OR (mem%!A% AND &FFFFFF)=&8CFFBE       :REM A%=>EXECUTE
 1910 mem%!&FF8C=0:mem%?&FF8C=rpc%DIV256:mem%?&FF8D=rpc%:rpc%=A%              :REM Set address and PC
 1920 REPEATB%=B%+1:UNTILmem%!B%=&39303836:B%=B%+7:B%=256*mem%?B%+mem%?(B%+1) :REM B%=>CLIBUF
 1930 IF link%=0:rs%=rpc%-2:IFrs%>prog%:rs%=prog%                :REM Put stack at entry point or top of RAM
 1940 IF link%=0:rs%=rs%-2:mem%?rs%=&FF:mem%?(rs%+1)=&A7         :REM Initialise registers to enter code
 1950 $(mem%+B%)=LEFT$(A$,63):mem%?&FF86=B%DIV256:mem%?&FF87=B%  :REM Store command string and pointer rx%=B%:PROCGo:=0                                           :REM Point X=>command line, start execution
 1960 rx%=B%:PROCGo:=0                                           :REM Point X=>command line, start execution
 1970 :
 1980 DEFFN_REG(A$):A%=INSTR(A$,"="):IFA%=0:=0
 1990 R%=VALLEFT$(A$,A%-1):A%=FNhex(MID$(A$,A%+1))
 2000 IFR%=0:ra%=A%
 2010 IFR%=1:rb%=A%
 2020 IFR%=2:rx%=A%
 2030 IFR%=3:ry%=A%
 2040 IFR%=4:ru%=A%
 2050 IFR%=5:rs%=A%
 2060 IFR%=6:rdp%=A%
 2070 IFR%=7:rp%=A%
 2080 PROCRegDump:=0
 2090 :
 2100 DEFFN_GO(A$):IF A$="":=0
 2110 A%=&FF90:IFA$<>"":IFINSTR("[(",LEFT$(A$,1)):A%=FNhex(MID$(A$,2)) ELSE IFA$<>"":rpc%=FNhex(A$):A%=-1
 2120 IFA%<>-1:rpc%=256*mem%?A%+mem%?(A%+1)
 2130 A%=INSTR(A$,";"):IF A%:A$=MID$(A$,A%+1) ELSE A$=""
 2140 F$="":A%=rpc%:hdr%=mem%+A%:rp%=1:=FN_go
 2150 :
 2160 DEFFN_CORE(A$):REM Dump core
 2170 A$=FNf_name(FNs(LEFT$(A$,INSTR(A$+" "," ")-1))):IFA$="":A$="core"
 2180 OSCLI"Save "+A$+" "+STR$~mem%+"+"+STR$~mz%
 2190 PROCSetType(A$,&FFD)
 2200 =0
 2210 :
 2220 DEFFN_DEBUG(A$):IFA$="":PRINT"1=Register Dump"'"3=Single Step"'"4=Don't emulate MOS calls"'"8=Display MOS calls":=0
 2230 debug%=0:trace0%=0:trace1%=&FFFF:IF FNuc(A$)="OFF":=0
 2240 debug%=EVAL(A$):IF(debug%AND1):IF VPOS<9:REPEAT PRINT:UNTIL VPOS>8
 2250 A%=INSTR(A$," "):IF A%:trace0%=FNhex(MID$(A$,A%+1)):A$=MID$(A$,A%+1)
 2260 A%=INSTR(A$," "):IF A%:trace1%=FNhex(MID$(A$,A%+1))
 2270 =0
 2280 :
 2290 DEFPROCSetType(A$,A%):IF os%>8:ENDPROC
 2300 OSCLI"SetType "+A$+" "+STR$~A%
 2310 ENDPROC
 2320 :
 2330 DEFFNhex(A$)
 2340 IFFNuc(LEFT$(A$,2))="&O":=EVAL("&"+FNh0(FNoct(MID$(A$,3)),8)) ELSE =EVAL("&"+FNuc(A$))
 2350 DEFFNoct(A$):LOCAL A%:REPEAT
 2360   IF A$>"/" AND A$<":":A%=A%*8+VAL LEFT$(A$,1):A$=MID$(A$,2)
 2370 UNTIL NOT(A$>"/" AND A$<":"):=A%
 2380 :
 2390 DEFPROCfname
 2400 IFLEFT$(A$,1)="""":A%=INSTR(A$+"""","""",2):F$=MID$(A$,2,A%-2) ELSE A%=INSTR(A$+" "," "):F$=LEFT$(A$,A%-1)
 2410 A$=FNs(MID$(A$,A%+1)):ENDPROC
 2420 :
 2430 DEFPROCaddrs
 2440 num%=0:start%=0:size%=0:load%=0:exec%=0
 2450 A$=FNs(A$):IF A$="":ENDPROC
 2460 num%=INSTR(A$,"+"):IF num%=0:num%=INSTR(A$+" "," ")
 2470 start%=FNhex(LEFT$(A$,num%-1)):load%=start%:exec%=load%:A$=FNs(MID$(A$,num%)):num%=1:IF A$="":ENDPROC
 2480 IF LEFT$(A$,1)="+":size%=0:A$=FNs(MID$(A$,2)) ELSE size%=start%
 2490 num%=INSTR(A$+" "," "):size%=FNhex(LEFT$(A$,num%-1))-size%:A$=FNs(MID$(A$,num%+1)):num%=2:IF A$="":ENDPROC
 2500 num%=INSTR(A$+" "," "):exec%=FNhex(LEFT$(A$,num%-1)):A$=FNs(MID$(A$,num%+1)):num%=3:IF A$="":ENDPROC
 2510 num%=INSTR(A$+" "," "):load%=FNhex(LEFT$(A$,num%-1)):A$=FNs(MID$(A$,num%+1)):num%=4
 2520 ENDPROC
 2530 :
 2540 DEFPROCRegDump
 2550 PRINT"A=&"FNh0(ra%,2)" X=&"FNh0(rx%,4)" U=&"FNh0(ru%,4)" DP=&"FNh0(rdp%DIV256,2)" PC=&"FNh0(rpc%,4)
 2560 PRINT"B=&"FNh0(rb%,2)" Y=&"FNh0(ry%,4)" S=&"FNh0(rs%,4)" CC=&"FNh0(rp%,2);" ";
 2570 FOR A%=7 TO 0 STEP -1:PRINTMID$("-CVZNIHFE",(((rp%AND(2^A%))<>0)AND(A%+1))+1,1);:NEXT:PRINT"  "
 2580 PRINT " X=&";:PROCDumpLine(rx%):PRINT
 2590 PRINT " Y=&";:PROCDumpLine(ry%):PRINT
 2600 PRINT " U=&";:PROCDumpLine(ru%):PRINT
 2610 PRINT " S=&";:PROCDumpLine(rs%):PRINT
 2620 PRINT "PC=&";:PROCDumpLine(rpc%)
 2630 PRINTFNdis(rpc%);SPC(66-POS)
 2640 ENDPROC
 2650 :
 2660 DEFPROCDumpLine(m%):PRINT FNh0(m%,4)" ";
 2670 FOR B%=m% TO m%+7:PRINT FNc(mem%?B%);:NEXT:VDU32
 2680 FOR B%=m% TO m%+7:PRINT FNh0(mem%?(B%ANDmm%)AND&FF,2)" ";:NEXT
 2690 ENDPROC
 2700 :
 2710 DEFFNdis(A%):LOCAL X%,Y%:X%=ctrl%:Y%=X%DIV256:N%=FNDis_Code(68,A%,mem%+(A%ANDmm%)):=$(X%+4)
 2720 :
 2730 DEFFNc(A%):A%=A%AND255:IF A%<32 OR A%>126:="." ELSE =CHR$ A%
 2740 REM DEFFNstr0(A%):A$="":REPEAT IF?A%>31:A$=A$+CHR$?A%:A%=A%+1
 2750 REM UNTIL?A%<32 OR LEN A$>254:=A$
 2760 :
 2770 DEFPROCEscInit:esch%=esch%:IFesch%:ENDPROC
 2780 IFos%>31 THEN
 2790   DIM P% 36, L% -1:[OPT 8:.escyes:mov byte [edi-1],0:mov eax,-1:ret
 2800   .esch%:mov ecx,256:mov edi,[@vdu%-148]:mov al,27:cld
 2810   repnz scasb:jz escyes:xor eax,eax:ret:.escb%:dw 0:dw 0:]:ENDPROC
 2820 ENDIF
 2830 DIM esch% 31:FOR P=0 TO 1:P%=esch%:[OPT P*2:MOV R11,R11,LSL #1
 2840 LDR R12,escb%:STRB R11,[R12]:MOV PC,R14:.escb%:EQUD mem%+escflg%:]:NEXT:escho%=0:ENDPROC
 2850 DEFPROCEscOff:escho%=escho%:IFescho%:ENDPROC
 2860 IFos%<32:SYS "OS_ChangeEnvironment",9,esch%,0,0 TO ,escho%,escRo%,escbo%:ENDPROC
 2870 OSCLI"ESC OFF":escho%=TRUE:ON TIME IFUSResch%:mem%?escflg%=&FF:RETURN ELSE RETURN
 2880 ENDPROC
 2890 DEFPROCEscOn:escho%=escho%:IFescho%=0:ENDPROC
 2900 IFos%<32:SYS "OS_ChangeEnvironment",9,escho%,escRo%,escbo%:escho%=0:ENDPROC
 2910 ON TIME OFF:escho%=0:OSCLI"ESC ON":ENDPROC
 2920 :
 2930 DEFPROCClose_All
 2940 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
 2950 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
 2960 ENDPROC
 2970 :
 2980 DEFPROCfdc_info(drv%)
 2990 A%=FNfdc_disk(&53,mem%+&C100,drv%,0,0,0,0):IF A%:PRINT"No disk in drive ";drv%:ENDPROC
 3000 PRINT"System Information Record for ";d_title$;":"
 3010 PRINT"Disk shape:";FNd(d_trk%+1,5);" tracks       ";FNd(d_sec%,3);" sectors   ";d_sid%;" sides"
 3020 PRINT"Disk used: ";FNd(d_used%,5);" sectors ";FNd(d_used%*256,8);" bytes ";FNd(d_used%/4,5);"K"
 3030 PRINT"Disk free: ";FNd(d_free%,5);" sectors ";FNd(d_free%*256,8);" bytes ";FNd(d_free%/4,5);"K"
 3040 PRINT"Disk size: ";FNd(d_size%,5);" sectors ";FNd(d_size%*256,8);" bytes ";FNd(d_size%/4,5);"K"
 3050 ENDPROC
 3060 :
 3070 DEFFNfdc_disk(cmd%,add%,drv%,trk%,sid%,sec%,num%):LOCAL ptr%
 3080 IF drv%>3:drv%=(drv%DIV2)+(drv%AND1)
 3090 IF(debug%AND8):PRINT"cmd:";FNh0(cmd%,2);" add:";~add%-mem%;" ";
 3100 IF(debug%AND8):PRINT"drv:";drv%;" trk:";trk%;" sid:";sid%;" sec:";sec%;" num:";num%;" ";
 3110 IF drv%<>d_drv%:IF d_chn%:CLOSE#d_chn%:d_chn%=0        :REM Different drive, close current drive
 3120 IF d_chn%=0 THEN
 3130   IF d_path$(drv%)="":=&1E                             :REM If no mount path, return Drive not present
 3140   d_chn%=OPENUPd_path$(drv%):IF d_chn%=0:=&1E          :REM No drive, return Drive not present
 3150 ENDIF
 3160 IF drv%<>d_drv%:d_drv%=-1:IF FNfdc_exam(drv%):=&1E     :REM No info, return Drive not present
 3170 d_drv%=drv%:IF num%=0:=0                               :REM Just refresh disk info
 3180 IF d_chn%=0:=&1E
 3190 sec%=sec%-d_sec0%
 3200 IF d_sid%=1:ptr%=((sid%*80+trk%)*d_num%+sec%)*d_bps%+d_off%
 3210 IF d_sid%=2:ptr%=((trk%*2 +sid%)*d_num%+sec%)*d_bps%+d_off%
 3220 REM IF(debug%AND8):PRINT"cmd:";FNh0(cmd%,2);" add:";~add%-mem%;" ";
 3230 REM IF(debug%AND8):PRINT"drv:";drv%;" trk:";trk%;" sid:";sid%;" sec:";sec%;" num:";num%;" ";
 3240 IF(debug%AND8):PRINT"ptr:&";FNh0(ptr%,6)
 3250 IF cmd%=&4B:cmd%=1
 3260 IF cmd%=&53:cmd%=3
 3270 IF cmd%=&57:cmd%=3
 3280 IF cmd%=&5B:FOR A%=0 TO d_num%+2:add%!(A%*4)=(A%MODd_num%)*65536:NEXT:=0
 3290 REM IF(debug%AND8):PRINTd_path$(drv%)
 3300 REM IF(debug%AND8):PRINT"cmd:";cmd%;" chn:";d_chn%;" add:";~add%-mem%;" num:";num%*d_bps%;" ptr:";~ptr%
 3310 IF cmd%<5:PROCgbpb(cmd%,d_chn%,add%,num%*d_bps%,ptr%)
 3320 =0
 3330 :
 3340 DEFFNfdc_exam(drv%)
 3350 REM 16-26 Volume name in ASCII
 3360 REM 27-28 Volume number in binary
 3370 REM 29-30 Address of first data sector (Track-Sector)
 3380 REM 31-32 Address of last data sector (Track-Sector)
 3390 REM 33-34 Total number of data sectors in binary
 3400 REM 35-37 Current date (Month-Day-Year) in binary
 3410 REM 38    Highest track number on disk in binary
 3420 REM 39    Highest sector number on a track in binary
 3430 PTR#d_chn%=0
 3440 IF BGET#d_chn%+256*BGET#d_chn%=&6B64 THEN
 3450   d_off%=BGET#d_chn%+256*BGET#d_chn%
 3460   PTR#d_chn%=8
 3470   d_trk%=BGET#d_chn%
 3480   d_sid%=BGET#d_chn%
 3490   d_sec%=(EXT#d_chn%-d_off%) DIV (d_trk%*d_sid%*256)
 3500 ELSE
 3510   d_off%=0
 3520   d_trk%=EXT#d_chn% DIV 2560
 3530   d_sid%=1
 3540   d_sec%=10
 3550 ENDIF
 3560 d_num%=d_sec%:d_bps%=256:d_sec0%=0
 3570 PTR#d_chn%=&221
 3580 d_free%=256*BGET#d_chn%+BGET#d_chn%
 3590 PTR#d_chn%=&226
 3600 d_trk% =BGET#d_chn%
 3610 d_sec% =BGET#d_chn%
 3620 IF d_sec%>19:d_sid%=2 ELSE d_sid%=1
 3630 d_num% =d_sec% DIV d_sid%
 3640 d_size%=(d_trk%+1)*d_sec%
 3650 d_used%=d_size%-d_free%
 3660 PTR#d_chn%=&210:d_title$=""
 3670 REPEAT:A%=BGET#d_chn%:IF A%:d_title$=d_title$+CHR$A%
 3680 UNTILA%=0 OR LENd_title$=12
 3690 =0
   10 REM > 6809
   20 REM 16-Feb-2015 CMPY #nnnn fixed, probably also CMPD #nnnn
   30 REM 21-Sep-2017 CMPU #nnnn, CMPS #nnnn fixed, added more address modes
   40 :
   50 DEFPROCGo:abort%=FALSE:halt%=0:run%=TRUE:PROCEscOff
   60 REPEAT:IF(debug%AND1):IF rpc%>=trace0% AND rpc%<=trace1%:x%=POS:y%=VPOS:VDU30:PROCRegDump:VDU31,x%,y%:IF(debug%AND2):IFGET
   70   REM   B%=mem%?rpc%:rpc%=rpc%+1:UNTIL EVAL("FNm"+STR$~(B%AND&30)+"+FN_"+STR$~(B%AND&CF))
   80   B%=mem%?rpc%:rpc%=rpc%+1
   90   REM   PRINT;~rpc%;" ";~B%;": FNm"+STR$~(B%AND&F0)+"+FN_"+STR$~(B%AND&FF):IFGET
  100 UNTIL EVAL("FNm"+STR$~(B%AND&F0)+"+FN_"+STR$~(B%AND&FF))
  110 PROCEscOn:run%=FALSE:IF NOTquiet% OR abort%:PROCRegDump
  120 ENDPROC
  130 :
  140 :
  150 REM Set flags from result
  160 REM ---------------------
  170 DEFPROCflg8(A%):rp%=(rp%AND&F1)OR(((A%AND255)=0)AND4)OR((A%AND128)DIV16):ENDPROC
  180 DEFPROCcmp8(A%):rp%=(rp%AND&F0)OR(((A%AND255)=0)AND4)OR((A%AND128)DIV16)OR((A%AND256)DIV256):ENDPROC
  190 
  200 REM DEFPROCsub8(A%,B%,R%)
  210 REM PRINT"{";~rp%;
  220 REM rp%=rp%AND&F0                 :REM Drop NZVC
  230 REM rp%=rp%OR((R%AND128)DIV16)    :REM Neg: copy b7 to N
  240 REM rp%=rp%OR(((R%AND255)=0)AND4) :REM Zero
  250 REM rp%=rp%OR((R%AND256)DIV256)   :REM Carry: copy b8 to C
  260 REM A%=((A%EORB%)AND(A%EORR%))AND128
  270 REM rp%=rp%OR(V%DIV64)            :REM Overflow
  280 REM PRINT":";~rp%;"}";
  290 REM ENDPROC
  300 REM
  310 REM DEFPROCadd8(A%,B%,R%)
  320 REM rp%=rp%AND&F0                 :REM Drop NZVC
  330 REM rp%=rp%OR(R%DIV16)            :REM Neg: copy b7 to N
  340 REM rp%=rp%OR(((R%AND255)=0)AND4) :REM Zero
  350 REM rp%=rp%OR(R%DIV256)           :REM Carry: copy b8 to C
  360 REM A%=((NOT(A%EORB%))AND(A%EORR%))AND128
  370 REM rp%=rp%OR(V%DIV64)            :REM Overflow
  380 REM ENDPROC
  390 
  400 
  410 DEFPROCflg16(A%):rp%=(rp%AND&F1)OR(((A%AND65535)=0)AND4)OR((A%AND32768)DIV4096):ENDPROC
  420 DEFPROCcmp16(A%):rp%=(rp%AND&F0)OR(((A%AND65535)=0)AND4)OR((A%AND32768)DIV4096)OR((A%AND65536)DIV65536):ENDPROC
  430 :
  440 REM 8-bit relative branches
  450 REM -----------------------
  460 DEFFNbr8(A%):rpc%=rpc%+1:IFA%=0:=0
  470 IFmem%?(rpc%-1)<128:rpc%=(rpc%+mem%?(rpc%-1))AND&FFFF:=0
  480 rpc%=(rpc%+mem%?(rpc%-1)-256)AND&FFFF:=0
  490 :
  500 REM 16-bit relative branches
  510 REM -----------------------
  520 DEFFNbr16(A%):rpc%=rpc%+2:IFA%=0:=0
  530 IFmem%?(rpc%-2)<128:rpc%=(rpc%+256*mem%?(rpc%-2)+mem%?(rpc%-1))AND&FFFF:=0
  540 rpc%=(rpc%+256*mem%?(rpc%-2)+mem%?(rpc%-1)-65536)AND&FFFF:=0
  550 :
  560 :
  570 REM Address modes. Sets A% pointing to the data for the opcode to use
  580 REM -----------------------------------------------------------------
  590 DEFFNm10
  600 DEFFNm20
  610 DEFFNm30
  620 DEFFNm40
  630 DEFFNm50
  640 =0
  650 :
  660 DEFFNm80
  670 DEFFNmC0
  680 A%=rpc%:rpc%=rpc%+1:=0                                   :REM #imm
  690 :
  700 DEFFNm0
  710 DEFFNm90
  720 DEFFNmD0
  730 A%=rdp%+mem%?rpc%:rpc%=rpc%+1:=0                         :REM <dp
  740 :
  750 DEFFNm70
  760 DEFFNmB0
  770 DEFFNmF0
  780 A%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2:=0            :REM >ext
  790 :
  800 DEFFNm60
  810 DEFFNmA0
  820 DEFFNmE0
  830 A%=mem%?rpc%:rpc%=rpc%+1:M%=A%AND31:N%=A%AND96           :REM idx
  840 IFN%=0 :R%=rx%
  850 IFN%=32:R%=ry%
  860 IFN%=64:R%=ru%
  870 IFN%=96:R%=rs%
  880 :
  890 REM B%=base opcode
  900 REM M%=mode
  910 REM N%=register number*32
  920 REM R%=register contents
  930 :
  940 IFA%<128:IFM%<16:A%=(R%+M%)AND&FFFF:=0                   :REM n,R  n +ve
  950 IFA%<128:IFM%>15:A%=(R%+M%-32)AND&FFFF:=0                :REM n,R  n -ve
  960 IFM%=0 THEN
  970   A%=R%:M%=1
  980   REM        IF(B%AND&BF)=&A3:M%=2
  990   REM        IF(B%AND&BC)=&AC:M%=2
 1000   IFN%=0 :rx%=(rx%+M%)AND&FFFF:=0                        :REM ,X+
 1010   IFN%=32:ry%=(ry%+M%)AND&FFFF:=0                        :REM ,Y+
 1020   IFN%=64:ru%=(ru%+M%)AND&FFFF:=0                        :REM ,U+
 1030   IFN%=96:rs%=(rs%+M%)AND&FFFF:=0                        :REM ,S+
 1040 ENDIF
 1050 IFM%=1 THEN
 1060   A%=R%
 1070   IFN%=0 :rx%=(rx%+2)AND&FFFF:=0                         :REM ,X++
 1080   IFN%=32:ry%=(ry%+2)AND&FFFF:=0                         :REM ,Y++
 1090   IFN%=64:ru%=(ru%+2)AND&FFFF:=0                         :REM ,U++
 1100   IFN%=96:rs%=(rs%+2)AND&FFFF:=0                         :REM ,S++
 1110 ENDIF
 1120 IFM%=2 THEN
 1130   M%=1
 1140   REM     IF(B%AND&BF)=&A3:M%=2
 1150   REM     IF(B%AND&BC)=&AC:M%=2
 1160   IFN%=0 :rx%=(rx%-M%)AND&FFFF:A%=rx%:=0                 :REM ,-X
 1170   IFN%=32:ry%=(ry%-M%)AND&FFFF:A%=ry%:=0                 :REM ,-Y
 1180   IFN%=64:ru%=(ru%-M%)AND&FFFF:A%=ru%:=0                 :REM ,-U
 1190   IFN%=96:rs%=(rs%-M%)AND&FFFF:A%=rs%:=0                 :REM ,-S
 1200 ENDIF
 1210 IFM%=3 THEN
 1220   IFN%=0 :rx%=(rx%-2)AND&FFFF:A%=rx%:=0                  :REM ,--X
 1230   IFN%=32:ry%=(ry%-2)AND&FFFF:A%=ry%:=0                  :REM ,--Y
 1240   IFN%=64:ru%=(ru%-2)AND&FFFF:A%=ru%:=0                  :REM ,--U
 1250   IFN%=96:rs%=(rs%-2)AND&FFFF:A%=rs%:=0                  :REM ,--S
 1260 ENDIF
 1270 IFM%=4:A%=R%:=0                                          :REM ,R
 1280 IFM%=5:A%=(rb%+R%+256*(rb%>127))AND&FFFF:=0              :REM B,R
 1290 IFM%=6:A%=(ra%+R%+256*(ra%>127))AND&FFFF:=0              :REM A,R
 1300 IFM%=7:PRINT"[M07:";~rpc%-2;"]";:A%=rpc%:=0              :REM
 1310 :
 1320 REM M%=mode
 1330 REM N%=register number
 1340 REM R%=register contents
 1350 :
 1360 IFM%=8 THEN
 1370   N%=mem%?rpc%:rpc%=rpc%+1
 1380   A%=(R%+N%+256*(N%>127))AND&FFFF:=0                     :REM n8,R
 1390 ENDIF
 1400 IFM%=9 THEN
 1410   N%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2
 1420   A%=(R%+N%+65536*(N%>32767))AND&FFFF:=0                 :REM n16,R
 1430 ENDIF
 1440 IFM%=10:PRINT"[M10:";~rpc%-2;"]";:A%=rpc%:=0             :REM
 1450 IFM%=11:A%=(ra%*256+rb%+R%)AND&FFFF:=0                   :REM D,R
 1460 IFM%=12 THEN
 1470   N%=mem%?rpc%:rpc%=rpc%+1
 1480   A%=(rpc%+N%+256*(N%>127))AND&FFFF:=0                   :REM n8,PC
 1490 ENDIF
 1500 IFM%=13 THEN
 1510   N%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2
 1520   A%=(rpc%+N%+65536*(N%>32767))AND&FFFF:=0               :REM n16,PC
 1530 ENDIF
 1540 IFM%=14:PRINT"[M14:";~rpc%-2;"]";:A%=rpc%:=0             :REM
 1550 IFM%=15:PRINT"[M15:";~rpc%-2;"]";:A%=rpc%:=0             :REM
 1560 IFM%=16:PRINT"[M16:";~rpc%-2;"]";:A%=rpc%:=0             :REM
 1570 IFM%=17 THEN
 1580   A%=256*mem%?R%+mem%?(R%+1)
 1590   IFN%=0 :rx%=(rx%+2)AND&FFFF:=0                         :REM [,X++]
 1600   IFN%=32:ry%=(ry%+2)AND&FFFF:=0                         :REM [,Y++]
 1610   IFN%=64:ru%=(ru%+2)AND&FFFF:=0                         :REM [,U++]
 1620   IFN%=96:rs%=(rs%+2)AND&FFFF:=0                         :REM [,S++]
 1630 ENDIF
 1640 IFM%=18:PRINT"[M18:";~rpc%-2;"]";:A%=rpc%:=0             :REM
 1650 IFM%=19 THEN
 1660   IFN%=0 :rx%=(rx%-2)AND&FFFF:R%=rx%                     :REM [,--X]
 1670   IFN%=32:ry%=(ry%-2)AND&FFFF:R%=ry%                     :REM [,--Y]
 1680   IFN%=64:ru%=(ru%-2)AND&FFFF:R%=ru%                     :REM [,--U]
 1690   IFN%=96:rs%=(rs%-2)AND&FFFF:R%=rs%                     :REM [,--S]
 1700   A%=256*mem%?R%+mem%?(R%+1):=0
 1710 ENDIF
 1720 IFM%=20:A%=256*mem%?R%+mem%?(R%+1):=0                    :REM [,R]
 1730 IFM%=21 THEN
 1740   A%=(R%+rb%+256*(rb%>127))AND&FFFF                      :REM [B,R]
 1750   A%=256*mem%?A%+mem%?(A%+1):=0
 1760 ENDIF
 1770 IFM%=22 THEN
 1780   A%=(R%+ra%+256*(ra%>127))AND&FFFF                      :REM [A,R]
 1790   A%=256*mem%?A%+mem%?(A%+1):=0
 1800 ENDIF
 1810 IFM%=23:PRINT"[M23:";~rpc%-2;"]";:A%=rpc%:=0
 1820 
 1830 IFM%=24:PRINT"[M24:";~rpc%-2;"]";:A%=rpc%:=0             :REM [n8,R]
 1840 IFM%=25:PRINT"[M25:";~rpc%-2;"]";:A%=rpc%:=0             :REM [n16,R]
 1850 IFM%=26:PRINT"[M26:";~rpc%-2;"]";:A%=rpc%:=0
 1860 IFM%=27:PRINT"[M27:";~rpc%-2;"]";:A%=rpc%:=0             :REM [D,R]
 1870 IFM%=28:PRINT"[M28:";~rpc%-2;"]";:A%=rpc%:=0             :REM [n8,PC]
 1880 IFM%=29:PRINT"[M29:";~rpc%-2;"]";:A%=rpc%:=0             :REM [n16,PC]
 1890 IFM%=30:PRINT"[M30:";~rpc%-2;"]";:A%=rpc%:=0
 1900 
 1910 IFM%=31:IFN%=0:A%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2:A%=256*mem%?A%+mem%?(A%+1):=0 :REM [n16]
 1920 IFM%=31:A%=rpc%:=0
 1930 
 1940 REM Indexed (idx) addressing mode
 1950 REM -----------------------------
 1960 REM Specified by a post-byte, after the opcode and before any additional data.
 1970 REM
 1980 REM postbyte data      assembler        postbyte data      assembler
 1990 REM 0rrnnnnn           n,R           |
 2000 REM 1rr00000           ,R+           |  1??10000
 2010 REM 1rr00001           ,R++          |  1rr10001           [,R++]
 2020 REM 1rr00010           ,-R           |  1??10010
 2030 REM 1rr00011           ,--R          |  1rr10011           [,--R]
 2040 REM 1rr00100           ,R            |  1rr10100           [,R]
 2050 REM 1rr00101           B,R           |  1rr10101           [B,R]
 2060 REM 1rr00110           A,R           |  1rr10110           [A,R]
 2070 REM 1??00111                         |  1??10111
 2080 REM 1rr01000 nn        n,R           |  1rr11000 nn        [n,R]
 2090 REM 1rr01001 hh ll     n16,R         |  1rr11001 hh ll     [n16,R]
 2100 REM 1??01010                         |  1??11010
 2110 REM 1rr01011           D,R           |  1rr11011           [D,R]
 2120 REM 1xx01100 nn        n,PCR         |  1xx11100 nn        [n,PCR]
 2130 REM 1xx01101 hh ll     n16,PCR       |  1xx11101 hh ll     [n16,PCR]
 2140 REM 1??01110                         |  1??11110
 2150 REM 1??01111                         |  10011111 hh ll     [n16]
 2160 REM                                  |  10111111
 2170 REM                                  |  11011111
 2180 REM                                  |  11111111
 2190 REM
 2200 REM rr=00,01,10,11 for R=X,Y,U,S
 2210 REM
 2220 =0
 2230 :
 2240 DEFFNimm16a:A%=256*mem%?A%+mem%?rpc%:rpc%=rpc%+1:=A%               :REM #imm16 after #imm8
 2250 DEFFNimm16b:A%=256*mem%?rpc%+mem%?(rpc%+1):rpc%=rpc%+2:=A%         :REM #imm16
 2260 :
 2270 REM opcode execution
 2280 REM ----------------
 2290 DEFFN_12:=0                                                        :REM NOP
 2300 :
 2310 REM 13:REM SYNC
 2320 DEFFN_14:=0
 2330 DEFFN_15:=0
 2340 DEFFN_16:=FNbr16(1)                                                            :REM LBRA rel
 2350 DEFFN_17:rs%=rs%-2:mem%?rs%=(rpc%+2)DIV256:mem%?(rs%+1)=(rpc%+2):=FNbr16(1):REM LBSR rel
 2360 DEFFN_18:=0
 2370 REM 19:REM DAA
 2380 :
 2390 DEFFN_1A:N%=FNmC0:rp%=rp%OR(mem%?A%):=0                            :REM ORRCC #nn
 2400 DEFFN_1B:=0
 2410 DEFFN_1C:N%=FNmC0:rp%=rp%AND(mem%?A%):=0                           :REM ANDCC #nn
 2420 DEFFN_1D:IFrb%<128:ra%=0 ELSE ra%=255                              :REM SEX
 2430 A%=rp%AND2:PROCflg8(ra%):rp%=rp%ORA%:=0
 2440 :
 2450 DEFFN_1E:N%=mem%?rpc%:rpc%=rpc%+1                                  :REM EXG r0,r1
 2460 IF(N%AND&F0)=&00:A%=256*ra%+rb%
 2470 IF(N%AND&F0)=&10:A%=rx%
 2480 IF(N%AND&F0)=&20:A%=ry%
 2490 IF(N%AND&F0)=&30:A%=ru%
 2500 IF(N%AND&F0)=&40:A%=rs%
 2510 IF(N%AND&F0)=&50:A%=rpc%
 2520 IF(N%AND&F0)=&60:A%=0
 2530 IF(N%AND&F0)=&70:A%=0
 2540 IF(N%AND&F0)=&80:A%=ra%
 2550 IF(N%AND&F0)=&90:A%=rb%
 2560 IF(N%AND&F0)=&A0:A%=rp%
 2570 IF(N%AND&F0)=&B0:A%=rdp%DIV256
 2580 IF(N%AND&F0)=&C0:A%=0
 2590 IF(N%AND&F0)=&D0:A%=0
 2600 IF(N%AND&F0)=&E0:A%=0
 2610 IF(N%AND&F0)=&F0:A%=0
 2620 IF(N%AND&F)=&0:M%=256*ra%+rb%:ra%=A%DIV256:rb%=A%AND255
 2630 IF(N%AND&F)=&1:M%=rx%:rx%=A%
 2640 IF(N%AND&F)=&2:M%=ry%:ry%=A%
 2650 IF(N%AND&F)=&3:M%=ru%:ru%=A%
 2660 IF(N%AND&F)=&4:M%=rs%:rs%=A%
 2670 IF(N%AND&F)=&5:M%=rpc%:rpc%=A%
 2680 IF(N%AND&F)=&6:M%=0:A%=0
 2690 IF(N%AND&F)=&7:M%=0:A%=0
 2700 IF(N%AND&F)=&8:M%=ra%:ra%=A%
 2710 IF(N%AND&F)=&9:M%=rb%:rb%=A%
 2720 IF(N%AND&F)=&A:M%=rp%:rp%=A%
 2730 IF(N%AND&F)=&B:M%=rdp%DIV256:rdp%=256*A%
 2740 IF(N%AND&F)=&C:M%=0:A%=0
 2750 IF(N%AND&F)=&D:M%=0:A%=0
 2760 IF(N%AND&F)=&E:M%=0:A%=0
 2770 IF(N%AND&F)=&F:M%=0:A%=0
 2780 IF(N%AND&F0)=&00:ra%=M%DIV256:rb%=M%AND255
 2790 IF(N%AND&F0)=&10:rx%=M%
 2800 IF(N%AND&F0)=&20:ry%=M%
 2810 IF(N%AND&F0)=&30:ru%=M%
 2820 IF(N%AND&F0)=&40:rs%=M%
 2830 IF(N%AND&F0)=&50:rpc%=M%
 2840 IF(N%AND&F0)=&60:A%=0
 2850 IF(N%AND&F0)=&70:A%=0
 2860 IF(N%AND&F0)=&80:ra%=M%
 2870 IF(N%AND&F0)=&90:rb%=M%
 2880 IF(N%AND&F0)=&A0:rp%=M%
 2890 IF(N%AND&F0)=&B0:rdp%=M%*256
 2900 IF(N%AND&F0)=&C0:A%=0
 2910 IF(N%AND&F0)=&D0:A%=0
 2920 IF(N%AND&F0)=&E0:A%=0
 2930 IF(N%AND&F0)=&F0:A%=0
 2940 =0
 2950 DEFFN_1F:N%=mem%?rpc%:rpc%=rpc%+1                                  :REM TFR r0,r1
 2960 IF(N%AND&F0)=&00:A%=256*ra%+rb%
 2970 IF(N%AND&F0)=&10:A%=rx%
 2980 IF(N%AND&F0)=&20:A%=ry%
 2990 IF(N%AND&F0)=&30:A%=ru%
 3000 IF(N%AND&F0)=&40:A%=rs%
 3010 IF(N%AND&F0)=&50:A%=rpc%
 3020 IF(N%AND&F0)=&60:A%=0
 3030 IF(N%AND&F0)=&70:A%=0
 3040 IF(N%AND&F0)=&80:A%=ra%
 3050 IF(N%AND&F0)=&90:A%=rb%
 3060 IF(N%AND&F0)=&A0:A%=rp%
 3070 IF(N%AND&F0)=&B0:A%=rdp%DIV256
 3080 IF(N%AND&F0)=&C0:A%=0
 3090 IF(N%AND&F0)=&D0:A%=0
 3100 IF(N%AND&F0)=&E0:A%=0
 3110 IF(N%AND&F0)=&F0:A%=0
 3120 IF(N%AND&F)=&0:ra%=(A%AND&FF00)DIV256:rb%=A%AND255
 3130 IF(N%AND&F)=&1:rx%=A%
 3140 IF(N%AND&F)=&2:ry%=A%
 3150 IF(N%AND&F)=&3:ru%=A%
 3160 IF(N%AND&F)=&4:rs%=A%
 3170 IF(N%AND&F)=&5:rpc%=A%
 3180 IF(N%AND&F)=&6:A%=0
 3190 IF(N%AND&F)=&7:A%=0
 3200 IF(N%AND&F)=&8:ra%=A%
 3210 IF(N%AND&F)=&9:rb%=A%
 3220 IF(N%AND&F)=&A:rp%=A%
 3230 IF(N%AND&F)=&B:rdp%=256*A%
 3240 IF(N%AND&F)=&C:A%=0
 3250 IF(N%AND&F)=&D:A%=0
 3260 IF(N%AND&F)=&E:A%=0
 3270 IF(N%AND&F)=&F:A%=0
 3280 =0
 3290 :
 3300 DEFFN_20:=FNbr8(1)                                                    :REM BRA
 3310 DEFFN_21:=FNbr8(0)                                                    :REM BRN
 3320 DEFFN_22:=FNbr8(((rp%AND1)OR((rp%AND4)DIV4))EOR1)                     :REM BHI  (C OR Z)=0
 3330 DEFFN_23:=FNbr8((rp%AND1)OR((rp%AND4)DIV4))                           :REM BLS  (C OR Z)=1
 3340 DEFFN_24:=FNbr8((rp%EOR1)AND1)                                        :REM BCC
 3350 DEFFN_25:=FNbr8(rp%AND1)                                              :REM BCS/BLO
 3360 DEFFN_26:=FNbr8((rp%AND4)EOR4)                                        :REM BNE
 3370 DEFFN_27:=FNbr8(rp%AND4)                                              :REM BEQ
 3380 DEFFN_28:=FNbr8((rp%AND2)EOR2)                                        :REM BVC
 3390 DEFFN_29:=FNbr8(rp%AND2)                                              :REM BVS
 3400 DEFFN_2A:=FNbr8((rp%AND8)EOR8)                                        :REM BPL
 3410 DEFFN_2B:=FNbr8(rp%AND8)                                              :REM BMI
 3420 DEFFN_2C:PRINT"{";~rpc%-1;"}";:=FNbr8(((((rp%AND8)DIV2)EOR(rp%AND2))EOR2))  :REM BGE  (N EOR V)=0
 3430 DEFFN_2D:PRINT"[";~rpc%-1;"]";:=FNbr8(((rp%AND8)DIV2)EOR(rp%AND2))          :REM BLT  (N EOR V)=1
 3440 DEFFN_2E:IF(rp%AND4)=0:=FNbr8(1)                                            :REM BGT  Z AND (N EOR V)=0
 3450 PRINT"@";
 3460 =FNbr8((((rp%AND4)DIV2)AND(((rp%AND8)DIV2)EOR(rp%AND2)))EOR2)               :REM BGT  Z AND (N EOR V)=0
 3470 DEFFN_2F:IF(rp%AND4)=0:=FNbr8(0)                                            :REM BLE  Z AND (N EOR V)=1
 3480 PRINT"#";
 3490 =FNbr8((((rp%AND4)DIV2)AND(((rp%AND8)DIV2)EOR(rp%AND2))))                   :REM BLE  Z AND (N EOR V)=1
 3500 :
 3510 DEFFN_30:N%=FNmE0:rx%=A%:rp%=(rp%AND&FB)OR((rx%=0)AND4):=0         :REM LEAX idx
 3520 DEFFN_31:N%=FNmE0:ry%=A%:rp%=(rp%AND&FB)OR((ry%=0)AND4):=0         :REM LEAY idx
 3530 DEFFN_32:N%=FNmE0:rs%=A%:=0                                        :REM LEAS idx
 3540 DEFFN_33:N%=FNmE0:ru%=A%:=0                                        :REM LEAU idx
 3550 :
 3560 DEFFN_34:A%=mem%?rpc%:rpc%=rpc%+1                                  :REM PSHS
 3570 IF(A%AND128):rs%=rs%-2:mem%?rs%=rpc%DIV256:mem%?(rs%+1)=rpc%
 3580 IF(A%AND64):rs%=rs%-2:mem%?rs%=ru%DIV256:mem%?(rs%+1)=ru%
 3590 IF(A%AND32):rs%=rs%-2:mem%?rs%=ry%DIV256:mem%?(rs%+1)=ry%
 3600 IF(A%AND16):rs%=rs%-2:mem%?rs%=rx%DIV256:mem%?(rs%+1)=rx%
 3610 IF(A%AND8):rs%=rs%-1:mem%?rs%=rdp%DIV256
 3620 IF(A%AND4):rs%=rs%-1:mem%?rs%=rb%
 3630 IF(A%AND2):rs%=rs%-1:mem%?rs%=ra%
 3640 IF(A%AND1):rs%=rs%-1:mem%?rs%=rp%
 3650 =0
 3660 DEFFN_35:A%=mem%?rpc%:rpc%=rpc%+1                                  :REM PULS
 3670 IF(A%AND1):rp%=mem%?rs%:rs%=rs%+1
 3680 IF(A%AND2):ra%=mem%?rs%:rs%=rs%+1
 3690 IF(A%AND4):rb%=mem%?rs%:rs%=rs%+1
 3700 IF(A%AND8):rdp%=256*mem%?rs%:rs%=rs%+1
 3710 IF(A%AND16):rx%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2
 3720 IF(A%AND32):ry%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2
 3730 IF(A%AND64):ru%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2
 3740 IF(A%AND128):rpc%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2
 3750 =0
 3760 DEFFN_36:A%=mem%?rpc%:rpc%=rpc%+1                                  :REM PSHU
 3770 IF(A%AND128):ru%=ru%-2:mem%?ru%=rpc%DIV256:mem%?(ru%+1)=rpc%
 3780 IF(A%AND64):ru%=ru%-2:mem%?ru%=rs%DIV256:mem%?(ru%+1)=rs%
 3790 IF(A%AND32):ru%=ru%-2:mem%?ru%=ry%DIV256:mem%?(ru%+1)=ry%
 3800 IF(A%AND16):ru%=ru%-2:mem%?ru%=rx%DIV256:mem%?(ru%+1)=rx%
 3810 IF(A%AND8):ru%=ru%-1:mem%?ru%=rdp%DIV256
 3820 IF(A%AND4):ru%=ru%-1:mem%?ru%=rb%
 3830 IF(A%AND2):ru%=ru%-1:mem%?ru%=ra%
 3840 IF(A%AND1):ru%=ru%-1:mem%?ru%=rp%
 3850 =0
 3860 DEFFN_37:A%=mem%?rpc%:rpc%=rpc%+1                                  :REM PULU
 3870 IF(A%AND1):rp%=mem%?ru%:ru%=ru%+1
 3880 IF(A%AND2):ra%=mem%?ru%:ru%=ru%+1
 3890 IF(A%AND4):rb%=mem%?ru%:ru%=ru%+1
 3900 IF(A%AND8):rdp%=256*mem%?ru%:ru%=ru%+1
 3910 IF(A%AND16):rx%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2
 3920 IF(A%AND32):ry%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2
 3930 IF(A%AND64):ru%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2
 3940 IF(A%AND128):rpc%=256*mem%?ru%+mem%?(ru%+1):ru%=ru%+2
 3950 =0
 3960 :
 3970 REM 38:REM (cwai)
 3980 :
 3990 DEFFN_39:rpc%=256*mem%?rs%+mem%?(rs%+1):rs%=rs%+2:=0                             :REM RTS
 4000 DEFFN_3A:rx%=(rx%+rb%)AND&FFFF:=0                                                :REM ABX
 4010 :
 4020 REM 3B:REM RTI
 4030 REM 3C:REM CWAI #imm
 4040 :
 4050 DEFFN_3D:A%=ra%*rb%:ra%=A%DIV256:rb%=A%AND255:rp%=(rp%AND&FA)OR((A%=0)AND4)OR(rb%DIV128):=0:REM MUL A,B
 4060 :
 4070 REM 3E:REM (reset)
 4080 :
 4090 REM DEFFN_3F:PRINT'"Error: ";$$(mem%+rpc%+1)+" @ "+STR$ERL:rpc%=errpc%:quiet%=FALSE:=TRUE:REM SWI
 4100 DEFFN_3F:rs%=rs%-12:rp%=rp%OR128:mem%?rs%=rp%:mem%?(rs%+1)=ra%:mem%?(rs%+2)=rb%:mem%?(rs%+3)=rdp%DIV256
 4110 mem%?(rs%+4)=rx%DIV256:mem%?(rs%+5)=rx%:mem%?(rs%+6)=ry%DIV256:mem%?(rs%+7)=ry%
 4120 mem%?(rs%+8)=ru%DIV256:mem%?(rs%+9)=ru%:mem%?(rs%+10)=rpc%DIV256:mem%?(rs%+11)=rpc%
 4130 rpc%=256*mem%?&FEFA+mem%?&FEFB:=0                                                :REM SWI
 4140 :
 4150 DEFFN_0:N%=0-mem%?A%:PROCcmp8(N%):mem%?A%=N%:=0                                  :REM NEG <dp
 4160 DEFFN_40:N%=0-ra%:PROCcmp8(N%):ra%=N%AND255:=0                                   :REM NEGA
 4170 DEFFN_50:N%=0-rb%:PROCcmp8(N%):rb%=N%AND255:=0                                   :REM NEGB
 4180 DEFFN_60:N%=0-mem%?A%:PROCcmp8(N%):mem%?A%=N%:=0                                 :REM NEG idx
 4190 DEFFN_70:N%=0-mem%?A%:PROCcmp8(N%):mem%?A%=N%:=0                                 :REM NEG >ext
 4200 REM NB: V not set correctly
 4210 :
 4220 DEFFN_1:N%=0-mem%?A%:PROCcmp8(N%):mem%?A%=N%:=0                                  :REM (NEG <dp)
 4230 DEFFN_41:N%=0-ra%:PROCcmp8(N%):ra%=N%AND255:=0                                   :REM (NEGA)
 4240 DEFFN_51:N%=0-rb%:PROCcmp8(N%):rb%=N%AND255:=0                                   :REM (NEGB)
 4250 DEFFN_61:N%=0-mem%?A%:PROCcmp8(N%):mem%?A%=N%:=0                                 :REM (NEG idx)
 4260 DEFFN_71:N%=0-mem%?A%:PROCcmp8(N%):mem%?A%=N%:=0                                 :REM (NEG >ext)
 4270 REM NB: V not set correctly
 4280 :
 4290 DEFFN_2:mem%?A%=mem%?A%EOR255:PROCflg8(mem%?A%):rp%=rp%OR1:=0                    :REM (COM <dp)
 4300 DEFFN_42:ra%=ra%EOR255:PROCflg8(ra%):rp%=rp%OR1:=0                               :REM (COMA)
 4310 DEFFN_52:rb%=rb%EOR255:PROCflg8(rb%):rp%=rp%OR1:=0                               :REM (COMB)
 4320 DEFFN_62:mem%?A%=mem%?A%EOR255:PROCflg8(mem%?A%):rp%=rp%OR1:=0                   :REM (COM idx)
 4330 DEFFN_72:mem%?A%=mem%?A%EOR255:PROCflg8(mem%?A%):rp%=rp%OR1:=0                   :REM (COM >ext)
 4340 :
 4350 DEFFN_3:mem%?A%=mem%?A%EOR255:PROCflg8(mem%?A%):rp%=rp%OR1:=0                    :REM COM <dp
 4360 DEFFN_43:ra%=ra%EOR255:PROCflg8(ra%):rp%=rp%OR1:=0                               :REM COMA
 4370 DEFFN_53:rb%=rb%EOR255:PROCflg8(rb%):rp%=rp%OR1:=0                               :REM COMB
 4380 DEFFN_63:mem%?A%=mem%?A%EOR255:PROCflg8(mem%?A%):rp%=rp%OR1:=0                   :REM COM idx
 4390 DEFFN_73:mem%?A%=mem%?A%EOR255:PROCflg8(mem%?A%):rp%=rp%OR1:=0                   :REM COM >ext
 4400 :
 4410 DEFFN_4:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0  :REM LSR <dp
 4420 DEFFN_44:ra%=ra%:rp%=(rp%AND&FE)OR(ra%AND1):ra%=ra%DIV2:PROCflg8(ra%):=0           :REM LSRA
 4430 DEFFN_54:rb%=rb%:rp%=(rp%AND&FE)OR(rb%AND1):rb%=rb%DIV2:PROCflg8(rb%):=0           :REM LSRB
 4440 DEFFN_64:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0 :REM LSR idx
 4450 DEFFN_74:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0 :REM LSR >ext
 4460 REM V should be preserved
 4470 :
 4480 DEFFN_5:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0  :REM (LSR <dp)
 4490 DEFFN_45:ra%=ra%:rp%=(rp%AND&FE)OR(ra%AND1):ra%=ra%DIV2:PROCflg8(ra%):=0           :REM (LSRA)
 4500 DEFFN_55:rb%=rb%:rp%=(rp%AND&FE)OR(rb%AND1):rb%=rb%DIV2:PROCflg8(rb%):=0           :REM (LSRB)
 4510 DEFFN_65:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0 :REM (LSR idx)
 4520 DEFFN_75:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0 :REM (LSR >ext)
 4530 REM V should be preserved
 4540 :
 4550 DEFFN_6:N%=mem%?A%+256*(rp%AND1):rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0  :REM ROR <dp
 4560 DEFFN_46:ra%=ra%+256*(rp%AND1):rp%=(rp%AND&FE)OR(ra%AND1):ra%=ra%DIV2:PROCflg8(ra%):=0           :REM RORA
 4570 DEFFN_56:rb%=rb%+256*(rp%AND1):rp%=(rp%AND&FE)OR(rb%AND1):rb%=rb%DIV2:PROCflg8(rb%):=0           :REM RORB
 4580 DEFFN_66:N%=mem%?A%+256*(rp%AND1):rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0 :REM ROR idx
 4590 DEFFN_76:N%=mem%?A%+256*(rp%AND1):rp%=(rp%AND&FE)OR(N%AND1):N%=N%DIV2:mem%?A%=N%:PROCflg8(N%):=0 :REM ROR >ext
 4600 REM V should be preserved
 4610 :
 4620 DEFFN_7:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=(N%DIV2)OR(N%AND128):mem%?A%=N%:PROCflg8(N%):=0  :REM LSR <dp
 4630 DEFFN_47:ra%=ra%:rp%=(rp%AND&FE)OR(ra%AND1):ra%=(ra%DIV2)OR(N%AND128):PROCflg8(ra%):=0           :REM LSRA
 4640 DEFFN_57:rb%=rb%:rp%=(rp%AND&FE)OR(rb%AND1):rb%=(rb%DIV2)OR(N%AND128):PROCflg8(rb%):=0           :REM LSRB
 4650 DEFFN_67:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=(N%DIV2)OR(N%AND128):mem%?A%=N%:PROCflg8(N%):=0 :REM LSR idx
 4660 DEFFN_77:N%=mem%?A%:rp%=(rp%AND&FE)OR(N%AND1):N%=(N%DIV2)OR(N%AND128):mem%?A%=N%:PROCflg8(N%):=0 :REM LSR >ext
 4670 REM V should be preserved
 4680 :
 4690 DEFFN_8:N%=mem%?A%*2:mem%?A%=N%:PROCflg8(N%):rp%=(rp%AND&FE)OR(N%DIV256):=0      :REM ASL <dp
 4700 DEFFN_48:ra%=ra%*2:PROCflg8(ra%):rp%=(rp%AND&FE)OR(ra%DIV256):ra%=ra%AND255:=0   :REM ASLA
 4710 DEFFN_58:rb%=rb%*2:PROCflg8(rb%):rp%=(rp%AND&FE)OR(rb%DIV256):rb%=rb%AND255:=0   :REM ASLB
 4720 DEFFN_68:N%=mem%?A%*2:mem%?A%=N%:PROCflg8(N%):rp%=(rp%AND&FE)OR(N%DIV256):=0     :REM ASL idx
 4730 DEFFN_78:N%=mem%?A%*2:mem%?A%=N%:PROCflg8(N%):rp%=(rp%AND&FE)OR(N%DIV256):=0     :REM ASL >ext
 4740 REM V not set correctly
 4750 :
 4760 DEFFN_9:N%=mem%?A%*2+(rp%AND1):mem%?A%=N%:PROCflg8(N%):rp%=(rp%AND&FC)OR(N%DIV256)OR((((N%EOR(N%DIV2))AND128))DIV64):=0      :REM ROL <dp
 4770 DEFFN_49:ra%=ra%*2+(rp%AND1):PROCflg8(ra%):rp%=(rp%AND&FC)OR(ra%DIV256)OR((((ra%EOR(ra%DIV2))AND128))DIV64):ra%=ra%AND255:=0 :REM ROLA
 4780 DEFFN_59:rb%=rb%*2+(rp%AND1):PROCflg8(rb%):rp%=(rp%AND&FC)OR(rb%DIV256)OR((((rb%EOR(rb%DIV2))AND128))DIV64):rb%=rb%AND255:=0 :REM ROLB
 4790 DEFFN_69:N%=mem%?A%*2+(rp%AND1):mem%?A%=N%:PROCflg8(N%):rp%=(rp%AND&FC)OR(N%DIV256)OR((((N%EOR(N%DIV2))AND128))DIV64):=0     :REM ROL idx
 4800 DEFFN_79:N%=mem%?A%*2+(rp%AND1):mem%?A%=N%:PROCflg8(N%):rp%=(rp%AND&FC)OR(N%DIV256)OR((((N%EOR(N%DIV2))AND128))DIV64):=0     :REM ROL >ext
 4810 REM Is V set correctly?
 4820 :
 4830 DEFFN_A:mem%?A%=mem%?A%-1:PROCflg8(mem%?A%):=0                                   :REM DEC <dp
 4840 DEFFN_4A:ra%=(ra%-1)AND255:PROCflg8(ra%):=0                                      :REM DECA
 4850 DEFFN_5A:rb%=(rb%-1)AND255:PROCflg8(rb%):=0                                      :REM DECA
 4860 DEFFN_6A:mem%?A%=mem%?A%-1:PROCflg8(mem%?A%):=0                                  :REM DEC idx
 4870 DEFFN_7A:mem%?A%=mem%?A%-1:PROCflg8(mem%?A%):=0                                  :REM DEC >ext
 4880 :
 4890 DEFFN_B:mem%?A%=mem%?A%-1:PROCflg8(mem%?A%):=0                                   :REM (DEC <dp)
 4900 DEFFN_4B:ra%=(ra%-1)AND255:PROCflg8(ra%):=0                                      :REM (DECA)
 4910 DEFFN_5B:rb%=(rb%-1)AND255:PROCflg8(rb%):=0                                      :REM (DECA)
 4920 DEFFN_6B:mem%?A%=mem%?A%-1:PROCflg8(mem%?A%):=0                                  :REM (DEC idx)
 4930 DEFFN_7B:mem%?A%=mem%?A%-1:PROCflg8(mem%?A%):=0                                  :REM (DEC >ext)
 4940 :
 4950 DEFFN_C:mem%?A%=mem%?A%+1:PROCflg8(mem%?A%):=0                                   :REM INC <dp
 4960 DEFFN_4C:ra%=(ra%+1)AND255:PROCflg8(ra%):=0                                      :REM INCA
 4970 DEFFN_5C:rb%=(rb%+1)AND255:PROCflg8(rb%):=0                                      :REM INCA
 4980 DEFFN_6C:mem%?A%=mem%?A%+1:PROCflg8(mem%?A%):=0                                  :REM INC idx
 4990 DEFFN_7C:mem%?A%=mem%?A%+1:PROCflg8(mem%?A%):=0                                  :REM INC >ext
 5000 :
 5010 DEFFN_D:PROCflg8(mem%?A%):=0                                                     :REM TST <dp
 5020 DEFFN_4D:PROCflg8(ra%):=0                                                        :REM TSTA
 5030 DEFFN_5D:PROCflg8(rb%):=0                                                        :REM TSTB
 5040 DEFFN_6D:PROCflg8(mem%?A%):=0                                                    :REM TST idx
 5050 DEFFN_7D:PROCflg8(mem%?A%):=0                                                    :REM TST >ext
 5060 :
 5070 DEFFN_E:rpc%=A%:=0                                                               :REM JMP <dp
 5080 DEFFN_4E:ra%=0:rp%=(rp%AND&F0)OR4:=0                                             :REM (CLRA)
 5090 DEFFN_5E:rb%=0:rp%=(rp%AND&F0)OR4:=0                                             :REM (CLRB)
 5100 DEFFN_6E:rpc%=A%:=0                                                              :REM JMP idx
 5110 DEFFN_7E:N%=rpc%-3:IF N%<&FFCE OR (debug%AND4)=4:rpc%=A%:=0                      :REM JMP >ext
 5120 IF N%<>&FFF7:A%=FN_39:=FNmos(N%)                                                 :REM Do MOS call
 5130 A%=FNmos(N%):=FN_39                                                              :REM Do MOS call
 5140 :
 5150 DEFFN_F:mem%?A%=0:rp%=(rp%AND&F0)OR4:=0                                          :REM CLR <dp
 5160 DEFFN_4F:ra%=0:rp%=(rp%AND&F0)OR4:=0                                             :REM CLRA
 5170 DEFFN_5F:rb%=0:rp%=(rp%AND&F0)OR4:=0                                             :REM CLRB
 5180 DEFFN_6F:mem%?A%=0:rp%=(rp%AND&F0)OR4:=0                                         :REM CLR idx
 5190 DEFFN_7F:mem%?A%=0:rp%=(rp%AND&F0)OR4:=0                                         :REM CLR >ext
 5200 :
 5210 DEFFN_80:ra%=ra%-mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM SUBA #imm
 5220 DEFFN_90:ra%=ra%-mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM SUBA <dp
 5230 DEFFN_A0:ra%=ra%-mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM SUBA idx
 5240 DEFFN_B0:ra%=ra%-mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM SUBA >ext
 5250 DEFFN_C0:rb%=rb%-mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM SUBB #imm
 5260 DEFFN_D0:rb%=rb%-mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM SUBB <dp
 5270 DEFFN_E0:rb%=rb%-mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM SUBB idx
 5280 DEFFN_F0:rb%=rb%-mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM SUBB >ext
 5290 :
 5300 DEFFN_81:A%=ra%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPA #imm
 5310 DEFFN_91:A%=ra%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPA <dp
 5320 DEFFN_A1:A%=ra%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPA idx
 5330 DEFFN_B1:A%=ra%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPA >ext
 5340 :
 5350 DEFFN_C1:A%=rb%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPB #imm
 5360 DEFFN_D1:A%=rb%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPB <dp
 5370 DEFFN_E1:A%=rb%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPB idx
 5380 DEFFN_F1:A%=rb%-mem%?A%:PROCcmp8(A%):=0                                          :REM CMPB >ext
 5390 :
 5400 DEFFN_82:ra%=ra%-mem%?A%-(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM SBCA #imm
 5410 DEFFN_92:ra%=ra%-mem%?A%-(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM SBCA <dp
 5420 DEFFN_A2:ra%=ra%-mem%?A%-(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM SBCA idx
 5430 DEFFN_B2:ra%=ra%-mem%?A%-(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM SBCA >ext
 5440 DEFFN_C2:rb%=rb%-mem%?A%-(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM SBCB #imm
 5450 DEFFN_D2:rb%=rb%-mem%?A%-(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM SBCB <dp
 5460 DEFFN_E2:rb%=rb%-mem%?A%-(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM SBCB idx
 5470 DEFFN_F2:rb%=rb%-mem%?A%-(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM SBCB >ext
 5480 :
 5490 DEFFN_83:rb%=256*ra%+rb%:rb%=rb%-FNimm16a:PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0                :REM SUBD #imm
 5500 DEFFN_93:rb%=256*ra%+rb%:rb%=rb%-256*mem%?A%-mem%?(A%+1):PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0 :REM SUBD <dp
 5510 DEFFN_A3:rb%=256*ra%+rb%:rb%=rb%-256*mem%?A%-mem%?(A%+1):PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0 :REM SUBD idx
 5520 DEFFN_B3:rb%=256*ra%+rb%:rb%=rb%-256*mem%?A%-mem%?(A%+1):PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0 :REM SUBD >ext
 5530 DEFFN_C3:rb%=256*ra%+rb%:rb%=rb%+FNimm16a:PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0                :REM ADDD #imm
 5540 DEFFN_D3:rb%=256*ra%+rb%:rb%=rb%+256*mem%?A%+mem%?(A%+1):PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0 :REM ADDD <dp
 5550 DEFFN_E3:rb%=256*ra%+rb%:rb%=rb%+256*mem%?A%+mem%?(A%+1):PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0 :REM ADDD idx
 5560 DEFFN_F3:rb%=256*ra%+rb%:rb%=rb%+256*mem%?A%+mem%?(A%+1):PROCcmp16(rb%):ra%=(rb%AND&FF00)DIV256:rb%=rb%AND255:=0 :REM ADDD >ext
 5570 :
 5580 DEFFN_84:ra%=ra%ANDmem%?A%:PROCflg8(ra%):=0                                      :REM ANDA #imm
 5590 DEFFN_94:ra%=ra%ANDmem%?A%:PROCflg8(ra%):=0                                      :REM ANDA <dp
 5600 DEFFN_A4:ra%=ra%ANDmem%?A%:PROCflg8(ra%):=0                                      :REM ANDA idx
 5610 DEFFN_B4:ra%=ra%ANDmem%?A%:PROCflg8(ra%):=0                                      :REM ANDA >ext
 5620 DEFFN_C4:rb%=rb%ANDmem%?A%:PROCflg8(rb%):=0                                      :REM ANDB #imm
 5630 DEFFN_D4:rb%=rb%ANDmem%?A%:PROCflg8(rb%):=0                                      :REM ANDB <dp
 5640 DEFFN_E4:rb%=rb%ANDmem%?A%:PROCflg8(rb%):=0                                      :REM ANDB idx
 5650 DEFFN_F4:rb%=rb%ANDmem%?A%:PROCflg8(rb%):=0                                      :REM ANDB >ext
 5660 :
 5670 DEFFN_85:A%=ra%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITA #imm
 5680 DEFFN_95:A%=ra%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITA <dp
 5690 DEFFN_A5:A%=ra%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITA idx
 5700 DEFFN_B5:A%=ra%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITA >ext
 5710 DEFFN_C5:A%=rb%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITB #imm
 5720 DEFFN_D5:A%=rb%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITB <dp
 5730 DEFFN_E5:A%=rb%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITB idx
 5740 DEFFN_F5:A%=rb%ANDmem%?A%:PROCflg8(A%):=0                                        :REM BITB >ext
 5750 :
 5760 DEFFN_86:ra%=mem%?A%:PROCflg8(ra%):=0                                            :REM LDA #nn
 5770 DEFFN_96:ra%=mem%?A%:PROCflg8(ra%):=0                                            :REM LDA <dp
 5780 DEFFN_A6:ra%=mem%?A%:PROCflg8(ra%):=0                                            :REM LDA idx
 5790 DEFFN_B6:ra%=FNio_rd(A%):PROCflg8(ra%):=0                                        :REM LDA >ext
 5800 DEFFN_C6:rb%=mem%?A%:PROCflg8(rb%):=0                                            :REM LDB #imm
 5810 DEFFN_D6:rb%=mem%?A%:PROCflg8(rb%):=0                                            :REM LDB <dp
 5820 DEFFN_E6:rb%=mem%?A%:PROCflg8(rb%):=0                                            :REM LDB idx
 5830 DEFFN_F6:rb%=FNio_rd(A%):PROCflg8(rb%):=0                                        :REM LDB >ext
 5840 :
 5850 DEFFN_87:=0
 5860 DEFFN_97:mem%?A%=ra%:PROCflg8(ra%):=0                                            :REM STA <dp
 5870 DEFFN_A7:mem%?A%=ra%:PROCflg8(ra%):=0                                            :REM STA idx
 5880 DEFFN_B7:PROCio_wr(A%,ra%):PROCflg8(ra%):=0                                      :REM STA >ext
 5890 DEFFN_C7:=0
 5900 DEFFN_D7:mem%?A%=rb%:PROCflg8(rb%):=0                                            :REM STB <dp
 5910 DEFFN_E7:mem%?A%=rb%:PROCflg8(rb%):=0                                            :REM STB idx
 5920 DEFFN_F7:PROCio_wr(A%,rb%):PROCflg8(rb%):=0                                      :REM STB >ext
 5930 :
 5940 DEFFN_88:ra%=ra%EORmem%?A%:PROCflg8(ra%):=0                                      :REM EORA #imm
 5950 DEFFN_98:ra%=ra%EORmem%?A%:PROCflg8(ra%):=0                                      :REM EORA <dp
 5960 DEFFN_A8:ra%=ra%EORmem%?A%:PROCflg8(ra%):=0                                      :REM EORA idx
 5970 DEFFN_B8:ra%=ra%EORmem%?A%:PROCflg8(ra%):=0                                      :REM EORA >ext
 5980 DEFFN_C8:rb%=rb%EORmem%?A%:PROCflg8(rb%):=0                                      :REM EORB #imm
 5990 DEFFN_D8:rb%=rb%EORmem%?A%:PROCflg8(rb%):=0                                      :REM EORB <dp
 6000 DEFFN_E8:rb%=rb%EORmem%?A%:PROCflg8(rb%):=0                                      :REM EORB idx
 6010 DEFFN_F8:rb%=rb%EORmem%?A%:PROCflg8(rb%):=0                                      :REM EORB >ext
 6020 :
 6030 DEFFN_89:ra%=ra%+mem%?A%+(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM ADCA #imm
 6040 DEFFN_99:ra%=ra%+mem%?A%+(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM ADCA <dp
 6050 DEFFN_A9:ra%=ra%+mem%?A%+(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM ADCA idx
 6060 DEFFN_B9:ra%=ra%+mem%?A%+(rp%AND1):PROCcmp8(ra%):ra%=ra%AND255:=0                :REM ADCA >ext
 6070 DEFFN_C9:rb%=rb%+mem%?A%+(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM ADCB #imm
 6080 DEFFN_D9:rb%=rb%+mem%?A%+(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM ADCB <dp
 6090 DEFFN_E9:rb%=rb%+mem%?A%+(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM ADCB idx
 6100 DEFFN_F9:rb%=rb%+mem%?A%+(rp%AND1):PROCcmp8(rb%):rb%=rb%AND255:=0                :REM ADCB >ext
 6110 :
 6120 DEFFN_8A:ra%=ra%ORmem%?A%:PROCflg8(ra%):=0                                       :REM ORA #imm
 6130 DEFFN_9A:ra%=ra%ORmem%?A%:PROCflg8(ra%):=0                                       :REM ORA <dp
 6140 DEFFN_AA:ra%=ra%ORmem%?A%:PROCflg8(ra%):=0                                       :REM ORA idx
 6150 DEFFN_BA:ra%=ra%ORmem%?A%:PROCflg8(ra%):=0                                       :REM ORA >ext
 6160 DEFFN_CA:rb%=rb%ORmem%?A%:PROCflg8(rb%):=0                                       :REM ORB #imm
 6170 DEFFN_DA:rb%=rb%ORmem%?A%:PROCflg8(rb%):=0                                       :REM ORB <dp
 6180 DEFFN_EA:rb%=rb%ORmem%?A%:PROCflg8(rb%):=0                                       :REM ORB idx
 6190 DEFFN_FA:rb%=rb%ORmem%?A%:PROCflg8(rb%):=0                                       :REM ORB >ext
 6200 :
 6210 DEFFN_8B:ra%=ra%+mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM ADDA #imm
 6220 DEFFN_9B:ra%=ra%+mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM ADDA <dp
 6230 DEFFN_AB:ra%=ra%+mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM ADDA idx
 6240 DEFFN_BB:ra%=ra%+mem%?A%:PROCcmp8(ra%):ra%=ra%AND255:=0                          :REM ADDA >ext
 6250 DEFFN_CB:rb%=rb%+mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM ADDB #imm
 6260 DEFFN_DB:rb%=rb%+mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM ADDB <dp
 6270 DEFFN_EB:rb%=rb%+mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM ADDB idx
 6280 DEFFN_FB:rb%=rb%+mem%?A%:PROCcmp8(rb%):rb%=rb%AND255:=0                          :REM ADDB >ext
 6290 :
 6300 REMFN_8C:N%=FNmF0:A%=rx%-A%:PROCcmp16(A%):=0                                     :REM CMPX #imm
 6310 DEFFN_8C:A%=rx%-FNimm16a:PROCcmp16(A%):=0                                        :REM CMPX #imm
 6320 DEFFN_9C:A%=rx%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0                         :REM CMPX <dp
 6330 DEFFN_AC:A%=rx%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0                         :REM CMPX idx
 6340 DEFFN_BC:A%=rx%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0                         :REM CMPX >ext
 6350 DEFFN_CC:A%=FNimm16a:rb%=A%AND255:ra%=A%DIV256:PROCflg16(A%):=0                  :REM LDD #nnnn
 6360 DEFFN_DC:A%=256*mem%?A%+mem%?(A%+1):rb%=A%AND255:ra%=A%DIV256:PROCflg16(A%):=0   :REM LDD <dp
 6370 DEFFN_EC:A%=256*mem%?A%+mem%?(A%+1):rb%=A%AND255:ra%=A%DIV256:PROCflg16(A%):=0   :REM LDD idx
 6380 DEFFN_FC:A%=256*mem%?A%+mem%?(A%+1):rb%=A%AND255:ra%=A%DIV256:PROCflg16(A%):=0   :REM LDD >ext
 6390 :
 6400 DEFFN_8D:rs%=rs%-2:mem%?rs%=rpc%DIV256:mem%?(rs%+1)=rpc%:rpc%=rpc%-1:=FNbr8(1)   :REM BSR rel
 6410 DEFFN_9D:rs%=rs%-2:mem%?rs%=rpc%DIV256:mem%?(rs%+1)=rpc%:rpc%=A%:=0              :REM JSR <dp
 6420 DEFFN_AD:rs%=rs%-2:mem%?rs%=rpc%DIV256:mem%?(rs%+1)=rpc%:rpc%=A%:=0              :REM JSR idx
 6430 DEFFN_BD:rs%=rs%-2:mem%?rs%=rpc%DIV256:mem%?(rs%+1)=rpc%:rpc%=A%:=0              :REM JSR >ext
 6440 DEFFN_CD:=0
 6450 DEFFN_DD:mem%?A%=ra%:mem%?(A%+1)=rb%:PROCflg16(256*ra%+rb%):=0                   :REM STD <dp
 6460 DEFFN_ED:mem%?A%=ra%:mem%?(A%+1)=rb%:PROCflg16(256*ra%+rb%):=0                   :REM STD idx
 6470 DEFFN_FD:mem%?A%=ra%:mem%?(A%+1)=rb%:PROCflg16(256*ra%+rb%):=0                   :REM STD >ext
 6480 :
 6490 DEFFN_8E:rx%=FNimm16a:PROCflg16(rx%):=0                                          :REM LDX #nnnn
 6500 DEFFN_9E:rx%=256*mem%?A%+mem%?(A%+1):PROCflg16(rx%):=0                           :REM LDX <dp
 6510 DEFFN_AE:rx%=256*mem%?A%+mem%?(A%+1):PROCflg16(rx%):=0                           :REM LDX idx
 6520 DEFFN_BE:rx%=256*mem%?A%+mem%?(A%+1):PROCflg16(rx%):=0                           :REM LDX >ext
 6530 DEFFN_CE:ru%=FNimm16a:PROCflg16(ru%):=0                                          :REM LDU #nnnn
 6540 DEFFN_DE:ru%=256*mem%?A%+mem%?(A%+1):PROCflg16(ru%):=0                           :REM LDU <dp
 6550 DEFFN_EE:ru%=256*mem%?A%+mem%?(A%+1):PROCflg16(ru%):=0                           :REM LDU idx
 6560 DEFFN_FE:ru%=256*mem%?A%+mem%?(A%+1):PROCflg16(ru%):=0                           :REM LDU >ext
 6570 :
 6580 DEFFN_8F:=0
 6590 DEFFN_9F:mem%?A%=rx%DIV256:mem%?(A%+1)=rx%:PROCflg16(rx%):=0                     :REM STX <dp
 6600 DEFFN_AF:mem%?A%=rx%DIV256:mem%?(A%+1)=rx%:PROCflg16(rx%):=0                     :REM STX idx
 6610 DEFFN_BF:mem%?A%=rx%DIV256:mem%?(A%+1)=rx%:PROCflg16(rx%):=0                     :REM STX >ext
 6620 DEFFN_CF:=0
 6630 DEFFN_DF:mem%?A%=ru%DIV256:mem%?(A%+1)=ru%:PROCflg16(ru%):=0                     :REM STU <dp
 6640 DEFFN_EF:mem%?A%=ru%DIV256:mem%?(A%+1)=ru%:PROCflg16(ru%):=0                     :REM STU idx
 6650 DEFFN_FF:mem%?A%=ru%DIV256:mem%?(A%+1)=ru%:PROCflg16(ru%):=0                     :REM STU >ext
 6660 :
 6670 :
 6680 REM Group 10 opcodes
 6690 DEFFN_10:B%=mem%?rpc%:rpc%=rpc%+1:IF(B%AND&C0)=&40:=0
 6700 IF(B%AND&80):IF(B%AND7)<3:=0
 6710 IF(B%AND&87)=&85:=0
 6720 IF(B%AND&E0)<&20:=0
 6730 IF(B%AND&F0)=&30:IFB%<>&3F:=0
 6740 =EVAL("FNg10_"+STR$~B%)
 6750 :
 6760 DEFFNg10_20:=FNbr16(1)                                                    :REM LBRA
 6770 DEFFNg10_21:=FNbr16(0)                                                    :REM LBRN
 6780 DEFFNg10_22:=FNbr16(((rp%AND1)OR((rp%AND4)DIV4))EOR1)                     :REM LBHI  (C OR Z)=0
 6790 DEFFNg10_23:=FNbr16((rp%AND1)OR((rp%AND4)DIV4))                           :REM LBLS  (C OR Z)=1
 6800 DEFFNg10_24:=FNbr16((rp%EOR1)AND1)                                        :REM LBCC
 6810 DEFFNg10_25:=FNbr16(rp%AND1)                                              :REM LBCS/BLO
 6820 DEFFNg10_26:=FNbr16((rp%AND4)EOR4)                                        :REM LBNE
 6830 DEFFNg10_27:=FNbr16(rp%AND4)                                              :REM LBEQ
 6840 DEFFNg10_28:=FNbr16((rp%AND2)EOR2)                                        :REM LBVC
 6850 DEFFNg10_29:=FNbr16(rp%AND2)                                              :REM LBVS
 6860 DEFFNg10_2A:=FNbr16((rp%AND8)EOR8)                                        :REM LBPL
 6870 DEFFNg10_2B:=FNbr16(rp%AND8)                                              :REM LBMI
 6880 DEFFNg10_2C:=FNbr16(((((rp%AND8)DIV2)EOR(rp%AND2))EOR2))                  :REM LBGE  (N EOR V)=0
 6890 DEFFNg10_2D:=FNbr16(((rp%AND8)DIV2)EOR(rp%AND2))                          :REM LBLT  (N EOR V)=1
 6900 DEFFNg10_2E:IF(rp%AND4)=0:=FNbr16(1)
 6910 PRINT"@";
 6920 =FNbr16((((rp%AND4)DIV2)AND(((rp%AND8)DIV2)EOR(rp%AND2)))EOR2):REM LBGT  Z AND (N EOR V)=0
 6930 DEFFNg10_2F:=FNbr16((((rp%AND4)DIV2)AND(((rp%AND8)DIV2)EOR(rp%AND2))))    :REM LBLE  Z AND (N EOR V)=1
 6940 :
 6950 REM &3F     - SWI2
 6960 :
 6970 DEFFNg10_83:N%=FNmF0:A%=256*ra%+rb%-A%:PROCcmp16(A%):=0                          :REM CMPD #nnnn
 6980 DEFFNg10_93:N%=FNmD0:A%=256*ra%+rb%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0     :REM CMPD <dp
 6990 DEFFNg10_A3:N%=FNmE0:A%=256*ra%+rb%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0     :REM CMPD idx
 7000 DEFFNg10_B3:N%=FNmF0:A%=256*ra%+rb%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0     :REM CMPD >ext
 7010 :
 7020 DEFFNg10_8C:N%=FNmF0:A%=ry%-A%:PROCcmp16(A%):=0                                  :REM CMPY #nnnn
 7030 DEFFNg10_9C:N%=FNmD0:A%=ry%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPY <dp
 7040 DEFFNg10_AC:N%=FNmE0:A%=ry%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPY idx
 7050 DEFFNg10_BC:N%=FNmF0:A%=ry%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPY >ext
 7060 :
 7070 DEFFNg10_8E:N%=FNmF0:ry%=A%:PROCflg16(ry%):=0                                    :REM LDY #nnnn
 7080 DEFFNg10_9E:N%=FNmD0:ry%=256*mem%?A%+mem%?(A%+1):PROCflg16(ry%):=0               :REM LDY <dp
 7090 DEFFNg10_AE:N%=FNmE0:ry%=256*mem%?A%+mem%?(A%+1):PROCflg16(ry%):=0               :REM LDY idx
 7100 DEFFNg10_BE:N%=FNmF0:ry%=256*mem%?A%+mem%?(A%+1):PROCflg16(ry%):=0               :REM LDY >ext
 7110 :
 7120 DEFFNg10_CE:N%=FNmF0:rs%=A%:PROCflg16(rs%):=0                                    :REM LDS #nnnn
 7130 DEFFNg10_DE:N%=FNmD0:rs%=256*mem%?A%+mem%?(A%+1):PROCflg16(rs%):=0               :REM LDS <dp
 7140 DEFFNg10_EE:N%=FNmE0:rs%=256*mem%?A%+mem%?(A%+1):PROCflg16(rs%):=0               :REM LDS idx
 7150 DEFFNg10_FE:N%=FNmF0:rs%=256*mem%?A%+mem%?(A%+1):PROCflg16(rs%):=0               :REM LDS >ext
 7160 :
 7170 DEFFNg10_9F:N%=FNmD0:mem%?A%=ry%DIV256:mem%?(A%+1)=ry%:PROCflg16(ry%):=0         :REM STY <dp
 7180 DEFFNg10_AF:N%=FNmE0:mem%?A%=ry%DIV256:mem%?(A%+1)=ry%:PROCflg16(ry%):=0         :REM STY idx
 7190 DEFFNg10_BF:N%=FNmF0:mem%?A%=ry%DIV256:mem%?(A%+1)=ry%:PROCflg16(ry%):=0         :REM STY >ext
 7200 :
 7210 DEFFNg10_DF:N%=FNmD0:mem%?A%=rs%DIV256:mem%?(A%+1)=rs%:PROCflg16(rs%):=0         :REM STS <dp
 7220 DEFFNg10_EF:N%=FNmE0:mem%?A%=rs%DIV256:mem%?(A%+1)=rs%:PROCflg16(rs%):=0         :REM STS idx
 7230 DEFFNg10_FF:N%=FNmF0:mem%?A%=rs%DIV256:mem%?(A%+1)=rs%:PROCflg16(rs%):=0         :REM STS >ext
 7240 :
 7250 :
 7260 REM Group 11 opcodes
 7270 DEFFN_11:B%=mem%?rpc%:rpc%=rpc%+1
 7280 IF(B%AND&C0)<>&80:=0
 7290 IF(B%AND&0F)<>3 AND (B%AND&0F)<>12:=0
 7300 =EVAL("FNg11_"+STR$~B%)
 7310 :
 7320 REM &3F     - SWI3
 7330 :
 7340 DEFFNg11_83:N%=FNmF0:A%=ru%-A%:PROCcmp16(A%):=0                                  :REM CMPU #nnnn
 7350 DEFFNg11_93:N%=FNmD0:A%=ru%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPU <dp
 7360 DEFFNg11_A3:N%=FNmE0:A%=ru%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPU idx
 7370 DEFFNg11_B3:N%=FNmF0:A%=ru%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPU >ext
 7380 :
 7390 DEFFNg11_8C:N%=FNmF0:A%=rs%-A%:PROCcmp16(A%):=0                                  :REM CMPS #nnnn
 7400 DEFFNg11_9C:N%=FNmD0:A%=rs%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPS <dp
 7410 DEFFNg11_AC:N%=FNmE0:A%=rs%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPS idx
 7420 DEFFNg11_BC:N%=FNmF0:A%=rs%-256*mem%?A%-mem%?(A%+1):PROCcmp16(A%):=0             :REM CMPS >ext
 7430 :
   10 REM > MOS for 6809
   20 REM v0.12 Uses big-endian file addresses
   30 :
   40 DEFFNmos(m%):LOCAL X%,Y%
   50 A%=ra%:X%=rx%:Y%=ry%:C%=rp%:rp%=0
   60 CASE m% OF
   70   WHEN &13,&FFF4:=FNmos_byte
   80   WHEN &33,&FFEE:VDU A%:=0
   90   WHEN &FFEC:VDU 13:=0
  100   WHEN &FFE7:CALL &FFE7:=0
  110   WHEN &FFE3:CALL &FFE3:=0
  120   WHEN &43,&FFE0:ra%=GET:rp%=(ra%=27)AND1:=0
  130   WHEN &73,&FFD7:=FNmos_bget
  140   WHEN &83,&FFD4:=FNmos_bput
  150   WHEN &A3,&FFCE:=FNmos_find
  160   WHEN &63,&FFDA:=FNmos_args
  170   WHEN &B3:=FNmos_quit
  180   WHEN &C3:=FNmos_lang
  190 ENDCASE
  200 X%=X%+mem%:Y%=X%DIV256
  210 CASE m% OF
  220   WHEN &03,&FFF7:=FNmos_cli
  230   WHEN &23,&FFF1:=FNmos_word
  240   WHEN &53,&FFDD:=FNmos_file
  250   WHEN &93,&FFD1:=FNmos_gbpb
  260 ENDCASE
  270 =0
  280 :
  290 DEFFNmos_cli:PROCcmd($X%,TRUE):=0
  300 :
  310 DEFFNmos_byte
  320 IF A%=&82:rx%=0:ry%=0:=0                                 :REM high order address
  330 IF A%=&83:rx%=256*mem%?&FF88+mem%?&FF89:ry%=mem%?&FF88:=0:REM bottom of user memory
  340 IF A%=&84:rx%=256*mem%?&FF8A+mem%?&FF8B:ry%=mem%?&FF8A:=0:REM top of user memory
  350 IF A%>123:IFA%<127:mem%?escflg%=128*(A%AND1):OSCLI"FX15" :REM Clear/Set/Ack Escape
  360 IF A%=&7F:IFrx%=0 OR rx%=&FFFF:rx%=0:=0                  :REM =EOF#0/-1
  370 IF A%=&A0:IFos%=6:IFFNvdu:=0                             :REM =VDU(n)
  380 IF os%<32:X%=X%AND255:A%=USR&FFF4:rx%=(A%AND&FFFF00)DIV256:ry%=(A%AND&FF0000)DIV65536:rp%=(A%AND&1000000)DIV&1000000:=0
  390 REM Windows OSBYTE calls:
  400 IF A%=128:IFrx%=7:MOUSE rx%,A%,A%:ry%=(rx%>>8)AND255:=0
  410 IF A%=128:IFrx%=8:MOUSE A%,rx%,A%:ry%=(rx%>>8)AND255:=0
  420 IF A%=128:IFrx%=9:MOUSE A%,A%,rx%:ry%=(rx%>>8)AND255:=0
  430 CASE A% OF
  440   WHEN   0:rx%=32:=0
  450   WHEN 127:rx%=EOF#rx%:=0
  460   WHEN 128:A%=(255AND(rx%>&FFFD))-ADVAL((rx%AND255)+256*ry%OR((ry%>&7F)AND&FFFF0000)):rx%=A%:ry%=A%DIV256:=0
  470   WHEN 129:A%=INKEY((rx%AND255)+256*ry%OR((ry%>&7F)AND&FFFF0000)):PROCcarry(A%=-1 AND ry%<&80):rx%=A%AND&FFFF:ry%=(A%AND&FF00)DIV256:PROCcarry(A%=-1):=0
  480   WHEN 134:rx%=POS:ry%=VPOS:=0
  490   WHEN 135:rx%=GET(POS,VPOS):ry%=MODE:=0
  500   WHEN 160:
  510   CASE rx% OF
  520     WHEN  0,128:SYS "GetRgnBox",@vdu%!60,zp%:rx%=zp%!0
  530     WHEN  2,129:SYS "GetRgnBox",@vdu%!60,zp%:rx%=zp%!4
  540     WHEN  4,130:SYS "GetRgnBox",@vdu%!60,zp%:rx%=zp%!8
  550     WHEN  6,131:SYS "GetRgnBox",@vdu%!60,zp%:rx%=zp%!12
  560     WHEN  8,132:rx%=@vdu%!24 DIV @vdu%!216
  570     WHEN  9,133:rx%=@vdu%!36 DIV @vdu%!220-1
  580     WHEN 10,134:rx%=@vdu%!28 DIV @vdu%!216-1
  590     WHEN 11,135:rx%=@vdu%!32 DIV @vdu%!220
  600     WHEN 12,136:rx%=2*@vdu%!0
  610     WHEN 14,137:rx%=2*@vdu%!4
  620     WHEN 16,138:rx%=2*@vdu%!8
  630     WHEN 18,139:SYS "GetRgnBox",@vdu%!60,zp%:rx%=2*(zp%!12-@vdu%!12-1)
  640     WHEN 20,142:r%(1)=@vdu%!16
  650     WHEN 22,143:SYS "GetRgnBox",@vdu%!60,zp%:rx%=(zp%!12-@vdu%!20-1)
  660     WHEN 36:rx%=@vdu%!8
  670     WHEN 38:SYS "GetRgnBox",@vdu%!60,zp%:rx%=(zp%!12-@vdu%!12-1)
  680     WHEN 87,155:rx%=@vdu%?70
  690     WHEN 88,156:rx%=@vdu%?71
  700     WHEN 89,153:rx%=@vdu%?65
  710     WHEN 90,154:rx%=@vdu%?67
  720     WHEN 91,151:rx%=3-(@vdu%?64-7)DIV2:IFrx%<0:rx%=1
  730     WHEN 92,152:rx%=3-(@vdu%?66-7)DIV2:IFrx%<0:rx%=1
  740     WHEN 96,3:rx%=@vdu%?73
  750   OTHERWISE
  760     rx%=0
  770   ENDCASE
  780   ry%=rx%DIV256:=0
  790 ENDCASE
  800 =0
  810 DEFFNvdu:IFos%<>6:=0
  820 IFrx%<16:IFrx%<>3:=0
  830 IF FALSE THEN
  840   =0
  850 ENDIF
  860 REM ARM and R1>15  or  ARM and R1=3
  870 IFrx%=3:rx%=96
  880 CASE rx% OF
  890   WHEN 16:A%=138
  900   WHEN 18:A%=139
  910   WHEN 20:A%=142
  920   WHEN 22:A%=143
  930   WHEN 36:A%=144
  940   WHEN 38:A%=145
  950   WHEN 77:A%=148
  960   WHEN 80:A%=149
  970   WHEN 83:A%=150
  980   WHEN 87:A%=155
  990   WHEN 88:A%=156
 1000   WHEN 89:A%=153
 1010   WHEN 90:A%=154
 1020   WHEN 91:A%=151
 1030   WHEN 92:A%=152
 1040   WHEN 96:A%=3
 1050 OTHERWISE
 1060   A%=rx%:IF A%<128:rx%=0:rx%=0:=TRUE
 1070 ENDCASE
 1080 !zp%=A%:zp%!4=-1:SYS "OS_ReadVduVariables",zp%,zp%+8
 1090 rx%=zp%!8:ry%=rx%DIV256
 1100 =TRUE
 1110 :
 1120 DEFFNmos_word
 1130 IFA%=0:A%=256*?X%+X%?1:mem%?escflg%=0:osw0%=TRUE:PROCEscOn:INPUTLINE""A$:PROCEscOff:$(mem%+A%)=A$:osw0%=FALSE:ry%=LENA$:=0
 1140 IF A%=190:IF X%?2=9:IF ?X%>8:A%=FNDis_Code(9,X%!4,X%!8):=0
 1150 IF A%=190:IF X%?2=9:IF ?X%<9:$(X%+4)=FNDis_Name(9):=0
 1160 IF A%=127:IF d_chn%:=FNmos_word7F
 1170 IF os%<32 OR A%=10:CALL &FFF1:=0
 1180 CASE A% OF
 1190   WHEN 1:mem%!rx%=TIME:=0
 1200   WHEN 2:TIME=mem%!rx%:=0
 1210   WHEN 7:SOUND mem%!rx%AND&FFFF,mem%!(2+rx%)AND&FFFF,mem%!(4+rx%)AND&FFFF,mem%!(6+rx%)AND&FFFF:=0
 1220   WHEN 8:ENVELOPE 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
 1230   WHEN 9:mem%?(rx%+4)=POINT(mem%!rx%AND&FFFF,mem%!(2+rx%)AND&FFFF)
 1240   WHEN 14:$(mem%+rx%)=TIME$:=0
 1250   WHEN 15:TIME$=$(mem%+rx%+1):=0
 1260 ENDCASE
 1270 =0
 1280 :
 1290 DEFFNmos_word7F
 1300 IF(debug%AND8):PRINT"OSW7F: ";?X%;" ";~X%!1;" ";X%?5;" ";~X%?6;" ";X%?7;" ";X%?8;" "FNh0(X%?9,2)" "FNh0(X%?10,2)" "FNh0(X%?11,2)" "FNh0(X%?12,2)" "FNh0(X%?13,2)" "FNh0(X%?14,2)" "FNh0(X%?15,2)
 1310 A$="":FORA%=0TO14:A$=A$+CHR$X%?A%:NEXT
 1320 REM FNfdc_disk(cmd%,   add%,     drv%,   trk%,       sid%,       sec%,    num%)
 1330 A% =FNfdc_disk(X%?6,mem%+X%!1,X%?0 AND 5,X%?7,(X%?0 DIV 2) AND 1,X%?8,X%?9 AND 31)
 1340 B%=X%?15:$X%=A$:X%?15=B%:X%?(X%?5+7)=A%
 1350 IF(debug%AND8):PRINT"RESULT:";?X%;" ";~X%!1;" ";X%?5;" ";~X%?6;" ";X%?7;" ";X%?8;" "FNh0(X%?9,2)" "FNh0(X%?10,2)" "FNh0(X%?11,2)" "FNh0(X%?12,2)" "FNh0(X%?13,2)" "FNh0(X%?14,2)" "FNh0(X%?15,2)
 1360 IF(debug%AND10)=10:A%=GET
 1370 =0
 1380 :
 1390 DEFPROCswap(S%):REPEAT
 1400   A%=X%?(S%+0):X%?(S%+0)=X%?(S%+3):X%?(S%+3)=A%
 1410   A%=X%?(S%+1):X%?(S%+1)=X%?(S%+2):X%?(S%+2)=A%
 1420 S%=S%-4:UNTILS%<0
 1430 ENDPROC
 1440 DEFPROCaddr(A%):IFX%!A%<&10000:X%!A%=mem%+A%!X%
 1450 ENDPROC
 1460 :
 1470 DEFFNmos_file
 1480 fn%=mem%+256*?X%+X%?1:PROCswap(14)
 1490 IF debug%AND8:PRINT"OSFILE ";ra%;" ";~fn%-mem%;" ";~X%!2;" ";~X%!6;" ";~X%!10;" ";~X%!14
 1500 IF ra%=255:PROCaddr(2)
 1510 IF ra%=0  :PROCaddr(10):PROCaddr(14)
 1520 IF os%<32 :SYS "OS_File",ra%,$fn%,X%!2,X%!6,X%!10,X%!14 TO ra%,,X%!2,X%!6,X%!10,X%!14 ELSE ra%=FNfile($fn%,ra%)
 1530 FOR A%=2 TO 14 STEP 4:mem%!(rx%+A%)=X%!A%:NEXT:PROCswap(14):=0
 1540 :
 1550 DEFFNmos_args
 1560 REM A%=function
 1570 REM X%=>data
 1580 REM Y%=handle
 1590 IF os%>31:IF A%=0:IF Y%=0:ra%=29:=0
 1600 IF A%=0:IF Y%=0:ra%=(USR&FFDA)AND&FF:=0
 1610 X%=mem%+X%:PROCswap(0)
 1620 IF Y%=0 OR Y%=&FFFF THEN
 1630   CASE A% OF
 1640     WHEN 0:!X%=0         :REM =PTR#0/-1
 1650     WHEN 1:              :REM PTR#0/-1=
 1660     WHEN 2:!X%=0         :REM =EXT#0/-1
 1670     WHEN 3:              :REM EXT#0/-1=
 1680     WHEN 4:!X%=0         :REM =Alloc#0/-1
 1690     WHEN 5:!X%=0         :REM =EOF#0/-1
 1700     WHEN 6:              :REM Alloc#0/-1=
 1710   ENDCASE
 1720   PROCswap(0):=0
 1730 ENDIF
 1740 CASE A% OF
 1750   WHEN 0:!X%=PTR#Y%
 1760   WHEN 1:PTR#Y%=!X%
 1770   WHEN 2:!X%=EXT#Y%
 1780   WHEN 3:EXT#Y%=!X%
 1790   WHEN 4:!X%=EXT#Y%
 1800   WHEN 5:!X%=EOF#Y%
 1810   WHEN 6:EXT#Y%=!X%
 1820   WHEN 255:IFos%>31
 1830 OTHERWISE
 1840   !X%=FNargs(A%,Y%,!X%)
 1850 ENDCASE
 1860 PROCswap(0):=0
 1870 :
 1880 DEFFNmos_bget:IF Y%=0:ra%=GET:=0
 1890 IFos%>31:ra%=BGET#Y%:=0
 1900 A%=USR&FFD7:ra%=A%AND&FF:PROCcarry(A%AND&1000000):=0
 1910 :
 1920 DEFFNmos_bput:IF Y%=0:VDU A%:=0 ELSE BPUT#Y%,A%:=0
 1930 :
 1940 DEFFNmos_gbpb
 1950 PROCswap(9):B%=(X%!1<&10000):PROCaddr(1)
 1960 IF ?X%=0:IFA%=1ORA%=2:REPEATVDUmem%?(X%!1):X%!5=X%!5-1:UNTILX%!5<1
 1970 IF ?X%=0:IFA%=3ORA%=4:REPEATmem%?(X%!1)=GET:X%!5=X%!5-1:UNTILX%!5<1
 1980 IF ?X%:PROCf_gbpb(A%,X%?0,X%!1,X%!5,X%!9)
 1990 IF B%:X%!1=X%!1-mem%
 2000 PROCswap(9):=0
 2010 :
 2020 DEFFNmos_find:IFA%=0:CLOSE#Y%:=0
 2030 IF (A%AND&C0)=&40:ra%=FNopenin($(mem%+X%)):=0
 2040 IF (A%AND&C0)=&80:ra%=FNopenout($(mem%+X%)):=0
 2050 IF (A%AND&C0)=&C0:ra%=FNopenup($(mem%+X%)):=0
 2060 :
 2070 DEFFNmos_quit:=TRUE
 2080 DEFFNmos_lang:=0
 2090 :
 2100 DEFPROCcarry(C%):rp%=(rp%AND-2)OR(C%AND1):ENDPROC
   10 REM > IO
   20 :
   30 REM Access absolute memory, checking for I/O devices
   40 REM ------------------------------------------------
   50 DEFPROCio_reset:ENDPROC
   60 :
   70 DEFFNio_rd(A%):IF(A%AND&FFF0)<>&FEE0:=mem%?A%
   80 LOCAL X%,Y%
   90 IFA%=&FEE0:=&7F                               :REM TubeS1 - VDU output
  100 REM PRINT;~rpc%;": TubeRd: ";~A%
  110 IFA%=&FEE1:=&80
  120 IFA%=&FEE2:=&C0                               :REM TubeS2
  130 IFA%=&FEE3:=&80
  140 IFA%=&FEE8:=((ADVAL(-2)<>0)AND2)+((ADVAL(-3)<>0)AND1)  :REM RxStatus b1=RxRDY, b0=TxRDY
  150 IFA%=&FEE9:A%=145:X%=1:=((USR&FFF4)AND&FF0000)DIV65536 :REM RxData
  160 =&7F
  170 :
  180 DEFPROCio_wr(A%,B%):IF(A%AND&FFE0)<>&FEE0:mem%?A%=B%:ENDPROC
  190 LOCAL X%,Y%
  200 IFA%=&FEE1:VDU B%:ENDPROC                                 :REM TubeR1 - VDU output
  210 REM PRINT;~rpc%;": TubeWr: ";~A%;",";~B%
  220 IFA%=&FEE8:OSCLI"FX7,8":OSCLI"FX8,8":OSCLI"FX2,2":ENDPROC :REM TxCtrl
  230 IFA%=&FEE9:A%=138:X%=2:Y%=B%:CALL&FFF4:ENDPROC            :REM TxData
  240 ENDPROC
  250 :
   10 REM > Dis09 1.01 - 24Sep2007 - 6809 disassembly routines
   20 REM PSH/PUL shows U or S instead of U/S, shows R, and ,R modes
   30 :
   40 DEFFNDis_Name(A%)="6809"
   50 DEFFNDis_Code(A%,Ptr%,Data%):num%=1
   60 X%!0=0:$(X%+4)=FN_diss:IFnum%<1:num%=1:$(X%+4)="EQUB &"+FNh0(Data%?0,2)
   70 X%?3=num%:=num%
   80 DEFFN_diss:op%=?Data%:num%=1
   90 IF(op%AND&CF)=&83:="SUBD "+FNmde2((op%AND&30)DIV16)
  100 IF(op%AND&CF)=&C3:="ADDD "+FNmde2((op%AND&30)DIV16)
  110 IFop%=&87:num%=0:=""
  120 IFop%=&C7:num%=0:=""
  130 IF(op%AND&CF)=&87:="ST"+CHR$(65+(op%AND64)DIV64)+"  "+FNmde((op%AND&30)DIV16)
  140 IF(op%AND&CF)=&8C:="CMPX "+FNmde2((op%AND&30)DIV16)
  150 IF(op%AND&CF)=&CC:="LDD  "+FNmde2((op%AND&30)DIV16)
  160 IFop%=&8D:num%=2:="BSR  &"+FNh0(FNjr(Data%?1),4)
  170 IF(op%AND&CF)=&8D:="JSR  "+FNmde((op%AND&30)DIV16)
  180 IFop%=&CD:num%=0:=""
  190 IF(op%AND&CF)=&CD:="STD  "+FNmde2((op%AND&30)DIV16)
  200 IF(op%AND&CF)=&8E:="LDX  "+FNmde2((op%AND&30)DIV16)
  210 IF(op%AND&CF)=&CE:="LDU  "+FNmde2((op%AND&30)DIV16)
  220 IFop%=&8F:num%=0:=""
  230 IF(op%AND&CF)=&8F:="STX  "+FNmde2((op%AND&30)DIV16)
  240 IFop%=&CF:num%=0:=""
  250 IF(op%AND&CF)=&CF:="STU  "+FNmde2((op%AND&30)DIV16)
  260 IF(op%AND&80)=&80:=FNalu(op%AND15)+CHR$(65+(op%AND64)DIV64)+" "+LEFT$(" ",(op%AND&8E)=&86)+FNmde((op%AND&30)DIV16)
  270 IF(op%AND&E0)=&40:=FNrot(op%AND15)+CHR$(65+(op%AND16)DIV16)
  280 IF(op%AND&EF)=&6E:="JMP  "+FNmde2((op%AND&30)DIV16)
  290 IF(op%AND&E0)=&60:=FNrot(op%AND15)+"  "+FNmde((op%AND&30)DIV16)
  300 IF(op%AND&F0)=&20:num%=num%+1:="B"+MID$("RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%AND15)*2+1,2)+"  &"+FNh0(FNjr(Data%?1),4)
  310 IFop%=&0E:="JMP  "+FNmde(1)
  320 IF(op%AND&F0)=&00:=FNrot(op%AND15)+"  "+FNmde(1)
  330 IFop%=&10:=FNgrp10
  340 IFop%=&11:=FNgrp11
  350 IFop%=&12:="NOP"
  360 IFop%=&13:="SYNC"
  370 IFop%=&19:="DAA"
  380 IFop%=&1A:="ORCC "+FNmde(0)
  390 IFop%=&1C:="ANDCC "+FNmde(0)
  400 IFop%=&1D:="SEX"
  410 IF(op%AND&FE)=&1E:num%=num%+1:=MID$("EXGTFR",(op%AND1)*3+1,3)+"  "+FNr(Data%?1 DIV16)+","+FNr(Data%?1 AND15)
  420 IF(op%AND&FC)=&30:="LEA"+FNreg2(op%AND3)+" "+FNmde(2)
  430 IFop%=&34:num%=num%+1:="PSHS "+FNstk(Data%?1)
  440 IFop%=&35:num%=num%+1:="PULS "+FNstk(Data%?1)
  450 IFop%=&36:num%=num%+1:="PSHU "+FNstk(Data%?1)
  460 IFop%=&37:num%=num%+1:="PULU "+FNstk(Data%?1)
  470 IFop%=&39:="RTS"
  480 IFop%=&3A:="ABX"
  490 IFop%=&3B:="RTI"
  500 IFop%=&3C:="CWAI"
  510 IFop%=&3D:="MUL"
  520 IFop%=&3F:="SWI"
  530 IFop%=&16:num%=3:="LBRA &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
  540 IFop%=&17:num%=3:="LBSR &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
  550 IFop%=&3E:="RESET"
  560 num%=0:=""
  570 DEFFNgrp10:num%=num%+1:op%=Data%?1
  580 IF(op%AND&E0)=&20:num%=num%+1:="LB"+MID$("RARNHILSCCCSNEEQVCVSPLMIGELTGTLE",(op%AND15)*2+1,2)+" &"+FNh0(FNljr(256*Data%?1+Data%?2),4)
  590 IFop%=&3F:="SWI2"
  600 IF(op%AND&CF)=&83:="CMPD "+FNmde2((op%AND&30)DIV16)
  610 IF(op%AND&CF)=&8C:="CMPY "+FNmde2((op%AND&30)DIV16)
  620 IF(op%AND&CF)=&8E:="LDY  "+FNmde2((op%AND&30)DIV16)
  630 IFop%=&8F;num%=0:=""
  640 IF(op%AND&CF)=&8F:="STY  "+FNmde2((op%AND&30)DIV16)
  650 IF(op%AND&CF)=&CE:="LDS  "+FNmde2((op%AND&30)DIV16)
  660 IFop%=&CF:num%=0:=""
  670 IF(op%AND&CF)=&CF:="STS  "+FNmde2((op%AND&30)DIV16)
  680 num%=0:=""
  690 DEFFNgrp11:num%=num%+1:op%=Data%?1
  700 IFop%=&3F:="SWI3"
  710 IF(op%AND&CF)=&83:="CMPU "+FNmde2((op%AND&30)DIV16)
  720 IF(op%AND&CF)=&8C:="CMPS "+FNmde2((op%AND&30)DIV16)
  730 num%=0:=""
  740 DEFFNalu(A%)=MID$("SUBCMPSBCxxxANDBITLD ST EORADCOR ADD",A%*3+1,3+(A%=6 OR A%=7 OR A%=10))
  750 DEFFNrot(A%):IFA%=1ORA%=2ORA%=5ORA%=11ORA%=14:num%=-9:=""
  760 =MID$("NEGxxxxxxCOMLSRxxxRORASRASLROLDECxxxINCTSTxxxCLR",A%*3+1,3)
  770 DEFFNmde2(A%):IFA%=0:num%=num%+2:="#&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)
  780 DEFFNmde(A%):IFA%=0:num%=num%+1:="#&"+FNh0(Data%?(num%-1),2)
  790 IFA%=1:num%=num%+1:="&"+FNh0(Data%?(num%-1),2)
  800 IFA%=2:num%=num%+1:=FNidx(Data%?(num%-1))
  810 IFA%=3:num%=num%+2:="&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)
  820 DEFFNidx(A%):R$=FNreg1((A%AND&60)DIV32):A%=A%AND&9F
  830 IFA%<16:=STR$(A%AND15)+","+R$
  840 IFA%<32:=STR$((A%AND15)-16)+","+R$
  850 O$="":C$="":IF(A%AND16):O$="[":C$="]"
  860 A%=A%AND15
  870 IFA%=0:IFO$<>"":num%=0:=""
  880 IFA%=0:=O$+R$+"+,"+C$
  890 IFA%=1:=O$+R$+"++,"+C$
  900 IFA%=2:IFO$<>"":num%=0:=""
  910 IFA%=2:=O$+",-"+R$+C$
  920 IFA%=3:=O$+",--"+R$+C$
  930 IFA%=4:=O$+","+R$+C$
  940 IFA%=5:=O$+"B,"+R$+C$
  950 IFA%=6:=O$+"A,"+R$+C$
  960 IFA%=7:num%=0:""
  970 IFA%=8:num%=num%+1:=O$+"&"+FNh0(Data%?(num%-1),2)+","+R$+C$
  980 IFA%=9:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+","+R$+C$
  990 IFA%=10:num%=0:=""
 1000 IFA%=11:=O$+"D,"+R$+C$
 1010 IFA%=12:num%=num%+1:=O$+"&"+FNh0(Data%?(num%-1),2)+",PC"+C$
 1020 IFA%=13:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+",PC"+C$
 1030 IFA%=14:num%=0:=""
 1040 IFA%=14:IFO$="":num%=0:=""
 1050 IFA%=15:num%=num%+2:=O$+"&"+FNh0(Data%?(num%-2),2)+FNh0(Data%?(num%-1),2)+C$
 1060 =""
 1070 DEFFNreg1(A%)=MID$("XYUS",A%+1,1)
 1080 DEFFNreg2(A%)=MID$("XYSU",A%+1,1)
 1090 DEFFNr(A%)=MID$("D X Y U S PC????A B CCDP????????",A%*2+1,1-(A%=5 OR A%>9))
 1100 DEFFNjr(A%):IFA%<128:=Ptr%+2+A% ELSE =Ptr%+2-256+A%
 1110 DEFFNljr(A%):IFA%<32768:=Ptr%+3+A% ELSE =Ptr%+3-65536+A%
 1120 DEFFNstk(A%):A$=""
 1130 IF(A%AND1):A$=",CC"
 1140 IF(A%AND2):A$=A$+",A"
 1150 IF(A%AND4):A$=A$+",B"
 1160 IF(A%AND8):A$=A$+",DP"
 1170 IF(A%AND16):A$=A$+",X"
 1180 IF(A%AND32):A$=A$+",Y"
 1190 IF(A%AND64):A$=A$+MID$(",U,S",(Data%?0AND2)+1,2)
 1200 IF(A%AND128):A$=A$+",PC"
 1210 =MID$(A$,2)
   10 REM > BLib.Close 1.00 09Aug1998
   20 :
   30 REM Close Handling
   40 REM ~~~~~~~~~~~~~~
   50 :
   60 DEFPROCClose_All
   70 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
   80 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
   90 ENDPROC
   10 REM > BLib.String 1.00 09Aug1998
   20 :
   30 REM String Manipulation Functions
   40 REM =============================
   50 :
   60 REM FNs() - strip spaces from start and end of string
   70 REM -------------------------------------------------
   80 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
   90 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
  100 =A$
  110 :
  120 REM FNuc() - convert string to upper case
  130 REM -------------------------------------
  140 DEFFNuc(A$):LOCAL B$:IFA$="":=""
  150 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
  160 :
  170 REM FNlc() - convert string to lower case
  180 REM -------------------------------------
  190 DEFFNlc(A$):LOCAL B$:IFA$="":=""
  200 REPEATB$=B$+CHR$(ASCA$OR((A$<"_")AND&20)):A$=MID$(A$,2):UNTILA$="":=B$
  210 :
   10 REM > BLib.Number 1.01 09Aug1988
   20 REM v1.00 09Aug1988 JGH: First version
   30 REM v1.01 12Feb1992 JGH: Added Octal and Binary
   40 REM v1.02 15Sep2009 JGH: Octal and Binary works for &8xxxxxxx
   50 :
   60 REM Number Output Routines
   70 REM ~~~~~~~~~~~~~~~~~~~~~~
   80 :
   90 REM Hexadecimal padded with zeros
  100 DEFFNh0(A%,N%):=RIGHT$("0000000"+STR$~A%,N%)
  110 :
  120 REM Hexadecimal padded with spaces
  130 DEFFNh(A%,N%):=RIGHT$("       "+STR$~A%,N%)
  140 :
  150 REM Decimal padded with zeros
  160 DEFFNd0(A%,N%):=RIGHT$("00000000"+STR$A%,N%)
  170 :
  180 REM Decimal padded with spaces
  190 DEFFNd(A%,N%):=RIGHT$("         "+STR$A%,N%)
  200 :
  210 REM Octal padded with zeros
  220 DEFFNo0(A%,N%):LOCAL A$,B%,L%:IFA%<0:B%=2:A%=A%AND&7FFFFFFF
  230 REPEATA$=STR$(A%AND7)+A$:A%=A%DIV8:L%=L%+3:UNTILL%>27:=RIGHT$(STR$(A%+B%)+A$,N%)
  240 :
  250 REM Octal padded with spaces
  260 DEFFNo(A%,N%):LOCAL A$:IFA%<0:=FNo0(A%,N%)
  270 REPEATA$=STR$(A%AND7)+A$:A%=A%DIV8:UNTILA%=0:=RIGHT$(STRING$(N%," ")+A$,N%)
  280 :
  290 REM Binary padded with zeros
  300 DEFFNb0(A%,N%):LOCAL A$,B$,L%:B$="0":IFA%<0:B$="1":A%=A%AND&7FFFFFFF
  310 REPEATA$=STR$(A%AND1)+A$:A%=A%DIV2:L%=L%+1:UNTILL%>30:=RIGHT$(B$+A$,N%)
  320 :
  330 REM Binary padded with spaces
  340 DEFFNb(A%,N%):LOCAL A$:IFA%<0:=FNb0(A%,N%)
  350 REPEATA$=STR$(A%AND1)+A$:A%=A%DIV2:UNTILA%=0:=RIGHT$(STRING$(N%," ")+A$,N%)
  360 :
  370 REM Drive character for supplied number
  380 DEFFNdrv(A%):=CHR$(48+A%-7*(A%>9))
  390 :
  400 REM Drive number for supplied character
  410 DEFFNDrv(A$):=ASCA$-48+7*(A$>"9")AND31
  420 :
   10 REM > BLib.ProgEnv 1.06 20Apr2020
   20 :
   30 REM Program Environment Functions
   40 REM =============================
   50 :
   60 REM Return command line tail, sets run$ to execution filename
   70 REM Works on BBCIO,BBC09,T6502,T6809,TZ80,ZX80,PDP11,ARMEval,ARMCoPro,RISCOS,DOS,Windows
   80 REM ------------------------------------------------------------------------------------
   90 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
  100 IFos%>31:IFPAGE>&FFFFF:DIMX%LOCAL256:SYS"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$
  110 A%=&600-&7B00*(PAGE>&8000)-&3F00*(PAGE>&C000):IF!(PAGE-&108)=@%:A%=PAGE-&208
  120 IF?(TOP-3)=0:A%=&100:IFHIMEM<&FFFF:A%=PAGE-&300:IF!(HIMEM+512)=@%:A%=HIMEM
  130 A$=$A%:IFPAGE=&8F00:run$=A$:SYS16TOA$,,A%:SYS72,"",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
  140 FORY%=-1TO0:A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32:IFASCA$=34:A%=INSTR(A$,"""",2)+1 ELSE A%=INSTR(A$+" "," ")
  150   IFY%:run$=MID$(A$,1-(ASCA$=34),A%-1+2*(ASCA$=34)):A$=MID$(A$,A%+1)
  160 NEXT:=A$
  170 :
  180 REM Run a program, passing it a command line
  190 REM If program is *Command, called with OSCLI, else CHAINed
  200 REM -------------------------------------------------------
  210 DEFPROCos(A$):IFASCA$=42:OSCLIA$ ELSE IFLENA$:CHAINA$
  220 ENDPROC
  230 :
  240 REM Exit program, setting return value
  250 REM ----------------------------------
  260 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):quit$=quit$:A$=quit$:quit$="":PROCos(A$)
  270 IFPAGE>&FFFFF:QUIT A% ELSE END
  280 ENDPROC
  290 :
   10 REM > BLib.Generic.FileIO 1.05 22Mar2008
   20 REM v1.05 22Mar2009 Optimised CDIR in FNfile()
   30 REM v1.04 22Mar2008 FNf_scan strips spaces
   40 REM v1.03 15Feb2008 Add veneer functions in f_ domain
   50 REM v1.02 28Apr2007 Added functions to FNfile on DOS, PROCcdir, FNopenout
   60 REM v1.01 07Sep2006 FNargs avoid zero page on RISC OS
   70 REM v1.00 09Aug1988 Initial version
   80 :
   90 REM General File Interface Routines
  100 REM ===============================
  110 :
  120 REM FNfile(), PROCgbpb(), FNfs are callable on Windows
  130 REM --------------------------------------------------
  140 :
  150 REM Returns file type, file info in X%!...
  160 REM --------------------------------------
  170 DEFFNfile(A$,A%):IFA%<>8:IFPAGE<&FFFFF:$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
  180 A$=FNf_name(A$):IFA%=255 OR A%=5:X%!14=OPENIN(A$):IFX%!14:X%!10=EXT#X%!14:CLOSE#X%!14:X%!14=&33
  190 IFA%=255:IFX%?6=0:OSCLI"LOAD """+A$+""" "+STR$~X%!2:=1
  200 IFA%=5:IFX%!14:=1 ELSE IFA%=5:=0
  210 IFA%=0:OSCLI"SAVE """+A$+""" "+STR$~X%!10+" "+STR$~X%!14:X%!10=X%!14-X%!10:=1
  220 IFA%=7:OSCLI"SAVE """+A$+""" "+STR$~PAGE+"+"+STR$~X%!10:X%!10=X%!14-X%!10:=1
  230 IFA%<>8:=0
  240 IF(os%AND-24):A$="mkdir "+A$ ELSE A$="cdir "+A$
  250 IFHIMEM>&FFFF:LOCAL ERROR:ON ERROR LOCAL:=0
  260 OSCLIA$:=2
  270 :
  280 REM General OSGBPB call
  290 REM -------------------
  300 DEFPROCf_gbpb(A%,chn%,addr%,num%,ptr%)
  310 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFPAGE<&FFFFF:CALL&FFD1:ENDPROC
  320 IFA%=1ORA%=3:PTR#?X%=X%!9
  330 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1 ELSE IFA%=3ORA%=4:?X%!1=BGET#?X%
  340 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X% AND A%>2)OR X%!5<1:ENDPROC
  350 :
  360 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
  370 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFPAGE<&FFFFF:CALL&FFD1:ENDPROC
  380 IFA%=1ORA%=3:PTR#?X%=X%!9
  390 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1 ELSE IFA%=3ORA%=4:?X%!1=BGET#?X%
  400 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X% AND A%>2)OR X%!5<1:ENDPROC
  410 :
  420 REM Return current disk (5), directory (6) or library (7) name
  430 REM ----------------------------------------------------------
  440 DEFFNgbpb(A%):IFPAGE>&FFFFF:=""
  450 X%!1=name%:CALL&FFD1:A%=name%+((1+?name%)AND((A%AND-2)=6)):A%?(1+?A%)=13:=$(A%+1)
  460 :
  470 REM Returns entry in current directory, or null string if at end
  480 REM ------------------------------------------------------------
  490 DEFFNf_scan(ptr%):IFPAGE>&FFFFF:=""
  500 X%!1=name%:X%!5=1:X%!9=ptr%:A%=8:CALL&FFD1:IFX%!5=1:=""
  510 A%=name%+1:A%!(A%?-1)=&D20:A%?(INSTR($A%," ")-1)=13:=$A%
  520 :
  530 DEFFNgbpb8(ptr%):IFPAGE>&FFFFF:=""
  540 X%!1=name%:X%!5=1:X%!9=ptr%:A%=8:CALL&FFD1:IFX%!5=1:=""
  550 A%=name%+1:A%!(A%?-1)=&D20:A%?(INSTR($A%," ")-1)=13:=$A%
  560 :
  570 REM OSARGS call with data.  Returns any returned data
  580 REM -------------------------------------------------
  590 DEFFNf_args(A%,Y%,ptr%):LOCAL X%,E%:IF?(TOP-3)=0:E%=Y%:Y%=0
  600 IF FALSE THEN
  610   LOCAL !&70:X%=&70:!X%=ptr%:CALL&FFDA:=!X%
  620 ELSE
  630   SYS"OS_Args",A%,Y%,ptr% TO ,,ptr%
  640   SAVE:=ptr%
  650   :
  660   DEFFNargs(A%,Y%,ptr%):LOCAL X%,E%:IF?(TOP-3)=0:E%=Y%:Y%=0
  670   IF FALSE THEN
  680     LOCAL !&70:X%=&70:!X%=ptr%:CALL&FFDA:=!X%
  690   ELSE
  700     SYS"OS_Args",A%,Y%,ptr% TO ,,ptr%
  710     SAVE:=ptr%
  720     :
  730     REM OSARGS call ignoring X, returns A
  740     REM ---------------------------------
  750     DEFFNf_argsA(A%):IF FALSE THEN
  760       LOCAL X%,Y%,E%,!&70:X%=&70:=(USR&FFDA)AND&FF
  770     ELSE
  780       SYS"OS_Args",A% TO A%
  790       SAVE:=A%
  800       :
  810       DEFFNargsA(A%):IF FALSE THEN
  820         LOCAL X%,Y%,E%,!&70:X%=&70:=(USR&FFDA)AND&FF
  830       ELSE
  840         SYS"OS_Args",A% TO A%
  850         SAVE:=A%
  860         :
  870         REM Get current filing system number
  880         REM --------------------------------
  890         DEFFNfs:IF(os%AND-32)=0:LOCAL A%,Y%,E%:=(USR&FFDA)AND&FF
  900         =29
  910         :
  920         REM Delete an object
  930         REM ----------------
  940         DEFPROCf_delete(A$):IF(os%AND-24):A$="del "+A$ ELSE A$="delete "+A$
  950         OSCLIA$:ENDPROC
  960         :
  970         REM Select a directory
  980         REM ------------------
  990         DEFPROCf_dir(A$):IF(os%AND-24):A$="cd "+A$ ELSE A$="dir "+A$
 1000         OSCLIA$:ENDPROC
 1010         :
 1020         REM Create a directory only if it doesn't exist
 1030         REM -------------------------------------------
 1040         DEFPROCf_cdir(A$):
 1050         IF(os%AND-24):A$="mkdir "+A$ ELSE A$="cdir "+A$
 1060         IF FALSE THEN
 1070           OSCLIA$:ENDPROC
 1080         ENDIF
 1090         LOCAL ERROR:ON ERROR LOCAL:ENDPROC
 1100         OSCLIA$
 1110         ENDPROC
 1120         :
 1130         REM Open an input file ensuring no extension
 1140         REM ----------------------------------------
 1150         DEFFNf_openin(A$)=OPENIN(FNf_name(A$))
 1160         :
 1170         REM Open an output file ensuring no extension
 1180         REM -----------------------------------------
 1190         DEFFNf_openout(A$)=OPENOUT(FNf_name(A$))
 1200         :
 1210         REM Open an update file ensuring no extension
 1220         REM -----------------------------------------
 1230         DEFFNf_openup(A$)=OPENUP(FNf_name(A$))
 1240         :
 1250         DEFFNf_name(A$):IFos%AND-32:LOCALA%,B%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:IFINSTR(A$,".",B%)=0:A$=A$+"."
 1260         =A$