110 ' EXBIN - CONVERT S-RECORD FORMAT TO BINARY 120 ' 130 PCLEAR 1 140 CLEAR 200,&H1FFF 150 DIM V(50) 160 AL=64*1024 ' LOWEST ADDRESS 170 AU=0 ' HIGHEST ADDRESS 180 AX=0 ' EXEC ADDRESS 190 AM=&H2000 ' MIN ALLOWED 200 SF=1 210 CLS 220 PRINT"EXBIN" 230 PRINT"CONVERT S-RECORD FILE TO BINARY" 240 ' 250 INPUT"S-FILE";NM$ 260 OPEN"I",SF,NM$ 270 ' 280 NREC=0 290 ' 300 ' MAIN LOOP - READ RECORD AND CONVERT IT 310 INPUT#SF,DL$: NREC=NREC+1 320 IF LEFT$(DL$,1)="S" THEN 380 330 PRINT "FILE IS NOT IN S-RECORD FORMAT." 340 PRINT "LINE";NREC 350 PRINT DL$ 360 STOP 370 ' RECORD TYPE (0,1 OR 9) 380 TYPE=VAL(MID$(DL$,2,1)) 390 ' RECORD LENGTH 400 LN=VAL("&H"+MID$(DL$,3,2)) 410 ' ADDRESS FIELD 420 ADR=VAL("&H"+MID$(DL$,5,4)) 430 ' COMPUTE CHECKSUM 440 CK=LN+INT(ADR/256)+ADR-256*INT(ADR/256) 450 ' DATA BYTES 460 IF LN<=3 THEN 510 470 FOR I=1 TO LN-3 480 V(I)=VAL("&H"+MID$(DL$,7+2*I,2)) 490 CK=CK+V(I) 500 NEXT I 510 CK=255-(CK-256*INT(CK/256)) 520 CS=VAL("&H"+RIGHT$(DL$,2)) 530 IF CK=CS THEN 580 540 PRINT"CHECKSUM ERROR AT LINE";NREC 550 PRINT DL$ 560 PRINT "COMPUTED ";HEX$(CK);" FOUND ";HEX$(CS) 570 STOP 580 IF TYPE=9 THEN TYPE=2 590 IF TYPE<0 OR TYPE>2 THEN PRINT"UNKNOWN RECORD TYPE ";TYPE:PRINT DL$:STOP 600 ON TYPE+1 GOSUB 640,720,840 610 IF TYPE<2 THEN GOTO 310 620 END 630 ' 640 ' FILE NAME RECORD 650 BN$="" 660 FOR I=1 TO LN-3 670 BN$=BN$+CHR$(V(I)) 680 NEXT I 690 PRINT"OUTPUT FILE = ";BN$ 700 RETURN 710 ' 720 ' DATA RECORD 730 IF ADR>=AM THEN 770 740 PRINT"ADDRESS ";HEX$(ADR);" LESS THAN ";HEX$(AM) 750 PRINT"AT LINE ";NREC 760 STOP 770 FOR I=0 TO LN-4 780 POKE ADR+I,V(I+1) 790 NEXT I 800 IF ADRAU THEN AU=ADR+LN-4 820 RETURN 830 ' 840 ' EXECUTION ENTRY RECORD 850 AX=ADR 860 PRINT"BINARY FILE = ";BN$ 870 PRINT"LOW ADDRESS = &H";HEX$(AL) 880 PRINT"HIGH ADDRESS = &H";HEX$(AU) 890 PRINT"EXEC ADDRESS = &H";HEX$(AX) 900 SAVEM BN$,AL,AU,AX 910 RETURN