10 REM Two pass 65C02 disassembler (C) J.de B.P. 19870325 20 MODE135:CLOSE#0 30 DIM Hash%(255),stack%(256),Motype$(15),Nbytes(15),set% &1004 40 REM 6502 code hash table for mode and mnemonic position,holds stack,holds text characters for mode display,holds number of bytes for each mode. 50 ON ERROR PROCerror:GOTO50 60 PROCvars:RESTORE:PROCfildim 70 ON ERROR PROCerror:GOTO70 80 VDU28 0 24 39 1 90 REPEAT:CLS:G%=FNmenu0 100 IF(G%=0)OR(G%=2) THENIFFNin(2,21,1,1,on$+"Are you sure :"+off$,"Y","YN")="N" UNTILFALSE 110 IF(G%=0)CLS:PRINTon$"Ended."off$:END 120 IF(G%=1)CLS:PROCcli 130 IF(G%=2)PROCinit:CLS:PROCmenu1:D%=-1:top%=start%:bottom%=end% 140 IF(G%>2)ANDNOTD%PRINTTAB(2,21)on$"First Select Memory Area"off$;:PROCcur(7):PROCcur(0*INKEY(300)):UNTILFALSE 150 IF(G%=3)CLS:PROCtload 160 IF(G%=4)CLS:PROCtsave 170 IF(G%=5)CLS:PROCmenu2:PROCdis1 180 IF(G%=6)CLS:PROCmenu3 190 IF(G%=7)PRINTTAB(2,21)on$"Hello Welly Boots : Mr Computer"off$;:PROCcur(7):PROCcur(0*INKEY(300)) 200 IF(G%=8)CLS:PROCmenu5 210 IF(G%=9)CLS:PROCdis2 220 UNTILFALSE 230 DEFPROCvars 240 on$=CHR$132+CHR$157+CHR$135:off$=" "+CHR$156 250 VDU26 12:PRINTon$"Two pass 65C02 disassembler"off$:VDU28 0 24 39 1 260 pntr%=0:file%=0:spool%=0:rom%=?&F4:D%=0:@%=1:os=0 270 file$=STRING$(25," "):spool$=file$:map$=file$:file$="":spool$="":map$="" 280 A$=STRING$(255," "):line$=A$:prompt$=A$:inp$=A$:cli$=A$:allhex$="0123456789ABCDEF" 290 start%=&C000:end%=&FFFF:top%=&C000:bottom%=&FFFF:printer=3:page=15 300 ENDPROC 310 DEFPROCfildim:MNE$=STRING$(255," "):MNE$="" 320 FOR I%=1TO15:READ Nbytes(I%):NEXT:FORI%=1TO15:READ Motype$(I%):NEXT 330 MNE$=STRING$(255," "):MNE$="" 340 MNE$=MNE$+"ADCANDASLBCCBCSBEQBITBMIBNEBPL" 350 MNE$=MNE$+"BRKBVCBVSCLCCLDCLICLVCMPCPXCPY" 360 MNE$=MNE$+"DECDEXDEYEORINCINXINYJMPJSRLDA" 370 MNE$=MNE$+"LDXLDYLSRNOPORAPHAPHPPLAPLPROL" 380 MNE$=MNE$+"RORRTIRTSSBCSECSEDSEISTASTXSTY" 390 MNE$=MNE$+"TAXTAYTYATSXTXATXS" 400 REM New 65C02 opcodes 410 MNE$=MNE$+"BRAPHYPHXPLYPLXSTZTSBTRB" 420 READ Q$:REPEAT:REPEAT:IF LEFT$(Q$,1)="-" THEN Nmne%=ABS(EVAL(Q$)):READQ$ 430 UNTIL LEFT$(Q$,1)<>"-" 440 Q%=EVAL("&"+Q$):I%=(Q% AND &FF):Hash%(I%)=(Q% AND &FF00)+Nmne%:READ Q$ 450 UNTIL Q$="*" 460 ENDPROC 470 DEFFNmenu0:LOCAL E%,A$ 480 FORE%=0TO9:PRINTTAB(36,2*E%+1)off$;:NEXT:PRINTTAB(0,0); 490 PRINT'"0>"on$"Exit the program" 500 PRINT'"1>"on$"OS * command" 510 PRINT'"2>"on$"Select another area of memory" 520 PRINT'"3>"on$"Load tracing map" 530 PRINT'"4>"on$"Save tracing map" 540 PRINT'"5>"on$"Trace from an entry point" 550 PRINT'"6>"on$"Reset area to data" 560 PRINT'"7>"on$"A string just for Welly" 570 PRINT'"8>"on$"Select range to be printed" 580 PRINT'"9>"on$"Disassemble selected range" 590 REPEAT 600 A$=FNin(2,21,1,0,on$+"Select an option"+off$,"",allhex$) 610 IFE%=0 E%=EVAL("&"+A$) ELSE E%=E%-&B0 620 UNTIL E%<10:PRINTTAB(2,E%*2+1)CHR$135CHR$157CHR$132TAB(2,21)SPC(39); 630 =E% 640 DEFPROCcli:LOCAL cli$ 650 REPEAT:cli$=FNin(0,1,118,20,"*","|"+cli$,"") 660 IFcli$<>"" VDU28 0 24 39 5 12:os=-1:OSCLIcli$:os=0:VDU28 0 24 39 1 670 REPEATUNTILFNin(0,23,0,20,on$+"RETURN to continue"+off$,"","")="" 680 PRINTTAB(0,23)SPC(24);:UNTILE%<>&B1:ENDPROC 690 DEFPROCinit 700 spool%=0:stack%=-1:moshow$=" " 710 FORI=0TO&1000STEP4:set%!I=0:NEXT 720 ENDPROC 730 DEFPROCmenu1:LOCALE%,F%:REPEAT:F%=TRUE 740 fm=(FNin(0,1,1,1,on$+"File or memory :"+off$,MID$("FM",2+fm,1),"FM")="F") 750 IFfm PROCmenu1F ELSEPROCmenu1M 760 start%=EVAL("&"+FNin(0,5,4,1,on$+"Start address :"+off$,FNhex(start%,4),allhex$)) 770 end%=EVAL("&"+FNin(0,7,4,1,on$+"End address :"+off$,FNhex(end%,4),allhex$)) 780 IF(start%>end%)OR(end%-start%>&4000)F%=FALSE 790 opnt%=EVAL("&"+FNin(0,9,4,1,on$+"Target address :"+off$,FNhex(opnt%+start%,4),allhex$))-start% 800 UNTILE%<>6ANDF%:ENDPROC 810 DEFPROCmenu1M:CLOSE#file%:file%=0:PRINTTAB(27,3)SPC(12); 820 rom%=EVAL("&"+FNin(0,3,1,1,on$+"Rom socket number :"+off$,FNhex(rom%,1),allhex$)):map$="TrMem" 830 ENDPROC 840 DEFPROCmenu1F:CLOSE#file%:file%=0 850 file$=FNin(0,3,10,0,on$+"Input file name :"+off$,file$,"") 860 file%=OPENINfile$:start%=0:end%=EXT#file%:map$="Tr"+file$ 870 ENDPROC 880 DEFPROCmenu2 890 REPEATREPEATentry$=FNin(0,1,4,21,on$+"Known entry points "+off$+CHR$13+CHR$10+on$+"RETURN if no more : "+off$,"",allhex$):UNTILE%=0 900 IFentry$<>""VDU28 0 24 39 5:PROCpush(EVAL("&"+entry$)-opnt%):VDU28 0 24 39 1:E%=6 910 UNTILE%=0:VDU28 0 4 39 1 12 28 0 24 39 1:ENDPROC 920 DEFPROCdis1 930 PRINT'on$"Tracing in progress."off$:VDU28 0 24 39 5 940 REPEAT:IFstack%=-1 THENUNTILTRUE:VDU28 0 24 39 1:ENDPROC 950 pntr%=FNpull:IF(pntr%end%)UNTILFALSE 960 IF Hash%(FNpeek(pntr%,1))AND&F00 THENPROCfollow(pntr%) 970 UNTILFALSE 980 ENDPROC 990 DEFPROCfollow(pntr%) 1000 REPEAT:IFFNset(pntr%)=3 UNTILTRUE:ENDPROC 1010 H%=Hash%(FNpeek(pntr%,1)):IF(H%AND&F00)=0 UNTILTRUE:ENDPROC 1020 FORN%=1TONbytes(H% DIV&100):PROCset(pntr%+N%-1,2):NEXT:PROCset(pntr%,3) 1030 IF H%MOD&100=&1C THENPROCjmpjsr1:UNTILTRUE:ENDPROC 1040 IF H%MOD&100=&1D THENPROCjmpjsr1 1050 IF H%MOD&100=&2A THENUNTILTRUE:ENDPROC 1060 IF H%MOD&100=&2B THENUNTILTRUE:ENDPROC 1070 IF H%MOD&100=&0B THENPROCbrk1:UNTILTRUE:ENDPROC 1080 IF(H%DIV&100=10) THENoff%=FNpeek(pntr%+1,1):off%=((256-off%)*(off%>127)-off%*(off%<128)):PROCpush(pntr%+2+off%) 1090 IF H%MOD&100=&80 THENUNTILTRUE:STOPP:ENDPROC 1100 pntr%=pntr%+Nbytes(H%DIV&100) 1110 UNTILpntr%>end%:ENDPROC 1120 DEFPROCbrk1 1130 pntr%=pntr%+1:PROCset(pntr%,2) 1140 REPEAT:pntr%=pntr%+1:PROCset(pntr%,2):UNTILFNpeek(pntr%,1)=0:ENDPROC 1150 DEFPROCjmpjsr1:LOCAL Q%,I% 1160 Q%=FNpeek(pntr%+1,2) 1170 IFQ%end%+opnt% ENDPROC 1180 Q%=Q%-opnt% 1190 IFH%DIV&100=6 PROCpush(Q%):ENDPROC 1200 IFH%DIV&100=13 LOCALpntr%,H%:pntr%=Q%:PROCjmpjsr1 1210 IFH%DIV&100=15 REM 1220 ENDPROC 1230 DEFPROCtsave:LOCAL B%,Q% 1240 REPEAT:map$=FNin(0,1,10,0,on$+"Save to filename :"+off$,map$,""):UNTILE%=0 1250 PRINT:B%=OPENUPmap$:IFB%<>0 IFFNin(0,3,1,1,on$+"Overwrite file ?"+off$,"Y","YN")="N" CLOSE#B%:ENDPROC 1260 IFB%=0 B%=OPENOUTmap$ 1270 PRINTTAB(0,5)on$"Saving "map$;off$:FORQ%=0TO&FFF:BPUT#B%,set%?Q%:NEXT:CLOSE#B%:ENDPROC 1280 DEFPROCtload:LOCAL B%,Q% 1290 REPEAT:map$=FNin(0,1,10,20,on$+"Load from filename :"+off$,map$,""):UNTILE%=0 1300 PRINT:B%=OPENINmap$:IFB%=0 VDU7:ENDPROC 1310 PRINT'on$"Loading "map$;off$:FORQ%=0TO&FFF:set%?Q%=BGET#B%:NEXT:CLOSE#B%:ENDPROC 1320 DEFPROCpush(push%):IFstack%>&FF THENCLS:PRINT"Stack overflow":END 1330 LOCAL B%,Q% 1340 IFstack%>-1 FORB%=0TOstack%:Q%=Q%-(stack%(B%)=push%):NEXT 1350 Q%=(Q%=0)AND(FNset(push%)<>3) 1360 IFQ% stack%=stack%+1:stack%(stack%)=push%:IFstack%<41PRINTTAB(10*((stack%)DIV20),(stack%)MOD20)FNhex(stack%,2)" : "FNhex(push%,4); 1370 ENDPROC 1380 DEFFNpull:IFstack%<0 THENCLS:PRINT"Stack underflow":END 1390 stack%=stack%-1:IFstack%<41PRINTTAB(10*((stack%+1)DIV20),(stack%+1)MOD20)SPC(10); 1400 =stack%(stack%+1)AND&FFFF 1410 DEFPROCmenu3 1420 LOCAL E%,F%,T%,I%:REPEAT 1430 F%=EVAL("&"+FNin(0,1,4,1,on$+"Start address :"+off$,FNhex(F%,4),allhex$))-opnt% 1440 T%=EVAL("&"+FNin(0,3,4,1,on$+"End address :"+off$,FNhex(T%,4),allhex$))-opnt% 1450 IF""=FNin(0,5,0,21,on$+"Return to confirm reset :"+off$,"","") 1460 UNTIL(E%=0)AND(F%<=T%)AND(F%>=start%)AND(F%<=end%)AND(T%>=start%)AND(T%<=end%) 1470 FORI%=F%TOT%:PRINTTAB(0,7)on$"Resetting address :"off$FNhex(I%+opnt%,4):PROCset(I%,0):NEXT:ENDPROC 1480 DEFPROCmenu5:REPEAT 1490 top%=EVAL("&"+FNin(0,1,4,1,on$+"Begin disassembly :"+off$,FNhex(top%+opnt%,4),allhex$))-opnt% 1500 bottom%=EVAL("&"+FNin(0,3,4,1,on$+"Cease disassembly :"+off$,FNhex(bottom%+opnt%,4),allhex$))-opnt% 1510 printer=3+(FNin(0,5,1,1,on$+"Output to printer :"+off$,MID$("YN",printer-1,1),"YN")="Y") 1520 page=15+(FNin(0,7,1,1,on$+"Paged mode on :"+off$,MID$("YN",page-13,1),"YN")="Y") 1530 spool%=FNin(0,9,1,1,on$+"Spool to a file :"+off$,MID$("YN",2+spool%,1),"YN")="Y" 1540 IFspool% spool$=FNin(0,11,10,1,on$+"Spool filename :"+off$,spool$,"") 1550 IF(top%>end%)OR(bottom%0)THENPROCcode2 ELSEPROCdata2 1630 PROCpause:NEXT 1640 IFspool% OSCLI"SPOOL" 1650 VDU3,15 1660 PRINT'on$"Press any key to return to Menu"off$:PROCcur(3):PROCcur(0*GET) 1670 ENDPROC 1680 DEFPROCcode2 1690 LOCAL H%,mode,mn%,mn$,N%:H%=Hash%(FNpeek(pntr%,1)) 1700 mode=H%DIV&100:mn%=H%AND&FF:N%=Nbytes(mode):mn$=MID$(MNE$,(mn%-1)*3+1,3):moshow$=Motype$(mode) 1710 IFmn%=11 PROCbrk2:ENDPROC 1720 IFmode=10 off%=FNpeek(pntr%+1,1):off%=((256-off%)*(off%>127)-off%*(off%<128)):PROCnum(pntr%+2+off%+opnt%) 1730 IF(N%=2)AND(mode<>10)PROCnum(FNpeek(pntr%+1,1)) 1740 IF(N%=3) PROCnum(FNpeek(pntr%+1,2)) 1750 IFmn%=29 ORmn%=28 PROCjmpjsr2 1760 PROCascii(N%):PRINTmn$" "moshow$ 1770 pntr%=pntr%+N%-1 1780 ENDPROC 1790 DEFPROCbrk2:PROCascii(2):LOCAL Q% 1800 pntr%=pntr%+1:B%=FNpeek(pntr%,1):PRINTmn$" &"FNhex(B%,2)TAB(22)"""";:pntr%=pntr%+1:Q%=pntr% 1810 REPEATB%=FNpeek(Q%,1) 1820 IFB%>31 ANDB%<127 THENPRINTCHR$B%;ELSEPRINT""""TAB(22)"&"FNhex(B%,2)TAB(22)"""";:PROCpause 1830 IFCOUNT>37THENPRINT""""TAB(22)""""; 1840 Q%=Q%+1:UNTILB%=0:PRINT"""":Q%=Q%-pntr% 1850 IFQ%>3 THENREPEAT:PROCpause:PROCascii(4):Q%=Q%-4:pntr%=pntr%+4:UNTILQ%<4 1860 IFQ%PROCpause:PROCascii(Q%) 1870 pntr%=pntr%+Q%-1 1880 ENDPROC 1890 DEFPROCjmpjsr2 1900 : 1910 : 1920 : 1930 : 1940 : 1950 ENDPROC 1960 DEFPROCdata2 1970 LOCAL B%:B%=-(FNset(pntr%)=0)-(FNset(pntr%+1)=0)-(FNset(pntr%+2)=0)-(FNset(pntr%+3)=0):B%=B%-(B%=0) 1980 PROCascii(B%):PRINT:pntr%=pntr%+B%-1 1990 ENDPROC 2000 DEFPROCset(pntr%,type%):LOCAL B%,Q%:B%=(pntr%-start%)DIV4:Q%=(pntr%-start%)MOD4 2010 IFpntr%end% THENENDPROC 2020 set%?B%=set%?B%ANDNOT(3*2^(Q%*2)):set%?B%=set%?B%OR(type%*2^(Q%*2)):ENDPROC 2030 DEFFNset(isset):LOCAL B%,Q%:B%=(isset-start%)DIV4:Q%=(isset-start%)MOD4 2040 IFissetend% THEN=0 2050 =((set%?B%)DIV(2^(Q%*2)))AND3 2060 DEFFNpeek(addr%,len%):LOCAL I%,R%,A%,X%,Y% 2070 IFfm ANDfile% THEN=FNfilepeek(addr%,len%) 2080 IFrom%=?&F4 THENFORI%=len%-1TO0STEP-1:R%=R%*&100+addr%?I%:NEXT:=R% 2090 FORI%=len%-1TO0STEP-1:X%=addr%+I%:Y%=rom%:?&F6=X%MOD&100:?&F7=X%DIV&100:A%=USR(&FFB9)AND&FF:R%=R%*&100+A%:NEXT 2100 =R% 2110 DEFFNfilepeek(addr%,len%) 2120 LOCAL E%:E%=EXT#file% 2130 FORI%=len%-1TO0STEP-1 2140 R%=R%*&100:IFaddr%+I%<=E% THENPTR#file%=addr%+I%:R%=R%+BGET#file% 2150 NEXT:=R% 2160 DEFPROCascii(asc%):LOCALI%,B%:PRINTTAB(5); 2170 FORI%=0TOasc%-1:PRINTFNhex(FNpeek(pntr%+I%,1),2)" ";:NEXT:PRINTTAB(17); 2180 FORI%=0TOasc%-1:B%=FNpeek(pntr%+I%,1):IFB%>31 ANDB%<127 THENPRINTCHR$B%;ELSEPRINT"."; 2190 NEXT:PRINTTAB(22);:ENDPROC 2200 DEFPROCnum(num%) 2210 LOCAL N2,N4:N2=INSTR(moshow$,".."):N4=INSTR(moshow$,"....") 2220 IFN4=0 THENmoshow$=LEFT$(moshow$,N2-1)+FNhex(num%,2)+MID$(moshow$,N2+2) ELSEmoshow$=LEFT$(moshow$,N4-1)+FNhex(num%,4)+MID$(moshow$,N4+4) 2230 ENDPROC 2240 DEFFNhex(hex,hexlen)=RIGHT$(STRING$(hexlen,"0")+STR$~hex,hexlen) 2250 DEFFNgetmulti:=GET$ 2260 DEFPROCpause:A%=INKEY(0):IFA%=-1 ENDPROC ELSELOCALC%:C%=COUNT 2270 VDU3,15:PROCcur(7):PRINTon$"Pause"off$;:PROCcur(0*GET):PRINTSTRING$(11,CHR$127)CHR$13STRING$(C%,CHR$9);:VDUpage,printer:ENDPROC 2280 DEFPROCerror 2290 IFFNosbyte(4,0,0)ORFNosbyte(225,1,0)ORFNosbyte(12,2,0) 2300 IF(ERR=254)ANDos REPORT:IFINKEY(300)OR1 ENDPROC 2310 PROCcur(5):ONERROROFF 2320 IF(ERR=17)ANDNOTINKEY(-1) ENDPROC 2330 IFFNosbyte(&77,0,0) 2340 REPORT:PRINT" at line "ERL:END 2350 DEFFNin(P%,V%,L%,F%,prp$,li$,key$) 2360 LOCALin$,ins,curs,cnv,prp,b1%,b2%,shf 2370 b1%=((FNosbyte(225,&B0,0)AND&FF00)DIV&100)+(FNosbyte(226,&80,0)AND&FF00)+((FNosbyte(227,&90,0)AND&FF00)*&100)+(FNosbyte(228,1,0)AND&FF00)*&10000 2380 b2%=(FNosbyte(4,2,0)AND&FF00)DIV&100 2390 cnv=F%MOD10:prp=(F%DIV100)MOD10:in$=STRING$(L%," "):IFLEN(li$)>L%li$=LEFT$(li$,L%):VDU7 2400 PRINTTAB(P%,V%)prp$" ";:P%=POS:V%=VPOS 2410 REPEATE%=0:in$=li$:curs=1 2420 REPEATPROCcur(0):PRINTTAB(P%,V%); 2430 IF(prp AND1)=0PRINTin$;ELSEPRINTSTRING$(LENin$,CHR$255); 2440 IF(prp AND2)=0PRINTSTRING$(L%-LENin$,"_");ELSEPRINTSTRING$(L%-LENin$," "); 2450 PRINTSTRING$(L%-curs+1,CHR$8);:IFins PROCcur(2-(curs>L%))ELSEPROCcur(1) 2460 `%=ASCFNgetmulti:shf=INKEY(-2)*-2-INKEY(-1) 2470 IF`%=&7F PROCdel 2480 IF`%<27ANDshf AND2 `%=`%+96 2490 IF(`%>31)AND(`%<127)PROCchar 2500 IF(`%AND&8F>&8A)PROCarrow 2510 UNTIL(`%=9)OR(`%=13)OR(`%>&AF AND`%<&BB) 2520 IF`%=9 E%=6ELSEIF`%<>13 E%=`% 2530 IF`%=13OR`%=9 `%=0 2540 UNTILFNcompress OR`% 2550 PROCcur(0):PRINTTAB(P%,V%); 2560 IF(prp AND1)=0PRINTin$;ELSEPRINTSTRING$(LENin$,CHR$255); 2570 IF(prp AND2)=0PRINTSTRING$(L%-LENin$,"_");ELSEPRINTSTRING$(L%-LENin$," "); 2580 IFFNosbyte(4,b2%AND&FF,0) 2590 IFFNosbyte(225,b1%AND&FF,0)ORFNosbyte(226,(b1%DIV&100)AND&FF,0)ORFNosbyte(227,(b1%DIV&10000)AND&FF,0)ORFNosbyte(228,(b1%DIV&1000000)AND&FF,0) 2600 =in$ 2610 DEFPROCcur(C%):LOCAL flag 2620 IFC%>3THENflag=18:C%=C%AND3 2630 flag=flag-32*(C%=0)-96*(C%=2)-64*(C%=3):VDU23 0 10 flag,0;0;0;:ENDPROC 2640 DEFFNosbyte(A%,X%,Y%):=USR&FFF4 2650 DEFPROCchar:IFFNosbyte(12,25,0) 2660 IFcurs>L%VDU7:ENDPROC 2670 IFcnv=0ORNOTFNalpha(CHR$`%) PROCaddchar:ENDPROC 2680 IFcnv=1 THEN`%=`%AND&5F 2690 IFcnv=2 THEN`%=`%OR &20 2700 IFshf AND2 PROCaddchar:ENDPROC 2710 IF(cnv>2AND(shf AND1))OR(cnv>3ANDcurs=1) THEN`%=`%AND&5F 2720 IFcurs<2 PROCaddchar:ENDPROC 2730 IF(cnv>4ANDMID$(in$,curs-1,1)=" ")OR(cnv>5ANDFNalpha(MID$(in$,curs-1,1))=0) `%=`%AND&5F 2740 PROCaddchar:ENDPROC 2750 DEFFNalpha(alph$):=(alph$>"@"ANDalph$<"[")OR(alph$>"`"ANDalph$<"{") 2760 DEFPROCaddchar 2770 IF(curs>L%)OR((`%=255)ORkey$=""ORINSTR(key$,CHR$`%))=0 VDU7:ENDPROC 2780 IFins SOUND3,-5,200,1:IFLEN(in$)=L%VDU7:ENDPROC 2790 LOCALi$:i$=LEFT$(in$,curs-1)+CHR$`%:in$=i$+MID$(in$,curs+ins+1,255-LENi$):curs=curs+1:ENDPROC 2800 DEFPROCdel:IFFNosbyte(12,10,0) 2810 IF(shf=0)AND(curs<2)OR(shf=1)AND(curs>LENin$) ENDPROC 2820 curs=curs+(shf=0):in$=LEFT$(in$,curs-1)+MID$(in$,curs+1,LENin$-curs):ENDPROC 2830 DEFPROCarrow:IFFNosbyte(12,5,0) 2840 IF(`%=&BB)in$=li$:curs=1 2850 IF(`%=&8B) 2860 IF(`%=&9B)in$="":curs=1 2870 IF(`%=&BC)curs=curs+(curs>1) 2880 IF(`%=&8C)curs=1 2890 IF(`%=&9C) 2900 IF(`%=&BD)curs=curs-(curs<=LENin$) 2910 IF(`%=&8D)curs=LENin$+1 2920 IF(`%=&9D)in$=LEFT$(in$,curs-1) 2930 IF(`%=&BE) 2940 IF(`%=&8E)ins=FALSE 2950 IF(`%=&9E) 2960 IF(`%=&BF):LOCAL_%:_%=`%:`%=255:PROCaddchar:`%=_% 2970 IF(`%=&8F)ins=TRUE 2980 IF(`%=&9F) 2990 ENDPROC 3000 DEFFNcompress:LOCALsear,strp:strp=(F%DIV10)MOD10 3010 REPEATsear=-INSTR(in$,CHR$255)*(in$<>""):IFsear in$=LEFT$(in$,sear-1)+MID$(in$,sear+1,LENin$-sear) 3020 UNTILsear=0 3030 IFRIGHT$(in$,1)=" "REPEATin$=LEFT$(in$,LENin$-1):UNTILRIGHT$(in$,1)<>" " 3040 IF(strp AND1)=0THENin$=FNspace_strip(in$) 3050 strp=strp DIV2 3060 IFstrp=0THEN=in$<>"" 3070 IFstrp=2THEN=LENin$=L% 3080 =TRUE 3090 DEFFNspace_strip(strip$):LOCALloop%:REPEATloop%=loop%+1:UNTILMID$(strip$,loop%,1)<>" "ORloop%>LEN(strip$):=MID$(strip$,loop%) 3100 : 3110 REM Jump table data 3120 REM Fast 6502 disassembler data for BBC micro 3130 REM J.M. Leach, June 1982 3140 REM 3150 REM Mode descriptors order : 3160 REM 1) Accumulator 2) Immediate 3) Zero Page 4) Zero Page,X 3170 REM 5) Zero Page,Y 6) Absolute 7) Absolute,X 8) Absolute,Y 3180 REM 9) Implied 10) Relative 11) (Indirect,X)12) (Indirect),Y 3190 REM 13) Absolute Indirect Jump 3200 REM 14) Zero Page Indirect 3210 REM 15) *** *** UNUSED *** *** 3220 REM 3230 REM Number of bytes for each mode 3240 DATA 1,2,2,2,2,3,3,3,1,2,2,2,3,2,3 3250 REM Display format for each mode 3260 DATA"A" ,"#&.." ,"&.." ,"&..,X" 3270 DATA"&..,Y" ,"&...." ,"&....,X","&....,Y" 3280 DATA"" ,"&...." ,"(&..,X)","(&..),Y" 3290 DATA"(&....)","(&..)" ,"(&....,X)" 3300 REM 3310 REM Build hash table to hold characteristics for each 6502 code 3320 REM In the following data statements a negative number gives the position of the associated mnemonic in the MNE$ string 3330 REM the following (hexadecimal) numbers give the instruction mode (1 digit) and 3340 REM the instruction code (2 digits) which directs the position in the hash table 3350 REM 3360 DATA -1,269,365,475,66D,77D,879,B61,C71,D72 3370 DATA -2,229,325,435,62D,73D,839,B21,C31,D32 3380 DATA -3,10A,306,416,60E,71E 3390 DATA -4,A90 3400 DATA -5,AB0 3410 DATA -6,AF0 3420 DATA -7,289,324,62C,434,73C 3430 DATA -8,A30 3440 DATA -9,AD0 3450 DATA -10,A10 3460 DATA -11,900 3470 DATA -12,A50 3480 DATA -13,A70 3490 DATA -14,918 3500 DATA -15,9D8 3510 DATA -16,958 3520 DATA -17,9B8 3530 DATA -18,2C9,3C5,4D5,6CD,7DD,8D9,BC1,CD1,DD2 3540 DATA -19,2E0,3E4,6EC 3550 DATA -20,2C0,3C4,6CC 3560 DATA -21,13A,3C6,4D6,6CE,7DE 3570 DATA -22,9CA 3580 DATA -23,988 3590 DATA -24,249,345,455,64D,75D,859,B41,C51,D52 3600 DATA -25,11A,3E6,4F6,6EE,7FE 3610 DATA -26,9E8 3620 DATA -27,9C8 3630 DATA -28,64C,D6C,F7C 3640 DATA -29,620 3650 DATA -30,2A9,3A5,4B5,6AD,7BD,8B9,BA1,CB1,DB2 3660 DATA -31,2A2,3A6,5B6,6AE,8BE 3670 DATA -32,2A0,3A4,4B4,6AC,7BC 3680 DATA -33,14A,346,456,64E,75E 3690 DATA -34,9EA 3700 DATA -35,209,305,415,60D,71D,819,B01,C11,D12 3710 DATA -36,948 3720 DATA -37,908 3730 DATA -38,968 3740 DATA -39,928 3750 DATA -40,12A,326,436,62E,73E 3760 DATA -41,16A,366,476,66E,67E 3770 DATA -42,940 3780 DATA -43,960 3790 DATA -44,2E9,3E5,4F5,6ED,7FD,8F9,BE1,CF1,DF2 3800 DATA -45,938 3810 DATA -46,9F8 3820 DATA -47,978 3830 DATA -48,385,495,68D,79D,899,B81,C91,D92 3840 DATA -49,386,596,68E 3850 DATA -50,384,494,68C 3860 DATA -51,9AA 3870 DATA -52,9A8 3880 DATA -53,998 3890 DATA -54,9BA 3900 DATA -55,98A 3910 DATA -56,99A 3920 DATA -57,A80 3930 DATA -58,95A 3940 DATA -59,9DA 3950 DATA -60,97A 3960 DATA -61,9FA 3970 DATA -62,364,474,69C,79E 3980 DATA -63,304,60C 3990 DATA -64,314,61C 4000 DATA "*"