diff options
author | ISSOtm <eldredhabert0@gmail.com> | 2018-05-27 11:18:14 +0200 |
---|---|---|
committer | ISSOtm <eldredhabert0@gmail.com> | 2018-05-27 11:18:14 +0200 |
commit | 6bd6e25eef4a57d1898d7aae0b3b09e6dc5f2695 (patch) | |
tree | 214d4e433770231e3067e069426beb449af74dd1 | |
parent | 83afa8a12dfe450c378ca11743a2291501ec19a8 (diff) |
Import more macros from pokecrystal
-rw-r--r-- | macros.asm | 7 | ||||
-rw-r--r-- | macros/code.asm | 101 | ||||
-rw-r--r-- | macros/coords.asm | 52 | ||||
-rw-r--r-- | macros/data.asm | 129 | ||||
-rw-r--r-- | macros/farcall.asm | 22 | ||||
-rw-r--r-- | macros/gfx.asm | 2 | ||||
-rw-r--r-- | macros/predef.asm | 15 |
7 files changed, 327 insertions, 1 deletions
@@ -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 |