home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / basic / mbextend.lbr / GENMOD.BZS / GENMOD.BAS
Encoding:
BASIC Source File  |  1988-01-24  |  3.5 KB  |  150 lines

  1. 10 ' Reprinted from Micro/Systems Journal, Vol. 1, No. 1, March-
  2. 20 ' April 1985, article titled "Assembly Language Extensions for
  3. 30 ' MS-Basic" by Ron Kreymborg.  
  4. 60 '
  5. 1000 '                      GENMOD
  6. 1010 '
  7. 1020 '  A Microsoft Basic program which simulates the
  8. 1030 '  Digital Research program called GENMOD.COM.
  9. 1040 '  It takes a concatenated HEX file and produces
  10. 1050 '  a page relocatable version.
  11. 1060 '
  12. 1070 '                                         Ron Kreymborg
  13. 1080 DEFINT A-Z
  14. 1090 INPUT "FILENAME (.HEX ASSUMED)? ",A$
  15. 1100 B$=A$+".HEX"
  16. 1110 S=6000è1120 DIM M(S), B(S/8)
  17. 1130 H$="0123456789ABCDEF"
  18. 1140 NOPRNT=1
  19. 1150 '
  20. 1160 OPEN "I",1,B$
  21. 1170 PASS=1
  22. 1180 FLG=0
  23. 1190 G=0
  24. 1200 PRINT
  25. 1210 PRINT "FIRST PASS"
  26. 1220 IF EOF(1) THEN 1280
  27. 1230 LINE INPUT #1, L$
  28. 1240 IF MID$(L$,2,2) = "00" THEN 1320
  29. 1250 GOSUB 2120
  30. 1260 GOTO 1220
  31. 1270 '
  32. 1280 CLOSE
  33. 1290 PRINT "INCORRECT FILE END"
  34. 1300 STOP
  35. 1310 '
  36. 1320 GOSUB 2370
  37. 1330 G=256
  38. 1340 PASS=2
  39. 1350 PRINT "SECOND PASS"
  40. 1360 IF EOF(1) THEN 1280
  41. 1370 LINE INPUT #1, L$
  42. 1380 IF MID$(L$,2,2) = "00" THEN 1420è1390 GOSUB 2120
  43. 1400 GOTO 1360
  44. 1410 '
  45. 1420 CLOSE
  46. 1430 Q=P+1
  47. 1440 FOR I=0 TO D
  48. 1450    P=P+1
  49. 1460    M(P)=B(I)
  50. 1470 NEXT I
  51. 1480 IF NOPRNT THEN 1690
  52. 1490 J=0
  53. 1500 PRINT
  54. 1510 PRINT "OUTPUT CODE:"
  55. 1520 PRINT
  56. 1530 T=512 : GOSUB 2480 : PRINT T$;"  ";
  57. 1540 FOR I=0 TO P
  58. 1550    IF J<16 THEN 1620
  59. 1560    PRINT "  ";
  60. 1570    FOR K=I-J TO I-1
  61. 1580       IF M(K)>=32 AND M(K)<=126 THEN PRINT CHR$(M(K)); ELSE PRINT ".";
  62. 1590    NEXT K
  63. 1600    PRINT
  64. 1610    J=0 : T=512+I : GOSUB 2480 : PRINT T$;"  "; 
  65. 1620    T=M(I) : GOSUB 2480
  66. 1630    PRINT MID$(T$,3);" ";
  67. 1640    J=J+1
  68. 1650 NEXT Iè1660 PRINT
  69. 1670 '
  70. 1680 ' NOW WRITE THE PRL FILE
  71. 1690 B$=A$+".PRL"
  72. 1700 A$="0000000000000000"
  73. 1710 OPEN "R",1,B$,16
  74. 1720 FIELD 1, 1 AS B0$, 2 AS B1$, 13 AS B2$
  75. 1730 LSET B0$=CHR$(0)
  76. 1740 FOR I=1 TO 14
  77. 1750    MID$(A$,I,1)=CHR$(0)
  78. 1760 NEXT I
  79. 1770 PH=Q\256
  80. 1780 PL=Q MOD 256
  81. 1790 B$=CHR$(PL)+CHR$(PH)
  82. 1800 LSET B1$=B$
  83. 1810 LSET B2$=A$
  84. 1820 PUT 1, 1
  85. 1830 LSET B1$=MKI$(0)
  86. 1840 FOR I=2 TO 16
  87. 1850    PUT 1, I
  88. 1860 NEXT I
  89. 1870 FIELD 1, 16 AS BUF$
  90. 1880 N=P\16+1
  91. 1890 P=0
  92. 1900 FOR I=1 TO N
  93. 1910    FOR J=1 TO 16
  94. 1920       MID$(A$,J,1)=CHR$(M(P))è1930       P=P+1
  95. 1940    NEXT J
  96. 1950    LSET BUF$=A$
  97. 1960    PUT 1, I+16
  98. 1970 NEXT I
  99. 1980 CLOSE
  100. 1990 PRINT
  101. 2000 T=Q : GOSUB 2480 : PRINT T$;" TOTAL CODE"
  102. 2010 T=P-1 : GOSUB 2480 : PRINT T$;" TOTAL BYTES"
  103. 2020 IF FLG THEN 2040
  104. 2030 PRINT "MODULE CONSTRUCTED" : GOTO 2050
  105. 2040 PRINT "ERRORS IN RE-LOCATION"
  106. 2050 PRINT
  107. 2060 SYSTEM
  108. 2070 END
  109. 2080 '
  110. 2090 '
  111. 2100 '
  112. 2110 ' TRANSLATE THE CURRENT HEX LINE
  113. 2120 T$=MID$(L$,2,2) : GOSUB 2440
  114. 2130 N=T
  115. 2140 T$=MID$(L$,4,2) : GOSUB 2440
  116. 2150 P=T*256
  117. 2160 T$=MID$(L$,6,2) : GOSUB 2440
  118. 2170 P=P+T-G-1
  119. 2180 J=10
  120. 2190 FOR I=1 TO Nè2200    P=P+1
  121. 2210    T$=MID$(L$,J,2) : GOSUB 2440
  122. 2220    IF PASS = 1 THEN M(P)=T : GOTO 2320
  123. 2230    IF T = M(P) THEN 2320
  124. 2240    T=T-M(P)
  125. 2250    IF (T = 1 OR T = -255) THEN 2290
  126. 2260    PRINT HEX$(P);"RE-LOCATION ERROR";T
  127. 2270    FLG=1
  128. 2280    GOTO 2320
  129. 2290    P1=P\8
  130. 2300    P2=P MOD 8
  131. 2310    B(P1)=B(P1)+2^(7-P2)
  132. 2320    J=J+2
  133. 2330 NEXT I
  134. 2340 RETURN
  135. 2350 '
  136. 2360 ' ZERO THE BIT MAP
  137. 2370 D=P\8+1
  138. 2380 FOR I=0 TO D
  139. 2390    B(I)=0
  140. 2400 NEXT I
  141. 2410 RETURN
  142. 2420 '
  143. 2430 ' HEX TO DECIMAL
  144. 2440 T=(INSTR(H$,LEFT$(T$,1))-1)*16+INSTR(H$,RIGHT$(T$,1))-1
  145. 2450 RETURN
  146. 2460 'è2470 ' DECIMAL TO HEX
  147. 2480 T$="000"+HEX$(T)
  148. 2490 IF LEN(T$)>4 THEN T$=MID$(T$,2) : GOTO 2490
  149. 2500 RETURN
  150.