home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Go64!
/
Go64_1999-04_1999_CSW_Side_A.d64
/
cheap.docs
< prev
next >
Wrap
Text File
|
2023-02-26
|
9KB
|
341 lines
eL cHEAPO aSSEMBLER
BY
s.l jUDD 12/98
wELL, THE scpu IS NEARING ITS THIRD BIRTHDAY, AND YET IN ALL THIS
TIME AN ASSEMBLER HAS NEVER BEEN WRITTEN. hENCE THIS PROGRAM.
eL cHEAPO aSSEMBLER -- OR cHEAPaSS, IF YOU LIKE -- IS NOT THE FANCIEST
ASSEMBLER IN THE WORLD. iT'S PURPOSE IS TO WORK, AND BE PRACTICAL. iT ALSO
HAS A NUMBER OF USEFUL FEATURES, INCLUDING LOCAL VARIABLES, AN INTEGRATED
EDITOR AND MONITOR, USEFUL PSEUDO-OPCODES, AND A FEW OTHER NIFTY THINGS.
aND MOST IMPORTANTLY, IT KNOWS 65816 OPCODES. iN FACT, IT REQUIRES A scpu
TO WORK PROPERLY.
nOTE THAT eL cHEAPO IS A WORK IN PROGRESS -- NEWER FEATURES WILL
UNDOUBTABLY APPEAR DOWN THE ROAD. tHE FIRST VERSION WAS WRITTEN IN A
SHORT FLURRY OF PROGRAMMING, SO SAVE THAT SOURCE CODE OFTEN!
sO IN THE SPIRIT OF A HASTILY SLAPPED-TOGETHER PROGRAM, HERE ARE
SOME HASTILY SLAPPED-TOGETHER DOCS.
bOOT PROGRAM
------------
tHE BOOT PROGRAM LOADS AN ml MONITOR TO $8800, POKES THE INIT ADDRESS
TO $0334/$0335, AND THEN LOADS THE MAIN PROGRAM. tHE PROGRAM USES
THE $0334 VECTOR TO ENTER THE MONITOR, SO YOU CAN USE ANY MONITOR
YOU WANT.
tHE PROGRAM ALSO pokeS THE SWAP BANK -- CHANGE THIS TO USE A BANK
OTHER THAN BANK 1 IF YOU HAVE sUPERram (BANK 1 IS USED FOR LOTS
OF SYSTEM THINGS, WHICH YOU MAY LOSE).
tHE EDITOR
----------
tHE EDITOR'S NAME IS ned. hELLO ned.
ned IS A 240-COLUMN EDITOR WHICH HAS BEEN UPDATED FOR WRITING ASSEMBLY CODE.
tHE TEXT IS AUTOMATICALLY FORMATTED INTO LABEL/OPCODE/ARGUMENT/COMMENT
COLUMNS. ned ALSO FEATURES CUT AND PASTE, AND SOME DECENT NAVIGATIONAL
AIDS.
SHIFT-RETURN - iNSERT A NEW LINE
CURSOR KEYS, RETURN - wHAT YOU WOULD EXPECT
INSERT, DELETE - lIKEWISE
SHIFT-CLEAR - cLEAR ALL TEXT
HOME - mOVE TO TOP OF FILE
r/s - tAB (NOT NEEDED)
f1 - aSSEMBLE
f2 - eXIT TO ml MONITOR
f7 - dISK MENU
ctrl-A - dELETE CHARACTERS TO RIGHT OF CURSOR
-D - dELETE LINE
-B/N - mOVE TO BEGINNING/END OF LINE
-C/X - cOPY/CUT LINES TO CLIPBOARD
-P - pASTE LINE FROM CLIPBOARD
-J/K - mOVE 40 COLUMNS LEFT/RIGHT (MAX 240 COLUMNS)
-I/M - mOVE 25 ROWS UP/DOWN
-G - gOTO LINE #
-Z - rEFORMAT ALL TEXT (CONVERT SOURCE)
- <- - eXIT TO basic (sys 822 TO RE-ENTER)
tHE ASSEMBLER
-------------
lINES OF CODE ARE STRUCTURED AS FOLLOWS:
LABELOPCODEARGUMENTCOMMENT
eACH FIELD MUST BE SEPARATED BY AT LEAST ONE SPACE, WITH THE EXCEPTION OF
COMMENTS, WHICH MAY BEGIN AT ANY COLUMN.
wHILE ASSEMBLING, run/stop WILL HALT ASSEMBLY AND <- (BACKARROW) WILL
TOGGLE THE SCREEN OUTPUT.
tHE ASSEMBLER IS CASE INSENSITIVE, BOTH FOR LABELS AND OPCODES.
tHUS LDA lda LdA ARE EQUIVALENT, AS WOULD BE LABELS SUCH AS
WAREZ AND WaReZ.
* cOMMENTS
;THIS IS A COMMENT
* tHIS IS ALSO A COMMENT, PROVIDED THE * IS IN COLUMN 1
* oPCODES
aLL THE 65816 OPCODES ARE SUPPORTED, AND ALTERNATE MNEMONICS
ARE PROVIDED FOR THE FOLLOWING COMMANDS:
bccblt
bcsbge
dec adea
inc aina
jsrjsl (lONG jsr)
jmpjml (fORCE LONG jmp)
mOREOVER, brk AND cop ARE IN PRINCIPLE TWO-BYTE INSTRUCTIONS, SO THEY
CAN INCLUDE AN OPTIONAL ARGUMENT, I.E. brk ASSEMBLES AS 00, BUT
brk $02 ASSEMBLES AS 00 02.
* aDDRESSING MODES
aLL OF THE 65816 MODES ARE SUPPORTED. aRGUMENTS MAY BE
- nUMBERS: lda 100
lda $64
lda %01100100
- lABELS:jsr chrout
- cHARACTERS: lda #'A'
lda #"A"
- pc:lda $d011
bpl *-3
sIMPLE MATHEMATICAL OPERATIONS ARE SUPPORTED -- CURRENTLY JUST ADDITION
AND SUBTRACTION (BUT MULTIPLICATION AND DIVISION ARE A CINCH AND JUST
A MATTER OF ME ADDING THEM IN). tHUS ARGUMENTS LIKE chrout+$20-*
ARE PERFECTLY VALID.
* lABELS
lABELS ARE COMPOSED OF LETTERS AND NUMBERS. lABELS MUST START WITH
A COLON OR A LETTER. lABELS MAY BE ANY LENGTH (ALTHOUGH SHORTER LENGTHS
SAVE MEMORY, AND LENGTHS GREATER THAN EIGHT CHARS WILL PRODUCE MESSY PROGRAM
LISTINGS).
lABELS BEGINNING WITH A COLON ARE _LOCAL_ LABELS -- THEIR SCOPE ONLY
EXTENDS TO THE NEXT GLOBAL VARIABLE (THINK OF THEM AS BEING 'ATTACHED'
TO THE LAST GLOBAL VARIABLE). eXAMPLE:
global1
ldx #$20
:l1jsr chrout
dex
bne :l1;bACKWARDS BRANCH
global2
cmp #$80
bcs :l1;fORWARDS BRANCH
and #$7f
:l1
tHUS LOCAL LABELS ARE REUSABLE LABELS. pRETTY COOL, EH?
* pREFIXES
tHE STANDARD 65816 PREFIXES ARE SUPPORTED. tHESE ARE < ^ > FOR #IMMEDIATE
MODE, AND < ! > FOR ABSOLUTE ADDRESSES. iMMEDIATE-MODE PREFIXES
SPECIFY WHICH PART OF THE BYTE TO USE:
oPERAND oNE-BYTE RESULT tWO-BYTE RESULT
#$010203040404 03
#<$010203040404 03
#>$010203040303 02
#^$010203040202 01
iT SHOULD BE NOTED THAT, CURRENTLY, eL cHEAPO aSSEMBLER ONLY SUPPORTS
24-BIT NUMBERS, NOT 32-BITS AS THE ABOVE INDICATES (COMING LATER!).
aDDRESS PREFIXES SPECIFY THE LENGTH OF THE ADDRESS:
<oNE BYTE (DIRECT A.K.A. ZERO PAGE)
!tWO BYTES (ABSOLUTE)
>tHREE BYTES (ABS LONG)
tHUS lda $0203 AND lda !$010203 ARE EQUIVALENT. nOTE THAT THIS IS
PERHAPS THE ONLY WAY TO FORCE LONG ADDRESSING IN BANK ZERO
(lda $000102 WILL ASSEMBLE TO lda $0102).
* pSEUDO-oPCODES
sEVERAL USEFUL PSEUDO-OPCODES ARE SUPPORTED.
org ADDRESSALTERNATE SYNTAX: *= ADDRESS
org*
org SETS THE PROGRAM orIgIN TO ADDRESS, AND IS THUS THE FIRST
LINE OF MOST PROGRAMS. fOR EXAMPLE, org $c000 ASSEMBLES THE
PROGRAM TO $c000. sUBSEQUENT org DIRECTIVES MAY BE SPECIFIED
CHANGE THE ADDRESS AGAIN -- THIS IS USEFUL WHEN YOU HAVE
A SECTION OF CODE TO COPY TO ANOTHER AREA OF MEMORY. fINALLY,
org WITHOUT ANY ARGUMENT PERFORMS A RE-org, THAT IS, RESETS
THE PROGRAM COUNTER TO ITS PROPER VALUE. fOR EXAMPLE:
org $0801
... BASIC HEADER HERE
ldx #end-start
:looplda start-1,x
sta $c000,x
dex
bne :loop
rts
start
org $c000;aSSEMBLE BELOW CODE AS IF TO $c000
l1 jsr chrout
jmp l1;jmp $c000
org;rE-org
end
equ OR =
equATE A LABEL TO SOME VALUE. eXAMPLES:
chrout = $ffd2
zero equ 0
--- sTORAGE OPCODES ---
dfb OR db
dEfINE bYTE -- OUTPUT BYTES DIRECTLY INTO CODE. eXAMPLES:
dfb $20
dfb 100,$64,%1100100
nOTE SEPARATING COMMAS
da OR dw
dEFINE aDDRESS -- ASSEMBLES 16-BIT ADDRESS IN LO/HI ORDER:
da $ffd2 ;ASSEMBLES AS d2 ff
da $0801,$ffd2;ASSEMBLES AS 01 08 d2 ff
dla
dEFINE lONG aDDRESS -- LIKE da, BUT 24-BIT
hex
dEFINE HEX BYTES. nO COMMA SEPARATORS ARE USED AND EACH
BYTE IS TWO CHARACTERS
hex 20d2ff;aSSEMBLES AS 20 d2 ff
ds AND ds ^
dEFINE STORAGE -- FILL MEMORY WITH SPECIFIED NUMBER OF BYTES.
ds ^ FILLS TO THE END OF THE PAGE.
ds 5;aSSEMBLES AS 00 00 00 00 00
ds 5,$3d;aSSEMBLES AS 3d 3d 3d 3d 3d
ds ^;fILLS MEMORY WITH ZEROS TO END OF PAGE
ds ^,$3d;fILLS MEMORY WITH 3d TO END OF PAGE
txt
aSSEMBLE TEXT. tEXT IS DELIMITED USING EITHER ' OR ".
cURRENTLY THE TWO FUNCTION THE SAME, BUT THIS MAY CHANGE IN
THE FUTURE. tHE PURPOSE OF HAVING TWO DELIMITERS IS SO THAT
THE OTHER MAY BE EMBEDDED INTO THE STRING. eXAMPLES:
txt 'hELLO'
txt "i SAID, 'hELLO'"
txt 'BOO!',0D,0D,00
hEX BYTES, SEPARATED BY COMMAS, MAY FOLLOW THE STRING.
--- cONDITIONAL aSSEMBLY ---
do ARG
iF ARG=0 THEN ASSEMBLY IS HALTED, UNTIL AN else OR fin CONDITION
IS REACHED. eXAMPLES:
do 0;dON'T ASSEMBLE
do debug;dON'T ASSEMBLE IF debug=0
do *-$c000;dON'T ASSEMBLE IF *=$c000
else
rEVERSE THE LAST do CONDITION.
fin
eND do/else CONSTRUCTS. aLL do'S SHOULD END WITH A fin.
--- dISK i/o ---
put 'FILENAME'
put CURRENTLY DOESN'T WORK, SO DON'T USE IT!
--- 16-BIT SUPPORT ---
reg reg on reg off
tHE 65816 USES THE SAME OPCODE FOR lda #$12 AND lda #$1234 -- SHOULD
THE ASSEMBLER ASSUME 8 OR 16 BITS? iN THE CODE THIS IS DETERMINED BY
THE SETTINGS OF THE m AND x FLAGS, SO NORMALLY eL cHEAPO TRACKS THESE
FLAGS BY REMEMBERING ANY CHANGES MADE BY rep OR sep. reg off TURNS OFF
THIS FEATURE; reg on TURNS IT BACK ON. reg #$30 WILL SET THE REGISTER
BITS TO #$30 -- reg ACTS LIKE lda, not LIKE rep OR sep.
jAMAICAmON
----------
jAMAICAmon -- OR jAMMON, FOR SHORT -- IS A FULL-FEATURED ml
MONITOR FOR THE scpu. pLEASE SEE THE INCLUDED DOC FILE FOR MORE INFO.
tHE ONLY DIFFERENCE IS THAT 'X' EXITS BACK TO THE EDITOR.
mEMORY mAP
----------
$0334/$0335ml MONITOR VECTOR
$0336jmp TO EDITOR
$0800-sOURCE CODE
$8800-$9900jAMMON
$9a00-$bfffcHEAPaSS
$c000-$fffflABEL/VARIABLE TABLE (TEMPORARY)
cODE IS ASSEMBLED TO THE SWAP BANK, SO IT CAN BE QUITE LARGE. wHEN THE
PROGRAM EXITS TO THE MONITOR, BANKS ZERO AND THE SWAP BANK ARE SWAPPED --
SO THE SOURCE IS NOW IN THE SWAP BANK AND THE BINARY IS IN BANK 0 -- AND
THE BINARY IS TRANSLATED TO ITS SPECIFIED STARTING ADDRESS, BEFORE ENTERING
THE MONITOR.
tHUS, IF YOU CRASH THE MACHINE, AND SUDDENLY REALIZE YOU DIDN'T
SAVE THE LAST THREE HOURS OF CODING -- WELL, DON'T LOSE HEART JUST
YET. iNSTEAD, ENTER THE MONITOR (E.G. sys $8800) AND LOOK THROUGH
MEMORY FOR THE TEXT -- IN PARTICULAR, LOOK THROUGH THE SWAP BANK. yOU
CAN THEN TRANSFER TO BANK 0 AND SAVE (OR IF YOU HAVE pEEKpOKEpATCH
YOU CAN SAVE FROM THE SWAP BANK DIRECTLY).
bY GOLLY
--------
bY GOLLY, THAT'S ALL i CAN THINK OF FOR NOW!