1 REM Ins{nd av Kristoffer Eriksson <5357> 1987-02-19 18.37.13 (KERMIT) 2 ! ********************************************************************** 3 ! Program convert.bas Utg}va 1.1 1987-02-14 4 ! . 1.2 1987-02-18 5 ! av Bo Kullmar 6 ! Ins{nd av Bo Kullmar <1789> 7 ! Uppsnabbat 50% av Kristoffer Eriksson <5357> 8 ! F|r ABC800M ABC800C ABC802 ABC806 D-BASIC V 9 ! Testad p} ABC806 D-BASIC V 10 ! Programmet konverterar en IBM textfil till ABC dito. 11 ! Programmets tabell |ver ASCII-koder {r h{mtad fr}n 7H.DOC. 12 ! Programmet {r inte s{rskilt snabbt, den som vill kan skriva om det 13 ! f|r i maskinkod f|r Z80. 14 ! \vers{ttningstabellen borde nog {ndras, s} alla tecken blir l{sbara. 15 ! I s} fall kunde man ta bort den sista IF-satsen ur FNConvert ocks}. 16 ! ********************************************************************** 17 ! 100 EXTEND : INTEGER 110 Maxradl{ngd=1000 120 DIM Swe(255),Rad$=Maxradl{ngd 130 ! (Not: P} ABC {r st|rre radl{ngd {n 160 ganska meningsl|s, eftersom l{ngre 140 ! rader inte g}r att l{sa i en textfil, men p} Unix g}r det bra.) 150 IF Argv$(1)="" THEN Eofilecode=38 ELSE Eofilecode=50 ! ABC/UNIX 1000 ! 1010 DATA 0, 1, 2, 3, 4, 5, 6, 7 1020 DATA 8, 9, 10, 11, 12, 13, 14, 15 1030 DATA 16, 17, 18, 19, 20, 21, 22, 23 1040 DATA 24, 25, 26, 27, 28, 29, 30, 31 1050 DATA 32, 33, 34, 35, 36, 37, 38, 39 1060 DATA 40, 41, 42, 43, 44, 45, 46, 47 1070 DATA 48, 49, 50, 51, 52, 53, 54, 55 1080 DATA 56, 57, 58, 59, 60, 61, 62, 63 1090 DATA 64, 65, 66, 67, 68, 69, 70, 71 1100 DATA 72, 73, 74, 75, 76, 77, 78, 79 1110 DATA 80, 81, 82, 83, 84, 85, 86, 87 1120 DATA 88, 89, 90, 91, 92, 93, 94, 95 1130 DATA 96, 97, 98, 99, 100,101,102,103 1140 DATA 104,105,106,107,108,109,110,111 1150 DATA 112,113,114,115,116,117,118,119 1160 DATA 120,121,122,123,124,125,126,127 1170 DATA 128,126, 96,131,123,133,125,135 1180 DATA 136,137,138,139,140,141, 91, 93 1190 DATA 64, 145,146,147,124,149,150,151 1200 DATA 152, 92, 94,155,156,157,158,159 1210 DATA 160,161,162,163,164,165,166,167 1220 DATA 168,169,170,171,172,173,174,175 1230 DATA 176,177,178,179,180,181,182,183 1240 DATA 184,185,186,187,188,189,190,191 1250 DATA 192,193,194,195,196,197,198,199 1260 DATA 200,201,202,203,204,205,206,207 1270 DATA 208,209,210,211,212,213,214,215 1280 DATA 216,217,218,219,220,221,222,223 1290 DATA 224,225,226,227,228,229,230,231 1300 DATA 232,233,234,235,236,237,238,239 1310 DATA 240,241,242,243,244,245,246,247 1320 DATA 248,249,250,251,252,253,254,255 2000 ! Initiering av tabell 2010 ! 2020 FOR I=0 TO 255 2030 READ Swe(I) 2040 NEXT I 2050 ! 3000 ! Huvudprogram 3010 ! 3020 INPUT 'Ange infil: 'Infil$ 3030 WHILE Infil$="" 3040 END 3050 WEND 3060 OPEN Infil$ AS FILE 1 3070 Kolon=INSTR(1,Infil$,":") : Utfil$=LEFT$(Infil$,Kolon)+'temp.fil' 3080 PREPARE Utfil$ AS FILE 2 3090 Z=FNInitread 3100 ; 'Detta tar en liten stund!' 3110 WHILE NOT FNReadline(1) 3120 Z=FNConvert 3130 ; #2,Rad$ 3140 WEND 3150 CLOSE 1,2 3160 Punkt=INSTR(1,Infil$,'.') 3170 IF Punkt NAME Infil$ AS LEFT$(Infil$,Punkt-1)+'.BAK' ELSE NAME Infil$ AS Infil$+'.BAK' 3180 NAME Utfil$ AS Infil$ 3190 ; CHR$(13) SPACE$(30) CHR$(13) 'Klart!' 3200 END 3210 ! 4000 ! Funktioner 4010 ! 4020 DEF FNInitread 4030 Eof=0 4040 Feof=0 4050 DIM Buffert$=Maxradl{ngd+254,In$=253 4060 DIM Ctrlz$=1 : Ctrlz$=CHR$(26) 4070 RETURN 0 4080 FNEND 4090 ! 4100 ! Denna komplicerade inl{sningsrutin har den f|rdelen att l{sning sker 4110 ! blockvis till en buffert, d{r sedan radslut snabbt s|ks upp med INSTR. 4120 ! Blocken utg|r en ABC-sektor. P} ABC {r filen alltid ett helt antal 4130 ! block. P} Unix blir sista blocket f|re EOF kortare {n beg{rt, och det 4140 ! passar alldeles utm{rkt, f|r d} missar man inget vid den l{sning som ger 4150 ! error. Om en rad {r l{ngre {n Maxradl{ngd delas raden. 4160 ! 4170 ! Rad$ ger f|r varje anrop en ny rad. 4180 ! Buffert$ {r rutinens privata inbuffert. 4190 ! Feof signalerar fysiskt filslut eller CTRL-Z. 4200 ! Eof och returv{rdet signalerar att filen {r slut och Rad$ ej {r giltig. 4210 ! 4220 DEF FNReadline(Lu) LOCAL In$=253,Ctrlz 4230 WHILE 1 4240 P=INSTR(1,Buffert$,CHR$(13)) 4250 WHILE P AND P<=Maxradl{ngd+1 4260 Rad$=LEFT$(Buffert$,P-1) 4270 IF P+1<=LEN(Buffert$) THEN Buffert$=RIGHT$(Buffert$,P+2) : RETURN 0 4280 IF Feof THEN Buffert$="" : RETURN 0 ! N{sta Readline ger EOF 4290 ON ERROR GOTO 4500 4300 GET #Lu,In$ : IF In$=Ctrlz$ THEN Buffert$="" : Feof=-1 : RETURN 0 4310 GET #Lu,Buffert$ COUNT 252 4320 Ctrlz=INSTR(1,Buffert$,Ctrlz$) 4330 IF Ctrlz THEN Buffert$=LEFT$(Buffert$,Z-1) : Feof=-1 4340 RETURN 0 4350 ! H{r sammanf|ll radslut och buffertslut. Det f|rsta tecknet (In$) 4360 ! kasseras direkt, resten l{ses till Buffert$. 4370 WEND 4380 IF Feof THEN Rad$=Buffert$ : Eof=-1 : Buffert$="" : RETURN -1 ! Slut! 4390 IF LEN(Buffert$)>Maxradl{ngd THEN Rad$=LEFT$(Buffert$,Maxradl{ngd) : Buffert$=RIGHT$(Buffert$,Maxradl{ngd+1) : RETURN 0 4400 ON ERROR GOTO 4500 : GET #Lu,In$ COUNT 253 4410 Ctrlz=INSTR(1,In$,Ctrlz$) 4420 IF Ctrlz THEN Buffert$=Buffert$+LEFT$(In$,Ctrlz-1) ELSE Buffert$=Buffert$+In$ 4430 WEND 4440 ! Ovanst}ende avsnitt WEND...WEND l{ser in ett nytt block som l{ggs 4450 ! till slutet av bufferten, n{r bufferten inte inneh}ller n}gon full 4460 ! rad, och om den inte |verskrider max radl{ngd. 4470 ! 4480 ! Felhantering fill{sning: 4490 ! Sista raden returneras, och EOF f|rdr|js tills n{sta rad ska l{sas. 4500 IF ERRCODE<>Eofilecode ; 'Fel nr' ERRCODE 4510 Rad$=Buffert$ : Buffert$="" 4520 IF Rad$="" THEN Eof=-1 4530 Feof=-1 4540 RETURN Eof 4550 FNEND 4560 ! 4570 DEF FNConvert LOCAL I,Tkn,Sp 4580 ON ERROR GOTO 4590 WHILE I