home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib37a.dsk / NOVEMBER.1989 / NIBBLE.ASM.bas < prev    next >
BASIC Source File  |  2023-02-26  |  10KB  |  175 lines

  1. 10  REM  *************************
  2. 20  REM  *     NIBBLE.ASM        *
  3. 30  REM  * BY KENNETH A. PLUM    *
  4. 40  REM  * COPYRIGHT(C) 1989     *
  5. 50  REM  * MINDCRAFT PUBL. CORP. *
  6. 60  REM  * CONCORD, MA 01742     *
  7. 70  REM  *************************
  8. 80  GOSUB 1720: ONERR  GOTO 670
  9. 90  PRINT  CHR$(4)"VERIFY NIBBLE.ASM.ML": PRINT  CHR$(4)"VERIFY NIBBLE.ASM2": PRINT  CHR$(4)"BRUN NIBBLE.ASM.ML": GOSUB 740
  10. 100  PRINT  CHR$(4)"PREFIX": INPUT "";PF$
  11. 110  HOME : PRINT "NIBBLE ASSEMBLER By Kenneth A. Plum": PRINT "Copyright(c) 1989 MindCraft Publ. Corp."
  12. 120  REM    INPUT SOURCE FILE NAME
  13. 130 EF = 1: POKE 34,2: HOME : GOSUB 630: VTAB 4: PRINT "Sourcefile: ";:T$ = SF$:L = 64: GOSUB 260: PRINT : IF  LEFT$(T$,1) = "*"  THEN  GOSUB 560: GOTO 130
  14. 140 SF$ = T$: IF SF$ = ""  OR SF$ = " "  OR (ES)  THEN  PRINT "Do you wish to quit (Y/N) ";: GET T$: ON T$ = "N"  OR T$ = "n" GOTO 130: GOTO 240
  15. 150  ONERR  GOTO 1710
  16. 160  PRINT  CHR$(4)"VERIFY"T$
  17. 170  POKE 34,4: HOME : GOSUB 630: PRINT "Objectfile: ";:T$ = BF$:L = 64: GOSUB 260: PRINT : IF  LEFT$(T$,1) = "*"  THEN  GOSUB 560: GOTO 170
  18. 180  ON ES GOTO 130:BF$ = T$:F$ = SF$: IF BF$ = ""  OR BF$ = " "  THEN 170
  19. 210  REM  
  20. 220  POKE 34,7: HOME : PRINT "Loading NIBBLE.ASM2..."
  21. 230 EF = 2: PRINT D$"CHAIN "PF$"NIBBLE.ASM2"
  22. 240  CALL 48888: END 
  23. 250  REM   INPUT SUBROUTINE
  24. 260 E$ = T$: IF T$ = ""  THEN E$ = " "
  25. 270 P = 1:ES = 0: PRINT  LEFT$(CL$,L) LEFT$(BB$,L)E$ LEFT$(BB$, LEN(E$));
  26. 280  IF  LEN(E$) >L  THEN E$ =  LEFT$(E$,L): PRINT B$;
  27. 290 E1$ = " ":L1 = 1: ON (P > LEN(E$)) GOTO 300:E1$ =  MID$ (E$,P,1)
  28. 300  IF L1  AND   NOT IM  THEN  INVERSE : PRINT E1$B$;: NORMAL : GOTO 330
  29. 310  IF L1  THEN  PRINT "_"B$;: GOTO 330
  30. 320  PRINT E1$B$;
  31. 330  FOR A = 1 TO 20:L2 =  PEEK( -16384): IF L2 >127  THEN A = 20
  32. 340  NEXT :L1 =   NOT L1: IF L2 <128  THEN 300
  33. 350 E2$ =  CHR$(L2 -128): POKE  -16368,0: PRINT E1$B$;: ON (L2 >159  AND L2 <255) GOTO 380
  34. 360 E = 0: FOR A = 1 TO  LEN(EC$): IF E2$ =  MID$ (EC$,A,1)  THEN E = A:A =  LEN(EC$)
  35. 370  NEXT : ON E GOTO 430,430,450,500,470,470,500,510,530: GOTO 280
  36. 380  IF P >1  AND P < =  LEN(E$)  THEN E$ =  LEFT$(E$,P -1) +E2$ + MID$ (E$,P +(  NOT IM))
  37. 390  IF P = 1  THEN E$ = E2$ + MID$ (E$,P +(  NOT IM)): IF  RIGHT$(E$,1) = " "  THEN E$ =  LEFT$(E$, LEN(E$) -1)
  38. 400  IF P > LEN(E$)  THEN E$ = E$ +E2$
  39. 410  PRINT  MID$ (E$,P);: IF P < LEN(E$)  THEN  PRINT  LEFT$(BB$, LEN(E$) -P);
  40. 420 P = P +(P < = L): GOTO 280
  41. 430  IF E = 1  AND P >1  THEN  PRINT E2$;:P = P -1: GOTO 280
  42. 440  IF E = 2  AND P < =  LEN(E$)  THEN  PRINT E1$;:P = P +1: GOTO 280
  43. 450 IM =   NOT IM: GOTO 280
  44. 460  PRINT  LEFT$(BB$,P -1);: GOTO 260
  45. 470  ON P = 1 GOTO 280:E2$ = "": IF P >2  THEN E2$ =  LEFT$(E$,P -2)
  46. 480 E$ = E2$ + MID$ (E$,P):P = P -1: PRINT B$ MID$ (E$,P)" ";B$;: IF P < LEN(E$)  THEN  PRINT  LEFT$(BB$, LEN(E$) -P +1);
  47. 490  GOTO 280
  48. 500  PRINT  LEFT$(BB$,P -1 +(P = 1));: ON P >1 GOTO 260:ES = 1: RETURN 
  49. 510 T$ = E$: IF P >1  THEN  PRINT  LEFT$(BB$,P -1);
  50. 520  PRINT T$;: RETURN 
  51. 530  ON P > LEN(E$) GOTO 280:A =  LEN(E$) -P +1: PRINT  LEFT$(CL$,A); LEFT$(BB$,A);: IF P = 1  THEN E$ = " ": GOTO 280
  52. 540 E$ =  LEFT$(E$,P -1): GOTO 280
  53. 550  REM    EXECUTE DOS COMMAND
  54. 560 T$ =  MID$ (T$,2): IF  LEFT$(T$,1) = " "  THEN T$ =  MID$ (T$,2)
  55. 570  ONERR  GOTO 610
  56. 580  POKE 34, PEEK(34) +2: HOME : PRINT D$T$: IF T$ = "PREFIX"  THEN  INPUT "";T$: PRINT T$
  57. 590  PRINT "Press Return to continue. ";: GET T$: POKE 34, PEEK(34) -2: POKE 216,0: ONERR  GOTO 670
  58. 600  RETURN 
  59. 610  PRINT  CHR$(7);PM$( PEEK(222)): PRINT D$C$: POKE 216,0: CALL  -3288: GOTO 590
  60. 620  REM    DISPLAY INPUT EXAMPLES
  61. 630  VTAB 11: PRINT "Example entries:": PRINT : PRINT "MYFILE": PRINT "/MYDISK/MYFILE": PRINT "MYFILE,S6,D2": PRINT 
  62. 640  PRINT "*CATALOG (See current directory)": PRINT "*CAT,D2 (See directory for drive 2)": PRINT "*PREFIX (See current prefix)": PRINT "*PREFIX,D2 (Set prefix to drive 2)"
  63. 650  PRINT  CHR$(25): RETURN 
  64. 660  REM    ERROR HANDLER
  65. 670  PRINT  CHR$(4)"CLOSE": IF  PEEK(222) >21  OR  PEEK(222) = 16  THEN  PRINT "ERROR # " PEEK(222)" IN LINE " PEEK(218) +256 * PEEK(219): GOTO 240
  66. 680 ER =  PEEK(222): POKE 216,0: CALL  -3288: ONERR  GOTO 670
  67. 690  IF EF = 0  THEN  HOME : PRINT "Unable to load program files.": PRINT : PRINT "The following files must all": PRINT "be in the same directory:": PRINT "NIBBLE.ASM": PRINT "NIBBLE.ASM2": PRINT "NIBBLE.ASM.ML"; CHR$(7): END 
  68. 700  PRINT : PRINT PM$(ER): PRINT 
  69. 710  IF EF = 2  THEN  PRINT "Place disk with "PF$"NIBBLE.ASM2 in drive and press <RET>": PRINT "or press <SPACE> to abort program";: GET T$: ON (T$ =  CHR$(13)) GOTO 220
  70. 720  POKE 216,0: GOTO 240
  71. 730  REM   SIMPLE VARIABLE DEFINITIONS
  72. 740 Z = 0:L = 0:A = 0:L1 = 0:L2 = 0:H = 0:GM = 0:A1 = 0:P = 0:T$ = "":E$ = "":CM = 0
  73. 750 PN = 0:LM = 0:LR = 0:PC = 0:ER = 0:AM = 0:LC = 0:BL = 0:CC = 0:CV = 0:MB = 0:GS = 0:BA = 0:SN = 0:TL = 0:PP = 0:EF = 0:E = 0
  74. 760 BF$ = "":IM = 0:ES = 0:SF$ = "":F$ = "":E1$ = "":E2$ = "":CD = 0:ET = 0:HC = 0
  75. 770 BS = ( PEEK(1014) +256 * PEEK(1015)) -512:BP = BS
  76. 780 EC$ =  CHR$(8) + CHR$(21) + CHR$(9) + CHR$(12) + CHR$(4) + CHR$(127) + CHR$(27) + CHR$(13) + CHR$(25)
  77. 790 B$ =  CHR$(8): FOR L = 1 TO 80:BB$ = BB$ +B$:CL$ = CL$ + CHR$(32): NEXT 
  78. 800  REM  DEFINE STRING CONSTANTS FOR PRODOS
  79. 810 D$ =  CHR$(4):Q$ = "OPEN":R$ = "READ":W$ = "WRITE":C$ = "CLOSE"
  80. 820 H$ = "/RAM/ASM.TEMP":PF$ = "":LX = 1500
  81. 830  DIM PL$(3),AG$(2),AG(2),GL$(LX),GA(LX)
  82. 840  DIM MN$(92),SC%(31),BC%(13),MC%(25,11): REM     OPCODES & MNEMONICS 
  83. 850  DIM NL(3):NL(0) = 8:NL(1) = 3:NL(2) = 10:NL(3) = 0
  84. 860  DIM CI%(92): FOR L = 0 TO 92: READ CI%(L): NEXT 
  85. 870  DATA  0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  86. 880  DATA  1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2
  87. 890  DATA  2,2,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
  88. 900  DATA  5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7
  89. 910  DATA  8,8,9,9,10,11,11,12,13
  90. 920  DIM EM$(8)
  91. 930 EM$(1) = "Bad operand "
  92. 940 EM$(2) = "Value over / under range "
  93. 950 EM$(3) = "Duplicate Global label "
  94. 960 EM$(4) = "Local label overrange "
  95. 970 EM$(5) = "Bad opcode "
  96. 980 EM$(6) = "Branch overrange "
  97. 990 EM$(7) = "Bad address mode "
  98. 1000 EM$(8) = "Undefined label "
  99. 1010  REM  Time to set up data tables
  100. 1020  FOR L = 1 TO 92: READ MN$(L): NEXT 
  101. 1030  DATA  "INA","INX","INY","DEA","DEX","DEY","RTS","RTI","CLC"
  102. 1040  DATA  "CLD","CLI","CLV","SEC","SED","SEI","TAX","TAY","TSX"
  103. 1050  DATA  "TXA","TXS","TYA","PHA","PHP","PHX","PHY","PLA","PLP"
  104. 1060  DATA  "PLX","PLY","BRK","NOP","BCC","BCS","BEQ","BNE","BMI"
  105. 1070  DATA  "BPL","BRA","BVC","BVS","BLT","BGE","BFL","BTR","JSR"
  106. 1080  DATA  "JMP","ASL","LSR","ROL","ROR","LDA","LDX","LDY","STA"
  107. 1090  DATA  "STX","STY","STZ","ADC","AND","BIT","CMP","CPX","CPY"
  108. 1100  DATA  "DEC","EOR","XOR","INC","ORA","SBC","TRB","TSB","STR"
  109. 1110  DATA  "ASC","DCI","INV","FLS","REV","BYT","HBY","DDB","DBY"
  110. 1120  DATA  "DW","ADR","DFB","HEX","DS","DFS","MSB","EQU","="
  111. 1130  DATA  "ORG","CHN"
  112. 1140  FOR L = 1 TO 31: READ SC%(L): NEXT : REM  SINGLE OPCODES
  113. 1150  DATA  26,232,200,58,202,136,96,64,24,216
  114. 1160  DATA   88,184,56,248,120,170,168,186,138,154 
  115. 1170  DATA  152,72,8,218,90,104,40,250,122,0,234
  116. 1180  FOR L = 1 TO 13: READ BC%(L): NEXT : REM  BRANCH OPCODES
  117. 1190  DATA  144,176,240,208,48,16,128,80,112
  118. 1200  DATA  144,176,240,208
  119. 1210  FOR L = 1 TO 25: FOR L1 = 1 TO 11: READ MC%(L,L1): NEXT : NEXT 
  120. 1220  DATA  10,0,0,0,0,6,22,0,14,30,0
  121. 1230  DATA  74,0,0,0,0,70,86,0,78,94,0
  122. 1240  DATA  42,0,0,0,0,38,54,0,46,62,0
  123. 1250  DATA  106,0,0,0,0,102,118,0,110,126,0
  124. 1260  DATA  0,169,178,161,177,165,181,0,173,189,185
  125. 1270  DATA  0,162,0,0,0,166,0,182,174,0,190
  126. 1280  DATA  0,160,0,0,0,164,180,0,172,188,0
  127. 1290  DATA  0,0,146,129,145,133,149,0,141,157,153
  128. 1300  DATA  0,0,0,0,0,134,0,150,142,0,0
  129. 1310  DATA  0,0,0,0,0,132,148,0,140,0,0
  130. 1320  DATA  0,0,0,0,0,100,116,0,156,158,0
  131. 1330  DATA  0,105,114,97,113,101,117,0,109,125,121
  132. 1340  DATA  0,41,50,33,49,37,53,0,45,61,57
  133. 1350  DATA  0,137,210,0,0,36,52,0,44,60,0
  134. 1360  DATA  0,201,0,193,209,197,213,0,205,221,217
  135. 1370  DATA   0,224,0,0,0,228,0,0,236,0,0
  136. 1380  DATA   0,192,0,0,0,196,0,0,204,0,0
  137. 1390  DATA  0,0,0,0,0,198,214,0,206,222,0
  138. 1400  DATA  0,73,82,65,81,69,85,0,77,93,89
  139. 1410  DATA  0,73,82,65,81,69,85,0,77,93,89
  140. 1420  DATA  0,0,0,0,0,230,246,0,238,254,0
  141. 1430  DATA  0,9,18,1,17,5,21,0,13,29,25
  142. 1440  DATA  0,233,242,225,241,229,245,0,237,253,249
  143. 1450  DATA  0,0,0,0,0,20,0,0,28,0,0
  144. 1460  DATA  0,0,0,0,0,4,0,0,12,0,0
  145. 1470  DIM PM$(21)
  146. 1480 PM$(0) = "UNDEFINED ERROR"
  147. 1490 PM$(1) = PM$(0)
  148. 1500 PM$(2) = "RANGE ERROR"
  149. 1510 PM$(3) = "NO DEVICE CONNECTED"
  150. 1520 PM$(4) = "WRITE PROTECTED"
  151. 1530 PM$(5) = "END OF DATA"
  152. 1540 PM$(6) = "PATH NOT FOUND"
  153. 1550 PM$(7) = PM$(6)
  154. 1560 PM$(8) = "I/O ERROR"
  155. 1570 PM$(9) = "DISK FULL"
  156. 1580 PM$(10) = "FILE LOCKED"
  157. 1590 PM$(11) = "INVALID OPTION"
  158. 1600 PM$(12) = "NO BUFFERS AVAILABLE"
  159. 1610 PM$(13) = "FILE TYPE MISMATCH"
  160. 1620 PM$(14) = "PROGRAM TOO LARGE"
  161. 1630 PM$(15) = "NOT DIRECT COMMAND"
  162. 1640 PM$(16) = "SYNTAX ERROR"
  163. 1650 PM$(17) = "DIRECTORY FULL"
  164. 1660 PM$(18) = "FILE NOT OPEN"
  165. 1670 PM$(19) = "DUPLICATE FILE NAME"
  166. 1680 PM$(20) = "FILE BUSY"
  167. 1690 PM$(21) = "FILE(S) STILL OPEN"
  168. 1700  RETURN 
  169. 1710  PRINT : PRINT "THE FILE "T$" IS INVALID. PRESS RETURN AND TRY AGAIN";: GET XX$: PRINT XX$: GOTO 130
  170. 1720  POKE 768,169: POKE 769,0: POKE 770,141: POKE 771,0: POKE 772,3: POKE 773,56: POKE 774,32: POKE 775,31: POKE 776,254: POKE 777,144: POKE 778,1: POKE 779,96: POKE 780,169: POKE 781,1: POKE 782,141: POKE 783,0: POKE 784,3: POKE 785,96
  171. 1730  CALL 768: IF  PEEK(768) = 1  THEN  PRINT  CHR$(4)"PR#3": RETURN 
  172. 1740  IF  PEEK(768) = 0  THEN QZ =  PEEK(64435) + PEEK(64448)
  173. 1750  IF QZ >240  THEN  PRINT  CHR$(21): RETURN 
  174. 1760  IF QZ < = 229  THEN  PRINT  CHR$(4)"PR#3": RETURN 
  175. 1770  RETURN