home *** CD-ROM | disk | FTP | other *** search
/ Go64! / Go64_1999-04_1999_CSW_Side_A.d64 / cheap.docs < prev    next >
Text File  |  2023-02-26  |  9KB  |  341 lines

  1.  
  2.  
  3.      eL cHEAPO aSSEMBLER
  4.  
  5.      BY
  6. s.l jUDD 12/98
  7.  
  8.  
  9. wELL, THE scpu IS NEARING ITS THIRD BIRTHDAY, AND YET IN ALL THIS
  10. TIME AN ASSEMBLER HAS NEVER BEEN WRITTEN.  hENCE THIS PROGRAM.
  11. eL cHEAPO aSSEMBLER -- OR cHEAPaSS, IF YOU LIKE -- IS NOT THE FANCIEST 
  12. ASSEMBLER IN THE WORLD.  iT'S PURPOSE IS TO WORK, AND BE PRACTICAL.  iT ALSO 
  13. HAS A NUMBER OF USEFUL FEATURES, INCLUDING LOCAL VARIABLES, AN INTEGRATED 
  14. EDITOR AND MONITOR, USEFUL PSEUDO-OPCODES, AND A FEW OTHER NIFTY THINGS.  
  15. aND MOST IMPORTANTLY, IT KNOWS 65816 OPCODES.  iN FACT, IT REQUIRES A scpu 
  16. TO WORK PROPERLY.
  17.  
  18. nOTE THAT eL cHEAPO IS A WORK IN PROGRESS -- NEWER FEATURES WILL
  19. UNDOUBTABLY APPEAR DOWN THE ROAD.  tHE FIRST VERSION WAS WRITTEN IN A
  20. SHORT FLURRY OF PROGRAMMING, SO SAVE THAT SOURCE CODE OFTEN!
  21.  
  22. sO IN THE SPIRIT OF A HASTILY SLAPPED-TOGETHER PROGRAM, HERE ARE
  23. SOME HASTILY SLAPPED-TOGETHER DOCS.
  24.  
  25.  
  26. bOOT PROGRAM
  27. ------------
  28.  
  29. tHE BOOT PROGRAM LOADS AN ml MONITOR TO $8800, POKES THE INIT ADDRESS
  30. TO $0334/$0335, AND THEN LOADS THE MAIN PROGRAM.  tHE PROGRAM USES
  31. THE $0334 VECTOR TO ENTER THE MONITOR, SO YOU CAN USE ANY MONITOR
  32. YOU WANT.
  33.  
  34. tHE PROGRAM ALSO pokeS THE SWAP BANK -- CHANGE THIS TO USE A BANK
  35. OTHER THAN BANK 1 IF YOU HAVE sUPERram (BANK 1 IS USED FOR LOTS
  36. OF SYSTEM THINGS, WHICH YOU MAY LOSE).
  37.  
  38.  
  39. tHE EDITOR
  40. ----------
  41.  
  42. tHE EDITOR'S NAME IS ned.  hELLO ned.
  43.  
  44. ned IS A 240-COLUMN EDITOR WHICH HAS BEEN UPDATED FOR WRITING ASSEMBLY CODE.
  45. tHE TEXT IS AUTOMATICALLY FORMATTED INTO LABEL/OPCODE/ARGUMENT/COMMENT
  46. COLUMNS.  ned ALSO FEATURES CUT AND PASTE, AND SOME DECENT NAVIGATIONAL
  47. AIDS.
  48.  
  49. SHIFT-RETURN        - iNSERT A NEW LINE
  50. CURSOR KEYS, RETURN - wHAT YOU WOULD EXPECT
  51. INSERT, DELETE      - lIKEWISE
  52. SHIFT-CLEAR         - cLEAR ALL TEXT
  53. HOME                - mOVE TO TOP OF FILE
  54. r/s    - tAB (NOT NEEDED)
  55. f1    - aSSEMBLE
  56. f2    - eXIT TO ml MONITOR
  57. f7                  - dISK MENU
  58.  
  59. ctrl-A    - dELETE CHARACTERS TO RIGHT OF CURSOR
  60.     -D    - dELETE LINE
  61.     -B/N  - mOVE TO BEGINNING/END OF LINE
  62.     -C/X  - cOPY/CUT LINES TO CLIPBOARD
  63.     -P    - pASTE LINE FROM CLIPBOARD
  64.     -J/K  - mOVE 40 COLUMNS LEFT/RIGHT (MAX 240 COLUMNS)
  65.     -I/M  - mOVE 25 ROWS UP/DOWN
  66.     -G    - gOTO LINE #
  67.     -Z    - rEFORMAT ALL TEXT (CONVERT SOURCE)
  68.     - <-  - eXIT TO basic (sys 822 TO RE-ENTER)
  69.  
  70.  
  71. tHE ASSEMBLER
  72. -------------
  73.  
  74. lINES OF CODE ARE STRUCTURED AS FOLLOWS:
  75.  
  76. LABELOPCODEARGUMENTCOMMENT
  77.  
  78. eACH FIELD MUST BE SEPARATED BY AT LEAST ONE SPACE, WITH THE EXCEPTION OF
  79. COMMENTS, WHICH MAY BEGIN AT ANY COLUMN.
  80.  
  81. wHILE ASSEMBLING, run/stop WILL HALT ASSEMBLY AND <- (BACKARROW) WILL
  82. TOGGLE THE SCREEN OUTPUT.
  83.  
  84. tHE ASSEMBLER IS CASE INSENSITIVE, BOTH FOR LABELS AND OPCODES.
  85. tHUS LDA lda LdA ARE EQUIVALENT, AS WOULD BE LABELS SUCH AS
  86. WAREZ AND WaReZ.
  87.  
  88. * cOMMENTS
  89.  
  90. ;THIS IS A COMMENT
  91. * tHIS IS ALSO A COMMENT, PROVIDED THE * IS IN COLUMN 1
  92.  
  93. * oPCODES
  94.  
  95. aLL THE 65816 OPCODES ARE SUPPORTED, AND ALTERNATE MNEMONICS
  96. ARE PROVIDED FOR THE FOLLOWING COMMANDS:
  97.  
  98. bccblt
  99. bcsbge
  100. dec adea
  101. inc aina
  102. jsrjsl  (lONG jsr)
  103. jmpjml  (fORCE LONG jmp)
  104.  
  105. mOREOVER, brk AND cop ARE IN PRINCIPLE TWO-BYTE INSTRUCTIONS, SO THEY
  106. CAN INCLUDE AN OPTIONAL ARGUMENT, I.E.  brk ASSEMBLES AS 00, BUT
  107. brk $02 ASSEMBLES AS 00 02.
  108.  
  109. * aDDRESSING MODES
  110.  
  111. aLL OF THE 65816 MODES ARE SUPPORTED.  aRGUMENTS MAY BE
  112.  
  113. - nUMBERS: lda 100
  114. lda $64
  115. lda %01100100
  116.  
  117. - lABELS:jsr chrout
  118.  
  119. - cHARACTERS: lda #'A'
  120. lda #"A"
  121.  
  122. - pc:lda $d011
  123. bpl *-3
  124.  
  125. sIMPLE MATHEMATICAL OPERATIONS ARE SUPPORTED -- CURRENTLY JUST ADDITION
  126. AND SUBTRACTION (BUT MULTIPLICATION AND DIVISION ARE A CINCH AND JUST
  127. A MATTER OF ME ADDING THEM IN).  tHUS ARGUMENTS LIKE chrout+$20-*
  128. ARE PERFECTLY VALID.
  129.  
  130. * lABELS
  131.  
  132. lABELS ARE COMPOSED OF LETTERS AND NUMBERS.  lABELS MUST START WITH
  133. A COLON OR A LETTER.  lABELS MAY BE ANY LENGTH (ALTHOUGH SHORTER LENGTHS 
  134. SAVE MEMORY, AND LENGTHS GREATER THAN EIGHT CHARS WILL PRODUCE MESSY PROGRAM 
  135. LISTINGS).
  136.  
  137. lABELS BEGINNING WITH A COLON ARE _LOCAL_ LABELS -- THEIR SCOPE ONLY
  138. EXTENDS TO THE NEXT GLOBAL VARIABLE (THINK OF THEM AS BEING 'ATTACHED'
  139. TO THE LAST GLOBAL VARIABLE).  eXAMPLE:
  140.  
  141. global1
  142. ldx #$20
  143. :l1jsr chrout
  144. dex
  145. bne :l1;bACKWARDS BRANCH
  146. global2
  147. cmp #$80
  148. bcs :l1;fORWARDS BRANCH
  149. and #$7f
  150. :l1
  151.  
  152. tHUS LOCAL LABELS ARE REUSABLE LABELS.  pRETTY COOL, EH?
  153.  
  154. * pREFIXES
  155.  
  156. tHE STANDARD 65816 PREFIXES ARE SUPPORTED.  tHESE ARE < ^ > FOR #IMMEDIATE
  157. MODE, AND < ! > FOR ABSOLUTE ADDRESSES.  iMMEDIATE-MODE PREFIXES
  158. SPECIFY WHICH PART OF THE BYTE TO USE:
  159.  
  160. oPERAND   oNE-BYTE RESULT  tWO-BYTE RESULT
  161.  
  162. #$010203040404 03
  163. #<$010203040404 03
  164. #>$010203040303 02
  165. #^$010203040202 01
  166.  
  167. iT SHOULD BE NOTED THAT, CURRENTLY, eL cHEAPO aSSEMBLER ONLY SUPPORTS
  168. 24-BIT NUMBERS, NOT 32-BITS AS THE ABOVE INDICATES (COMING LATER!).
  169. aDDRESS PREFIXES SPECIFY THE LENGTH OF THE ADDRESS:
  170.  
  171. <oNE BYTE (DIRECT A.K.A. ZERO PAGE)
  172. !tWO BYTES (ABSOLUTE)
  173. >tHREE BYTES (ABS LONG)
  174.  
  175. tHUS lda $0203 AND lda !$010203 ARE EQUIVALENT.  nOTE THAT THIS IS
  176. PERHAPS THE ONLY WAY TO FORCE LONG ADDRESSING IN BANK ZERO
  177. (lda $000102 WILL ASSEMBLE TO lda $0102).
  178.  
  179. * pSEUDO-oPCODES
  180.  
  181. sEVERAL USEFUL PSEUDO-OPCODES ARE SUPPORTED.
  182.  
  183. org ADDRESSALTERNATE SYNTAX: *= ADDRESS
  184. org*
  185.  
  186. org SETS THE PROGRAM orIgIN TO ADDRESS, AND IS THUS THE FIRST
  187. LINE OF MOST PROGRAMS.  fOR EXAMPLE, org $c000 ASSEMBLES THE
  188. PROGRAM TO $c000.  sUBSEQUENT org DIRECTIVES MAY BE SPECIFIED
  189. CHANGE THE ADDRESS AGAIN -- THIS IS USEFUL WHEN YOU HAVE
  190. A SECTION OF CODE TO COPY TO ANOTHER AREA OF MEMORY.  fINALLY,
  191. org WITHOUT ANY ARGUMENT PERFORMS A RE-org, THAT IS, RESETS
  192. THE PROGRAM COUNTER TO ITS PROPER VALUE.  fOR EXAMPLE:
  193.  
  194. org $0801
  195.  
  196. ... BASIC HEADER HERE
  197.  
  198. ldx #end-start
  199.   :looplda start-1,x
  200. sta $c000,x
  201. dex
  202. bne :loop
  203. rts
  204.  
  205.   start
  206. org $c000;aSSEMBLE BELOW CODE AS IF TO $c000
  207.  
  208.      l1 jsr chrout
  209. jmp l1;jmp $c000
  210.  
  211. org;rE-org
  212.   end
  213.  
  214.  
  215. equ OR =
  216.  
  217. equATE A LABEL TO SOME VALUE.  eXAMPLES:
  218.  
  219. chrout = $ffd2
  220. zero   equ 0
  221.  
  222. --- sTORAGE OPCODES ---
  223.  
  224. dfb OR db
  225.  
  226. dEfINE bYTE -- OUTPUT BYTES DIRECTLY INTO CODE.  eXAMPLES:
  227.  
  228. dfb $20
  229. dfb 100,$64,%1100100
  230.  
  231. nOTE SEPARATING COMMAS
  232.  
  233. da OR dw
  234.  
  235. dEFINE aDDRESS -- ASSEMBLES 16-BIT ADDRESS IN LO/HI ORDER:
  236.  
  237. da $ffd2 ;ASSEMBLES AS d2 ff
  238. da $0801,$ffd2;ASSEMBLES AS 01 08 d2 ff
  239.  
  240. dla
  241. dEFINE lONG aDDRESS -- LIKE da, BUT 24-BIT
  242.  
  243. hex
  244. dEFINE HEX BYTES.  nO COMMA SEPARATORS ARE USED AND EACH
  245. BYTE IS TWO CHARACTERS
  246.  
  247. hex 20d2ff;aSSEMBLES AS 20 d2 ff
  248.  
  249.  
  250. ds AND ds ^
  251. dEFINE STORAGE -- FILL MEMORY WITH SPECIFIED NUMBER OF BYTES.
  252. ds ^ FILLS TO THE END OF THE PAGE.
  253.  
  254. ds 5;aSSEMBLES AS 00 00 00 00 00
  255. ds 5,$3d;aSSEMBLES AS 3d 3d 3d 3d 3d
  256. ds ^;fILLS MEMORY WITH ZEROS TO END OF PAGE
  257. ds ^,$3d;fILLS MEMORY WITH 3d TO END OF PAGE
  258.  
  259. txt
  260. aSSEMBLE TEXT.  tEXT IS DELIMITED USING EITHER ' OR ".
  261. cURRENTLY THE TWO FUNCTION THE SAME, BUT THIS MAY CHANGE IN
  262. THE FUTURE.  tHE PURPOSE OF HAVING TWO DELIMITERS IS SO THAT
  263. THE OTHER MAY BE EMBEDDED INTO THE STRING.  eXAMPLES:
  264.  
  265. txt 'hELLO'
  266. txt "i SAID, 'hELLO'"
  267. txt 'BOO!',0D,0D,00
  268.  
  269. hEX BYTES, SEPARATED BY COMMAS, MAY FOLLOW THE STRING.
  270.  
  271. --- cONDITIONAL aSSEMBLY ---
  272.  
  273. do ARG
  274. iF ARG=0 THEN ASSEMBLY IS HALTED, UNTIL AN else OR fin CONDITION
  275. IS REACHED.  eXAMPLES:
  276.  
  277. do 0;dON'T ASSEMBLE
  278. do debug;dON'T ASSEMBLE IF debug=0
  279. do *-$c000;dON'T ASSEMBLE IF *=$c000
  280.  
  281. else
  282. rEVERSE THE LAST do CONDITION.
  283.  
  284. fin
  285. eND do/else CONSTRUCTS.  aLL do'S SHOULD END WITH A fin.
  286.  
  287. --- dISK i/o ---
  288.  
  289. put 'FILENAME'
  290.  
  291. put CURRENTLY DOESN'T WORK, SO DON'T USE IT!
  292.  
  293. --- 16-BIT SUPPORT ---
  294.  
  295. reg  reg on  reg off
  296. tHE 65816 USES THE SAME OPCODE FOR lda #$12 AND lda #$1234 -- SHOULD
  297. THE ASSEMBLER ASSUME 8 OR 16 BITS?  iN THE CODE THIS IS DETERMINED BY
  298. THE SETTINGS OF THE m AND x FLAGS, SO NORMALLY eL cHEAPO TRACKS THESE
  299. FLAGS BY REMEMBERING ANY CHANGES MADE BY rep OR sep.  reg off TURNS OFF
  300. THIS FEATURE; reg on TURNS IT BACK ON.  reg #$30 WILL SET THE REGISTER
  301. BITS TO #$30 -- reg ACTS LIKE lda, not LIKE rep OR sep.
  302.  
  303.  
  304. jAMAICAmON
  305. ----------
  306.  
  307. jAMAICAmon -- OR jAMMON, FOR SHORT -- IS A FULL-FEATURED ml
  308. MONITOR FOR THE scpu.  pLEASE SEE THE INCLUDED DOC FILE FOR MORE INFO.
  309. tHE ONLY DIFFERENCE IS THAT 'X' EXITS BACK TO THE EDITOR.
  310.  
  311.  
  312. mEMORY mAP
  313. ----------
  314.  
  315. $0334/$0335ml MONITOR VECTOR
  316. $0336jmp TO EDITOR
  317.  
  318. $0800-sOURCE CODE
  319. $8800-$9900jAMMON
  320. $9a00-$bfffcHEAPaSS
  321. $c000-$fffflABEL/VARIABLE TABLE (TEMPORARY)
  322.  
  323. cODE IS ASSEMBLED TO THE SWAP BANK, SO IT CAN BE QUITE LARGE.  wHEN THE 
  324. PROGRAM EXITS TO THE MONITOR, BANKS ZERO AND THE SWAP BANK ARE SWAPPED -- 
  325. SO THE SOURCE IS NOW IN THE SWAP BANK AND THE BINARY IS IN BANK 0 -- AND 
  326. THE BINARY IS TRANSLATED TO ITS SPECIFIED STARTING ADDRESS, BEFORE ENTERING
  327. THE MONITOR.
  328.  
  329. tHUS, IF YOU CRASH THE MACHINE, AND SUDDENLY REALIZE YOU DIDN'T
  330. SAVE THE LAST THREE HOURS OF CODING -- WELL, DON'T LOSE HEART JUST
  331. YET.  iNSTEAD, ENTER THE MONITOR (E.G. sys $8800) AND LOOK THROUGH
  332. MEMORY FOR THE TEXT -- IN PARTICULAR, LOOK THROUGH THE SWAP BANK.  yOU
  333. CAN THEN TRANSFER TO BANK 0 AND SAVE (OR IF YOU HAVE pEEKpOKEpATCH
  334. YOU CAN SAVE FROM THE SWAP BANK DIRECTLY).
  335.  
  336.  
  337. bY GOLLY
  338. --------
  339.  
  340. bY GOLLY, THAT'S ALL i CAN THINK OF FOR NOW!
  341.