summaryrefslogtreecommitdiff
path: root/macros/data.asm
blob: 2e998145970c56cd631a3e8a06a7b143f050bb79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
; Value macros

; Many arbitrary percentages are simple base-10 or base-16 values:
; -  10 = 4 percent
; -  15 = 6 percent
; - $10 = 6 percent + 1 = 7 percent - 1
; -  20 = 8 percent
; -  25 = 10 percent
; -  30 = 12 percent
; -  40 = 16 percent
; -  50 = 20 percent - 1
; -  60 = 24 percent - 1
; -  70 = 28 percent - 1
; -  80 = 31 percent + 1 = 32 percent - 1
; -  85 = 33 percent + 1 = 34 percent - 1
; - 100 = 39 percent + 1 = 40 percent - 2
; - 120 = 47 percent + 1
; - 123 = 49 percent - 1
; - 160 = 63 percent
; - 180 = 71 percent - 1 = 70 percent + 2
; - 200 = 79 percent - 1
; - 230 = 90 percent + 1
percent EQUS "* $ff / 100"

; e.g. 1 out_of 2 == 50 percent + 1 == $80
out_of EQUS "* $100 /"

assert_power_of_2: MACRO
	assert (\1) & ((\1) - 1) == 0, "\1 must be a power of 2"
ENDM

; Constant data (db, dw, dl) macros

dwb: MACRO
	dw \1
	db \2
ENDM

dbw: MACRO
	db \1
	dw \2
ENDM

dn: MACRO ; nybbles
rept _NARG / 2
	db ((\1) << 4) | (\2)
	shift 2
endr
ENDM

dc: MACRO ; "crumbs"
rept _NARG / 4
	db ((\1) << 6) | ((\2) << 4) | ((\3) << 2) | (\4)
	shift 4
endr
ENDM

dt: MACRO ; three-byte (big-endian)
	db LOW((\1) >> 16), HIGH(\1), LOW(\1)
ENDM

dd: MACRO ; four-byte (big-endian)
	db HIGH((\1) >> 16), LOW((\1) >> 16), HIGH(\1), LOW(\1)
ENDM

bigdw: MACRO ; big-endian word
	db HIGH(\1), LOW(\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

; Reverses FixPicBank in engine/gfx/load_pics.asm
;
; Takes the actual bank of the pic in the ROM and returns the "defined" bank:
;     BANK("Pics 12") -> $13
;     BANK("Pics 13") -> $14
;     BANK("Pics 14") -> $1f
;
; Otherwise, the ROM bank will match the defined bank.
dba_pic: MACRO ; dbw bank, address
	db (BANK(\1) == BANK("Pics 12")) * ($13 - BANK("Pics 12")) \
		+ (BANK(\1) == BANK("Pics 13")) * ($14 - BANK("Pics 13")) \
		+ (BANK(\1) == BANK("Pics 14")) * ($1f - BANK("Pics 14")) \
		+ (BANK(\1))
	dw \1
ENDM

bcd: MACRO
rept _NARG
	dn ((\1) % 100) / 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 (sin(x) + (sin(x) & $ff)) >> 8 ; round up
x += DIV(32768, \1) ; a circle has 65536 "degrees"
endr
ENDM