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