home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
nasm20b
/
libinc
/
header
/
macros.h65
< prev
next >
Wrap
Text File
|
1993-01-19
|
6KB
|
343 lines
.if .not .def _MACROS_
_MACROS_ = 1
.if .not .def _STDDEF_
.include #stddef
.endif
; version 2.12.90 (C) Natuerlich! (This comes from 4 years ago)
; -------------------------------------------------------------
; Purists might object to the use of 'BASIC'-like macros
; and it is true, that with every macro U use you might be losing
; some control (if you aren't careful) or that at least the
; temptation is very big to code sloppily to use a macro. But
; since I am currently editing on on a 24 line display, too many
; lda sta, sequences would just fill up too much screen space
; and I am not that brilliant to keep all this stuff in my brain,
; in 100% KODAK quality. Also I don't like printer output
; ----------------------------------------------------------------
;
; defines for macro use
;
; Note that in order to not bother the internal label table with
; too many "temporary helper" variables, we are going to use the
; following shortcut:
; @0 means low level temporary variable (e.g. @STT)
; @1 means first level .. (e.g. POKE)
; @2 means second level..
; from the fourth level, we just use @<name>
.macro @stt
@0 .= @a
.if %0 = 2
@0 .= %2
.endif
.if @0 = @a
sta %1
.else
.if @0 = @x
stx %1
.else
sty %1
.endif
.endif
.endm
.macro @ldi
@0 .= @a
.if %0 = 2
@0 .= %2
.endif
.if %2 = @a
lda #%1
.else
.if %2 = @x
ldx #%1
.else
ldy #%1
.endif
.endif
.endm
.macro @ldf
@0 .= @a
.if %0 = 2
@0 .= %2
.endif
.if %2 = @a
lda %1
.else
.if %2 = @x
ldx %1
.else
ldy %1
.endif
.endif
.endm
.macro poke
@1 .= @a
.if %0 = 3
@1 .= %3
.endif
@LDI %2,@1
@STT %1,@1
.endm
.macro dpoke
@1 .= @a
.if %0 = 3
@1 .= %3
.endif
@LDI <%2,@1
@STT %1,@1
@LDI >%2,@1
@STT %1+1,@1
.endm
.macro move
@1 .= @a
.if %0 = 3
@1 .= %3
.endif
@LDF %1,@1
@STT %2,@1
.endm
.macro dmove
@1 .= @a
.if %0 = 3
@1 .= %3
.endif
@LDF %1,@1
@STT %2,@1
@LDF %1+1,@1
@STT %2+1,@1
.endm
; the following macros are for indirect pokes
.macro poke_x
lda #<%2
sta %1,x
.endm
.macro poke_y
lda #<%2
sta %1,y
.endm
.macro _move_x
lda %1
sta %2,x
.endm
.macro _move_y
lda %1
sta %2,y
.endm
.macro dpoke_x
lda #<%2
sta %1,x
lda #>%2
sta %1+1,x
.endm
.macro dpoke_y
lda #<%2
sta %1,y
lda #>%2
sta %1+1,y
.endm
.macro _dmove_x
lda %1
sta %2,x
lda %1+1
sta %2+1,x
.endm
.macro _dmove_y
lda %1
sta %2,y
lda %1+1
sta %2+1,y
.endm
; usage: ddec <address> decrements 8 bit byte by 2
.macro ddec
dec %1
dec %1
.endm
; usage: dinc <address> increments 8 bit byte by 2
.macro dinc
inc %1
inc %1
.endm
; usage: ddey decrements Y by 2
.macro ddey
dey
dey
.endm
; usage: diny increments Y by 2
.macro diny
iny
iny
.endm
; usage: dinx decrements X by 2
.macro ddex
dex
dex
.endm
; usage: dinx increments X by 2
.macro dinx
inx
inx
.endm
; usage: lxy <value>,[flags] loads value in x/y LSB/MSB
.macro lxy
@0 .= @p1
.if %0 = 2
@0 .= %2
.endif
.if @0 & @p1
ldx #<%1
ldy #>%1
.else
ldx %1
ldy %1+1
.endif
.endm
; usage: sxy <address> stores x/y in LSB/MSB of a 16 bit word
.macro sxy
stx %1
sty %1+1
.endm
; -------------------------------------------------------------
; This is the macro for other macros. Assembles either a move
; or a poke (or a DPOKE or a DMOVE)
; Usage:
; @MOKE src,dst,select
; src as in POKE dst,src MOVE src,dst
; select -> see stddef.h65 ONLY %1 can be selected!
; --------------------------------------------------------------
.macro @moke
.if %3 & @p1
poke %2,%1
.else
move %1,%2
.endif
.endm
.macro @moke_x
.if %3 & @p1
poke_x %2,%1
.else
_move_x %1,%2
.endif
.endm
.macro @moke_y
.if %3 & @p1
poke_y %2,%1
.else
_move_y %1,%2
.endif
.endm
; -------------------------------------------------------------
; This is the macro for other macros. Assembles either a DPOKE
; or DMOVE)
; Usage:
; @DMOKE src,dst,select
;
; select -> stddef.h65
; --------------------------------------------------------------
.macro @dmoke
.if %3 & @p1
dpoke %2,%1
.else
dmove %1,%2
.endif
.endm
.macro @dmoke_x
.if %3 & @p1
dpoke_x %2,%1
.else
_dmove_x %1,%2
.endif
.endm
.macro @dmoke_y
.if %3 & @p1
dpoke_y %2,%1
.else
_dmove_y %1,%2
.endif
.endm
; -------------------------------------------------------------
; This is the macro for other macros. Assembles either a direct
; or an immediate load.
; Usage:
; @MOAD src,select[,reglsb]
;
; select -> stddef.h65
; reglsb -> @a @x @y
; --------------------------------------------------------------
.macro @moad
@2lsb .= @a
.if %0 > 2
@2lsb .= %3
.endif
.if %2 & @p1
@ldi <%1,@2lsb
.else
@ldf %1,@2lsb
.endif
.endm
; -------------------------------------------------------------
; This is the macro for other macros. Assembles either a direct
; or an immediate load. (as you can see these comments were
; copied again and again)
; Usage:
; @DMOAD src,select[,reglsb,regmsb]
;
; select -> stddef.h65
; reglsb -> @a @x @y
; --------------------------------------------------------------
.macro @dmoad
@2lsb .= @a
@2msb .= @y
.if %0 > 2
@2lsb .= %3
@2msb .= %4
.endif
.if %2 & @p1
@ldi <%1,@2lsb
@ldi >%1,@2msb
.else
@ldf %1,@2lsb
@ldf %1+1,@2msb
.endif
.endm
.endif