summaryrefslogtreecommitdiff
path: root/macros.asm
diff options
context:
space:
mode:
authorluckytyphlosion <alan.rj.huang@gmail.com>2015-05-17 18:21:24 -0400
committerluckytyphlosion <alan.rj.huang@gmail.com>2015-05-17 18:21:24 -0400
commitb5f5a16f43ef62680f09666073f07911306e1561 (patch)
treeb62055647e8b02b8d0341639b398f1ed1a1913a2 /macros.asm
parentfb327a0a949f9ce2f25116c29ee6c9d2aa83bd94 (diff)
Completed home/overworld.asm with other related functions
Diffstat (limited to 'macros.asm')
-rw-r--r--macros.asm1169
1 files changed, 600 insertions, 569 deletions
diff --git a/macros.asm b/macros.asm
index 4a97e236..0f79fa74 100644
--- a/macros.asm
+++ b/macros.asm
@@ -1,569 +1,600 @@
-
-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"
-
-
-; 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
-
-
-homecall_jump: MACRO
- ld a, [H_LOADEDROMBANK]
- push af
- ld a, BANK(\1)
- call BankswitchCommon
- call \1
- pop af
- jp BankswitchCommon
- ENDM
-
-callba: MACRO
- ld b, BANK(\1)
- ld hl, \1
- call Bankswitch
- ENDM
-
-callab: MACRO
- ld hl, \1
- ld b, BANK(\1)
- call Bankswitch
- ENDM
-
-bcd2: MACRO
- dn ((\1) / 1000) % 10, ((\1) / 100) % 10
- dn ((\1) / 10) % 10, (\1) % 10
- ENDM
-
-bcd3: MACRO
- 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"
-
-;\1 = X
-;\2 = Y
-hlCoord: MACRO
- ld hl, wTileMap + 20 * \2 + \1
- ENDM
-
-;\1 = X
-;\2 = Y
-deCoord: MACRO
- ld de, wTileMap + 20 * \2 + \1
- ENDM
-
-;\1 = X
-;\2 = Y
-bcCoord: MACRO
- ld bc, wTileMap + 20 * \2 + \1
- 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
- ENDM
-
-;\1 = Map Width
-;\2 = Rows above (Y-blocks)
-;\3 = X movement (X-blocks)
-EVENT_DISP: MACRO
- dw (wOverworldMap + 7 + (\1) + ((\1) + 6) * ((\2) >> 1) + ((\3) >> 1)) ; Ev.Disp
- 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
- 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)
- ENDM
-
-INDOOR EQU 0
-CAVE EQU 1
-OUTDOOR EQU 2
-
-; 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
- db $2
- dw \1
- db \2
- ENDM
-
-; Predef macro.
-add_predef: MACRO
-\1Predef::
- db BANK(\1)
- dw \1
- ENDM
-
-predef_id: MACRO
- ld a, (\1Predef - PredefPointers) / 3
- ENDM
-
-predef: MACRO
- predef_id \1
- call Predef
- ENDM
-
-predef_jump: MACRO
- predef_id \1
- jp Predef
- ENDM
-
-
-add_tx_pre: MACRO
-\1_id:: dw \1
-ENDM
-
-tx_pre_id: MACRO
- ld a, (\1_id - TextPredefs) / 2
-ENDM
-
-tx_pre: MACRO
- tx_pre_id \1
- call PrintPredefTextID
-ENDM
-
-tx_pre_jump: MACRO
- tx_pre_id \1
- jp PrintPredefTextID
-ENDM
-
-
-;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)
-ENDM
-
-B_: MACRO
- 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
-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
-
-toggleperfectpitch: MACRO
- 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
- db \1 / $100
- db \1 % $100
-ENDM
-
-stereopanning: MACRO
- db $EE
- db \1
-ENDM
-
-volume: MACRO
- db $F0
- db (\1 << 4) | \2
-ENDM
-
-executemusic: MACRO
- db $F8
-ENDM
-
-dutycycle: MACRO
- db $FC
- db \1
-ENDM
-
-;format: callchannel address
-callchannel: MACRO
- db $FD
- dw \1
-ENDM
-
-;format: loopchannel count, address
-loopchannel: MACRO
- db $FE
- db \1
- dw \2
-ENDM
-
-endchannel: MACRO
- db $FF
-ENDM
-
-
-;\1 (byte) = connected map id
-;\2 (byte) = connected map width
-;\3 (byte) = connected map height
-;\4 (byte) = x movement of connection strip
-;\5 (byte) = connection strip offset
-;\6 (byte) = width of connection strip
-;\7 (word) = connected map blocks pointer
-NORTH_MAP_CONNECTION: MACRO
- db \1 ; map id
- dw \7 + (\2 * (\3 - 3)) + \5; "Connection Strip" location
- dw wOverworldMap + 3 + \4 ; current map position
- db \6 ; width of connection strip
- db \2 ; map width
- db (\3 * 2) - 1 ; y alignment (y coordinate of player when entering map)
- db (\4 - \5) * -2 ; x alignment (x coordinate of player when entering map)
- dw wOverworldMap + 1 + (\3 * (\2 + 6)) ; window (position of the upper left block after entering the map)
-ENDM
-
-;\1 (byte) = connected map id
-;\2 (byte) = connected map width
-;\3 (byte) = x movement of connection strip
-;\4 (byte) = connection strip offset
-;\5 (byte) = width of connection strip
-;\6 (word) = connected map blocks pointer
-;\7 (byte) = current map width
-;\8 (byte) = current map height
-SOUTH_MAP_CONNECTION: MACRO
- db \1 ; map id
- dw \6 + \4 ; "Conection Strip" location
- dw wOverworldMap + 3 + (\8 + 3) * (\7 + 6) + \3 ; current map positoin
- db \5 ; width of connection strip
- db \2 ; map width
- 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 ; window (position of the upper left block after entering the map)
-ENDM
-
-;\1 (byte) = connected map id
-;\2 (byte) = connected map width
-;\3 (byte) = y movement of connection strip
-;\4 (byte) = connection strip offset
-;\5 (byte) = height of connection strip
-;\6 (word) = connected map blocks pointer
-;\7 (byte) = current map width
-EAST_MAP_CONNECTION: MACRO
- db \1 ; map id
- dw \6 + (\2 * \4) ; "Connection Strip" location
- dw wOverworldMap - 3 + (\7 + 6) * (\3 + 4) ; current map position
- db \5 ; height of connection strip
- db \2 ; map width
- db (\3 - \4) * -2 ; y alignment
- db 0 ; x alignment
- dw wOverworldMap + 7 + \2 ; window (position of the upper left block after entering the map)
-ENDM
-
-;\1 (byte) = connected map id
-;\2 (byte) = connected map width
-;\3 (byte) = y movement of connection strip
-;\4 (byte) = connection strip offset
-;\5 (byte) = height of connection strip
-;\6 (word) = connected map blocks pointer
-;\7 (byte) = current map width
-WEST_MAP_CONNECTION: MACRO
- db \1 ; map id
- dw \6 + (\2 * \4) + \2 - 3 ; "Connection Strip" location
- dw wOverworldMap + (\7 + 6) * (\3 + 3) ; current map position
- db \5 ; height of connection strip
- db \2 ; map width
- db (\3 - \4) * -2 ; y alignment
- db (\2 * 2) - 1 ; x alignment
- dw wOverworldMap + 6 + (2 * \2) ; window (position of the upper left block after entring the map)
-ENDM
+
+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"
+
+
+; 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
+
+
+homecall_jump: MACRO
+ ld a, [H_LOADEDROMBANK]
+ push af
+ ld a, BANK(\1)
+ call BankswitchCommon
+ call \1
+ pop af
+ jp BankswitchCommon
+ ENDM
+
+homecall: MACRO
+ ld a, [H_LOADEDROMBANK]
+ push af
+ ld a, BANK(\1)
+ call BankswitchCommon
+ call \1
+ pop af
+ call BankswitchCommon
+ ENDM
+
+homecall_sf: MACRO ; homecall but save flags by popping into bc instead of af
+ ld a, [H_LOADEDROMBANK]
+ push af
+ ld a, BANK(\1)
+ call BankswitchCommon
+ call \1
+ pop bc
+ ld a,b
+ call BankswitchCommon
+ ENDM
+
+switchbank: MACRO
+ ld a, BANK(\1)
+ call BankswitchCommon
+ ENDM
+
+callsb: MACRO
+ ld a, BANK(\1)
+ call BankswitchCommon
+ call \1
+
+callba: MACRO
+ ld b, BANK(\1)
+ ld hl, \1
+ call Bankswitch
+ ENDM
+
+callab: MACRO
+ ld hl, \1
+ ld b, BANK(\1)
+ call Bankswitch
+ ENDM
+
+bcd2: MACRO
+ dn ((\1) / 1000) % 10, ((\1) / 100) % 10
+ dn ((\1) / 10) % 10, (\1) % 10
+ ENDM
+
+bcd3: MACRO
+ 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"
+
+;\1 = X
+;\2 = Y
+hlCoord: MACRO
+ ld hl, wTileMap + 20 * \2 + \1
+ ENDM
+
+;\1 = X
+;\2 = Y
+deCoord: MACRO
+ ld de, wTileMap + 20 * \2 + \1
+ ENDM
+
+;\1 = X
+;\2 = Y
+bcCoord: MACRO
+ ld bc, wTileMap + 20 * \2 + \1
+ 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
+ ENDM
+
+;\1 = Map Width
+;\2 = Rows above (Y-blocks)
+;\3 = X movement (X-blocks)
+EVENT_DISP: MACRO
+ dw (wOverworldMap + 7 + (\1) + ((\1) + 6) * ((\2) >> 1) + ((\3) >> 1)) ; Ev.Disp
+ 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
+ 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)
+ ENDM
+
+INDOOR EQU 0
+CAVE EQU 1
+OUTDOOR EQU 2
+
+; 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
+ db $2
+ dw \1
+ db \2
+ ENDM
+
+; Predef macro.
+add_predef: MACRO
+\1Predef::
+ db BANK(\1)
+ dw \1
+ ENDM
+
+predef_id: MACRO
+ ld a, (\1Predef - PredefPointers) / 3
+ ENDM
+
+predef: MACRO
+ predef_id \1
+ call Predef
+ ENDM
+
+predef_jump: MACRO
+ predef_id \1
+ jp Predef
+ ENDM
+
+
+add_tx_pre: MACRO
+\1_id:: dw \1
+ENDM
+
+tx_pre_id: MACRO
+ ld a, (\1_id - TextPredefs) / 2
+ENDM
+
+tx_pre: MACRO
+ tx_pre_id \1
+ call PrintPredefTextID
+ENDM
+
+tx_pre_jump: MACRO
+ tx_pre_id \1
+ jp PrintPredefTextID
+ENDM
+
+
+;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)
+ENDM
+
+B_: MACRO
+ 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
+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
+
+toggleperfectpitch: MACRO
+ 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
+ db \1 / $100
+ db \1 % $100
+ENDM
+
+stereopanning: MACRO
+ db $EE
+ db \1
+ENDM
+
+volume: MACRO
+ db $F0
+ db (\1 << 4) | \2
+ENDM
+
+executemusic: MACRO
+ db $F8
+ENDM
+
+dutycycle: MACRO
+ db $FC
+ db \1
+ENDM
+
+;format: callchannel address
+callchannel: MACRO
+ db $FD
+ dw \1
+ENDM
+
+;format: loopchannel count, address
+loopchannel: MACRO
+ db $FE
+ db \1
+ dw \2
+ENDM
+
+endchannel: MACRO
+ db $FF
+ENDM
+
+
+;\1 (byte) = connected map id
+;\2 (byte) = connected map width
+;\3 (byte) = connected map height
+;\4 (byte) = x movement of connection strip
+;\5 (byte) = connection strip offset
+;\6 (byte) = width of connection strip
+;\7 (word) = connected map blocks pointer
+NORTH_MAP_CONNECTION: MACRO
+ db \1 ; map id
+ dw \7 + (\2 * (\3 - 3)) + \5; "Connection Strip" location
+ dw wOverworldMap + 3 + \4 ; current map position
+ db \6 ; width of connection strip
+ db \2 ; map width
+ db (\3 * 2) - 1 ; y alignment (y coordinate of player when entering map)
+ db (\4 - \5) * -2 ; x alignment (x coordinate of player when entering map)
+ dw wOverworldMap + 1 + (\3 * (\2 + 6)) ; window (position of the upper left block after entering the map)
+ENDM
+
+;\1 (byte) = connected map id
+;\2 (byte) = connected map width
+;\3 (byte) = x movement of connection strip
+;\4 (byte) = connection strip offset
+;\5 (byte) = width of connection strip
+;\6 (word) = connected map blocks pointer
+;\7 (byte) = current map width
+;\8 (byte) = current map height
+SOUTH_MAP_CONNECTION: MACRO
+ db \1 ; map id
+ dw \6 + \4 ; "Conection Strip" location
+ dw wOverworldMap + 3 + (\8 + 3) * (\7 + 6) + \3 ; current map positoin
+ db \5 ; width of connection strip
+ db \2 ; map width
+ 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 ; window (position of the upper left block after entering the map)
+ENDM
+
+;\1 (byte) = connected map id
+;\2 (byte) = connected map width
+;\3 (byte) = y movement of connection strip
+;\4 (byte) = connection strip offset
+;\5 (byte) = height of connection strip
+;\6 (word) = connected map blocks pointer
+;\7 (byte) = current map width
+EAST_MAP_CONNECTION: MACRO
+ db \1 ; map id
+ dw \6 + (\2 * \4) ; "Connection Strip" location
+ dw wOverworldMap - 3 + (\7 + 6) * (\3 + 4) ; current map position
+ db \5 ; height of connection strip
+ db \2 ; map width
+ db (\3 - \4) * -2 ; y alignment
+ db 0 ; x alignment
+ dw wOverworldMap + 7 + \2 ; window (position of the upper left block after entering the map)
+ENDM
+
+;\1 (byte) = connected map id
+;\2 (byte) = connected map width
+;\3 (byte) = y movement of connection strip
+;\4 (byte) = connection strip offset
+;\5 (byte) = height of connection strip
+;\6 (word) = connected map blocks pointer
+;\7 (byte) = current map width
+WEST_MAP_CONNECTION: MACRO
+ db \1 ; map id
+ dw \6 + (\2 * \4) + \2 - 3 ; "Connection Strip" location
+ dw wOverworldMap + (\7 + 6) * (\3 + 3) ; current map position
+ db \5 ; height of connection strip
+ db \2 ; map width
+ db (\3 - \4) * -2 ; y alignment
+ db (\2 * 2) - 1 ; x alignment
+ dw wOverworldMap + 6 + (2 * \2) ; window (position of the upper left block after entring the map)
+ENDM