summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorISSOtm <eldredhabert0@gmail.com>2018-05-27 11:18:14 +0200
committerISSOtm <eldredhabert0@gmail.com>2018-05-27 11:18:14 +0200
commit6bd6e25eef4a57d1898d7aae0b3b09e6dc5f2695 (patch)
tree214d4e433770231e3067e069426beb449af74dd1
parent83afa8a12dfe450c378ca11743a2291501ec19a8 (diff)
Import more macros from pokecrystal
-rw-r--r--macros.asm7
-rw-r--r--macros/code.asm101
-rw-r--r--macros/coords.asm52
-rw-r--r--macros/data.asm129
-rw-r--r--macros/farcall.asm22
-rw-r--r--macros/gfx.asm2
-rw-r--r--macros/predef.asm15
7 files changed, 327 insertions, 1 deletions
diff --git a/macros.asm b/macros.asm
index 87fa36d..25c1ed6 100644
--- a/macros.asm
+++ b/macros.asm
@@ -1 +1,6 @@
-INCLUDE "macros/enum.asm" \ No newline at end of file
+INCLUDE "macros/enum.asm"
+INCLUDE "macros/predef.asm"
+INCLUDE "macros/farcall.asm"
+INCLUDE "macros/data.asm"
+INCLUDE "macros/code.asm"
+INCLUDE "macros/coords.asm" \ No newline at end of file
diff --git a/macros/code.asm b/macros/code.asm
new file mode 100644
index 0000000..1fb651f
--- /dev/null
+++ b/macros/code.asm
@@ -0,0 +1,101 @@
+; Syntactic sugar macros
+
+lb: MACRO ; r, hi, lo
+ ld \1, (((\2) & $ff) << 8) | (((\3) & $ff))
+ENDM
+
+ln: MACRO ; r, hi, lo
+ ld \1, (((\2) & $f) << 4) | (((\3) & $f))
+ENDM
+
+ldpixel: MACRO
+if _NARG >= 5
+ lb \1, \2 * 8 + \4, \3 * 8 + \5
+else
+ lb \1, \2 * 8, \3 * 8
+endc
+ENDM
+
+depixel EQUS "ldpixel de,"
+bcpixel EQUS "ldpixel bc,"
+
+
+; Design patterns
+
+jumptable: MACRO
+ ld a, [\2]
+ ld e, a
+ ld d, 0
+ ld hl, \1
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+ENDM
+
+maskbits: MACRO
+; masks just enough bits to cover the argument
+; e.g. "maskbits 26" becomes "and %00011111" (since 26 - 1 = %00011001)
+; example usage in rejection sampling:
+; .loop
+; call Random
+; maskbits 26
+; cp 26
+; jr nc, .loop
+x = 1
+rept 8
+if x + 1 < (\1)
+x = x << 1 | 1
+endc
+endr
+ and x
+ENDM
+
+calc_sine_wave: MACRO
+; input: a = a signed 6-bit value
+; output: a = d * sin(a * pi/32)
+ and %111111
+ cp %100000
+ jr nc, .negative\@
+ call .apply\@
+ ld a, h
+ ret
+.negative\@
+ and %011111
+ call .apply\@
+ ld a, h
+ xor $ff
+ inc a
+ ret
+.apply\@
+ ld e, a
+ ld a, d
+ ld d, 0
+if _NARG == 1
+ ld hl, \1
+else
+ ld hl, .sinetable\@
+endc
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, 0
+.multiply\@ ; factor amplitude
+ srl a
+ jr nc, .even\@
+ add hl, de
+.even\@
+ sla e
+ rl d
+ and a
+ jr nz, .multiply\@
+ ret
+if _NARG == 0
+.sinetable\@
+ sine_table 32
+endc
+ENDM
diff --git a/macros/coords.asm b/macros/coords.asm
new file mode 100644
index 0000000..0833c24
--- /dev/null
+++ b/macros/coords.asm
@@ -0,0 +1,52 @@
+hlcoord EQUS "coord hl,"
+bccoord EQUS "coord bc,"
+decoord EQUS "coord de,"
+
+coord: MACRO
+; register, x, y[, origin]
+ if _NARG < 4
+ ld \1, (\3) * SCREEN_WIDTH + (\2) + wTileMap
+ else
+ ld \1, (\3) * SCREEN_WIDTH + (\2) + \4
+ endc
+ENDM
+
+hlbgcoord EQUS "bgcoord hl,"
+bcbgcoord EQUS "bgcoord bc,"
+debgcoord EQUS "bgcoord de,"
+
+bgcoord: MACRO
+; register, x, y[, origin]
+ if _NARG < 4
+ ld \1, (\3) * BG_MAP_WIDTH + (\2) + vBGMap0
+ else
+ ld \1, (\3) * BG_MAP_WIDTH + (\2) + \4
+ endc
+ENDM
+
+dwcoord: MACRO
+; x, y
+rept _NARG / 2
+ dw (\2) * SCREEN_WIDTH + (\1) + wTileMap
+ shift
+ shift
+endr
+ENDM
+
+ldcoord_a: MACRO
+; x, y[, origin]
+ if _NARG < 3
+ ld [(\2) * SCREEN_WIDTH + (\1) + wTileMap], a
+ else
+ ld [(\2) * SCREEN_WIDTH + (\1) + \3], a
+ endc
+ENDM
+
+lda_coord: MACRO
+; x, y[, origin]
+ if _NARG < 3
+ ld a, [(\2) * SCREEN_WIDTH + (\1) + wTileMap]
+ else
+ ld a, [(\2) * SCREEN_WIDTH + (\1) + \3]
+ endc
+ENDM
diff --git a/macros/data.asm b/macros/data.asm
new file mode 100644
index 0000000..241e52a
--- /dev/null
+++ b/macros/data.asm
@@ -0,0 +1,129 @@
+; Value macros
+
+percent EQUS "* $ff / 100"
+
+
+; Constant data (db, dw, dl) macros
+
+dwb: MACRO
+ dw \1
+ db \2
+ENDM
+
+dbw: MACRO
+ db \1
+ dw \2
+ENDM
+
+dbbw: MACRO
+ db \1, \2
+ dw \3
+ENDM
+
+dbww: MACRO
+ db \1
+ dw \2, \3
+ENDM
+
+dbwww: MACRO
+ db \1
+ dw \2, \3, \4
+ENDM
+
+dn: MACRO ; nybbles
+rept _NARG / 2
+ db ((\1) << 4) | (\2)
+ shift
+ shift
+endr
+ENDM
+
+dc: MACRO ; "crumbs"
+rept _NARG / 4
+ db ((\1) << 6) | ((\2) << 4) | ((\3) << 2) | (\4)
+ shift
+ shift
+ shift
+ shift
+endr
+ENDM
+
+dx: MACRO
+x = 8 * ((\1) - 1)
+rept \1
+ db LOW((\2) >> x)
+x = x + -8
+endr
+ENDM
+
+dt: MACRO ; three-byte (big-endian)
+ dx 3, \1
+ENDM
+
+dd: MACRO ; four-byte (big-endian)
+ dx 4, \1
+ENDM
+
+bigdw: MACRO ; big-endian word
+ dx 2, \1
+ENDM
+
+dba: MACRO ; dbw bank, address
+rept _NARG
+ dbw BANK(\1), \1
+ shift
+endr
+ENDM
+
+dab: MACRO ; dwb address, bank
+rept _NARG
+ dwb \1, BANK(\1)
+ shift
+endr
+ENDM
+
+dba_pic: MACRO ; dbw bank, address
+ db BANK(\1) - PICS_FIX
+ dw \1
+ENDM
+
+
+dbpixel: MACRO
+if _NARG >= 4
+; x tile, x pxl, y tile, y pxl
+ db \1 * 8 + \3, \2 * 8 + \4
+else
+; x, y
+ db \1 * 8, \2 * 8
+endc
+ENDM
+
+dsprite: MACRO
+; y tile, y pxl, x tile, x pxl, vtile offset, flags, attributes
+ db LOW(\1 * 8) + \2, LOW(\3 * 8) + \4, \5, \6
+ENDM
+
+
+menu_coords: MACRO
+; x1, y1, x2, y2
+ db \2, \1 ; start coords
+ db \4, \3 ; end coords
+ENDM
+
+
+bcd: MACRO
+rept _NARG
+ dn LOW(\1) / 10, (\1) % 10
+ shift
+endr
+ENDM
+
+
+sine_table: MACRO
+; \1 samples of sin(x) from x=0 to x<32768 (pi radians)
+x = 0
+rept \1
+ dw HIGH(sin(x) + LOW(sin(x))) ; round up
+x = x + DIV(32768, \1) ; a circle has 65536 "degrees"
+endr
+ENDM
diff --git a/macros/farcall.asm b/macros/farcall.asm
new file mode 100644
index 0000000..e70cff8
--- /dev/null
+++ b/macros/farcall.asm
@@ -0,0 +1,22 @@
+
+farcall: MACRO ; bank, address
+ ld a, BANK(\1)
+ ld hl, \1
+ call FarCall
+ENDM
+
+callfar: MACRO ; address, bank
+ ld hl, \1
+ ld a, BANK(\1)
+ call FarCall
+ENDM
+
+homecall: MACRO
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(\1)
+ call Bankswitch
+ call \1
+ pop af
+ call Bankswitch
+ENDM
diff --git a/macros/gfx.asm b/macros/gfx.asm
new file mode 100644
index 0000000..16c7d9b
--- /dev/null
+++ b/macros/gfx.asm
@@ -0,0 +1,2 @@
+tiles EQUS "* LEN_2BPP_TILE"
+tile EQUS "+ LEN_2BPP_TILE *"
diff --git a/macros/predef.asm b/macros/predef.asm
new file mode 100644
index 0000000..7850350
--- /dev/null
+++ b/macros/predef.asm
@@ -0,0 +1,15 @@
+predef_id: MACRO
+; Some functions load the predef id
+; without immediately calling Predef.
+ ld a, (\1Predef - PredefPointers) / 3
+ENDM
+
+predef: MACRO
+ predef_id \1
+ call Predef
+ENDM
+
+predef_jump: MACRO
+ predef_id \1
+ jp Predef
+ENDM