pokered/macros.asm

684 lines
11 KiB
NASM
Raw Normal View History

2013-12-05 06:25:12 +00:00
text EQUS "db $00," ; Start writing text.
next EQUS "db $4e," ; Move a line down.
line EQUS "db $4f," ; Start writing at the bottom line.
para EQUS "db $51," ; Start a new paragraph.
cont EQUS "db $55," ; Scroll to the next line.
done EQUS "db $57" ; End a text box.
prompt EQUS "db $58" ; Prompt the player to end a text box (initiating some other event).
page EQUS "db $49," ; Start a new Pokedex page.
dex EQUS "db $5f, $50" ; End a Pokedex entry.
percent EQUS "* $ff / 100"
2015-07-18 15:17:29 +00:00
lb: MACRO ; r, hi, lo
2015-07-19 03:49:52 +00:00
ld \1, (\2) << 8 + ((\3) & $ff)
2015-07-18 15:17:29 +00:00
ENDM
; Constant enumeration is useful for monsters, items, moves, etc.
const_def: MACRO
const_value = 0
ENDM
const: MACRO
\1 EQU const_value
const_value = const_value + 1
ENDM
2014-05-23 22:34:35 +00:00
homecall: MACRO
ld a, [H_LOADEDROMBANK]
push af
ld a, BANK(\1)
ld [H_LOADEDROMBANK], a
2014-09-14 18:29:18 +00:00
ld [MBC1RomBank], a
2014-05-23 22:34:35 +00:00
call \1
pop af
ld [H_LOADEDROMBANK], a
2014-09-14 18:29:18 +00:00
ld [MBC1RomBank], a
2014-05-23 22:34:35 +00:00
ENDM
2016-03-15 01:23:49 +00:00
farcall EQUS "callba"
callba: MACRO
ld b, BANK(\1)
ld hl, \1
call Bankswitch
ENDM
callab: MACRO
ld hl, \1
ld b, BANK(\1)
call Bankswitch
ENDM
2015-07-19 18:56:13 +00:00
jpba: MACRO
ld b, BANK(\1)
ld hl, \1
jp Bankswitch
ENDM
jpab: MACRO
ld hl, \1
ld b, BANK(\1)
jp Bankswitch
ENDM
bcd2: MACRO
2015-07-22 01:58:19 +00:00
dn ((\1) / 1000) % 10, ((\1) / 100) % 10
dn ((\1) / 10) % 10, (\1) % 10
ENDM
bcd3: MACRO
2015-07-22 01:58:19 +00:00
dn ((\1) / 100000) % 10, ((\1) / 10000) % 10
dn ((\1) / 1000) % 10, ((\1) / 100) % 10
dn ((\1) / 10) % 10, (\1) % 10
ENDM
coins equs "bcd2"
money equs "bcd3"
2015-07-18 20:52:03 +00:00
;\1 = r
;\2 = X
;\3 = Y
coord: MACRO
ld \1, wTileMap + 20 * \3 + \2
ENDM
;\1 = X
;\2 = Y
aCoord: MACRO
ld a, [wTileMap + 20 * \2 + \1]
ENDM
;\1 = X
;\2 = Y
Coorda: MACRO
ld [wTileMap + 20 * \2 + \1], a
ENDM
;\1 = X
;\2 = Y
dwCoord: MACRO
dw wTileMap + 20 * \2 + \1
2013-12-05 06:25:12 +00:00
ENDM
;\1 = r
;\2 = X
;\3 = Y
;\4 = map width
overworldMapCoord: MACRO
ld \1, wOverworldMap + ((\2) + 3) + (((\3) + 3) * ((\4) + (3 * 2)))
ENDM
2013-12-05 06:25:12 +00:00
;\1 = Map Width
;\2 = Rows above (Y-blocks)
;\3 = X movement (X-blocks)
EVENT_DISP: MACRO
2014-05-27 19:03:30 +00:00
dw (wOverworldMap + 7 + (\1) + ((\1) + 6) * ((\2) >> 1) + ((\3) >> 1)) ; Ev.Disp
2013-12-05 06:25:12 +00:00
db \2,\3 ;Y,X
ENDM
FLYWARP_DATA: MACRO
EVENT_DISP \1,\2,\3
db ((\2) & $01) ;sub-block Y
db ((\3) & $01) ;sub-block X
ENDM
; external map entry macro
EMAP: MACRO ; emap x-coordinate,y-coordinate,textpointer
; the appearance of towns and routes in the town map, indexed by map id
; nybble: y-coordinate
; nybble: x-coordinate
; word : pointer to map name
db (\1 + (\2 << 4))
dw \3
ENDM
; internal map entry macro
IMAP: MACRO ; imap mapid_less_than,x-coordinate,y-coordinate,textpointer
; the appearance of buildings and dungeons in the town map
; byte : maximum map id subject to this rule
; nybble: y-coordinate
; nybble: x-coordinate
; word : pointer to map name
db \1 + 1
2013-12-05 06:25:12 +00:00
db \2 + \3 << 4
dw \4
ENDM
; tilesets' headers macro
tileset: MACRO
db BANK(\2) ; BANK(GFX)
dw \1, \2, \3 ; Block, GFX, Coll
db \4, \5, \6 ; counter tiles
db \7 ; grass tile
db \8 ; permission (indoor, cave, outdoor)
2013-12-05 06:25:12 +00:00
ENDM
INDOOR EQU 0
CAVE EQU 1
OUTDOOR EQU 2
2014-06-09 20:58:02 +00:00
2013-12-05 06:25:12 +00:00
; macro for two nibbles
dn: MACRO
db (\1 << 4 | \2)
ENDM
; macro for putting a byte then a word
dbw: MACRO
db \1
dw \2
ENDM
; data format macros
RGB: MACRO
dw (\3 << 10 | \2 << 5 | \1)
ENDM
; text macros
TX_NUM: MACRO
; print a big-endian decimal number.
; \1: address to read from
; \2: number of bytes to read
; \3: number of digits to display
db $09
dw \1
db \2 << 4 | \3
ENDM
TX_FAR: MACRO
db $17
dw \1
db BANK(\1)
ENDM
; text engine command $1
TX_RAM: MACRO
; prints text to screen
; \1: RAM address to read from
db $1
dw \1
ENDM
TX_BCD: MACRO
; \1: RAM address to read from
; \2: number of bytes + print flags
db $2
dw \1
db \2
ENDM
2016-04-09 02:16:42 +00:00
TX_MART: MACRO
db $FE, _NARG
rept _NARG
db \1
shift
endr
db $FF
ENDM
TX_LINE EQUS "db $05"
TX_BUTTON_SOUND EQUS "db $06"
TX_ASM EQUS "db $08"
TX_SFX_ITEM EQUS "db $0b"
TX_WAIT_BUTTON EQUS "db $0d"
TX_SFX_CONGRATS EQUS "db $10"
TX_SFX_KEY_ITEM EQUS "db $11"
TX_VENDING_MACHINE EQUS "db $f5"
TX_CABLE_CLUB_RECEPTIONIST EQUS "db $f6"
TX_PRIZE_VENDOR EQUS "db $f7"
TX_POKECENTER_PC EQUS "db $f9"
TX_PLAYERS_PC EQUS "db $fc"
TX_BILLS_PC EQUS "db $fd"
TX_POKECENTER_NURSE EQUS "db $ff"
2013-12-05 06:25:12 +00:00
; Predef macro.
2014-06-16 20:25:46 +00:00
add_predef: MACRO
\1Predef::
db BANK(\1)
dw \1
ENDM
predef_id: MACRO
ld a, (\1Predef - PredefPointers) / 3
ENDM
predef: MACRO
predef_id \1
2013-12-05 06:25:12 +00:00
call Predef
ENDM
2014-06-09 20:58:02 +00:00
2014-06-16 20:25:46 +00:00
predef_jump: MACRO
predef_id \1
2013-12-05 06:25:12 +00:00
jp Predef
ENDM
2014-09-18 04:15:11 +00:00
add_tx_pre: MACRO
\1_id:: dw \1
ENDM
tx_pre_id: MACRO
ld a, (\1_id - TextPredefs) / 2 + 1
2014-09-18 04:15:11 +00:00
ENDM
tx_pre: MACRO
tx_pre_id \1
call PrintPredefTextID
ENDM
tx_pre_jump: MACRO
tx_pre_id \1
jp PrintPredefTextID
ENDM
WALK EQU $FE
STAY EQU $FF
DOWN EQU $D0
UP EQU $D1
LEFT EQU $D2
RIGHT EQU $D3
NONE EQU $FF
;\1 sprite id
;\2 x position
;\3 y position
;\4 movement (WALK/STAY)
;\5 range or direction
;\6 text id
;\7 items only: item id
;\7 trainers only: trainer class/pokemon id
;\8 trainers only: trainer number/pokemon level
object: MACRO
2015-07-22 01:58:19 +00:00
db \1
db \3 + 4
db \2 + 4
db \4
db \5
IF (_NARG > 7)
db TRAINER | \6
db \7
db \8
ELSE
IF (_NARG > 6)
db ITEM | \6
db \7
ELSE
db \6
ENDC
ENDC
ENDM
StopAllMusic: macro
ld a, $ff
call PlaySound
endm
2013-12-05 06:25:12 +00:00
;1_channel EQU $00
;2_channels EQU $40
;3_channels EQU $80
;4_channels EQU $C0
CH0 EQU 0
CH1 EQU 1
CH2 EQU 2
CH3 EQU 3
CH4 EQU 4
CH5 EQU 5
CH6 EQU 6
CH7 EQU 7
unknownsfx0x10: MACRO
db $10
db \1
ENDM
unknownsfx0x20: MACRO
db $20 | \1
db \2
db \3
db \4
ENDM
unknownnoise0x20: MACRO
db $20 | \1
db \2
db \3
ENDM
;format: pitch length (in 16ths)
C_: MACRO
db $00 | (\1 - 1)
ENDM
C#: MACRO
db $10 | (\1 - 1)
ENDM
D_: MACRO
db $20 | (\1 - 1)
ENDM
D#: MACRO
db $30 | (\1 - 1)
ENDM
E_: MACRO
db $40 | (\1 - 1)
ENDM
F_: MACRO
db $50 | (\1 - 1)
ENDM
F#: MACRO
db $60 | (\1 - 1)
ENDM
G_: MACRO
db $70 | (\1 - 1)
ENDM
G#: MACRO
db $80 | (\1 - 1)
ENDM
A_: MACRO
db $90 | (\1 - 1)
ENDM
A#: MACRO
db $A0 | (\1 - 1)
2013-12-05 06:25:12 +00:00
ENDM
B_: MACRO
2013-12-05 06:25:12 +00:00
db $B0 | (\1 - 1)
ENDM
;format: instrument length (in 16ths)
snare1: MACRO
db $B0 | (\1 - 1)
db $01
ENDM
snare2: MACRO
db $B0 | (\1 - 1)
db $02
ENDM
snare3: MACRO
db $B0 | (\1 - 1)
db $03
ENDM
snare4: MACRO
db $B0 | (\1 - 1)
db $04
ENDM
snare5: MACRO
db $B0 | (\1 - 1)
db $05
ENDM
triangle1: MACRO
db $B0 | (\1 - 1)
db $06
ENDM
triangle2: MACRO
db $B0 | (\1 - 1)
db $07
ENDM
snare6: MACRO
db $B0 | (\1 - 1)
db $08
ENDM
snare7: MACRO
db $B0 | (\1 - 1)
db $09
ENDM
snare8: MACRO
db $B0 | (\1 - 1)
db $0A
ENDM
snare9: MACRO
db $B0 | (\1 - 1)
db $0B
ENDM
cymbal1: MACRO
db $B0 | (\1 - 1)
db $0C
ENDM
cymbal2: MACRO
db $B0 | (\1 - 1)
db $0D
ENDM
cymbal3: MACRO
db $B0 | (\1 - 1)
db $0E
ENDM
mutedsnare1: MACRO
db $B0 | (\1 - 1)
db $0F
ENDM
triangle3: MACRO
db $B0 | (\1 - 1)
db $10
ENDM
mutedsnare2: MACRO
db $B0 | (\1 - 1)
db $11
ENDM
mutedsnare3: MACRO
db $B0 | (\1 - 1)
db $12
ENDM
mutedsnare4: MACRO
db $B0 | (\1 - 1)
db $13
2013-12-05 06:25:12 +00:00
ENDM
;format: rest length (in 16ths)
rest: MACRO
db $C0 | (\1 - 1)
ENDM
; format: notetype speed, volume, fade
notetype: MACRO
db $D0 | \1
db (\2 << 4) | \3
ENDM
dspeed: MACRO
db $D0 | \1
ENDM
octave: MACRO
db $E8 - \1
ENDM
2014-06-09 17:22:35 +00:00
toggleperfectpitch: MACRO
2013-12-05 06:25:12 +00:00
db $E8
ENDM
;format: vibrato delay, rate, depth
vibrato: MACRO
db $EA
db \1
db (\2 << 4) | \3
ENDM
pitchbend: MACRO
db $EB
db \1
db \2
ENDM
duty: MACRO
db $EC
db \1
ENDM
tempo: MACRO
db $ED
2014-06-09 17:22:35 +00:00
db \1 / $100
db \1 % $100
2013-12-05 06:25:12 +00:00
ENDM
2014-06-09 17:22:35 +00:00
stereopanning: MACRO
2013-12-05 06:25:12 +00:00
db $EE
db \1
ENDM
2014-06-09 17:22:35 +00:00
volume: MACRO
2013-12-05 06:25:12 +00:00
db $F0
2014-06-09 17:22:35 +00:00
db (\1 << 4) | \2
2013-12-05 06:25:12 +00:00
ENDM
executemusic: MACRO
db $F8
ENDM
dutycycle: MACRO
db $FC
db \1
ENDM
;format: callchannel address
2014-11-05 01:22:55 +00:00
callchannel: MACRO
db $FD
dw \1
ENDM
2013-12-05 06:25:12 +00:00
;format: loopchannel count, address
2014-11-05 01:22:55 +00:00
loopchannel: MACRO
db $FE
db \1
dw \2
ENDM
2013-12-05 06:25:12 +00:00
endchannel: MACRO
db $FF
ENDM
2014-05-27 19:03:30 +00:00
;\1 (byte) = current map id
;\2 (byte) = connected map id
;\3 (byte) = x movement of connection strip
;\4 (byte) = connection strip offset
;\5 (word) = connected map blocks pointer
2013-12-21 00:47:05 +00:00
NORTH_MAP_CONNECTION: MACRO
db \2 ; map id
dw \5 + (\2_WIDTH * (\2_HEIGHT - 3)) + \4; "Connection Strip" location
dw wOverworldMap + 3 + \3 ; current map position
IF (\1_WIDTH < \2_WIDTH)
db \1_WIDTH - \3 + 3 ; width of connection strip
ELSE
db \2_WIDTH - \4 ; width of connection strip
ENDC
db \2_WIDTH ; map width
db (\2_HEIGHT * 2) - 1 ; y alignment (y coordinate of player when entering map)
db (\3 - \4) * -2 ; x alignment (x coordinate of player when entering map)
dw wOverworldMap + 1 + (\2_HEIGHT * (\2_WIDTH + 6)) ; window (position of the upper left block after entering the map)
ENDM
;\1 (byte) = current map id
;\2 (byte) = connected map id
;\3 (byte) = x movement of connection strip
;\4 (byte) = connection strip offset
;\5 (word) = connected map blocks pointer
;\6 (flag) = add 3 to width of connection strip (why?)
2013-12-21 00:47:05 +00:00
SOUTH_MAP_CONNECTION: MACRO
db \2 ; map id
dw \5 + \4 ; "Conection Strip" location
dw wOverworldMap + 3 + (\1_HEIGHT + 3) * (\1_WIDTH + 6) + \3 ; current map position
IF (\1_WIDTH < \2_WIDTH)
IF (_NARG > 5)
db \1_WIDTH - \3 + 3 ; width of connection strip
ELSE
db \1_WIDTH - \3 ; width of connection strip
ENDC
ELSE
db \2_WIDTH - \4 ; width of connection strip
ENDC
db \2_WIDTH ; map width
2013-12-21 00:47:05 +00:00
db 0 ; y alignment (y coordinate of player when entering map)
db (\3 - \4) * -2 ; x alignment (x coordinate of player when entering map)
dw wOverworldMap + 7 + \2_WIDTH ; window (position of the upper left block after entering the map)
2013-12-21 00:47:05 +00:00
ENDM
;\1 (byte) = current map id
;\2 (byte) = connected map id
;\3 (byte) = y movement of connection strip
;\4 (byte) = connection strip offset
;\5 (word) = connected map blocks pointer
WEST_MAP_CONNECTION: MACRO
db \2 ; map id
dw \5 + (\2_WIDTH * \4) + \2_WIDTH - 3 ; "Connection Strip" location
dw wOverworldMap + (\1_WIDTH + 6) * (\3 + 3) ; current map position
IF (\1_HEIGHT < \2_HEIGHT)
db \1_HEIGHT - \3 + 3 ; height of connection strip
ELSE
db \2_HEIGHT - \4 ; height of connection strip
ENDC
db \2_WIDTH ; map width
2013-12-21 00:47:05 +00:00
db (\3 - \4) * -2 ; y alignment
db (\2_WIDTH * 2) - 1 ; x alignment
2015-07-19 04:39:29 +00:00
dw wOverworldMap + 6 + (2 * \2_WIDTH) ; window (position of the upper left block after entering the map)
2013-12-21 00:47:05 +00:00
ENDM
;\1 (byte) = current map id
;\2 (byte) = connected map id
;\3 (byte) = y movement of connection strip
;\4 (byte) = connection strip offset
;\5 (word) = connected map blocks pointer
;\6 (flag) = add 3 to height of connection strip (why?)
EAST_MAP_CONNECTION: MACRO
db \2 ; map id
dw \5 + (\2_WIDTH * \4) ; "Connection Strip" location
dw wOverworldMap - 3 + (\1_WIDTH + 6) * (\3 + 4) ; current map position
IF (\1_HEIGHT < \2_HEIGHT)
IF (_NARG > 5)
db \1_HEIGHT - \3 + 3 ; height of connection strip
ELSE
db \1_HEIGHT - \3 ; height of connection strip
ENDC
ELSE
db \2_HEIGHT - \4 ; height of connection strip
ENDC
db \2_WIDTH ; map width
2013-12-21 00:47:05 +00:00
db (\3 - \4) * -2 ; y alignment
db 0 ; x alignment
dw wOverworldMap + 7 + \2_WIDTH ; window (position of the upper left block after entering the map)
2013-12-21 00:47:05 +00:00
ENDM
tmlearn: MACRO
2015-07-28 20:42:15 +00:00
x = 0
rept _NARG
if \1 != 0
x = x | (1 << ((\1 - 1) % 8))
endc
2015-07-28 20:42:15 +00:00
shift
endr
db x
ENDM