home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib22b.dsk / MC.EDITOR.bas < prev    next >
BASIC Source File  |  2023-02-26  |  9KB  |  204 lines

  1. 10  REM  ************************
  2. 20  REM  *      MC.EDITOR       *
  3. 30  REM  *    BY LOU PARADA     *
  4. 40  REM  *  COPYRIGHT (C) 1984  *
  5. 50  REM  *  BY MICROSPARC, INC  *
  6. 60  REM  *  CONCORD, MA. 01742  *
  7. 70  REM  ************************
  8. 80  REM 
  9. 90 LB = 06: REM  LOW-ORDER ADDR
  10. 100 HB = 07: REM  HI-ORDER ADDR
  11. 110  DIM DG$(4)
  12. 120  GOSUB 1770: REM  FIND END OF PG
  13. 130  GOSUB 1820: REM  LOAD M.LANG
  14. 140  GOTO 920: REM  MAIN MENU
  15. 150  VTAB 23: HTAB 1
  16. 160  PRINT "ENTER 'MENU' FOR OTHER SELECTIONS ": VTAB 21
  17. 170 FX =  FRE(0)
  18. 180  HTAB 34: PRINT "------";: HTAB 33: INPUT CD$: VTAB 23: CALL  -958
  19. 190  IF CD$ = "MENU" GOTO 920
  20. 200  ON DISPLAY GOTO 1180
  21. 210  POKE 0 +LB,LO: POKE 0 +HB,HI
  22. 220 NH = HI: REM  SAVE HI-ORDER BYTE
  23. 230 NL = LO: REM  SAVE LOW-ORDER BYTE
  24. 240 NX = (HI *256 +LO)
  25. 250 LX =  LEN(CD$): IF LX <2  OR LX >6  OR LX = 3  OR LX = 5  THEN  PRINT "MUST BE 2, 4, OR 6 HEX CODES";: GOSUB 910: GOTO 180
  26. 260  REM  POKE INSTRUCTION AND THEN DISASSEMBLE IT
  27. 270  FOR J = 1 TO LX  STEP 2
  28. 280 AD$ =  MID$ (CD$,J,2)
  29. 290 LG =  LEN(AD$)
  30. 300 HH = HI:LL = LO
  31. 310  GOSUB 650:HI = HH:LO = LL
  32. 320  IF ER = 1  THEN  PRINT "MUST BE HEXADECIMAL CODES": GOTO 180
  33. 330 W = DE
  34. 340  POKE 0 +NX,W:NX = NX +1: NEXT 
  35. 350  ON EDIT GOTO 450
  36. 360 B1 =  PEEK(0 +NX):B2 =  PEEK(1 +NX): REM  NEXT 2 BYTES
  37. 370  POKE 0 +NX,255: POKE 1 +NX,255
  38. 380  CALL LA
  39. 390  POKE 0 +NX,B1: POKE 1 +NX,B2: REM  NEXT 2 BYTES
  40. 400 TS = ( PEEK(59) *256) + PEEK(58): PRINT 
  41. 410  IF TS = NX  THEN  GOTO 430
  42. 420  PRINT "INSTRUCTION LENGTH ERROR, TRY AGAIN":NX = TS: GOSUB 910: GOTO 170
  43. 430 LO =  PEEK(58):HI =  PEEK(59)
  44. 440  GOTO 170
  45. 450  REM  BYPASS INSTRUCTION LENGTH EDITING
  46. 460 HI =  INT(NX/256):LO = NX -(HI *256)
  47. 470  GOSUB 500
  48. 480  PRINT N1$;N2$;N3$;N4$;"-   "; LEFT$(CD$,2);" "; MID$ (CD$,3,2);" "; MID$ (CD$,5,2);: HTAB 22: PRINT " EDIT OFF"
  49. 490  GOTO 170
  50. 500  REM  DECIMAL TO HEX CONVERTION OF HIGH AND LOW ORDER BYTES
  51. 510 N = NH: REM  HIGH ORDER BYTE
  52. 520 N% = N/16: GOSUB 620
  53. 530 N1$ = NN$
  54. 540 N% = N -N% -16: GOSUB 620
  55. 550 N2$ = NN$
  56. 560 N = NL: REM  LOW ORDER BYTE
  57. 570 N% = N/16: GOSUB 620
  58. 580 N3$ = NN$
  59. 590 N% = N -N% *16: GOSUB 620
  60. 600 N4$ = NN$
  61. 610  RETURN 
  62. 620 NN$ =  CHR$(48 +N% +7 *(N% <9))
  63. 630  RETURN 
  64. 640  REM  RIGHT JUSTIFY INSTRUCTION FOR EDITING
  65. 650 DG$(1) = "0":DG$(2) = "0":DG$(3) = "0":DG$(4) = "0"
  66. 660 X = 4:Y = LG
  67. 670  FOR I = 1 TO LG
  68. 680 DG$(X) =  MID$ (AD$,Y,1)
  69. 690 X = X -1:Y = Y -1
  70. 700  NEXT I
  71. 710  REM  EDIT FOR VALID RANGE HEX 0 THRU F
  72. 720 ER = 0
  73. 730  FOR I = 4 TO (5 -LG)  STEP  -1
  74. 740 V =  ASC(DG$(I))
  75. 750  IF V <48  OR V >70 GOTO 780
  76. 760  IF V >57  AND V <65 GOTO 780
  77. 770  NEXT : GOTO 800
  78. 780 ER = 1: GOSUB 910: RETURN : REM  ERROR FLAG
  79. 790  REM  CONVERT HEX ADDR TO DECIMAL
  80. 800 DE = 0:P = 1
  81. 810  FOR I = 4 TO (5 -LG)  STEP  -1
  82. 820 V =  ASC(DG$(I))
  83. 830  IF V >64  THEN V = V -7:
  84. 840 V = V -48
  85. 850 DE = DE +(V *P):P = P *16: NEXT 
  86. 860 HI =  INT(DE/256)
  87. 870 LO = DE -(HI *256)
  88. 880  RETURN 
  89. 890  PRINT "MUST BE HEXADECIMAL CODES": GOTO 180
  90. 900  REM  RING BELL
  91. 910  FOR LU = 1 TO 3: CALL  -198: NEXT : RETURN 
  92. 920  REM  MAIN MENU
  93. 930 DISPLAY = 0
  94. 940  TEXT : HOME : VTAB 18: INVERSE : PRINT "WARNING:";: NORMAL : PRINT " TO AVOID CONFLICTS WITH THIS   PROGRAM AND ITS VARIABLE SPACE, DO NOT  EDIT CODE FROM $800 TO $3000 OR ABOVE   $8000. RATHER, EDIT ABOVE $3000, SAVE   IT, AND  THEN RELOCATE IT."
  95. 950  PRINT : PRINT "** COPYRIGHT 1984 BY MICROSPARC INC. **": VTAB 2: HTAB 10: INVERSE : PRINT " MACHINE CODE EDITOR ": NORMAL : PRINT : PRINT 
  96. 960  PRINT "1 - BLOAD A PROGRAM FOR EDITING"
  97. 970  PRINT "2 - BSAVE EDITED PROGRAM"
  98. 980  PRINT "3 - START EDIT"
  99. 990  PRINT "4 - EDIT MODE - (CONTINUE)"
  100. 1000  PRINT "5 - EDIT ON/OFF TOGGLE SWITCH"
  101. 1010  PRINT "6 - DISPLAY MACHINE CODE - ONLY"
  102. 1020  PRINT "7 - QUIT"
  103. 1030  PRINT : INPUT "WHICH NUMBER? ";OPT$
  104. 1040 OPT =  VAL(OPT$): IF OPT <1  OR OPT >7 GOTO 1030
  105. 1050  IF OPT = 7  THEN  TEXT : HOME : END 
  106. 1060 OPT =  VAL(OPT$)
  107. 1070  ON OPT GOTO 1200,1430,1550,1670,1740,1080
  108. 1080  REM  DISPLAY MACHINE LANG. CODE
  109. 1090  HOME : VTAB 4: PRINT "** DISASSEMBLE MACHINE LANGUAGE CODE  **": PRINT 
  110. 1100  INPUT "ENTER BEGINNING ADDRESS IN HEX =$";AD$
  111. 1110 LG =  LEN(AD$)
  112. 1120  IF LG = 0  OR LG >4 GOTO 1190
  113. 1130  GOSUB 650: REM  EDIT ADDR
  114. 1140  ON ER GOTO 1190
  115. 1150 DISPLAY = 1
  116. 1160  IF ER = 0  THEN  PRINT : PRINT  TAB( 19);"DECIMAL ADDR=";DE: PRINT : PRINT "HIT RETURN TO STEP THRU INSTRUCTIONS"
  117. 1170  POKE 7, INT(DE/256): POKE 6,DE -( PEEK(7) *256)
  118. 1180  CALL LA: POKE 6, PEEK(58): POKE 7, PEEK(59): GOTO 150
  119. 1190  PRINT "ERROR IN HEX ADDRESS =$";AD$: PRINT "HIT ANY KEY TO TRY AGAIN": GOSUB 910: GET A$: GOTO 1100
  120. 1200  REM  #1 BLOAD A PROGRAM FOR EDIT
  121. 1210  HOME : FLASH : PRINT "WARNING:";: NORMAL : PRINT " LOADING A PROGRAM BETWEEN $800 AND $";H$;" WILL CLOBBER THIS PROGRAM.....TO PREVENT THIS LOAD AT $2500, EDIT YOURPROGRAM, SAVE IT, AND THEN RELOCATE IT"
  122. 1220  VTAB 8: PRINT "   ** BLOAD A PROGRAM FOR EDITING **"
  123. 1230  VTAB 10: CALL  -958: INPUT "FILE NAME:";PGM$: IF  VAL(PGM$) >0  OR  LEN(PGM$) >15  THEN 1230
  124. 1240  IF PGM$ = ""  THEN  GOTO 940
  125. 1250  VTAB 12: CALL  -958: INPUT "ENTER BEGINNING ADDRESS IN HEX =$";AD$
  126. 1260 LG =  LEN(AD$)
  127. 1270  IF LG = 0 TO LG >4 GOTO 1300
  128. 1280  GOSUB 650: REM  EDIT ADDR
  129. 1290  IF ER = 0  THEN  PRINT : GOSUB 1310: GOTO 1350
  130. 1300  PRINT "ERROR IN HEX ADDRESS";AD$: PRINT "PRESS A KEY TO CONTINUE": GET K$: GOSUB 910: GOTO 1250
  131. 1310  REM  PROTECT THIS PROGRAM
  132. 1320  IF DE =  >2048  AND DE < = LA +17  THEN 1340
  133. 1330  RETURN 
  134. 1340  PRINT : PRINT "ADDRESS ";AD$;" WILL CLOBBER THIS PROGRAM, HIT ANY KEY TO TRY AGAIN": GOSUB 910: GET A$: GOTO 1250
  135. 1350  ONERR  GOTO 1900
  136. 1360  PRINT  CHR$(4)"BLOAD";PGM$;",A$";AD$
  137. 1370 NH =  PEEK(43635):NL =  PEEK(43634): GOSUB 500
  138. 1380  VTAB 15: FLASH : PRINT "HEX LOAD ADDR=$";: NORMAL : PRINT N1$;N2$;N3$;N4$;:
  139. 1390 NH =  PEEK(43617):NL =  PEEK(43616): GOSUB 500
  140. 1400  HTAB 22: PRINT "LENGTH=$";N1$;N2$;N3$;N4$
  141. 1410  FOR TT = 1 TO 1300: NEXT TT
  142. 1420  GOTO 920
  143. 1430  REM  #2 BSAVE EDITED PROGRAM
  144. 1440  HOME : VTAB 4: PRINT "      ** BSAVE EDITED PROGRAM **": VTAB 6: CALL  -958: INPUT "FILE NAME:";NM$: IF NM$ = ""  THEN 930
  145. 1450  IF  VAL(NM$) >0  OR  LEN(NM$) >15  THEN 1440
  146. 1460  PRINT : CALL  -958: INPUT "ENTER BEGINNING ADDRESS $";AA$: IF AA$ = ""  THEN  PRINT "ERROR IN HEX ADDRESS": PRINT "PRESS A KEY TO CONTINUE": GET K$: PRINT : VTAB 7: GOTO 1460
  147. 1470  PRINT : CALL  -958: INPUT "ENTER LENGTH OF PROGRAM $";LL$: IF LL$ = ""  THEN  PRINT "ERROR IN LENGTH";AD$: PRINT "PRESS A KEY TO CONTINUE": GET K$: GOTO 1470
  148. 1480  HTAB 13: VTAB 15: FLASH : PRINT "BSAVING PROGRAM": NORMAL 
  149. 1490  ONERR  GOTO 1890
  150. 1500  PRINT  CHR$(4)"BSAVE ";NM$", A$";AA$;", L$"LL$
  151. 1510  GOTO 920
  152. 1520 NM$ = "*": REM  PG.NAME
  153. 1530 AA$ = "*": REM  LOAD ADDR
  154. 1540 LL$ = "*": REM  LENGTH OF PGM
  155. 1550  REM  #3 START EDIT
  156. 1560  HOME : VTAB 4: PRINT "    ** SET EDIT BEGINNING ADDRESS **": PRINT 
  157. 1570  INPUT "ENTER BEGINNING ADDRESS IN HEX =$";AD$
  158. 1580 LG =  LEN(AD$)
  159. 1590  IF LG = 0  OR LG >4 GOTO 1620
  160. 1600  GOSUB 650: REM  EDIT ADDR
  161. 1610  IF ER = 0  THEN  PRINT : PRINT  TAB( 19);"DECIMAL ADDR=";DE: GOSUB 1630: GOTO 150
  162. 1620  PRINT "ERROR IN HEX ADDRESS =$";AD$: PRINT "HIT ANY KEY TO TRY AGAIN": GOSUB 910: GET A$: GOTO 1570
  163. 1630  REM  PROTECT THIS PROGRAM
  164. 1640  IF DE =  >2048  AND DE < = LA +17  THEN 1660
  165. 1650  RETURN 
  166. 1660  PRINT : PRINT "ADDRESS ";AD$;" WILL CLOBBER THIS PROGRAM,  HIT ANY KEY TO TRY AGAIN": GOSUB 910: GET A$: GOTO 1560
  167. 1670  REM  #4 CONTINUE WITH EDIT
  168. 1680  HOME : VTAB 4
  169. 1690  IF EDIT = 0  THEN  INVERSE : PRINT "EDIT FEATURE IS ON"
  170. 1700  IF EDIT = 1  THEN  FLASH : PRINT "EDIT FEATURE IS OFF"
  171. 1710  NORMAL : VTAB 6: PRINT "**** EDIT MODE ****": PRINT 
  172. 1720 NH = HI:NL = LO: GOSUB 500:
  173. 1730  PRINT N1$;N2$;N3$;N4$;"-";" <--* START ADDRESS";: GOTO 150
  174. 1740  REM  #5 EDIT ON/OFF TOGGLE SWITCH
  175. 1750  IF EDIT = 0  THEN EDIT = 1: GOTO 1670
  176. 1760  IF EDIT = 1  THEN EDIT = 0: GOTO 1670
  177. 1770  REM  FIND END OF PROGRAM (FROM DECIMAL TO HEX)
  178. 1780 J = 0: FOR J1 = 1 TO 4  STEP 2:J = J +1:N(J1) =  INT( PEEK(174 +J)/16):N(J1 +1) =  PEEK(174 +J) -(16 *N(J1)): NEXT J1: FOR J = 1 TO 4: IF N(J) >9  THEN J$(J) =  CHR$(N(J) +55): NEXT J: GOTO 1800
  179. 1790 J$(J) =  STR$(N(J)): NEXT J
  180. 1800 H$ = "": FOR J = 3 TO 4:H$ = H$ +J$(J): NEXT J: FOR J = 1 TO 2:H$ = H$ +J$(J): NEXT J:MX = 0: FOR J = 1 TO 4:MX = N(J) +MX: NEXT J
  181. 1810  RETURN 
  182. 1820  REM  LOAD MACHINE LANGUAGE
  183. 1830 LA =  PEEK(176) *256 + PEEK(175) -17
  184. 1840  REM  LA = LOAD ADDR AT PGM END
  185. 1850  FOR I = LA TO LA +13: READ IN: POKE 0 +I,IN: NEXT 
  186. 1860  DATA  165,6,133,58,165,7,133,59,169,1,32,99,254,96
  187. 1870  RETURN 
  188. 1880  REM  DISK ERROR TRAPPING
  189. 1890 EL = 1: GOTO 1910: REM  ENTRY POINT FOR DISK BSAVE
  190. 1900 EL = 2: REM  ENTRY POINT FOR DISK BLOAD
  191. 1910 ER =  PEEK(222)
  192. 1920  IF ER = 4  THEN  PRINT "DISK WRITE PROTECTED": GOTO 2010
  193. 1930  IF ER = 6  THEN  PRINT "FILE NOT FOUND": GOTO 2010
  194. 1940  IF ER = 8  THEN  PRINT "DISK I/O ERROR": GOTO 2010
  195. 1950  IF ER = 9  THEN  PRINT "DISK FULL": GOTO 2010
  196. 1960  IF ER = 10  THEN  PRINT "FILE LOCKED": GOTO 2010
  197. 1970  IF ER = 11  THEN  PRINT "ILLEGAL FILE NAME": GOTO 2010
  198. 1980  IF ER = 13  THEN  PRINT "FILE TYPE MISMATCH": GOTO 2010
  199. 1990  PRINT "ERROR #";ER"IN LINE "; PEEK(218) + PEEK(219) *256
  200. 2000  PRINT "PRESS ANY KEY TO CONTINUE": GET K$: PRINT 
  201. 2010  PRINT "PRESS ANY KEY TO CONTINUE": GET K$: PRINT 
  202. 2020  ON EL GOTO 1450,1230
  203. 2030  REM  AREA WHERE MACHINE LANGUAGE IS LOADED. NEXT LINE MUST CONTAIN 20 ASTERISKS
  204. 2040  REM ********************