10 ! ********************************************************************** 20 ! Program DISASM2.BAS Utg}va 1.3 1984-04-03 30 ! av Lars Thor, 2560, mindre justeringar av Bo Kullmar 40 ! Ny scrollrutin (passar 800 C) av Jan-]ke Larsson. >2461< 50 ! Ins{nd av Bo Kullmar 60 ! F|r ABC800M ABC800C ABC802 ABC806 70 ! Testad p} ABC800 M,ABC806,ABC800 C 80 ! Till programmet h|r filen OPCODE.DAT och kommentarfilen DISASM.REM 90 ! ********************************************************************** 100 INTEGER : EXTEND : OPTION BASE 0 110 GOSUB 4700 ! INIT BILD ADRESS. 120 ! *---------------* 130 ! * Disassembler * 140 ! * f|r Z-80 * 150 ! * L.Thor 830330 * 160 ! *---------------* 170 ! 180 DEF FNInit 190 DIM Kod$(63)=13,Kodh$(192:255)=12 200 DIM Dd$(9:249)=14,Ed$(64:187)=14 210 DIM Reg$(7)=4,Cb$(31)=8,Las$(15)=10 220 DIM Bl}$=3,M$=16,P$=20,S|k$=17 230 ! 240 Ccr=PEEK(65364) : Pf1=192 : S|k=0 250 ON ERROR GOTO 260 : Z=DOT(1,1) : Graf=-1 : GOTO 270 260 Graf=0 : RESUME 270 270 ON ERROR GOTO 280 IF Graf THEN Bl}$=BLU+NWBG+YEL 290 ; FNRen$(0,23) CUR(0,0) Bl}$ 'Z80 DISASSEMBLER' CUR(0,Ccr-20) TIME$ 300 ; FNLine$(1) FNLine$(22) 310 FOR Z=58 TO 127 320 IF INSTR(1,TIME$,CHR$(Z))<>0 THEN Z=FNKlocka : GOTO 340 330 NEXT Z 340 IF FNLoad=1 THEN RETURN 1 ELSE RETURN 0 350 FNEND 360 ! 370 ! UTFIL-funktioner 380 ! ---------------- 390 DEF FNOpen(A$,N) 400 ON ERROR GOTO 420 410 OPEN A$ AS FILE N : RETURN 0 420 RESUME 430 430 RETURN ERRCODE 440 FNEND 450 ! 460 DEF FNL{s$(N) LOCAL T$=16 470 INPUT LINE #N T$ : RETURN LEFT$(T$,LEN(T$)-2) 480 FNEND 490 ! 500 ! BILDSK[RMS-funktioner 510 ! --------------------- 520 DEF FNCurpos=SWAP%(PEEK2(65362)) 530 ! 540 DEF FNCur$(P)=CUR(P,P/256) 550 ! 560 DEF FNRk(Pos) LOCAL R,K : K=Pos/256 : R=Pos-256*K 570 IF Ccr=80 THEN RETURN (30720+R*80+K) 580 RETURN (31744+MOD(R,8)*128+R/8*40+K) 590 FNEND 600 ! 610 DEF FNR$(Rad)=CUR(Rad,0)+Bl}$+SPACE$(Ccr-LEN(Bl}$)) 620 ! 630 DEF FNRen$(Start,Slut) LOCAL T : T=LEN(Bl}$) 640 FOR Z=Start TO Slut 650 ; CUR(Z,0) Bl}$ SPACE$(Ccr-T); 660 NEXT Z : RETURN '' 670 FNEND 680 ! 690 DEF FNPren$=FNRen$(2,23)+FNLine$(22) 700 ! 710 DEF FNLine$(Rad) 720 IF Graf THEN RETURN CUR(Rad,0)+BLU+NWBG+YEL+STRING$(Ccr-4,45) 730 RETURN CUR(Rad,0)+STRING$(Ccr,61) 740 FNEND 750 ! 760 DEF FNMessage(A$,Kvit,Kvit1) LOCAL P,T,Pos 770 P=FNCurpos : ; FNR$(23) CUR(23,Ccr/2-LEN(A$)/2) A$; 780 IF Kvit=0 THEN 820 ELSE Pos=FNCurpos 790 WHILE T<>Kvit AND T<>Kvit1 AND T<>Pf1 800 T=FNGet(Pos) : IF T'+STDY 940 FNEND 950 ! 960 DEF FNTut LOCAL T$=15 970 T$=CHR$(66,22,0,219,5,197,16,254,193,27,122,179,32,245,201) 980 RETURN CALL(VARPTR(T$),20600) 990 FNEND 1000 ! 1010 ! 1020 ! INMATNINGS-funktioner 1030 ! --------------------- 1040 DEF FNGet(Pos) LOCAL T$=1 1050 T$=CHR$(PEEK(FNRk(Pos))) : IF T$='_' THEN T$=' ' 1060 WHILE SYS(5)=0 1070 ; CUR(0,Ccr-20) YEL TIME$ WHT FNCur$(Pos); 1080 IF (PEEK(65525) AND 32)=0 THEN ; '_'; ELSE ; T$; 1090 WEND : GET T$ 1100 IF ASCII(T$)>95 AND ASCII(T$)<127 THEN T$=CHR$(ASCII(T$)-32) 1110 IF ASCII(T$)=247 THEN Z=FNBilddump : GOTO 1050 ELSE RETURN ASCII(T$) 1120 FNEND 1130 ! 1140 DEF FNInput(Rad,Min,Max) LOCAL T,Pos,Nollrad 1150 ; FNR$(23) CUR(23,5) 'V{lj (' NUM$(Min) '-' NUM$(Max) ') '; 1160 Pos=FNCurpos : Nollrad=Max-Min+1 : Z=ASCII(NUM$(Min+1)) 1170 WHILE Z<>13 : T=Z-48 1180 ; CUR(T-1+Rad-Nollrad*(T=0),2) YEL '=>' 1190 ; FNCur$(Pos) NUM$(T); 1200 Z=FNGet(Pos) : IF Z=Pf1 THEN RETURN Z 1210 IF ZMax+48 THEN 1200 1220 ; CUR(T-1+Rad-Nollrad*(T=0),1) ' ' 1230 WEND 1240 ; CUR(T-1+Rad-Nollrad*(T=0),1) '==>' FNR$(23); : RETURN T 1250 FNEND 1260 ! 1270 DEF FNInput$(Rad,Kol,Fr}ga$,Def$,L{ngd) LOCAL Ed$=80,In$=80,P,T,Flag 1280 Ed$=Def$ : Flag=-1 1290 ; CUR(Rad,Kol) Fr}ga$; : P=FNCurpos 1300 WHILE Flag 1310 ; FNCur$(P) In$ Ed$ STRING$(L{ngd-LEN(In$)-LEN(Ed$),ASCII('_')); 1320 ; FNCur$(P) In$; 1330 IF LEN(In$)=L{ngd THEN ; CHR$(8); 1340 T=FNGet(FNCurpos) 1350 IF T<32 OR T>127 THEN 1400 1360 IF Flag=-1 THEN Ed$='' 1370 IF LEN(In$)L{ngd THEN Ed$=LEFT$(Ed$,L{ngd-LEN(In$)) 1390 GOTO 1480 1400 IF T=0 THEN Flag=0 1410 IF T=8 THEN Ed$=FNShift$(4,In$)+Ed$ : In$=FNShift$(3,In$) 1420 IF T=9 THEN In$=In$+FNShift$(1,Ed$) : Ed$=FNShift$(2,Ed$) 1430 IF T=13 THEN Flag=0 : In$=In$+Ed$ 1440 IF T=24 THEN In$='' : Ed$='' 1450 IF T=192 THEN 1520 1460 IF T=199 THEN IF LEN(Ed$) THEN Ed$=FNShift$(2,Ed$) ELSE In$=FNShift$(3,In$) 1470 IF ((T>128 AND T<>199) AND LEN(In$)=0) THEN In$=In$+Ed$ : Flag=0 1480 Flag=-(Flag<>0) 1490 WEND 1500 ; FNCur$(P) In$ SPACE$(L{ngd-LEN(In$)); 1510 RETURN In$ 1520 ; FNCur$(P) Def$ SPACE$(L{ngd-LEN(Def$)); 1530 RETURN NUM$(T) 1540 FNEND 1550 ! 1560 DEF FNShift$(Typ,In$) 1570 IF In$='' THEN RETURN '' ELSE ON Typ GOTO 1580,1590,1600,1610 1580 RETURN LEFT$(In$,1) 1590 RETURN RIGHT$(In$,2) 1600 RETURN LEFT$(In$,LEN(In$)-1) 1610 RETURN RIGHT$(In$,LEN(In$)) 1620 FNEND 1630 ! 1640 ! PROCEDUR-funktioner 1650 ! ------------------- 1660 DEF FNKlocka LOCAL T,Min,Max,T$=9,In$=2 1670 ON ERROR GOTO 1810 1680 ; FNPren$;CUR(2,0) Bl}$ CHR$(127,32) 'St{lla SYSTEMKLOCKAN' 1690 RESTORE 1780 : READ T$,Min,Max : T=0 1700 WHILE T$<>'' : ; FNR$(2*T+5); 1710 In$=FNInput$(2*T+5,5,T$,MID$(TIME$,3*(T+1),2),2) 1720 IF VAL(In$)Max THEN 1700 1730 POKE 65519+T,VAL(In$) 1740 READ T$,Min,Max : T=T+1 1750 WEND 1760 IF FNInput$(23,10,'[r det R[TT (J/N) ','J',1)<>'J' THEN 1680 1770 ; FNPren$; : RETURN 0 1780 DATA ']r ..... ',0,99,'M}nad .. ',1,12 1790 DATA 'Dag .... ',1,31,'Timme .. ',0,23 1800 DATA 'Minut .. ',0,59,'Sekund . ',0,59 ,'',0,0 1810 RESUME 1700 1820 FNEND 1830 ! 1840 DEF FNBilddump LOCAL R,P,T,T$=80,H$=80 1850 H$='' : T=FNRk(23) 1860 FOR Z=T TO T+Ccr-1 : H$=H$+CHR$(PEEK(Z)) : NEXT Z 1870 Z=FNMessage('Bilden dumpas p} printern',0,0) 1880 IF FNOpen('PR:',8)=0 THEN 1900 1890 IF FNFel('Printer ej ansluten')=Pf1 THEN 1960 ELSE 1870 1900 WHILE R<23 : T$='' : P=30720+R*80 1910 FOR Z=0 TO 79 1920 T=PEEK(P+Z) : IF T>126 OR T<32 THEN T=32 1930 T$=T$+CHR$(T) 1940 NEXT Z : ; #8 T$ : R=R+1 1950 WEND : ; #8 H$ 1960 ; FNR$(23) CUR(23,0) H$; : CLOSE 8 : RETURN 0 1970 FNEND 1980 ! 1990 ! DISASSEMBLER-funktioner 2000 ! ======================= 2010 DEF FNLoad LOCAL Start,Slut 2020 IF Reg$(0)<>'' THEN RETURN 0 2030 ; CUR(3,3) 'OPCODE l{ses in fr}n skiva.' : ON ERROR GOTO 2220 2040 IF FNOpen('OPCODE.DAT',1)<>0 THEN 2200 2050 INPUT #1,Start : INPUT #1,Slut 2060 FOR Z=Start TO Slut : Reg$(Z)=FNL{s$(1) : NEXT Z 2070 INPUT #1,Start : INPUT #1,Slut 2080 FOR Z=Start TO Slut : Las$(Z)=FNL{s$(1) : NEXT Z 2090 INPUT #1,Start : INPUT #1,Slut 2100 FOR Z=Start TO Slut : Kod$(Z)=FNL{s$(1) : NEXT Z 2110 INPUT #1,Start : INPUT #1,Slut 2120 FOR Z=Start TO Slut : Kodh$(Z)=FNL{s$(1) : NEXT Z 2130 INPUT #1,Start : INPUT #1,Slut 2140 FOR Z=Start TO Slut : Cb$(Z)=FNL{s$(1) : NEXT Z 2150 INPUT #1,Start : INPUT #1,Slut 2160 FOR Z=Start TO Slut : Dd$(Z)=FNL{s$(1) : NEXT Z 2170 INPUT #1,Start : INPUT #1,Slut 2180 FOR Z=Start TO Slut : Ed$(Z)=FNL{s$(1) : NEXT Z 2190 CLOSE 1 : ; FNR$(3) : RETURN 0 2200 IF FNFel('Skivan ej klar')=13 THEN 2030 2210 ; FNR$(3) : RETURN 1 2220 IF FNFel('FEL vid l{sning.')=13 THEN RESUME 2030 ELSE RESUME 2210 2230 FNEND 2240 ! 2250 DEF FNOmv.(A$) LOCAL T.,H 2260 IF A$='' RETURN 65535. 2270 IF Dec RETURN VAL(A$) ELSE IF LEN(A$)>4 RETURN 65535. 2280 FOR Z=1 TO LEN(A$) 2290 H=INSTR(1,'0123456789ABCDEF',MID$(A$,Z,1)) 2300 IF H=0 THEN RETURN -1 ELSE T.=T.*16+H-1 2310 NEXT Z : RETURN T. 2320 FNEND 2330 ! 2340 DEF FNDisassembler LOCAL In,T.,T,Tab1,Tab2,T$=32 2350 Tab1=17-8*Dec+5*Dev : Tab2=35-10*Dec+10*Dev 2360 IF Dev>0 THEN Z=FNPrhead 2370 WHILE Ad.0 THEN IF FNGet(FNCurpos)=Pf1 THEN 2490 2390 T$=FNVal$(FNPek) 2400 IF INSTR(1,T$,'d')>0 THEN T$=FNDis$(T$) 2410 IF INSTR(1,T$,'n')>0 THEN T$=FNFill$(T$,'n') 2420 IF INSTR(1,T$,'NN')>0 THEN T$=FNNn$(T$) 2430 IF S|k THEN IF INSTR(1,T$,S|k$)=0 THEN 2470 2440 IF Dev>0 THEN 2460 ELSE IF PEEK(65363)<23 THEN 2460 2450 IF FNGet(FNCurpos)=Pf1 THEN 2490 ELSE Z=FNScroll(2,22,1) 2460 ; #Dev FNTal$(T.,3) ' :' M$ TAB(Tab1) T$ TAB(Tab2) P$ 2470 In=In+1 : M$='' : P$='' 2480 WEND 2490 IF Dev=0 AND PEEK(65363)>20 THEN Z=FNScroll(2,22,2) 2500 ; #Dev STRING$(Ccr,61) STRING$(-2*(Dev=1),10); 2510 ; #Dev,(Ad.-Astart.) 'Bytes. ' In 'Instruktioner.' 2520 IF Dev>0 THEN ; #Dev CHR$(12) 2530 M$='' : P$='' : RETURN 0 2540 FNEND 2550 ! 2560 DEF FNAsc LOCAL T,T. 2570 IF Dev>0 THEN Z=FNPrhead 2580 IF S|k THEN 2710 2590 WHILE Ad.22 THEN Z=FNScroll(2,23,2) 2610 ; #Dev USING '#####&' Ad. 'D:'+HEX$(Ad.)+'H' 2620 WHILE PEEK(65362)127 THEN T=ASCII('.') 2640 ; #Dev CHR$(T); 2650 WEND 2660 WEND 2670 IF SYS(5)=0 THEN 2700 ELSE IF FNGet(FNCurpos)<>Pf1 THEN 2590 2680 IF PEEK(65363)>22 THEN Z=FNScroll(2,23,2) 2690 IF FNMessage('Mera ASCII (J/N) ',74,78)=74 THEN 2590 2700 RETURN 0 2710 WHILE Ad.LEN(S|k$) 2750 P$=P$+CHR$(PEEK(Ad.)) : Ad.=Ad.+1 2760 IF INSTR(1,S|k$,P$)=0 THEN 2800 2770 WEND 2780 ! IF PEEK(65363)>22 THEN Z=FNScroll(2,23,2) 2790 ; #Dev USING '#####&' (T.) 'D:'+HEX$(T.)+'H '+P$ 2800 WEND : GOTO 2670 2810 FNEND 2820 ! 2830 DEF FNTal$(A.,L) LOCAL T$=5 2840 IF Dec THEN T$=NUM$(A.) ELSE T$=HEX$(A.) 2850 RETURN RIGHT$(STRING$(L-Dec,48)+T$,LEN(T$)) 2860 FNEND 2870 ! 2880 DEF FNVal$(A) 2890 IF A<64 THEN RETURN Kod$(A) 2900 IF A<192 THEN RETURN FNMitti$(A) 2910 IF A=203 THEN RETURN FNCb$(FNPek) 2920 IF A=221 OR A=253 THEN RETURN FNDd$(FNPek,(A=221)) 2930 IF A=237 THEN RETURN FNEd$(FNPek) 2940 RETURN Kodh$(A) 2950 FNEND 2960 ! 2970 DEF FNPek LOCAL T,T$=4 2980 T=PEEK(Ad.) : Ad.=Ad.+1 : T$=FNTal$(T,1) 2990 IF Dec AND M$<>'' THEN M$=M$+','+T$ ELSE M$=M$+T$ 3000 IF T<32 OR T>=127 THEN P$=P$+'.' ELSE P$=P$+CHR$(T) 3010 RETURN T 3020 FNEND 3030 ! 3040 DEF FNMitti$(A) 3050 IF A=118 THEN RETURN 'HALT' 3060 RETURN Las$((A-64)/8)+Reg$(MOD(A-64,8)) 3070 FNEND 3080 ! 3090 DEF FNCb$(A)=Cb$(INT(A/8))+Reg$(MOD(A,8)) 3100 ! 3110 DEF FNDd$(A,Dd) LOCAL T,T$=24 3120 IF A<9 OR A>249 THEN 3240 3130 IF A<>203 THEN T$=Dd$(A) : GOTO 3160 3140 T$=FNTal$(FNPek,1) 3150 T$=Cb$((FNPek XOR 6)/8)+'(IX+'+T$+')' 3160 IF T$='...' THEN 3240 3170 IF INSTR(1,T$,'d')>0 THEN T$=FNFill$(T$,'d') 3180 IF INSTR(1,T$,'n')>0 THEN T$=FNFill$(T$,'n') 3190 IF INSTR(1,T$,'NN')>0 THEN T$=FNNn$(T$) 3200 IF Dd THEN RETURN T$ 3210 WHILE INSTR(1,T$,'IX')<>0 3220 MID$(T$,INSTR(1,T$,'IX'),2)='IY' 3230 WEND : RETURN T$ 3240 RETURN FNEjdis$ 3250 FNEND 3260 ! 3270 DEF FNEjdis$ 3280 M$=LEFT$(M$,LEN(M$)/2) : P$=LEFT$(P$,LEN(P$)/2) 3290 Ad.=Ad.-1 : RETURN '...' 3300 FNEND 3310 ! 3320 DEF FNEd$(A) 3330 IF A<64 OR A>187 THEN RETURN FNEjdis$ ELSE RETURN Ed$(A) 3340 FNEND 3350 ! 3360 DEF FNDis$(A$) LOCAL P,T.,T$=24 3370 T.=FNPek : P=INSTR(1,A$,'d') 3380 T$=FNTal$(T.,1)+' (' : T.=Ad.+T.+256*(T.>127) 3390 IF Dec THEN T$=T$+NUM$(T.)+')' ELSE T$=T$+HEX$(T.)+')' 3400 IF P=LEN(A$) THEN RETURN LEFT$(A$,P-1)+T$ 3410 RETURN LEFT$(A$,P-1)+T$+RIGHT$(A$,P+1) 3420 FNEND 3430 ! 3440 DEF FNFill$(A$,B$) LOCAL T,P,T$=24 3450 T=FNPek : P=INSTR(1,A$,B$) 3460 T$=LEFT$(A$,P-1)+FNTal$(T,1)+RIGHT$(A$,LEN(B$)+P) 3470 RETURN T$ 3480 FNEND 3490 ! 3500 DEF FNNn$(A$) LOCAL P,T.,T$=24 3510 P=INSTR(1,A$,'NN') : T.=FNPek+256.*FNPek 3520 IF Dec THEN T$=NUM$(T.) ELSE T$=HEX$(T.) 3530 IF NOT Dec THEN T$=RIGHT$('000'+T$,LEN(T$)) 3540 RETURN LEFT$(A$,P-1)+T$+RIGHT$(A$,P+2) 3550 FNEND 3560 ! 3570 DEF FNS|k LOCAL Max,Pos,T,T$=4 3580 ; CUR(2,0) Bl}$ CHR$(127,32) 'V{lja S|kkod' 3590 RESTORE 3900 : Max=70 3600 FOR I=0 TO Max : READ T$ 3610 ; CUR(4+MOD(I,18),5+10*(I/18)) T$ 3620 NEXT I : I=0 3630 Z=FNMessage('RETURN =>Val PF2 Info ',0,0) 3640 WHILE Z<>13 3650 ; CUR(4+MOD(I,18),3+10*(I/18)) CHR$(127,8); : Pos=FNCurpos 3660 Z=FNGet(FNCurpos) : T=I 3670 IF ZI THEN ; FNCur$(Pos) ' ' 3730 WEND : ; FNPren$ CUR(9,5); 3740 IF I=Max THEN S|k$='DR1:' : T$='' : GOTO 3780 3750 T=I : RESTORE 3900 3760 FOR I=0 TO T-1 : READ T$ : NEXT I : READ T$ 3770 S|k$=FNOpcodeex$(T$) 3780 ; CUR(10,8) 'ex-vis ' S|k$; 3790 S|k$=T$+FNInput$(9,5,'S|ka efter: '+T$,'',13) 3800 ; FNPren$; : S|k=-1 3810 RETURN 0 3820 ; FNPren$; 3830 ; CUR(3,3) 'Tangenter vid Val' 3840 ; CUR(5,3) 'PF1 Avbryter PF2 Visar detta' 3850 ; CUR(6,3) 'PF5 Bak}t PF6 Till Mitten' 3860 ; CUR(7,3) 'PF7 Fram}t PF8 Home' 3870 ; CUR(9,3) 'RETURN => Val av markerad OPCODE' 3880 Z=FNMessage('Tryck RETURN ',13,13) 3890 ; FNPren$; : GOTO 3580 3900 DATA ADC,ADD,AND,BIT,CALL,CCF,'CP ',CPL,CPD,CPDR,'CPI ',CPIR 3910 DATA DAA,DEC,DI,DJ,DJNZ,EI,'EX ',EXX,HALT 3920 DATA IM 0,IM 1,IM 2,'IN ',INC,INDR,IND,'INI ',INIR 3930 DATA JP,JR,LD,LDD,LDDR,'LDI ',LDIR,NEG,NOP 3940 DATA OR,OTDR,OTIR,'OUT ',OUTD,OUTI,POP,PUSH 3950 DATA RES,'RET ',RETI,RETN,'RL ',RLA,RLC,RLCA,RLD 3960 DATA 'RR ',RRA,'RRC ',RRCA,RRD,RST,SBC,SCF,SET 3970 DATA SLA,SRA,SRL,SUB,XOR,EGET 3980 FNEND 3990 ! 4000 DEF FNOpcodeex$(A$) 4010 ON ERROR GOTO 4100 4020 FOR I=0 TO 255 4030 IF I<32 THEN IF INSTR(1,Cb$(I),A$)>0 THEN RETURN Cb$(I) 4040 IF I<63 THEN IF INSTR(1,Kod$(I),A$)>0 THEN RETURN Kod$(I) 4050 IF I<9 THEN 4090 4060 IF I>63 AND I<188 THEN IF INSTR(1,Ed$(I),A$)>0 THEN RETURN Ed$(I) 4070 IF I<250 THEN IF INSTR(1,Dd$(I),A$)>0 THEN RETURN Dd$(I) 4080 IF I>191 THEN IF INSTR(1,Kodh$(I),A$)>0 THEN RETURN Kodh$(I) 4090 NEXT I : RETURN 'Fel OPCODE' 4100 RESUME 4020 4110 FNEND 4120 ! 4130 DEF FNPrhead 4140 ; #Dev 'Z-80 DISASSEMBLER' TAB(55) TIME$ 4150 ; #Dev STRING$(Ccr-6,61) CHR$(10) 4160 RETURN 0 4170 FNEND 4180 ! 4190 ! ********************** 4200 ! * P R O G R A M * 4210 ! ********************** 4220 ! 4230 DEF FNFr}ga LOCAL Felu,T$=6 4240 ON ERROR GOTO 4440 : Felu=1 4250 T$=FNInput$(5,3,'Adresser (Hex/Dec) ',CHR$(72+Dec*4),1) 4260 IF T$<>'D' AND T$<>'H' THEN 4420 ELSE ; FNR$(5) FNLine$(22); 4270 Dec=(T$='D') : IF NOT Dec THEN T$='Hexad' 4280 ; CUR(3,5) T$+'ecimala ADRESSER' : Felu=2 4290 IF Dec THEN T$=NUM$(Astart.) ELSE T$=HEX$(Astart.) 4300 Ad.=FNOmv.(FNInput$(5,3,'Start Adress: ',T$,4-Dec)) 4310 IF Ad.<0 THEN 4420 ELSE Astart.=Ad. : ; FNLine$(22); 4320 IF Aslut.=0 THEN Aslut.=65535. 4330 IF Dec THEN T$=NUM$(Aslut.) ELSE T$=HEX$(Aslut.) 4340 Felu=3 : Aslut.=FNOmv.(FNInput$(7,3,'Slut Adress: ',T$,4-Dec)) 4350 IF Aslut.65536. THEN 4420 ELSE Felu=4 : ; FNLine$(22); 4360 T$=FNInput$(9,3,'MEDIA Bildsk{rm/Printer (B/P): ','B',1) 4370 IF T$<>'P' AND T$<>'B' THEN 4420 4380 Dev=-(T$='P') : ; FNLine$(22); : Felu=5 4390 T$=FNInput$(11,3,'Instruktioner eller Ascii (I/A): ','I',1) 4400 IF T$<>'I' AND T$<>'A' THEN 4420 4410 RETURN (T$='A') 4420 ; FNError$('Fel V{rde') 4430 ON Felu GOTO 4250,4300,4340,4360,4390 4440 RESUME 4420 4450 FNEND 4460 ! 4470 IF FNInit=1 THEN 4650 4480 ; FNPren$; 4490 ; CUR(5,5) '1. Disassemblering' 4500 ; CUR(6,5) '2. S|kning efter OPCODE' 4510 ; CUR(7,5) '3. St{lla Systemklockan' 4520 ; CUR(8,5) '0. Avsluta' 4530 I=FNInput(5,0,3) : S|k=0 4540 IF I=0 THEN 4660 ELSE ; FNPren$; 4550 IF I=2 THEN IF FNS|k THEN 4480 4560 IF I=3 THEN Z=FNKlocka : GOTO 4480 4570 I=FNFr}ga 4580 IF Dev=0 THEN 4610 4590 IF FNOpen('PR:',Dev)=0 THEN 4610 4600 IF FNFel('Printer ej ansluten.')=Pf1 THEN 4650 ELSE 4590 4610 IF FNFel('Uskrift avbryts med PF1')=Pf1 THEN 4480 4620 ; FNRen$(2,23) CUR(2,0); 4630 IF I=0 THEN Z=FNDisassembler ELSE Z=FNAsc 4640 IF FNMessage('L[SA MER (J/N) ',74,78)=74 THEN 4480 4650 ! Avslutning 4660 ; CHR$(12) CUR(5,3) 'Tack f|r idag' 4670 CLOSE 4680 EXTEND 4690 END 4700 ! --- DEFINIERA RADPOS. --- 4710 IF PEEK(65364)=80 Wid=30720 : Wid2=80 ELSE Wid=31744 : Wid2=40 4720 Z$=FNDatorsort$ 4730 IF Z$='ABC800 C' Spec=128 : Spec2=984 ELSE Spec=Wid2 : Spec2=0 4740 DEF FNA(R,K)=(Wid+(Spec*R)-(R/8*Spec2))+K 4750 RETURN 4760 ! --- KOLLA DATORSORT --- 4770 DEF FNDatorsort$ LOCAL Z 4780 ON ERROR GOTO 4800 4790 Z=TXPOINT(1,1) : RETURN 'ABC800 C' 4800 RESUME 4810 4810 RETURN '' 4820 FNEND 4830 ! --- SCROLL RUTIN --- 4840 DEF FNScroll(Srad,Slrad,X.) 4850 FOR Rad=Srad TO Slrad 4860 Asm$=CHR$(17,FNA(Rad,0),SWAP%(FNA(Rad,0)),33,FNA(Rad+1,0),SWAP%(FNA(Rad+1,0)),1,Wid2,SWAP%(Wid2),237,176,201) 4870 Z=CALL(VARPTR(Asm$)) 4880 NEXT Rad 4890 ; CUR(Slrad,0); 4900 RETURN 0 4910 FNEND