100 ! ********************************************************************** 110 ! Program DISASM.800 Utg}va 1.3 1984-04-26 120 ! av L Thor 130 ! Ins{nd av L Thor 140 ! F|r ABC800M ABC800C ABC802 ABC806 150 ! Testad p} ABC806 160 ! 170 ! Screened by --"-TCP-"-- 180 ! ********************************************************************** 190 ! 200 ! ******************************************** 210 ! * DISASM.BAC Ver 1.3 * 220 ! * Disassembler f|r Z-80 830330 * 230 ! * -------------------------------------- * 240 ! * Initiering Rad 100-0999 * 250 ! * Allm{nna funktioner Rad 1000-1999 * 260 ! * Disassembler funktioner Rad 2000-4999 * 270 ! * System funktioner Rad 8000-8999 * 280 ! * HEAD-program Rad 9000- * 290 ! * Progsize 13.230 * 300 ! * Fullsize 24.301 * 310 ! * -------------------------------------- * 320 ! * L.Thor, Grimsn{s, 360 53 SKRUV * 330 ! * Tel 0478/20544, Medlem Nr: 2560 * 340 ! * -------------------------------------- * 350 ! * Provad p} ABC 800C/M,802,806 * 360 ! ******************************************** 370 INTEGER : EXTEND : OPTION BASE 0 380 DEF FNInit 390 ! 400 ! Dimensionera varibler och initiera konstanter 410 ! 420 DIM Kod$(63)=13,Kodh$(192:255)=12,Dd$(9:249)=14,Ed$(64:187)=14 430 DIM Reg$(7)=4,Cb$(31)=8,Las$(15)=10,M$=16,P$=20,S|k$=17 440 ! 450 Ccr=PEEK(65364) : Pf1=192 : S|k=0 : Graf=0 460 ON ERROR GOTO 480 : Z=DOT(1,1) : Graf=-1 470 DIM Bl}$=3,Gbl}$=3 : Bl}$=BLU+NWBG+YEL : Gbl}$=BLU+NWBG+GYEL : GOTO 490 480 DIM Bl}$=0,Gbl}$=0 : RESUME 490 490 ON ERROR GOTO 500 ; CHR$(12) Bl}$ 'Z80 DISASSEMBLER' CUR(0,Ccr-20) TIME$ FNLine$(1) FNPren$; 510 ; FNLine$(1) FNLine$(22) 520 FOR Z=58 TO 127 530 IF INSTR(1,TIME$,CHR$(Z))<>0 THEN Z=FNKlocka : GOTO 550 540 NEXT Z 550 IF FNLoad=1 THEN RETURN 1 ELSE RETURN 0 560 FNEND 570 ! FNSKIP 580 ! == Allm{nna funktioner == 590 ! 600 ! UTFIL-funktioner 610 ! ---------------- 620 DEF FNOpen(A$,N) 630 ! \ppna filen A$ som nr N, om OK returnera 0 640 ! 650 ON ERROR GOTO 670 660 OPEN A$ AS FILE N : RETURN 0 670 RESUME 680 680 RETURN ERRCODE 690 FNEND 700 ! 710 DEF FNChain(A$) 720 ! Laddar in program A$, om fel fr}ga om diskettbyte. 730 ! 740 Z=FNMessage('H{mtar vald rutin.',0,0) 750 ON ERROR GOTO 770 760 CHAIN A$ 770 RESUME 780 780 Z=FNFel('Hittar ej '+A$+' ,byt diskett.') 790 IF Z=13 THEN 740 ELSE RETURN -1 800 FNEND 810 ! 820 DEF FNL{s$(N) LOCAL T$=16 830 ! L{s in rad fr}n fil # N, och skala bort LF+CR 840 ! 850 INPUT LINE #N T$ : RETURN LEFT$(T$,LEN(T$)-2) 860 FNEND 870 ! 880 ! BILDSK[RMS-funktioner 890 ! --------------------- 900 ! 910 DEF FNCurpos=SWAP%(PEEK2(65362)) 920 ! Returnera aktuell cursorposition som heltal 930 ! 940 DEF FNCur$(P)=CUR(P,P/256) 950 ! Omvandla inparametern till cursoposition 960 ! 970 DEF FNRk(Pos) LOCAL R,K : K=Pos/256 : R=Pos-256*K 980 ! Returnera adress till bildminnet , Pos=FNCurpos 990 ! 1000 IF Ccr=80 THEN RETURN (30720+R*80+K) 1010 RETURN (31744+MOD(R,8)*128+R/8*40+K) 1020 FNEND 1030 ! 1040 DEF FNR$(Rad)=CUR(Rad,0)+Bl}$+SPACE$(Ccr-LEN(Bl}$)) 1050 ! Rensa Rad och f|r 800C s{tt f|r- och bakgundsf{rg 1060 ! 1070 DEF FNRen$(Start,Slut,A$) LOCAL T : T=Ccr-LEN(A$) 1080 ! Rensa raderna fr}n Start till Slut ,jfr FNR$ () 1090 ! 1100 FOR Z=Start TO Slut : ; CUR(Z,0) A$ SPACE$(T); 1110 NEXT Z : RETURN '' 1120 FNEND 1130 ! 1140 DEF FNPren$=FNRen$(2,21,Bl}$)+FNLine$(22)+FNR$(23) 1150 ! Rensa textarea p} sk{rmen 1160 ! 1170 DEF FNLine$(Rad) : ; CUR(Rad,0); 1180 ! Returnera linje och om 800C/802 grafisk linje 1190 ! 1200 IF Graf RETURN Gbl}$+STRING$(Ccr-5,44) ELSE RETURN STRING$(Ccr,61) 1210 FNEND 1220 ! 1230 DEF FNMessage(A$,Kvit,Kvit1) LOCAL P,T,Pos 1240 ! Skriv ut meddelande A$ och om kvittens<>0 inv{nta dito och 1250 ! returnera kvitens (Kvit/Kvit1/Pf1) 1260 P=FNCurpos : ; FNR$(23) CUR(23,Ccr/2-LEN(A$)/2) A$; 1270 IF Kvit=0 THEN 1310 ELSE Pos=FNCurpos 1280 WHILE T<>Kvit AND T<>Kvit1 AND T<>Pf1 1290 T=FNGet(Pos) : IF T63 THEN T=T AND 95 1300 WEND : ; FNR$(23); 1310 ; FNCur$(P); : RETURN T 1320 FNEND 1330 ! 1340 DEF FNFel(A$) LOCAL Pos 1350 ! Skriv ut felmeddelande f|r kvittens med RETURN 1360 ! 1370 Pos=FNCurpos : ; FNFel$(A$); 1380 Z=FNMessage('Tryck RETURN (PF1 avbryter)',13,Pf1) 1390 ; FNLine$(22) FNCur$(Pos); : RETURN Z 1400 FNEND 1410 ! 1420 DEF FNFel$(A$) LOCAL Pos 1430 ! Skriv ut felmeddelande,ej kvittens 1440 ! 1450 Z=FNTut : ; CUR(22,(Ccr-LEN(A$)-6+Graf*2)/2); 1460 IF NOT Graf RETURN ' < '+A$+' > ' 1470 RETURN MAG+FLSH+'<'+STDY+A$+FLSH+'>'+STDY+GYEL 1480 FNEND 1490 ! 1500 DEF FNTut LOCAL T$=15 1510 ! Ljudsignal (20600=Frekvens*256+l{ngd=80*256+120) 1520 ! 1530 T$=CHR$(66,22,0,219,5,197,16,254,193,27,122,179,32,245,201) 1540 RETURN CALL(VARPTR(T$),20600) 1550 FNEND 1560 ! 1570 ! INMATNINGS-funktioner 1580 ! --------------------- 1590 ! 1600 DEF FNBig$(A$)=CHR$(ASCII(A$) AND 95) 1610 ! Returnera f|rsta tecknet i A$ som stor Bokstav 1620 ! 1630 DEF FNGet(Pos) LOCAL T$=1 : IF SYS(5)<>0 THEN 1720 1640 ! L{s in tecken fr}n tangentbordet och returnera ASCII-v{rdet, 1650 ! intill dess skriv tid och fejka cursor. 1660 ! 1670 T$=CHR$(PEEK(FNRk(Pos))) : IF T$='_' THEN T$=' ' 1680 WHILE SYS(5)=0 1690 ; CUR(0,Ccr-20) TIME$ FNCur$(Pos); 1700 IF (PEEK(65525) AND 32)=0 THEN ; '_'; ELSE ; T$; 1710 WEND : ; FNCur$(Pos) T$; 1720 GET T$ : IF ASCII(T$)=247 THEN Z=FNBilddump : GOTO 1670 1730 RETURN ASCII(T$) 1740 FNEND 1750 ! 1760 DEF FNInput(Rad,Kol,Diff,Fr}ga$,Min,Max) LOCAL R,T,Pos,Noll 1770 ! Skriver ut Fr}ga$ p} rad 23 med defaultv{rde. 1780 ! Returnerar val i intervallet Min-Max, och ritar '=>' vid valt 1790 ! nummer (position best{mms av Rad,Kol,Diff=radavst}nd). 1800 ! Val avslutas med RETURN. 1810 ! 1820 ; FNR$(23) CUR(23,5) 'V{lj '+Fr}ga$+' (' NUM$(Min) '-' NUM$(Max) ') '; 1830 Pos=FNCurpos : Z=ASCII(NUM$(Min+1)) 1840 IF Min=0 THEN Noll=Rad+Diff*Max ELSE Z=ASCII(NUM$(Min)) 1850 WHILE Z<>13 : T=Z-48 1860 IF T<>0 THEN R=Rad+Diff*(T-1) ELSE R=Noll 1870 ; CUR(R,Kol-3) '=>' FNCur$(Pos) NUM$(T); 1880 Z=FNGet(Pos) : IF Z=Pf1 THEN RETURN Z 1890 IF (ZMax+48) AND Z<>13 THEN 1880 ELSE ; CUR(R,Kol-4) ' ' 1900 WEND 1910 ; CUR(R,Kol-4) '==>' FNR$(23); : RETURN T 1920 FNEND 1930 ! 1940 DEF FNInput$(Rad,Kol,Fr}ga$,Def$,L{ngd) LOCAL Ed$=80,In$=80,P,T,Flag 1950 ! Skriver ut ledtext+defaultv{rde, och returnerar svar. 1960 ! Svarets maximala l{ngd best{mms av L{ngd. 1970 ! Flag=0 uthopp ur rutinen, =-1 f|rsta tecken, =1 ej f|rsta tecken 1980 ! PF1 ger direkt RETURN med CHR$(192) 1990 ! 2000 Ed$=Def$ : Flag=-1 2010 ; CUR(Rad,Kol) Fr}ga$; : P=FNCurpos 2020 WHILE Flag 2030 ; FNCur$(P) In$ Ed$ STRING$(L{ngd-LEN(In$)-LEN(Ed$),ASCII('_')); 2040 ; FNCur$(P) In$; 2050 IF LEN(In$)=L{ngd THEN ; CHR$(8); 2060 T=FNGet(FNCurpos) 2070 IF T<32 OR T>127 THEN 2120 2080 IF Flag=-1 THEN Ed$='' 2090 IF LEN(In$)L{ngd THEN Ed$=LEFT$(Ed$,L{ngd-LEN(In$)) 2110 GOTO 2200 2120 IF T=0 THEN Flag=0 2130 IF T=8 THEN Ed$=FNShift$(4,In$)+Ed$ : In$=FNShift$(3,In$) 2140 IF T=9 THEN In$=In$+FNShift$(1,Ed$) : Ed$=FNShift$(2,Ed$) 2150 IF T=13 THEN Flag=0 : In$=In$+Ed$ 2160 IF T=24 THEN In$='' : Ed$='' 2170 IF T=192 THEN 2240 ELSE IF T<>199 THEN 2190 2180 IF LEN(Ed$) THEN Ed$=FNShift$(2,Ed$) ELSE In$=FNShift$(3,In$) 2190 IF ((T>128 AND T<>199) AND LEN(In$)=0) THEN In$=In$+Ed$ : Flag=0 2200 Flag=-(Flag<>0) 2210 WEND 2220 ; FNCur$(P) In$ SPACE$(L{ngd-LEN(In$)); : RETURN In$ 2230 ! retur vid Pf1 2240 ; FNCur$(P) Def$ SPACE$(L{ngd-LEN(Def$)); : RETURN CHR$(T) 2250 FNEND 2260 ! 2270 DEF FNShift$(Typ,A$) 2280 ! Returnerar delstr{ng av instr{ngen A$ 2290 ! 2300 IF A$='' THEN RETURN '' ELSE ON Typ GOTO 2310,2320,2330,2340 2310 RETURN LEFT$(A$,1) 2320 RETURN RIGHT$(A$,2) 2330 RETURN LEFT$(A$,LEN(A$)-1) 2340 RETURN RIGHT$(A$,LEN(A$)) 2350 FNEND 2360 ! FNSKIP 2370 ! == Disassembler funktioner == 2380 ! 2390 DEF FNLoad LOCAL Start,Slut 2400 ! L{ser in Opcoder fr}n skiva. 2410 ! 2420 IF Reg$(0)<>'' THEN RETURN 0 2430 ; CUR(3,3) 'OPCODE l{ses in fr}n skiva.' : ON ERROR GOTO 2620 2440 IF FNOpen('OPCODE.DAT',1)<>0 THEN 2600 2450 INPUT #1,Start : INPUT #1,Slut 2460 FOR Z=Start TO Slut : Reg$(Z)=FNL{s$(1) : NEXT Z 2470 INPUT #1,Start : INPUT #1,Slut 2480 FOR Z=Start TO Slut : Las$(Z)=FNL{s$(1) : NEXT Z 2490 INPUT #1,Start : INPUT #1,Slut 2500 FOR Z=Start TO Slut : Kod$(Z)=FNL{s$(1) : NEXT Z 2510 INPUT #1,Start : INPUT #1,Slut 2520 FOR Z=Start TO Slut : Kodh$(Z)=FNL{s$(1) : NEXT Z 2530 INPUT #1,Start : INPUT #1,Slut 2540 FOR Z=Start TO Slut : Cb$(Z)=FNL{s$(1) : NEXT Z 2550 INPUT #1,Start : INPUT #1,Slut 2560 FOR Z=Start TO Slut : Dd$(Z)=FNL{s$(1) : NEXT Z 2570 INPUT #1,Start : INPUT #1,Slut 2580 FOR Z=Start TO Slut : Ed$(Z)=FNL{s$(1) : NEXT Z 2590 CLOSE 1 : ; FNR$(3) : RETURN 0 2600 IF FNFel('Skivan ej klar')=13 THEN 2430 2610 ; FNR$(3) : RETURN 1 2620 IF FNFel('FEL vid l{sning.')=13 THEN RESUME 2430 ELSE RESUME 2610 2630 FNEND 2640 ! 2650 DEF FNOmv.(A$) LOCAL T.,H 2660 ! Omvandlar A$ till ett tal, dec. eller hexadec. 2670 ! 2680 IF A$='' RETURN 65535. 2690 IF Dec RETURN VAL(A$) ELSE IF LEN(A$)>4 RETURN 65535. 2700 FOR Z=1 TO LEN(A$) 2710 H=INSTR(1,'0123456789ABCDEF',MID$(A$,Z,1)) 2720 IF H=0 THEN RETURN -1 ELSE T.=T.*16+H-1 2730 NEXT Z : RETURN T. 2740 FNEND 2750 ! 2760 DEF FNDisassembler LOCAL In,T.,T,Tab1,Tab2,T$=32 2770 ! Skriver ut disassembler i instruktionsform, t.o.m. Aslut. 2780 ! eller tills man trycker p} PF1 2790 ! 2800 Tab1=17-7*Dec+5*Dev : Tab2=35-10*Dec+10*Dev 2810 IF Dev>0 THEN Z=FNPrhead 2820 WHILE Ad.0 THEN T$=FNDis$(T$) 2850 IF INSTR(1,T$,'n')>0 THEN T$=FNFill$(T$,'n') 2860 IF INSTR(1,T$,'NN')>0 THEN T$=FNNn$(T$) 2870 IF S|k THEN IF INSTR(1,T$,S|k$)=0 THEN 2830 2880 IF Dev>0 OR Ccr<>40 THEN 2900 2890 ; FNTal$(T.,3) ':' M$ TAB(23) T$ TAB(23) P$; : GOTO 2910 2900 ; #Dev FNTal$(T.,3) ' :' M$ TAB(Tab1) T$ TAB(Tab2) P$; 2910 IF Dev>0 OR PEEK(65363)<23 THEN ; #Dev : GOTO 2930 2920 IF FNGet(FNCurpos)=Pf1 THEN 2950 ELSE Z=FNScroll(2,23,1-(Ccr=40)) 2930 WEND 2940 IF SYS(5)=0 THEN 2980 ELSE IF FNGet(FNCurpos)<>Pf1 THEN 2820 2950 IF PEEK(65363)>22 THEN Z=FNScroll(2,23,2) 2960 IF S|k THEN T$='Forts{tta s|kning' ELSE T$='Mera instruktioner' 2970 IF FNMessage(T$+' (J/N) ',74,78)=74 THEN 2820 2980 IF Dev>0 THEN 3000 2990 IF PEEK(65363)>20 THEN Z=FNScroll(2,23,3) ELSE ; 3000 ; #Dev Bl}$ STRING$(Ccr-LEN(Bl}$),61) STRING$(-2*(Dev=1),10); 3010 ; #Dev Bl}$;(Ad.-Astart.) 'Bytes. ' In 'Instruktioner.' 3020 IF Dev>0 THEN ; #Dev CHR$(12) 3030 M$='' : P$='' : RETURN 0 3040 FNEND 3050 ! 3060 DEF FNAsc LOCAL T,T. 3070 ! Skriver ut disassembler i ASCII-form. 3080 ! 3090 IF Dev>0 THEN Z=FNPrhead 3100 IF S|k THEN 3240 3110 WHILE Ad.22 THEN Z=FNScroll(2,23,2) 3130 ; #Dev USING '#####&' Ad. 'D:'+HEX$(Ad.)+'H' 3140 WHILE PEEK(65362)127 THEN T=ASCII('.') 3160 ; #Dev CHR$(T); 3170 WEND 3180 WEND 3190 IF SYS(5)=0 THEN 3220 ELSE IF FNGet(FNCurpos)<>Pf1 THEN 3100 3200 IF PEEK(65363)>22 THEN Z=FNScroll(2,23,2) 3210 IF FNMessage('Mera ASCII (J/N) ',74,78)=74 THEN 3110 3220 RETURN 0 3230 ! S|kning efter S|k$ 3240 WHILE Ad.LEN(S|k$) 3280 P$=P$+CHR$(PEEK(Ad.)) : Ad.=Ad.+1 3290 IF INSTR(1,S|k$,P$)=0 THEN 3330 3300 WEND 3310 IF PEEK(65363)>22 THEN Z=FNScroll(2,23,2) 3320 ; #Dev USING '#####&' (T.) 'D:'+HEX$(T.)+'H '+P$ 3330 WEND : GOTO 3190 3340 FNEND 3350 ! 3360 DEF FNTal$(A.,L) LOCAL T$=5 3370 ! G|r om A. till en sifferstr{ng med nollor i b|rjan. 3380 ! 3390 IF Dec THEN T$=NUM$(A.) ELSE T$=HEX$(A.) 3400 RETURN RIGHT$(STRING$(L-Dec,48)+T$,LEN(T$)) 3410 FNEND 3420 ! 3430 DEF FNVal$(A) 3440 ! V{ljer Opcode eller Opcode-omr}de beroende p} A 3450 ! 3460 IF A<64 THEN RETURN Kod$(A) 3470 IF A<192 THEN RETURN FNMitti$(A) 3480 IF A=203 THEN RETURN FNCb$(FNPek) 3490 IF A=221 OR A=253 THEN RETURN FNDd$(FNPek,(A=221)) 3500 IF A=237 THEN RETURN FNEd$(FNPek) 3510 RETURN Kodh$(A) 3520 FNEND 3530 ! 3540 DEF FNPek LOCAL T,T$=4 3550 ! L{ser minnesadress Ad. 3560 ! M$=sifferinneh}llet i Ad. : P$=ASCCI-tecknet f|r Ad. else '.' 3570 ! 3580 T=PEEK(Ad.) : Ad.=Ad.+1 : T$=FNTal$(T,1) 3590 IF Dec AND M$<>'' THEN M$=M$+','+T$ ELSE M$=M$+T$ 3600 IF T<32 OR T>=127 THEN P$=P$+'.' ELSE P$=P$+CHR$(T) 3610 RETURN T 3620 FNEND 3630 ! 3640 DEF FNMitti$(A) 3650 ! Returnerar Opcode i intevallet 40-BF Hex (64-191) 3660 ! 3670 IF A=118 THEN RETURN 'HALT' 3680 RETURN Las$((A-64)/8)+Reg$(MOD(A-64,8)) 3690 FNEND 3700 ! 3710 DEF FNCb$(A)=Cb$(INT(A/8))+Reg$(MOD(A,8)) 3720 ! Returnerar de instr som b|rjar p} CB Hex (203). A {r byten efter CB. 3730 ! 3740 DEF FNDd$(A,Dd) LOCAL T,T$=24 3750 ! Returnerar de instr som b|rjar p} DD H eller FD H 3760 ! A {r byten efter DD/FD 3770 ! 3780 IF A<9 OR A>249 THEN 3910 3790 IF A<>203 THEN T$=Dd$(A) : GOTO 3820 3800 T$=FNTal$(FNPek,1) 3810 T$=Cb$((FNPek XOR 6)/8)+'(IX+'+T$+')' 3820 IF T$='...' THEN 3910 3830 IF INSTR(1,T$,'d')>0 THEN T$=FNFill$(T$,'d') 3840 IF INSTR(1,T$,'n')>0 THEN T$=FNFill$(T$,'n') 3850 IF INSTR(1,T$,'NN')>0 THEN T$=FNNn$(T$) 3860 IF Dd THEN RETURN T$ 3870 ! f|r FD byt ut IX mot IY 3880 WHILE INSTR(1,T$,'IX')<>0 3890 MID$(T$,INSTR(1,T$,'IX'),2)='IY' 3900 WEND : RETURN T$ 3910 RETURN FNEjdis$ 3920 FNEND 3930 ! 3940 DEF FNEd$(A) 3950 ! Returnera de instr som b|rjar p} ED Hex. A {r n{sta byte. 3960 ! 3970 IF A<64 OR A>187 THEN RETURN FNEjdis$ ELSE RETURN Ed$(A) 3980 FNEND 3990 ! 4000 DEF FNEjdis$ 4010 ! Bytekomb. g}r ej att disassemblera. 4020 ! R{kna tillbaks Ad. och korta av M$ och P$ 4030 ! 4040 M$=LEFT$(M$,LEN(M$)/2) : P$=LEFT$(P$,LEN(P$)/2) 4050 IF RIGHT$(M$,LEN(M$))=',' THEN M$=LEFT$(M$,LEN(M$)-1) 4060 Ad.=Ad.-1 : RETURN '...' 4070 FNEND 4080 ! 4090 DEF FNDis$(A$) LOCAL P,T.,T$=24 4100 ! F|r de instruktioner som inneh}ller relativ adressering, 4110 ! returneras avsedd adress. 4120 ! 4130 T.=FNPek : P=INSTR(1,A$,'d') 4140 T$=FNTal$(T.,1)+' (' : T.=Ad.+T.+256*(T.>127) 4150 IF Dec THEN T$=T$+NUM$(T.)+')' ELSE T$=T$+HEX$(T.)+')' 4160 IF P=LEN(A$) THEN RETURN LEFT$(A$,P-1)+T$ 4170 RETURN LEFT$(A$,P-1)+T$+RIGHT$(A$,P+1) 4180 FNEND 4190 ! 4200 DEF FNFill$(A$,B$) LOCAL T,P,T$=24 4210 ! De instruktioner som inneh}ller ett absolut 8-bitars tal. 4220 ! Stoppa in talet p} r{tt st{lle och returnera hela instr. 4230 ! 4240 T=FNPek : P=INSTR(1,A$,B$) 4250 T$=LEFT$(A$,P-1)+FNTal$(T,1)+RIGHT$(A$,LEN(B$)+P) 4260 RETURN T$ 4270 FNEND 4280 ! 4290 DEF FNNn$(A$) LOCAL P,T.,T$=24 4300 ! De instruktioner som inneh}ller en adress eller 16-bitars tal. 4310 ! Stoppa in talet p} r{tt st{lle och returnera hela instr. 4320 ! 4330 P=INSTR(1,A$,'NN') : T.=FNPek+256.*FNPek 4340 IF Dec THEN T$=NUM$(T.) ELSE T$=HEX$(T.) 4350 IF NOT Dec THEN T$=RIGHT$('000'+T$,LEN(T$)) 4360 RETURN LEFT$(A$,P-1)+T$+RIGHT$(A$,P+2) 4370 FNEND 4380 ! 4390 DEF FNS|k LOCAL Max,Pos,T,T$=4 4400 ! Best{mmning av s|kbegrepp (instr/'egen ASCII') 4410 ! 4420 ; CUR(2,0) Bl}$ CHR$(127,32) 'V{lja S|kkod' 4430 RESTORE 4700 : Max=70 4440 FOR I=0 TO Max : READ T$ : ; CUR(4+MOD(I,18),5+10*(I/18)) T$ 4450 NEXT I : I=0 : Z=FNMessage('RETURN =>Val PF2 Info ',0,0) 4460 Z=FNMessage('RETURN =>Val PF2 Info ',0,0) 4470 WHILE Z<>13 4480 ; CUR(4+MOD(I,18),3+10*(I/18)) CHR$(127,8); : Pos=FNCurpos 4490 Z=FNGet(FNCurpos) : T=I 4500 IF ZI THEN ; FNCur$(Pos) ' ' 4560 WEND : ; FNPren$ CUR(9,5); 4570 IF I=Max THEN S|k$='DR1:' : T$='' : GOTO 4600 ELSE T=I : RESTORE 4700 4580 FOR I=0 TO T-1 : READ T$ : NEXT I : READ T$ 4590 S|k$=FNOpcodeex$(T$) 4600 ; CUR(10,8) 'ex-vis ' S|k$; 4610 S|k$=T$+FNInput$(9,5,'S|ka efter: '+T$,'',13) 4620 ; FNPren$; : S|k=-1 : RETURN 0 4630 ! Info om funk-tangenter vid s|kval 4640 ; FNPren$ CUR(3,3) 'Tangenter vid Val' 4650 ; CUR(5,3) 'PF1 Avbryter PF2 Visar detta' 4660 ; CUR(6,3) 'PF5 Bak}t PF6 Till Mitten' 4670 ; CUR(7,3) 'PF7 Fram}t PF8 Home' 4680 ; CUR(9,3) 'RETURN => Val av markerad OPCODE' 4690 Z=FNMessage('Tryck RETURN ',13,13) : ; FNPren$; : GOTO 4420 4700 DATA ADC,ADD,AND,BIT,CALL,CCF,'CP ',CPL,CPD,CPDR,'CPI ',CPIR 4710 DATA DAA,DEC,DI,DJ,DJNZ,EI,'EX ',EXX,HALT 4720 DATA IM 0,IM 1,IM 2,'IN ',INC,INDR,IND,'INI ',INIR 4730 DATA JP,JR,LD,LDD,LDDR,'LDI ',LDIR,NEG,NOP 4740 DATA OR,OTDR,OTIR,'OUT ',OUTD,OUTI,POP,PUSH 4750 DATA RES,'RET ',RETI,RETN,'RL ',RLA,RLC,RLCA,RLD 4760 DATA 'RR ',RRA,'RRC ',RRCA,RRD,RST,SBC,SCF,SET 4770 DATA SLA,SRA,SRL,SUB,XOR,EGET 4780 FNEND 4790 ! 4800 DEF FNOpcodeex$(A$) 4810 ! Returnerar ex. p} opcode vari A$ ing}r. 4820 ! 4830 ON ERROR GOTO 4920 4840 FOR I=0 TO 255 4850 IF I<32 THEN IF INSTR(1,Cb$(I),A$)>0 THEN RETURN Cb$(I) 4860 IF I<63 THEN IF INSTR(1,Kod$(I),A$)>0 THEN RETURN Kod$(I) 4870 IF I<9 THEN 4910 4880 IF I>63 AND I<188 THEN IF INSTR(1,Ed$(I),A$)>0 THEN RETURN Ed$(I) 4890 IF I<250 THEN IF INSTR(1,Dd$(I),A$)>0 THEN RETURN Dd$(I) 4900 IF I>191 THEN IF INSTR(1,Kodh$(I),A$)>0 THEN RETURN Kodh$(I) 4910 NEXT I : RETURN 'Fel OPCODE' 4920 RESUME 4840 4930 FNEND 4940 ! 4950 DEF FNPrhead 4960 ! Skriv huvud p} Printer 4970 ! 4980 ; #Dev 'Z-80 DISASSEMBLER' TAB(60) TIME$ 4990 IF NOT (S|k) THEN 5020 ELSE ; #Dev 5000 ; #Dev 'S|kning efter "' S|k$ '" fr}n '; 5010 ; #Dev FNTal$(Astart.,3) ' till ' FNTal$(Aslut.,3) CHR$(10) 5020 ; #Dev STRING$(Ccr,61) CHR$(10) 5030 RETURN 0 5040 FNEND 5050 ! FNSKIP 5060 ! == System funktioner == 5070 ! 5080 DEF FNKlocka LOCAL T,Min,Max,T$=9 5090 ! Rutin f|r att st{lla systemklockan 5100 ! 5110 ON ERROR GOTO 5230 5120 ; FNPren$ CUR(2,0) Bl}$ CHR$(127,32) 'St{lla SYSTEMKLOCKAN' 5130 RESTORE 5210 : READ T$,Min,Max : T=0 5140 WHILE T$<>'' : ; FNR$(2*T+5); 5150 Z=VAL(FNInput$(2*T+5,5,T$,MID$(TIME$,3*(T+1),2),2)) 5160 IF ZMax THEN 5140 ELSE POKE 65519+T,Z 5170 READ T$,Min,Max : T=T+1 5180 WEND 5190 IF FNInput$(23,10,'[r det R[TT (J/N) ','J',1)<>'J' THEN 5120 5200 ; FNPren$; : RETURN 0 5210 DATA ']r ..... ',0,99,'M}nad .. ',1,12,'Dag .... ',1,31 5220 DATA 'Timme .. ',0,23,'Minut .. ',0,59,'Sekund . ',0,59 ,'',0,0 5230 RESUME 5140 5240 FNEND 5250 ! 5260 DEF FNScroll(Rad,Slut,N) LOCAL T,Kod$=9 5270 ! Scrollning av bildsk{rm radvis med b|rjan fr}n och med 5280 ! Rad t.o.m. Slut med intervallet N rader. 5290 ! 5300 IF Ccr=40 THEN 5380 5310 Kod$=CHR$(33)+CVT%$(FNRk(Rad+N))+CHR$(1) 5320 Kod$=Kod$+CVT%$(Ccr*(Slut-Rad-N+1))+CHR$(237,176,201) 5330 Z=CALL(VARPTR(Kod$),FNRk(Rad)) 5340 ; CUR(Slut-N+1,0) SPACE$(N*Ccr); 5350 WHILE Slut>T : ; CUR(T,0) T$; : T=T+1 : WEND 5360 ; CUR(Slut-N+1,0); : RETURN 0 5370 ! ABC 800C 5380 FOR Z=Rad TO Slut-N 5390 Kod$=CHR$(33)+CVT%$(FNRk(Z+N))+CHR$(1)+CVT%$(Ccr)+CHR$(237,176,201) 5400 T=CALL(VARPTR(Kod$),FNRk(Z)) 5410 NEXT Z : GOTO 5340 5420 FNEND 5430 ! 5440 DEF FNBilddump LOCAL Rad,T,T$=80,H$=80 5450 ! Dumpar bildsk{rm p} skrivare. 5460 ! Spara rad 23 skriv med. och }terst{ll rad 23 5470 ! 5480 H$='' : T=FNRk(23) : Rad=0 5490 FOR Z=T TO T+Ccr-1 : H$=H$+CHR$(PEEK(T)) : NEXT Z 5500 Z=FNMessage('Bilden dumpas p} printern.',0,0) 5510 IF FNOpen('PR:\\\\\\\\.\\A',8)=0 THEN 5530 5520 IF FNFel('Printer ej ansluten')=Pf1 THEN 5590 ELSE 5500 5530 WHILE Rad<23 : T$='' 5540 FOR Z=0 TO Ccr-1 5550 T=PEEK(Rad+Z*256) : IF T>126 OR T<32 THEN T=32 5560 T$=T$+CHR$(T) 5570 NEXT Z : ; #8 T$ : Rad=Rad+1 5580 WEND : ; #8 H$ : CLOSE 8 5590 ; FNR$(23) CUR(23,0) H$; : RETURN 0 5600 FNEND 5610 ! FNSKIP 5620 ! == P R O G R A M == 5630 ! 5640 DEF FNFr}ga LOCAL Felu,T$=6 5650 ! Best{mm adress-omr}de,form och utfil 5660 ! 5670 ON ERROR GOTO 5870 : Felu=1 5680 T$=FNInput$(5,3,'Adresser (Hex/Dec) ',CHR$(72+Dec*4),1) 5690 T$=FNBig$(T$) : IF T$<>'D' AND T$<>'H' THEN 5850 5700 Dec=(T$='D') : IF NOT Dec THEN T$='Hexad' 5710 ; CUR(3,5) T$+'ecimala ADRESSER' 5720 Felu=2 : ; FNLine$(22) FNR$(5) 5730 T$=FNInput$(5,3,'Start Adress: ',FNTal$(Astart.,3),4-Dec) 5740 Ad.=FNOmv.(T$) : IF Ad.<0 THEN 5850 ELSE Astart.=Ad. 5750 IF Aslut.<=Astart. THEN Aslut.=65535. 5760 T$=FNTal$(Aslut.,3) : Felu=3 : ; FNLine$(22); 5770 Aslut.=FNOmv.(FNInput$(7,3,'Slut Adress: ',T$,4-Dec)) 5780 IF Aslut.65536. THEN 5850 ELSE Felu=4 : ; FNLine$(22); 5790 T$=FNInput$(9,3,'MEDIA Bildsk{rm/Printer (B/P): ','B',1) 5800 T$=FNBig$(T$) : IF T$<>'P' AND T$<>'B' THEN 5850 5810 Dev=-(T$='P') : Felu=5 : ; FNLine$(22); 5820 T$=FNInput$(11,3,'Instruktioner eller Ascii (I/A): ','I',1) 5830 T$=FNBig$(T$) : IF T$<>'I' AND T$<>'A' THEN 5850 5840 RETURN (T$='A') 5850 ; FNFel$('Felaktigt v{rde') 5860 ON Felu GOTO 5680,5730,5770,5790,5820 5870 RESUME 5850 5880 FNEND 5890 ! 5900 IF FNInit=1 THEN 6090 5910 ; FNPren$; 5920 ; CUR(5,7) '1. Disassemblering' 5930 ; CUR(7,7) '2. S|kning efter OPCODE' 5940 ; CUR(9,7) '3. St{lla Systemklockan' 5950 ; CUR(11,7) '0. Avsluta' 5960 I=FNInput(5,7,2,'Rutin',0,3) : S|k=0 5970 IF I=0 THEN 6090 ELSE ; FNPren$; 5980 IF I=2 THEN IF FNS|k THEN 5910 5990 IF I=3 THEN Z=FNKlocka : GOTO 5910 6000 I=FNFr}ga 6010 IF Dev=0 THEN 6040 6020 IF FNOpen('PR:\\\\\\\\.\\A',Dev)=0 THEN 6040 6030 IF FNFel('Printer ej ansluten.')=Pf1 THEN 6090 ELSE 6020 6040 IF FNFel('Uskrift avbryts med PF1 ')=Pf1 THEN 5910 6050 ; FNRen$(2,23,'') CUR(2,0); 6060 IF I=0 THEN Z=FNDisassembler ELSE Z=FNAsc 6070 IF FNMessage('L{sa mer? (J/N) ',74,78)=74 THEN 5910 6080 ! Avslutning 6090 ; FNRen$(2,23,'') CUR(5,3) 'Tack f|r idag' 6100 CLOSE