10DIM workspace 40: DIM Buffer &2000: SymbolTableSize=1000:Address=Buffer 20RomNumber=15 30IO = FALSE 40INPUT LINE "Output file: "Out$ 50INPUT LINE "Object file: "File$ 60IF File$<>"" THEN GOTO 110 70INPUT LINE "Address: &"Address$ 80IF Address$ = "" GOTO 70 ELSE Address=EVAL("&"+Address$) 81IF PAGE<>&800 AND (&8000<=Address) AND (Address<=&BFFF) THEN IO = TRUE 90IF (&FFFF8000<=Address) AND (Address<=&FFFFBFFF) THEN IO = TRUE 100IF IO THEN INPUT LINE "Rom slot:"RomNumber 110INPUT LINE "Length: &"Length$ :IF Length$="" THEN Length=&100 ELSELength=EVAL("&"+Length$) 120INPUT LINE "Relocate: &"Reloc8$ 130IF Reloc8$<>"" THEN Reloc8=EVAL("&"+Reloc8$):RelOrg=Reloc8-Address ELSE RelOrg=0 140IF Out$<>"" THEN OSCLI"SPOOL "+Out$ 150PROCInitTables 160PRINT "AUTO" 170PROCInitSymbols 180 190Illegal$ = "?" 200IF File$<>"" THEN OSCLI("LOAD "+File$+" "+STR$~Buffer) 210PROCDisassemble(Address,Length) 220IF Out$<>"" THEN *SPOOL 230END 240 250DEFPROCDisassemble(Start,Length) 260Org=Start 270IF (Start AND &FFFF0000)=&FFFF0000 THEN Start=Start AND &FFFF:IO=TRUE 280PC = Start 290REPEAT 300 labsymb=FNlookup(PC+RelOrg) 310 IF labsymb<>0 IF (!labsymb AND &FFFF)=PC+RelOrg THEN PRINT " .";FNlabel(PC+RelOrg) 320 PC = PC+FN_dis(PC) 330 IF Opcode=&60 OR Opcode=&4C THEN PRINT 340UNTIL PC >= Start+Length 350ENDPROC 360 370DEFFN_dis(PC) 380 Opcode = FNget(PC) 390 Mode$ = FNmode(Opcode) 400 Name$ = FNname(Opcode) 410 IF Mode$ = Illegal$ THEN =FNillegal (Opcode) 420 ON INSTR(" ARI&#XYxyz()",Mode$) GOTO 460,500,540,580, 620,670,710,760,810,860,910,970,1010 ELSE 430 PRINT "Internal Error: Mode = "+Mode$ 440 450 460REM " " - Implicit 470=FNOpcode (1,"") 480 490 500REM "A" - Accumulator 510=FNOpcode (1," A") 520 530 540REM "R" - Relative 550=FNOpcode (2," "+FNlabel(PC+2+FNsex(FNget(PC+1))+RelOrg)) 560 570 580REM "I" - Indirect 590=FNOpcode (3," ("+FNlabel(FNpair)+")") 600 610 620REM "&" - Absolute 630Extra$ = "" 640=FNOpcode (3," "+FNlabel(FNpair)+Extra$) 650 660 670REM "#" - Immediate 680=FNOpcode (2," #"+STR$(FNget(PC+1))) 690 700 710REM "X" - Absolute, X 720Extra$ = ",X" 730GOTO 640 740 750 760REM "Y" - Absolute, Y 770Extra$ = ",Y" 780GOTO 640 790 800 810REM "x" - Xero page, X 820Extra$ = ",X" 830GOTO 930 840 850 860REM "y" - Zero page, Y 870Extra$ = ",Y" 880GOTO 930 890 900 910REM "z" - Zero page 920Extra$ = "" 930=FNOpcode (2," "+FNlabel(FNsingle)+Extra$) 940 950 960 970REM "(" - Pre indexed by X 980=FNOpcode (2," ("+FNlabel(FNsingle)+",X)") 990 1000 1010REM ")" - Post indexed by Y 1020=FNOpcode (2," ("+FNlabel(FNsingle)+"),Y") 1030 1040DEFFNillegal(Opcode) 1050 IF (ASC(" ")<=FNget(PC+1) AND FNget(PC+1)<=ASC("~")) AND (ASC(" ")<=Opcode AND Opcode<=ASC("~")) THEN =FNascii 1060 PROCaddress(1) 1070 PRINT " EQUB "; 1080 IF ASC(" ")<=Opcode AND Opcode<=ASC("~") THEN PRINT "ASC(""";CHR$(Opcode);""")" ELSE PRINT "&";STR$~(Opcode) 1090PRINT 1100=1 1110 1120DEFFNascii 1130 PROCaddress(3) 1140 PRINT " EQUS """; 1150 Count = 0 1160REM 1170 IF ASC(" ")<=FNget(PC+Count) AND FNget(PC+Count)<=ASC("~") THEN VDU FNget(PC+Count):Count=Count+1: GOTO 1160 1180 PRINT""": EQUB &"+FNHex(FNget(PC+Count),2) 1190PRINT 1200=Count+1 1210 1220 1230DEFFNsex(Byte) 1240IF Byte >= 128 THEN =(Byte OR &FFFFFF00) ELSE =Byte 1250 1260 1270DEFFNpair 1280 = FNget(PC+2)*256 + FNget(PC+1) 1290 1300 1310DEFFNsingle 1320 = FNget(PC+1) 1330 1340 1350 1360 1370DEFFNget(Address) 1380 IF IO THEN =FNgetHost(Address) : ELSE =Buffer?(Address-Org) 1390 1400 1410 DEFFNgetHost(Address) 1420 IF &8000 <= Address AND Address < &C000 THEN =FNgetRom(Address) 1430 Address=Address OR &FFFF0000 1440 !workspace=Address 1450 A%=5 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 1460 =workspace?4 1470 1480 1490 DEFFNgetRom(Address) 1491 IF PAGE<>&800 THEN =FNlocalGetRom(Address) 1500 LOCAL OldRom, TheByte : OldRom=FNgetHost(&00F4) 1510 Address=Address OR &FFFF0000 1520 workspace!0=&FFFF00F4 1530 workspace?4=RomNumber 1540 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 1550 workspace!0=&FFFFFE30 1560 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 1570 !workspace=Address 1580 workspace?4=OldRom 1590 A%=5 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 1600 TheByte=workspace?4 1610 workspace!0=&FFFF00F4 1620 workspace?4=OldRom 1630 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 1640 workspace!0=&FFFFFE30 1650 workspace?4=OldRom 1660 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 1670 =TheByte 1680 1681 1682DEFFNlocalGetRom(Address) 1683?&F6 = Address MOD 256 1684?&F7 = Address DIV 256 1685Y%=RomNumber 1686=USR(&FFB9) AND &FF 1687 1690 1700DEFFNlabel(Addr) 1710 LOCAL name$,symb 1720 symb=FNlookup(Addr) 1730 IF symb=0 THEN ="&"+STR$~Addr 1740 FOR i=3 TO SymbolEntrySize-1 1750 IF symb?i=ASC" " THEN workspace?(i-3)=13 ELSE workspace?(i-3)=symb?i 1760 NEXT 1770 workspace?SymbolEntrySize=13 1780 name$=$workspace 1790 IF (!symb AND &FFFF)=Addr THEN =name$ 1800 =name$+"+"+STR$(Addr-(!symb AND &FFFF)) 1810 1820 1830DEFFNOpcode (Size, Operand$) 1840 PROCaddress(Size) 1850 PRINT " "; Name$; Operand$ 1860 =Size 1870 1880 1890DEFFNx(Addr,Low,Size) 1900 =(Low <= Addr AND Addr < Low+Size) 1910 1920 1930 1940DEFFNr(Offset) 1950IF Offset>0 THEN = "+"+STR$(Offset) 1960="" 1970 1980 1990 2000DEFPROCaddress(Size) 2010 PRINT "\ ";FNHex((PC AND &FFFF)+RelOrg,4); 2020 FOR p = 1 TO 3 2030 IF p <= Size THEN PRINT " "FNHex(FNget((PC AND &FFFF)+p-1),2); ELSE PRINT " "; 2040 NEXT 2050 PRINT":"; 2060ENDPROC 2070 2080 2090DEFFNHex(I,J) 2100 = RIGHT$("000"+STR$~(I),J) 2110 2120 2130 2140 DEF PROCInitTables 2150 LOCAL a,b 2160 DIM Opcodes%(255) 2170 FOR a = 0 TO 15 2180 READ entry$ 2190 FOR b = 0 TO 15 2200 Opcodes%(a*16 + b)=FNencode(MID$(entry$,b*4+1,4)) 2210 NEXT 2220 NEXT 2230 2240 ENDPROC 2250 2260 DEF FNencode(string$) : REM Packs a 4 character string into 4 bytes !!! 2270 $workspace=string$ 2280 =!workspace 2290 2300 DEF FNname(op) 2310 LOCAL name$ 2320 workspace?4=13 2330 !workspace=Opcodes%(op) 2340 name$=$workspace 2350 =MID$(name$,1,3) 2360 2370 DEF FNmode(op) 2380 LOCAL name$ 2390 !workspace=Opcodes%(op) 2400 workspace?4=13 2410 name$=$workspace 2420 =MID$(name$,4,1) 2430 2440 REM Data table of all opcodes 2450 REM Each entry is 3 chars of opcode + one char of addressing mode 2460 REM The modes are :- 2470 REM None ( Space ) 2480 REM A Acc 2490 REM R Relative 2500 REM I Indirect 2510 REM & Absolute 2520 REM # Immediate 2530 REM z Zpage 2540 REM x Zpage,X 2550 REM y Zpage,Y 2560 REM X Abs,X 2570 REM Y Abs,Y 2580 REM ( Ind,X 2590 REM ) Ind,Y 2600 REM ? Illegal 2610 2620 REM "&x0 &x1 &x2 &x3 &x4 &x5 &x6 &x7 &x8 &x9 &xA &xB &xC &xD &xE &xF 2630 DATA"Brk Ora(????????????OrazAslz????Php Ora#AslA????????Ora&Asl&????" 2640 DATA"BplROra)????????????OraxAslx????Clc OraY????????????OraXAslX????" 2650 DATA"Jsr&And(????????BitzAndzRolz????Plp And#RolA????Bit&And&Rol&????" 2660 DATA"BmiRAnd)????????????AndxRolx????Sec AndY????????????AndXRolX????" 2670 DATA"Rti Eor(????????????EorzLsrz????Pha Eor#LsrA????Jmp&Eor&Lsr&????" 2680 DATA"BvcREor)????????????EorxLsrx????Cli EorY????????????EorXLsrX????" 2690 DATA"Rts Adc(????????????AdczRorz????Pla Adc#RorA????JmpIAdc&Ror&????" 2700 DATA"BvsRAdc)????????????AdcxRorx????Sei AdcY????????????AdcX????????" 2710 DATA"????Sta(????????StyzStazStxz????Dey ????Txa ????Sty&Sta&Stx&????" 2720 DATA"BccRSta)????????StyxStaxStxy????Tya StaYTxs ????????StaX????????" 2730 DATA"Ldy#Lda(Ldx#????LdyzLdazLdxz????Tay Lda#Tax ????Ldy&Lda&Ldx&????" 2740 DATA"BcsRLda)????????LdyxLdaxLdxy????Clv LdaYTsx ????LdyXLdaXLdxY????" 2750 DATA"Cpy#Cmp(????????CpyzCmpzDecz????Iny Cmp#Dex ????Cpy&Cmp&Dec&????" 2760 DATA"BneRCmp)????????????CmpxDecx????Cld CmpY????????????CmpXDecX????" 2770 DATA"Cpx#Sbc(????????CpxzSbczIncz????Inx Sbc#Nop ????Cpx&Sbc&Inc&????" 2780 DATA"BeqRSbc)????????????SbcxIncx????Sed SbcY????????????SbcXIncX????" 2790 2800 2810 DEFPROCInitSymbols 2820 LOCAL name$,Addr,Size 2830 DIM SymbolTable SymbolTableSize 2840 SymbolEntrySize=2+1+7 2850 RESTORE 3260 2860 NextFreeSymb=SymbolTable 2870 REPEAT 2880 READ name$,Addr,Size 2890 IF name$<>"" PROCdefine(name$,Addr,Size) 2900 UNTIL name$="" 2910 ENDPROC 2920 2930 2940 DEFPROCdefine(name$,Addr,Size) 2950 LOCAL symb,i 2960 IF NextFreeSymb-SymbolTable>= SymbolTableSize THEN PRINT "Too Many Symbols": ENDPROC 2970 symb=NextFreeSymb : NextFreeSymb=NextFreeSymb+SymbolEntrySize 2980 $workspace=name$+" " 2990 symb?0=Addr MOD 256 3000 symb?1=Addr DIV 256 3010 symb?2=Size 3020 FOR i=3 TO SymbolEntrySize-1 3030 symb?i=workspace?(i-3) 3040 NEXT 3042 IF (((Address+RelOrg) AND &0000FFFF) <= Addr) AND (Addr <= ((Address+RelOrg) AND &0000FFFF) + Length) THEN ENDPROC 3050 PRINT LEFT$(name$+" ",SymbolEntrySize-3);" = &";FNHex(Addr,4) 3060 ENDPROC 3070 3080 3090 DEFPROCprintsymbol(symb) 3100 PRINT """"; : FOR i=3 TO SymbolEntrySize-1 : VDU symb?i : NEXT 3110 PRINT " : ";FNHex(!symb AND &FFFF,4);" ";symb?2 3120 ENDPROC 3130 3140 3150 DEFFNlookup(Addr) 3160 LOCAL symb 3170 symb=SymbolTable 3180 IF FNx(Addr,!symb AND &FFFF,symb?2) THEN =symb 3190 symb=symb+SymbolEntrySize 3200 IF symb