home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 55
/
Amiga_Dream_55.iso
/
RISCOS
/
MAGAZINE
/
NEWS
/
PCE021.ZIP
/
Pce021
/
Src
/
cpu
/
hdr
/
addressing
next >
Wrap
Text File
|
1997-09-20
|
5KB
|
276 lines
; addressing.hdr
; --------------
; Macros for Hu6280 addressing modes
; Requires macros from memory.hdr
GBLS mr1
GBLS mr2
GBLS mw1
GBLS mw2
GBLS mm_adr
GBLS mm_val
; Reading from memory
; -------------------
; immediate, eg LDA #&ff
MACRO
mr_im $mr_data
read_byte_fast $mr_data
MEND
; absolute, eg CMP &1900
MACRO
mr_ab $mr_data
NEW mr1
read_word_fast $mr1
IGNORE mr1
read_byte $mr_data, $mr1
DELETE mr1
MEND
; zero page, eg CPY &80
MACRO
mr_zp $mr_data
NEW mr1
read_byte_fast $mr1
read_byte_zp $mr_data, $mr1
DELETE mr1
MEND
; absolute + X, eg LDA &2800, X
MACRO
mr_ax $mr_data
NEW mr1
read_word_fast $mr1
add $mr1, $mr1, r_x, lsr #8
IGNORE mr1
read_byte $mr_data, $mr1
DELETE mr1
MEND
; absolute + Y, eg ADC table, Y
MACRO
mr_ay $mr_data
NEW mr1
read_word_fast $mr1
add $mr1, $mr1, r_y, lsr #8
IGNORE mr1
read_byte $mr_data, $mr1
DELETE mr1
MEND
; zero page + X, eg LSR &80, X
MACRO
mr_zx $mr_data
NEW mr1
read_byte_fast $mr1
add $mr1, $mr1, r_x
read_byte_zp $mr_data, $mr1
DELETE mr1
MEND
; zero page + Y, eg LDX &72, Y
; this is a special case that applies to LDX only
MACRO
mr_zy $mr_data
NEW mr1
read_byte_fast $mr1
add $mr1, $mr1, r_y
read_byte_zp $mr_data, $mr1
DELETE mr1
MEND
; indirect addressing, eg LDA (&80)
MACRO
mr_in $mr_data
NEW mr1
read_byte_fast $mr1
NEW mr2
read_word_zp $mr2, $mr1
DELETE mr1
IGNORE mr2
read_byte $mr_data, $mr2
DELETE mr2
MEND
; pre-indexed indirect addressing, eg LDA (&80, X)
MACRO
mr_ix $mr_data
NEW mr1
read_byte_fast $mr1
add $mr1, $mr1, r_x
NEW mr2
read_word_zp $mr2, $mr1
DELETE mr1
IGNORE mr2
read_byte $mr_data, $mr2
DELETE mr2
MEND
; post-indexed indirect addressing, eg LDA (&80, Y)
MACRO
mr_iy $mr_data
NEW mr1
read_byte_fast $mr1
NEW mr2
read_word_zp $mr2, $mr1
DELETE mr1
add $mr2, $mr2, r_y, lsr #8
IGNORE mr2
read_byte $mr_data, $mr2
DELETE mr2
MEND
; Writing to memory
; -----------------
; absolute, eg STA &1900
MACRO
mw_ab $mw_data
NEW mw1
read_word_fast $mw1
IGNORE mw1
write_byte $mw_data, $mw1
DELETE mw1
MEND
; zero page, eg ASL &81
MACRO
mw_zp $mw_data
NEW mw1
read_byte_fast $mw1
write_byte_zp $mw_data, $mw1
DELETE mw1
MEND
; absolute + X, eg STA &2800, X
MACRO
mw_ax $mw_data
NEW mw1
read_word_fast $mw1
add $mw1, $mw1, r_x, lsr #8
IGNORE mw1
write_byte $mw_data, $mw1
DELETE mw1
MEND
; absolute + Y, eg ADC table, Y
MACRO
mw_ay $mw_data
NEW mw1
read_word_fast $mw1
add $mw1, $mw1, r_y, lsr #8
IGNORE mw1
write_byte $mw_data, $mw1
DELETE mw1
MEND
; zero page + X, eg LSR &80, X
MACRO
mw_zx $mw_data
NEW mw1
read_byte_fast $mw1
add $mw1, $mw1, r_x
write_byte_zp $mw_data, $mw1
DELETE mw1
MEND
; zero page + Y, eg STX &72, Y
; this is a special case that applies to STX only
MACRO
mw_zy $mw_data
NEW mw1
read_byte_fast $mw1
add $mw1, $mw1, r_y
write_byte_zp $mw_data, $mw1
DELETE mw1
MEND
; indirect addressing, eg STA (&80)
MACRO
mw_in $mw_data
NEW mw1
read_byte_fast $mw1
NEW mw2
read_word_zp $mw2, $mw1
DELETE mw1
IGNORE mw2
write_byte $mw_data, $mw2
DELETE mw2
MEND
; pre-indexed indirect addressing, eg STA (&80, X)
MACRO
mw_ix $mw_data
NEW mw1
read_byte_fast $mw1
add $mw1, $mw1, r_x
NEW mw2
read_word_zp $mw2, $mw1
DELETE mw1
IGNORE mw2
write_byte $mw_data, $mw2
DELETE mw2
MEND
; post-indexed indirect addressing, eg STA (&80), Y
MACRO
mw_iy $mw_data
NEW mw1
read_byte_fast $mw1
NEW mw2
read_word_zp $mw2, $mw1
DELETE mw1
add $mw2, $mw2, r_y, lsr #8
IGNORE mw2
write_byte $mw_data, $mw2
DELETE mw2
MEND
; Modifying memory
; ----------------
; absolute
MACRO
mm_ab $mm_opcode
NEW mm_adr
NEW mm_val
read_word_fast $mm_adr
read_byte $mm_val, $mm_adr
$mm_opcode $mm_val
write_byte $mm_val, $mm_adr
DELETE mm_val
DELETE mm_adr
MEND
; zero page
MACRO
mm_zp $mm_opcode
NEW mm_adr
NEW mm_val
read_byte_fast $mm_adr
read_byte_zp $mm_val, $mm_adr
$mm_opcode $mm_val
write_byte_zp $mm_val, $mm_adr
DELETE mm_val
DELETE mm_adr
MEND
; absolute + X
MACRO
mm_ax $mm_opcode
NEW mm_adr
NEW mm_val
read_word_fast $mm_adr
add $mm_adr, $mm_adr, r_x, lsr #8
read_byte $mm_val, $mm_adr
$mm_opcode $mm_val
IGNORE mm_val
IGNORE mm_adr
write_byte $mm_val, $mm_adr
DELETE mm_val
DELETE mm_adr
MEND
; zero page + X
MACRO
mm_zx $mm_opcode
NEW mm_adr
NEW mm_val
read_byte_fast $mm_adr
add $mm_adr, $mm_adr, r_x
read_byte_zp $mm_val, $mm_adr
$mm_opcode $mm_val
write_byte_zp $mm_val, $mm_adr
DELETE mm_val
DELETE mm_adr
MEND
END