10 ' Reprinted from Micro/Systems Journal, Vol. 1, No. 1, March- 20 ' April 1985, article titled "Assembly Language Extensions for 30 ' MS-Basic" by Ron Kreymborg. 60 ' 1000 ' GENMOD 1010 ' 1020 ' A Microsoft Basic program which simulates the 1030 ' Digital Research program called GENMOD.COM. 1040 ' It takes a concatenated HEX file and produces 1050 ' a page relocatable version. 1060 ' 1070 ' Ron Kreymborg 1080 DEFINT A-Z 1090 INPUT "FILENAME (.HEX ASSUMED)? ",A$ 1100 B$=A$+".HEX" 1110 S=6000 Š1120 DIM M(S), B(S/8) 1130 H$="0123456789ABCDEF" 1140 NOPRNT=1 1150 ' 1160 OPEN "I",1,B$ 1170 PASS=1 1180 FLG=0 1190 G=0 1200 PRINT 1210 PRINT "FIRST PASS" 1220 IF EOF(1) THEN 1280 1230 LINE INPUT #1, L$ 1240 IF MID$(L$,2,2) = "00" THEN 1320 1250 GOSUB 2120 1260 GOTO 1220 1270 ' 1280 CLOSE 1290 PRINT "INCORRECT FILE END" 1300 STOP 1310 ' 1320 GOSUB 2370 1330 G=256 1340 PASS=2 1350 PRINT "SECOND PASS" 1360 IF EOF(1) THEN 1280 1370 LINE INPUT #1, L$ 1380 IF MID$(L$,2,2) = "00" THEN 1420 Š1390 GOSUB 2120 1400 GOTO 1360 1410 ' 1420 CLOSE 1430 Q=P+1 1440 FOR I=0 TO D 1450 P=P+1 1460 M(P)=B(I) 1470 NEXT I 1480 IF NOPRNT THEN 1690 1490 J=0 1500 PRINT 1510 PRINT "OUTPUT CODE:" 1520 PRINT 1530 T=512 : GOSUB 2480 : PRINT T$;" "; 1540 FOR I=0 TO P 1550 IF J<16 THEN 1620 1560 PRINT " "; 1570 FOR K=I-J TO I-1 1580 IF M(K)>=32 AND M(K)<=126 THEN PRINT CHR$(M(K)); ELSE PRINT "."; 1590 NEXT K 1600 PRINT 1610 J=0 : T=512+I : GOSUB 2480 : PRINT T$;" "; 1620 T=M(I) : GOSUB 2480 1630 PRINT MID$(T$,3);" "; 1640 J=J+1 1650 NEXT I Š1660 PRINT 1670 ' 1680 ' NOW WRITE THE PRL FILE 1690 B$=A$+".PRL" 1700 A$="0000000000000000" 1710 OPEN "R",1,B$,16 1720 FIELD 1, 1 AS B0$, 2 AS B1$, 13 AS B2$ 1730 LSET B0$=CHR$(0) 1740 FOR I=1 TO 14 1750 MID$(A$,I,1)=CHR$(0) 1760 NEXT I 1770 PH=Q\256 1780 PL=Q MOD 256 1790 B$=CHR$(PL)+CHR$(PH) 1800 LSET B1$=B$ 1810 LSET B2$=A$ 1820 PUT 1, 1 1830 LSET B1$=MKI$(0) 1840 FOR I=2 TO 16 1850 PUT 1, I 1860 NEXT I 1870 FIELD 1, 16 AS BUF$ 1880 N=P\16+1 1890 P=0 1900 FOR I=1 TO N 1910 FOR J=1 TO 16 1920 MID$(A$,J,1)=CHR$(M(P)) Š1930 P=P+1 1940 NEXT J 1950 LSET BUF$=A$ 1960 PUT 1, I+16 1970 NEXT I 1980 CLOSE 1990 PRINT 2000 T=Q : GOSUB 2480 : PRINT T$;" TOTAL CODE" 2010 T=P-1 : GOSUB 2480 : PRINT T$;" TOTAL BYTES" 2020 IF FLG THEN 2040 2030 PRINT "MODULE CONSTRUCTED" : GOTO 2050 2040 PRINT "ERRORS IN RE-LOCATION" 2050 PRINT 2060 SYSTEM 2070 END 2080 ' 2090 ' 2100 ' 2110 ' TRANSLATE THE CURRENT HEX LINE 2120 T$=MID$(L$,2,2) : GOSUB 2440 2130 N=T 2140 T$=MID$(L$,4,2) : GOSUB 2440 2150 P=T*256 2160 T$=MID$(L$,6,2) : GOSUB 2440 2170 P=P+T-G-1 2180 J=10 2190 FOR I=1 TO N Š2200 P=P+1 2210 T$=MID$(L$,J,2) : GOSUB 2440 2220 IF PASS = 1 THEN M(P)=T : GOTO 2320 2230 IF T = M(P) THEN 2320 2240 T=T-M(P) 2250 IF (T = 1 OR T = -255) THEN 2290 2260 PRINT HEX$(P);"RE-LOCATION ERROR";T 2270 FLG=1 2280 GOTO 2320 2290 P1=P\8 2300 P2=P MOD 8 2310 B(P1)=B(P1)+2^(7-P2) 2320 J=J+2 2330 NEXT I 2340 RETURN 2350 ' 2360 ' ZERO THE BIT MAP 2370 D=P\8+1 2380 FOR I=0 TO D 2390 B(I)=0 2400 NEXT I 2410 RETURN 2420 ' 2430 ' HEX TO DECIMAL 2440 T=(INSTR(H$,LEFT$(T$,1))-1)*16+INSTR(H$,RIGHT$(T$,1))-1 2450 RETURN 2460 ' Š2470 ' DECIMAL TO HEX 2480 T$="000"+HEX$(T) 2490 IF LEN(T$)>4 THEN T$=MID$(T$,2) : GOTO 2490 2500 RETURN