pokecrystal-board/macros/code.asm

100 lines
1.4 KiB
NASM
Raw Normal View History

2017-12-13 21:36:24 -08:00
; Syntactic sugar macros
lb: MACRO ; r, hi, lo
2018-07-08 13:29:46 -07:00
ld \1, ((\2) & $ff) << 8 | ((\3) & $ff)
2017-12-28 13:31:16 -08:00
ENDM
2017-12-13 21:36:24 -08:00
ln: MACRO ; r, hi, lo
2018-07-08 13:29:46 -07:00
ld \1, ((\2) & $f) << 4 | ((\3) & $f)
2017-12-28 13:31:16 -08:00
ENDM
2017-12-13 21:36:24 -08:00
; Design patterns
jumptable: MACRO
if !STRCMP("\2", "hl")
ld a, [hl]
else
2017-12-13 21:36:24 -08:00
ld a, [\2]
endc
2017-12-13 21:36:24 -08:00
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
2017-12-28 13:31:16 -08:00
ENDM
2017-12-13 21:36:24 -08:00
maskbits: MACRO
; masks just enough bits to cover the first argument
; the second argument is an optional shift amount
2018-01-16 14:27:50 -08:00
; e.g. "maskbits 26" becomes "and %00011111" (since 26 - 1 = %00011001)
; and "maskbits 3, 2" becomes "and %00001100" (since "maskbits 3" becomes %00000011)
2017-12-13 21:36:24 -08:00
; example usage in rejection sampling:
; .loop
; call Random
; maskbits 26
; cp 26
2017-12-13 21:36:24 -08:00
; jr nc, .loop
x = 1
rept 8
2018-01-16 14:27:50 -08:00
if x + 1 < (\1)
x = x << 1 | 1
2017-12-24 09:47:30 -08:00
endc
2017-12-13 21:36:24 -08:00
endr
if _NARG == 2
and x << (\2)
else
2017-12-13 21:36:24 -08:00
and x
endc
2017-12-28 13:31:16 -08:00
ENDM
calc_sine_wave: MACRO
; input: a = a signed 6-bit value
; output: a = d * sin(a * pi/32)
and %111111
2020-04-23 13:10:46 -07:00
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