10 ' Wandeln von SOL-ENT-Dateien vom ASCII-Format in eine .COM-Datei 20 ' 30 ' Format der ENT Datei: 40 ' 50 ' Erste Zeile : 'ENTER 0000' 60 ' Datenzeilen : '0000: 00 00 00 00 C3 5A 06 19 D2 20 45 20 D6 20 45 20' 70 ' Letzte Zeile: '0DD0: 00 00/' 80 ' 90 ' Geschrieben fuer CP/M-80 MALLARD BASIC 100 ' Werner Cirsovius, Dezember 2002 110 ' 120 ' Ergaenzung September 2004 130 ' 140 ' Wegen abweichender Zeilen: 150 ' 160 ' Erste Zeile : 'EN XXXX' ++++ Die Adresse XXXX kann aus 1 bis 4 Ziffern bestehen. 170 ' Letzte Zeile: '0DD0: 00 00 /' ++++ Vor dem Endzeichen '/' kann ein Leerzeichen stehen. 180 ' 190 ON ERROR GOTO 1250 200 GOTO 1070 210 ' 220 ' Eingabe des Namens der Quelldatei 230 ' 240 INPUT "Dateiname [.ENT] ";FINAME$ 250 IF LEN(FINAME$)=0 THEN GOTO 240 260 FINAME$=UPPER$(FINAME$) 270 RETURN 280 ' 290 ' Oeffnen der benoetigten Dateien 300 ' 310 p=INSTR(FINAME$,".") 320 IF p=0 THEN FINAME$=FINAME$+".ENT" 330 OPEN "i",1,FINAME$ 340 p=INSTR(FINAME$,".") 350 FINAME$=LEFT$(FINAME$,p)+"COM" 360 OPEN "o",2,FINAME$ 370 Optr=0 380 EndCode=0 390 RETURN 400 ' 410 ' Wandeln einer Zeichenkette in Hex-Wert 420 ' 430 x=0 440 FOR ih=1 TO dig 450 : ch$=MID$(L$,ih,1) 460 : IF ch$ < "0" THEN GOTO 1230 470 : IF ch$ > "F" THEN GOTO 1230 480 : ch=ASC(ch$)-ASC("0") 490 : IF ch < 10 THEN GOTO 510 500 : ch=ch-7: IF ch > 15 THEN GOTO 1230 510 : x=x*16+ch 520 NEXT ih 530 RETURN 540 ' 550 ' Zeile einlesen, Leerzeilen ignorieren 560 ' 570 LINE INPUT #1,LINE$ 580 IF LEN(LINE$)=0 THEN GOTO 570 590 RETURN 600 ' 610 ' Suche nach Start der ENT-DAtei 620 ' 630 GOSUB 570 640 E$="ENTER " : del=LEN(E$) : IF INSTR(LINE$,E$)<>0 GOTO 660 650 E$="EN " : del=LEN(E$) : IF INSTR(LINE$,E$)=0 THEN GOTO 1190 660 LINE$=MID$(LINE$,del+1) 670 L$=LINE$ : dig=LEN(LINE$) 680 GOSUB 430 : EntAdr=x 690 StrAdr=EntAdr : EndAdr=EntAdr 700 RETURN 710 ' 720 ' Byte in COM-Datei schreiben 730 ' 740 PRINT #2,CHR$(b); 750 EndAdr=EndAdr+1 760 Optr=Optr+1: IF Optr=128 THEN Optr=0 770 RETURN 780 ' 790 ' Dateien schliessen 800 ' 810 IF Optr<>0 THEN FOR i=Optr TO 128: PRINT #2,CHR$(26);:NEXT i 820 CLOSE 830 RETURN 840 ' 850 ' ASCII-Zeile bearbeiten 860 ' 870 GOSUB 570 880 L$=LINE$ : dig=4 : GOSUB 430 : LinAdr=x 890 IF LinAdr<>EntAdr THEN GOTO 1200 900 EntAdr=EntAdr+16 910 IF MID$(LINE$,5,1)<>":" THEN GOTO 1220 920 ia=1 930 : AscHex$=MID$(LINE$,3*(ia+1),3) 940 : IF MID$(AscHex$,1,1)="/" OR MID$(AscHex$,2,1)="/" THEN GOTO 1020 950 : IF MID$(AscHex$,1,1)<>" " THEN GOTO 1180 960 : AscHex$=MID$(AscHex$,2) 970 : L$=AscHex$ : dig=2 : GOSUB 430 : BytHex=x 980 : b=BytHex : GOSUB 740 990 : ia=ia+1 1000 IF ia<17 THEN GOTO 930 1010 RETURN 1020 EndCode=1 1030 RETURN 1040 ' 1050 ' Hauptprogramm 1060 ' 1070 GOSUB 240 : ' Eingabe des Namens der Quelldatei 1080 GOSUB 310 : ' Oeffnen der benoetigten Dateien 1090 GOSUB 630 : ' Suche nach Start der ENT-DAtei 1100 GOSUB 870 : ' ASCII-Zeile bearbeiten 1110 IF EndCode=0 THEN GOTO 1100 1120 GOSUB 810 : ' Dateien schliessen 1130 PRINT "Datei ";FINAME$," beschrieben von ";HEX$(StrAdr,4);"H-";HEX$(EndAdr-1,4);"H" 1140 END 1150 ' 1160 ' Fehlerbehandlung 1170 ' 1180 PRINT "Leerzeichen an erster Stelle erwartet in: ";AscHex$ : END 1190 PRINT "Ungueltige erste Zeile (",LINE$,")" 1200 PRINT "- Erwartet: 'ENTER (xxx)x'" 1210 PRINT " oder: 'EN (xxx)x'" : END 1220 PRINT "':' fehlt in Zeile: ",LINE$ : END 1230 PRINT "Ungueltiges Hex-Zeichen: ";ch$ : END 1240 PRINT "Start-Adresse '";LINE$;"' zu lang (In Zeile 1)" : END 1250 IF ERR=53 THEN PRINT "Kann Datei ";FINAME$;" nicht oeffnen" : END 1260 IF ERR=67 THEN PRINT "Kann Datei ";FINAME$," nicht anlegen" : END 1270 IF ERR=62 THEN PRINT "EOF ueberlesen" : END 1280 PRINT "Error ";ERR : END