1 REM Ins{nd av Kristoffer Eriksson <5357> 1988-01-03 23.28.48 (DUMP) 20 ! +----------------------------------------------------+ 30 ! ! PROGSCAN - Avsl|jar ickeportabla programdetaljer. ! 40 ! ! F|r hela ABC800-familjen. ! 50 ! ! Av Kristoffer Eriksson <5357> ! 60 ! ! F}r kopieras fritt endast i ickekommersielltsyfte. ! 70 ! +----------------------------------------------------+ 80 ! 90 ! Ver 1.00 / 880102 / <5357> 100 ! 110 ! Noterar anv{ndningen av instruktioner och funktioner som inte finns p} 120 ! alla ABC800-modeller. 130 ! Uppt{cker inte BLK, ULN, EL och n}gra till inne i uttryck (utan blank- 140 ! tecken runtom), eftersom det skulle g|ra det mycket sv}rare att g|ra 150 ! igenk{nningen s{ker. Men tror du de anv{nds s} i ett program, s} editera 160 ! bort blanktecknen runt dem i datasatserna nedan. 170 ! Uppt{cker heller inte tilldelning till funktionsargument, som ger 180 ! felmeddelande vid f|rs|k till k|rning efter laddning fr}n .BAS-form 190 ! p} tidiga ABC800M/C. 200 ! 210 INTEGER : EXTEND 220 ! 230 DATA 28 240 DATA " INTEGER ", " FLOAT ", " EXTEND " 250 DATA "INP(", " OUT ", "PEEK(", "PEEK2(", " POKE ", "CALL(" 260 DATA " GBLK ", " BLK ", " ULN ", " NULN ", " EL ", " DBLE " 270 DATA " DOT ", "DOT(", " TXPOINT ", "TXPOINT(" 280 DATA " WIDTH ", " ATTRIBUTE ", " FGPICTURE ", " FGCTL ", " FG" 290 DATA " XSTM", "XFN" 300 DATA " RESUME ", "SYS(8)" 310 ! 320 READ Ants|k 330 DIM S|k$(1:Ants|k)=15,Hit(1:Ants|k),I$=160 340 FOR I=1 TO Ants|k 350 READ S|k$(I) 360 NEXT I 370 Nrfgctl=FNNr("FGCTL") 380 Typfgctl=0 390 Flgsk{rm=0 400 ! 410 ON ERROR GOTO : INPUT "Programfil att kolla: "Infil$ 420 WHILE Infil$="" 430 END 440 WEND 450 IF INSTR(1,Infil$,".")=0 THEN Infil$=Infil$+".BAS" 460 ON ERROR GOTO 410 : OPEN Infil$ AS FILE 1 470 ! 480 ON ERROR GOTO 410 : INPUT "Utskriftsfil f|r diagnos, RETURN=Sk{rmen: "Utfil$ 490 IF Utfil$="" THEN Utfil$="CON:" : Flgsk{rm=-1 500 ON ERROR GOTO 520 : PREPARE Utfil$ AS FILE 2 510 WHILE 0 520 ; "Kan inte skapa '" Utfil$ "'. Felkod" ERRCODE : GOTO 480 530 WEND 540 ! 550 ; 560 IF NOT Flgsk{rm THEN ; #2 "Diagnos f|r programmet '" Infil$ "', " TIME$ : ; #2 570 ; #2 "Intressanta rader:" 580 ; #2 590 WHILE 1 600 ON ERROR GOTO 690 : INPUT LINE #1,I$ : ON ERROR GOTO 610 I$=LEFT$(I$,LEN(I$)-2)+" " 620 Hit=0 630 FOR I=1 TO Ants|k 640 IF INSTR(1,I$,S|k$(I)) P=FNBass|k(I$,S|k$(I)) : IF P Hit(I)=Hit(I)+1 : Hit=1 : IF I=Nrfgctl THEN Z=FNFgctl(I$,P) 650 NEXT I 660 IF Hit THEN ; #2 I$ 670 WEND 680 ! 690 IF ERRCODE<>34 THEN ; "Felkod" ERRCODE "p} filen '" Infil$ "'." CHR$(7) 700 CLOSE 1 710 ; #2 720 ; #2 "Antal rader med intressanta ord i:" 730 ; #2 740 FOR I=1 TO Ants|k 750 ; #2 RIGHT$(S|k$(I),1-(ASCII(S|k$(I))=32)) ":",Hit(I); 760 IF MOD(I,3)=0 THEN ; #2 ELSE ; #2,, 770 NEXT I 780 ; #2 790 ; #2 800 ; #2 "Diagnos:" 810 ; #2 820 ! 830 IF Hit(FNNr(" INTEGER "))+Hit(FNNr(" FLOAT "))=0 THEN ; #2 "FLOAT/INTEGER-angivelse saknas. Kan ge problem vid laddning fr}n .BAS-form." : ; #2 840 IF Hit(FNNr(" EXTEND "))=0 THEN ; #2 "EXTEND/NO EXTEND-angivelse saknas. Kan ge problem vid laddning fr}n .BAS-form." : ; #2 850 IF Hit(FNNr("INP(")) THEN ; #2 "Portadresser i INP() kan vara maskinberoende." : ; #2 860 IF Hit(FNNr("OUT")) THEN ; #2 "Portadresser i OUT kan vara maskinberoende." : ; #2 870 IF Hit(FNNr("PEEK("))+Hit(FNNr("PEEK2(")) THEN ; #2 "Adresser i PEEK() och PEEK2() kan vara maskin- och DOS-beroende." : ; #2 880 IF Hit(FNNr("POKE")) THEN ; #2 "Adresser i POKE kan vara maskin- och DOS-beroende." : ; #2 890 ! 900 WHILE Hit(FNNr("CALL(")) 910 ; #2 "Adresser och argument till CALL() kan vara maskinberoende. [r den anropade" 920 ; #2 "rutinen 'hemmagjord' kan den inneh}lla maskinberoende adresser. Se {ven upp" 930 ; #2 "s} den inte {r placerad p} en adress som inte {r fri p} alla 800-modeller." 940 ; #2 950 IF 0 WEND 960 ! 970 WHILE Hit(FNNr("BLK"))+Hit(FNNr("GBLK")) 980 ; #2 "BLK och GBLK finns bara p} ABC806. Fungerar dock {nd} p} andra modeller" 990 ; #2 "vid laddning fr}n .BAC-form, men ser lustigt ut vid LIST:ning igen." 1000 ; #2 1010 IF 0 WEND 1020 WHILE Hit(FNNr("ULN"))+Hit(FNNr("NULN")) 1030 ; #2 "ULN och NULN finns bara p} ABC806. St|r dock inte programk|rningen p}" 1040 ; #2 "andra modeller vid laddning fr}n .BAC-form, men ser lustigt ut vid LIST:ning." 1050 ; #2 1060 IF 0 WEND 1070 IF Hit(FNNr(" EL ")) THEN ; #2 "EL finns bara p} ABC806. St|r dock inte programk|rningen vid laddning" : ; #2 "fr}n .BAC-form." : ; #2 1080 IF Hit(FNNr(" DBLE ")) THEN ; #2 "DBLE finns p} alla modeller, men har effekt endast p} ABC806." : ; #2 1090 ! 1100 WHILE Hit(FNNr("DOT"))+Hit(FNNr("DOT(")) 1110 ; #2 "SETDOT, CLR DOT och DOT() fungerar bara p} ABC800C och 802, inte 800M och 806," 1120 ; #2 "d{r de ger ERROR vid exekvering. Inladdning g}r dock bra. Med DOTOPT fungerar" 1130 ; #2 "de {ven p} 806 och utan grafikeffekt p} 800M." : ; #2 1140 IF 0 WEND 1150 ! 1160 WHILE Hit(FNNr("TXPOINT "))+Hit(FNNr("TXPOINT(")) 1170 ; #2 "TXPOINT och TXPOINT() fungerar bara p} ABC800C (802?). Ger p} |vriga ERROR vid" 1180 ; #2 "exekvering. Inladdning g}r dock bra." : ; #2 1190 IF 0 WEND 1200 ! 1210 IF Hit(FNNr("WIDTH")) THEN ; #2 "WIDTH finns bara p} ABC802 och 806, ej 800C och 800M. Kan bytas mot test av" : ; #2 "datortyp + POKE." : ; #2 1220 IF Hit(FNNr("ATTRIB")) THEN ; #2 "ATTRIBUTE finns bara p} ABC806, ej 800C, 800M och 802. Kan bytas mot test av" : ; #2 "datortyp + POKE." : ; #2 1230 IF Hit(FNNr("FGPICTURE")) THEN ; #2 "FGPICTURE finns bara p} ABC806." : ; #2 1240 ! 1250 WHILE Hit(FNNr(" FG+"))>Hit(FNNr("FGPICTURE")) 1260 ; #2;"Programmet anv{nder HR-grafik." 1270 IF Typfgctl=0 THEN IF Hit(Nrfgctl)=0 ; #2 "Saknar FGCTL!" ELSE ; #2 "Har inte lyckats avg|ra vilken uppl|sning som anv{nds; typ ABC800 eller 806." 1280 IF Typfgctl=1 THEN ; #2 "Anv{nder uppl|sning 240 x 240, fungerar p} alla HR-versioner." 1290 WHILE Typfgctl=2 1300 ; #2 "Anv{nder uppl|sning 256 eller 512 x 240, fungerar bara p} ABC806. FGCTL ger" 1310 ; #2 "ERROR vid laddning och k|rning p} |vriga modeller." 1320 IF 0 WEND 1330 IF Typfgctl=3 THEN ; #2 "Anv{nder b}de ABC800-uppl|sning och 806-dito. Anpassar sig antagligen efter" : ; #2 "datortyp." 1340 ; #2 "HR-grafik fungerar bara p} ABC806 och vissa 800M och 800C. Ger p} 802 ERROR" 1350 ; #2 "vid laddning fr}n .BAS-form, och vid k|rning fr}n .BAC-form. Ger p} 800M och" 1360 ; #2 "800C utan HR-modul ingen effekt." 1370 ; #2 1380 IF 0 WEND 1390 ! 1400 WHILE Hit(FNNr("XSTM")) 1410 ; #2 "Anv{nder utvidgad Basic (XSTM-instruktioner), och har LIST:ats utan denna" 1420 ; #2 "inladdad. Kr{ver f|rst}s at den {r inladdad vid laddning fr}n .BAS-form och" 1430 ; #2 "vid k|rning. Kan ge fel vid .BAS-laddning {ven n{r den {r inladdad, ISAM-" 1440 ; #2 "instruktionerna t ex ger det." 1450 ; #2 "Kan {ven vara ATTRIBUTE/WIDTH LIST:at p} {ldre datormodell, eller HR-grafik" 1460 ; #2 "LIST:at p} 802, eller BYE/NAME/KILL listat utan DOS, eller CD/FILESTAT" 1470 ; #2 "LIST:at utan LUX-NET-DOS." : ; #2 1480 IF 0 WEND 1490 ! 1500 WHILE Hit(FNNr("XFN")) 1510 ; #2 "Anv{nder utvidgad Basic (XFN-funktioner), och har LIST:ats utan denna" 1520 ; #2 "inladdad. Kr{ver f|rst}s att den {r inladdad vid laddning fr}n .BAS-form och" 1530 ; #2 "vid k|rning." : ; #2 1540 IF 0 WEND 1550 ! 1560 WHILE Hit(FNNr("RESUME")) 1570 ; #2 "Anv{nder RESUME. Kontrollera att det {r r{tt gjort. Kan ge t ex till" 1580 ; #2 "synes of|rklariga ERROR 140 eller andra felkoder om inte RESUME ALLTID" 1590 ; #2 "finns med i felhanteringen. Endast om man inte alls anv{nder RESUME i" 1600 ; #2 "programmet kan man slopa den i felhanteringen." : ; #2 1610 IF 0 WEND 1620 ! 1630 WHILE Hit(FNNr("SYS(8)")) 1640 ; #2 "SYS(8) fungerar bara p} ABC806 och 802, ej 800C och 800M. Ger ERROR 143" 1650 ; #2 "vid exekvering. [r naturligtvis ofarligt om det exekveringen undviks p}" 1660 ; #2 "800C och 800M, t ex med IF." 1670 ; #2 "Se dock upp med anv{ndningen {ven p} 802 och 806. Det finns en f|rdr|jning" 1680 ; #2 "fr}n att SYS(8) reagerar p} en tangenttryckning till dess att {ven SYS(5)" 1690 ; #2 "reagerar." : ; #2 1700 IF 0 WEND 1710 ! 1720 WHILE FNOro>0 1730 ; #2 "OBS: Instruktioner som inte finns p} en datortyp, kan f}ngas upp"; 1740 ; #2 " med" : ; #2 "ON ERROR GOTO, varvid programmet kanske fungerar,"; 1750 ; #2 " och i varje fall inte" : ; #2 "kraschar. Vid laddning fr}n .BAS-"; 1760 ; #2 "form f}r man dock fel {nd} vid sj{lva ladd-" 1770 ; #2 "ningen, sen blir det ERROR 144 vid k|rningen f|r felhanteringen"; 1780 ; #2 " att ta hand om." : ; #2 "Vid laddning fr}n. BAC-form blir det"; 1790 ; #2 " normalt ERROR 200 vid k|rningen att ta hand" 1800 ; #2 "om. -- Maskinberoende PEEK, POKE, INP och liknande {r f|rst}s"; 1810 ; #2 " ofarliga om de" : ; #2 "undviks med IF-satser som kollar datortyp." 1820 IF 0 WEND 1830 CLOSE 2 1840 END 1850 ! 1860 DEF FNBass|k(I$,S|k$) LOCAL P,R,S,T,U,V 1870 P=1 1880 WHILE 1 1890 R=INSTR(P,I$,'"') : S=INSTR(P,I$,"'") 1900 IF R=0 IF S=0 THEN T=LEN(I$)+1 ELSE T=S ELSE IF S0 THEN T=S ELSE T=R 1910 V=INSTR(P,I$,S|k$) : IF V=0 THEN RETURN 0 1920 IF V>T THEN V=T 1930 U=INSTR(P,I$," DATA ") : IF U AND ULEN(I$) THEN RETURN 0 2130 R=INSTR(P,I$," ") : IF R=0 THEN R=LEN(I$)+1 2140 IF FNArgtyp(MID$(I$,P,R-P))=1 THEN Typfgctl=Typfgctl OR 1 ELSE Typfgctl=Typfgctl OR 2 2150 RETURN 0 2160 FNEND 2170 ! 2180 DEF FNArgtyp(A$) LOCAL P 2190 IF ASCII(A$)>=ASCII("0") AND ASCII(A$)<=ASCII("9") THEN RETURN 1 2200 P=1 : WHILE P<=LEN(A$) 2210 IF INSTR(1," !""#$%&'()*+,-./:;<=>-?@^_`~",MID$(A$,P,1))=0 THEN P=P+1 : WEND 2220 IF P<=LEN(A$) THEN Q=INSTR(1,"%.$",MID$(A$,P,1)) : IF Q RETURN 1+(1 AND Q=3) 2230 IF INSTR(1," BLK RED GRN BLU YEL CYA MAG WHT GBLK GRED GGRN GBLU GYEL GCYA GMAG GWHT "," "+LEFT$(A$,P-1)+" ") THEN RETURN 2 2240 RETURN 1 2250 FNEND 2260 ! 2270 DEF FNOro LOCAL A,B,C,N,I 2280 A=FNNr("INTEGER") : B=FNNr("FLOAT") : C=FNNr("EXTEND") 2290 N=0 : WHILE IA AND I<>B AND I<>C THEN N=N+Hit(I) 2310 WEND 2320 RETURN N 2330 FNEND