diff options
Diffstat (limited to 'macros.asm')
-rw-r--r-- | macros.asm | 265 |
1 files changed, 225 insertions, 40 deletions
@@ -17,6 +17,22 @@ lb: MACRO ; r, hi, lo ld \1, (\2) << 8 + ((\3) & $ff) ENDM +SHADE_BLACK EQU %11 +SHADE_DARK EQU %10 +SHADE_LIGHT EQU %01 +SHADE_WHITE EQU %00 + +setpal: MACRO + ld a, \1 << 6 | \2 << 4 | \3 << 2 | \4 +ENDM + +setpalBGP: MACRO + setpal SHADE_BLACK, SHADE_DARK, SHADE_LIGHT, SHADE_WHITE +ENDM + +setpalOBP: MACRO + setpal SHADE_BLACK, SHADE_DARK, SHADE_WHITE, SHADE_WHITE +ENDM ; Constant enumeration is useful for monsters, items, moves, etc. const_def: MACRO @@ -28,20 +44,58 @@ const: MACRO 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_jump_sf: MACRO + ld a, [H_LOADEDROMBANK] + push af + ld a, BANK(\1) + call BankswitchCommon + call \1 + pop bc + ld a,b + jp BankswitchCommon + ENDM homecall: MACRO ld a, [H_LOADEDROMBANK] push af ld a, BANK(\1) - ld [H_LOADEDROMBANK], a - ld [MBC1RomBank], a + call BankswitchCommon call \1 pop af - ld [H_LOADEDROMBANK], a - ld [MBC1RomBank], a + 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 -farcall EQUS "callba" +switchbank: MACRO + ld a, BANK(\1) + call BankswitchCommon + ENDM + +callbs: MACRO + ld a, BANK(\1) + call BankswitchCommon + call \1 + ENDM callba: MACRO ld b, BANK(\1) @@ -55,6 +109,20 @@ callab: MACRO call Bankswitch ENDM +calladb_ModifyPikachuHappiness: MACRO + ld hl, ModifyPikachuHappiness + ld d, \1 + ld b, BANK(ModifyPikachuHappiness) + call Bankswitch + ENDM + +callabd_ModifyPikachuHappiness: MACRO + ld hl, ModifyPikachuHappiness + ld b, BANK(ModifyPikachuHappiness) + ld d, \1 + call Bankswitch + ENDM + jpba: MACRO ld b, BANK(\1) ld hl, \1 @@ -81,29 +149,62 @@ bcd3: MACRO coins equs "bcd2" money equs "bcd3" +validateCoords: MACRO + if \1 >= SCREEN_WIDTH + fail "x coord out of range" + endc + if \2 >= SCREEN_HEIGHT + fail "y coord out of range" + endc + endm + ;\1 = r ;\2 = X ;\3 = Y +;\4 = which tilemap (optional) coord: MACRO - ld \1, wTileMap + 20 * \3 + \2 + validateCoords \2, \3 +if _NARG >= 4 + ld \1, \4 + SCREEN_WIDTH * \3 + \2 +else + ld \1, wTileMap + SCREEN_WIDTH * \3 + \2 +endc ENDM ;\1 = X ;\2 = Y +;\3 = which tilemap (optional) aCoord: MACRO - ld a, [wTileMap + 20 * \2 + \1] + validateCoords \1, \2 +if _NARG >= 3 + ld a, [\3 + SCREEN_WIDTH * \2 + \1] +else + ld a, [wTileMap + SCREEN_WIDTH * \2 + \1] +endc ENDM ;\1 = X ;\2 = Y +;\3 = which tilemap (optional) Coorda: MACRO - ld [wTileMap + 20 * \2 + \1], a + validateCoords \1, \2 +if _NARG >= 3 + ld [\3 + SCREEN_WIDTH * \2 + \1], a +else + ld [wTileMap + SCREEN_WIDTH * \2 + \1], a +endc ENDM ;\1 = X ;\2 = Y +;\3 = which tilemap (optional) dwCoord: MACRO - dw wTileMap + 20 * \2 + \1 + validateCoords \1, \2 +if _NARG >= 3 + dw \3 + SCREEN_WIDTH * \2 + \1 +else + dw wTileMap + SCREEN_WIDTH * \2 + \1 +endc ENDM ;\1 = r @@ -134,7 +235,7 @@ EMAP: MACRO ; emap x-coordinate,y-coordinate,textpointer ; nybble: y-coordinate ; nybble: x-coordinate ; word : pointer to map name - db (\1 + (\2 << 4)) + dn \2, \1 dw \3 ENDM @@ -146,7 +247,7 @@ IMAP: MACRO ; imap mapid_less_than,x-coordinate,y-coordinate,textpointer ; nybble: x-coordinate ; word : pointer to map name db \1 + 1 - db \2 + \3 << 4 + dn \3, \2 dw \4 ENDM @@ -174,28 +275,30 @@ dbw: MACRO dw \2 ENDM -; data format macros -RGB: MACRO - dw (\3 << 10 | \2 << 5 | \1) +dba: MACRO + dbw BANK(\1), \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 +dwb: MACRO dw \1 - db \2 << 4 | \3 + db \2 ENDM -TX_FAR: MACRO - db $17 - dw \1 - db BANK(\1) +dab: MACRO + dwb \1, BANK(\1) ENDM +dbbw: MACRO + db \1, \2 + dw \3 + ENDM + +; data format macros +RGB: MACRO + dw (\3 << 10 | \2 << 5 | \1) + ENDM + +; text macros ; text engine command $1 TX_RAM: MACRO ; prints text to screen @@ -212,32 +315,62 @@ TX_BCD: MACRO db \2 ENDM -TX_MART: MACRO - db $FE, _NARG - rept _NARG - db \1 - shift - endr - db $FF +TX_CURSOR: MACRO +; Move cursor to (\1, \2) +; \1: X coord (0 - 19) +; \2: Y coord (0 - 17) + db $3 + dwCoord \1, \2 ENDM TX_LINE EQUS "db $05" TX_BUTTON_SOUND EQUS "db $06" TX_ASM EQUS "db $08" + +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_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_FAR: MACRO +; 17AAAABB (call text at BB:AAAA) + db $17 + dab \1 + ENDM + 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_MART: MACRO + db $FE, _NARG + rept _NARG + db \1 + shift + endr + db $FF + ENDM + TX_POKECENTER_NURSE EQUS "db $ff" ; Predef macro. +predef_const: MACRO + const \1PredefID + ENDM + add_predef: MACRO \1Predef:: db BANK(\1) @@ -258,11 +391,18 @@ predef_jump: MACRO jp Predef ENDM +tx_pre_const: MACRO + const \1_id + ENDM add_tx_pre: MACRO \1_id:: dw \1 ENDM +db_tx_pre: MACRO + db (\1_id - TextPredefs) / 2 + 1 +ENDM + tx_pre_id: MACRO ld a, (\1_id - TextPredefs) / 2 + 1 ENDM @@ -315,11 +455,6 @@ object: MACRO ENDC ENDM -StopAllMusic: macro - ld a, $ff - call PlaySound - endm - ;1_channel EQU $00 ;2_channels EQU $40 ;3_channels EQU $80 @@ -674,10 +809,60 @@ ENDM tmlearn: MACRO x = 0 rept _NARG -if \1 != 0 +IF \1 != 0 x = x | (1 << ((\1 - 1) % 8)) -endc +ENDC shift endr db x ENDM + +sine_wave: MACRO +; \1: amplitude + +x = 0 + rept $20 + ; Round up. + dw (sin(x) + (sin(x) & $ff)) >> 8 +x = x + (\1) * $40000 + endr +ENDM + +enum_start: macro +if _NARG >= 1 +__enum__ = \1 +else +__enum__ = 0 +endc +if _NARG >= 2 +__enumdir__ = \2 +else +__enumdir__ = +1 +endc +endm + +enum: macro +\1 = __enum__ +__enum__ = __enum__ + __enumdir__ +endm + +enum_set: macro +__enum__ = \1 +endm + +ANIM_OBJ_INDEX EQUS "AnimatedObject0Index - AnimatedObject0" +ANIM_OBJ_FRAME_SET EQUS "AnimatedObject0FramesetID - AnimatedObject0" +ANIM_OBJ_CALLBACK EQUS "AnimatedObject0AnimSeqID - AnimatedObject0" +ANIM_OBJ_TILE EQUS "AnimatedObject0TileID - AnimatedObject0" +ANIM_OBJ_X_COORD EQUS "AnimatedObject0XCoord - AnimatedObject0" +ANIM_OBJ_Y_COORD EQUS "AnimatedObject0YCoord - AnimatedObject0" +ANIM_OBJ_X_OFFSET EQUS "AnimatedObject0XOffset - AnimatedObject0" +ANIM_OBJ_Y_OFFSET EQUS "AnimatedObject0YOffset - AnimatedObject0" +ANIM_OBJ_DURATION EQUS "AnimatedObject0Duration - AnimatedObject0" +ANIM_OBJ_DURATION_OFFSET EQUS "AnimatedObject0DurationOffset - AnimatedObject0" +ANIM_OBJ_FRAME_IDX EQUS "AnimatedObject0FrameIndex - AnimatedObject0" +ANIM_OBJ_FIELD_B EQU $b +ANIM_OBJ_FIELD_C EQU $c +ANIM_OBJ_FIELD_D EQU $d +ANIM_OBJ_FIELD_E EQU $e +ANIM_OBJ_FIELD_F EQU $f |