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