This commit is contained in:
dannye 2025-05-10 12:25:27 -05:00
commit 2c74f137fc
27 changed files with 177 additions and 86 deletions

View File

@ -16,7 +16,7 @@ jobs:
uses: actions/checkout@master
with:
path: rgbds
ref: v0.9.0
ref: v0.9.2
repository: gbdev/rgbds
- name: Install rgbds

View File

@ -42,9 +42,9 @@ Run setup and leave the default settings. At the "**Select Packages**" step, cho
Double click on the text that says "**Skip**" next to each package to select the most recent version to install.
Then follow the [**rgbds** install instructions](https://rgbds.gbdev.io/install#pre-built) for Windows with Cygwin to install **rgbds 0.9.0**.
Then follow the [**rgbds** install instructions](https://rgbds.gbdev.io/install#pre-built) for Windows with Cygwin to install **rgbds 0.9.2**.
**Note:** If you already have an installed rgbds older than 0.9.0, you will need to update to 0.9.0. Ignore this if you have never installed rgbds before. If a version newer than 0.9.0 does not work, try downloading 0.9.0.
**Note:** If you already have an installed rgbds older than 0.9.2, you will need to update to 0.9.2. Ignore this if you have never installed rgbds before. If a version newer than 0.9.2 does not work, try downloading 0.9.2.
Now open the **Cygwin terminal** and enter the following commands.
@ -67,7 +67,7 @@ Install [**Homebrew**](https://brew.sh/). Follow the official instructions.
Open **Terminal** and prepare to enter commands.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for macOS to install **rgbds 0.9.0**.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#pre-built) for macOS to install **rgbds 0.9.2**.
Now you're ready to [build **pokeyellow**](#build-pokeyellow).
@ -84,7 +84,7 @@ To install the software required for **pokeyellow**:
sudo apt-get install make gcc git
```
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.0** from source.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.2** from source.
### OpenSUSE
@ -94,7 +94,7 @@ To install the software required for **pokeyellow**:
sudo zypper install make gcc git
```
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.0** from source.
Then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.2** from source.
### Arch Linux
@ -104,23 +104,23 @@ To install the software required for **pokeyellow**:
sudo pacman -S make gcc git rgbds
```
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.0** from source.
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.2** from source.
### Termux
To install the software required for **pokeyellow**:
```bash
sudo apt install make clang git sed
pkg install make clang git sed
```
To install **rgbds**:
```bash
sudo apt install rgbds
pkg install rgbds
```
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.0** from source.
If you want to compile and install **rgbds** yourself instead, then follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.2** from source.
### Other distros
@ -131,7 +131,7 @@ If your distro is not listed here, try to find the required software in its repo
- `git`
- `rgbds`
If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.0** from source.
If `rgbds` is not available, you'll need to follow the [**rgbds** instructions](https://rgbds.gbdev.io/install#building-from-source) to build **rgbds 0.9.2** from source.
Now you're ready to [build **pokeyellow**](#build-pokeyellow).
@ -153,8 +153,8 @@ make
### Build with a local rgbds version
If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.9.0 globally. Instead, you can put its files in a directory within pokeyellow, such as `pokeyellow/rgbds-0.9.0/`. Then specify it when you run `make`:
If you have different projects that require different versions of `rgbds`, it might not be convenient to install rgbds 0.9.2 globally. Instead, you can put its files in a directory within pokeyellow, such as `pokeyellow/rgbds-0.9.2/`. Then specify it when you run `make`:
```bash
make RGBDS=rgbds-0.9.0/
make RGBDS=rgbds-0.9.2/
```

View File

@ -23,7 +23,7 @@ pokeyellow_vc_obj := $(rom_obj:.o=_vc.o)
### Build tools
ifeq (,$(shell which sha1sum))
ifeq (,$(shell command -v sha1sum 2>/dev/null))
SHA1 := shasum
else
SHA1 := sha1sum

View File

@ -98,3 +98,7 @@ DEF NUM_GROWTH_RATES EQU const_value
; wild data (see data/wild/maps/*.asm)
DEF NUM_WILDMONS EQU 10
DEF WILDDATA_LENGTH EQU 1 + NUM_WILDMONS * 2
; PP in box_struct (see macros/ram.asm)
DEF PP_UP_MASK EQU %11000000 ; number of PP Up used
DEF PP_MASK EQU %00111111 ; currently remaining PP

View File

@ -43,6 +43,7 @@ DEF NUM_NPC_TRADES EQU const_value
const TRADE_DIALOGSET_CASUAL
const TRADE_DIALOGSET_EVOLUTION
const TRADE_DIALOGSET_HAPPY
DEF NUM_TRADE_DIALOGSETS EQU const_value
; OaksAideScript results
DEF OAKS_AIDE_BAG_FULL EQU $00

View File

@ -2,7 +2,7 @@ DEF NAME_LENGTH EQU 11
DEF ITEM_NAME_LENGTH EQU 13
DEF NAME_BUFFER_LENGTH EQU 20
; PrintNumber
; PrintNumber, PrintBCDNumber
const_def 5
const BIT_MONEY_SIGN ; 5
const BIT_LEFT_ALIGN ; 6

View File

@ -4,8 +4,11 @@ TradeMons:
; give mon, get mon, dialog id, nickname
; The two instances of TRADE_DIALOGSET_EVOLUTION are a leftover
; from the Japanese Blue trades, which used species that evolve.
; Japanese Red and Green used TRADE_DIALOGSET_CASUAL, and had
; the same species as English Red and Blue.
; TRADE_DIALOGSET_EVOLUTION did not refer to evolution in Japanese
; Red/Green. Japanese Blue changed _AfterTrade2Text to say your Pokémon
; "went and evolved" and also changed the trades to match. English
; Red/Blue uses the original JP Red/Green trades but with the JP Blue
; post-trade text.
db LICKITUNG, DUGTRIO, TRADE_DIALOGSET_CASUAL, "GURIO@@@@@@"
db CLEFAIRY, MR_MIME, TRADE_DIALOGSET_CASUAL, "MILES@@@@@@"
db BUTTERFREE, BEEDRILL, TRADE_DIALOGSET_HAPPY, "STINGER@@@@" ; unused

View File

@ -2753,7 +2753,7 @@ ENDC
ld b, $0
add hl, bc
ld a, [hl]
and $3f
and PP_MASK
jr z, .noPP
ld a, [wPlayerDisabledMove]
swap a
@ -2885,7 +2885,7 @@ AnyMoveToSelect:
or [hl]
inc hl
or [hl]
and $3f
and PP_MASK
ret nz
jr .noMovesLeft
.handleDisabledMove
@ -3049,7 +3049,7 @@ PrintMenuItem:
ld hl, wBattleMonPP
add hl, bc
ld a, [hl]
and $3f
and PP_MASK
ld [wBattleMenuCurrentPP], a
; print TYPE/<type> and <curPP>/<maxPP>
hlcoord 1, 9
@ -4242,18 +4242,18 @@ CheckForDisobedience:
ld hl, wBattleMonPP
push hl
ld a, [hli]
and $3f
and PP_MASK
ld b, a
ld a, [hli]
and $3f
and PP_MASK
add b
ld b, a
ld a, [hli]
and $3f
and PP_MASK
add b
ld b, a
ld a, [hl]
and $3f
and PP_MASK
add b
pop hl
push af
@ -4262,7 +4262,7 @@ CheckForDisobedience:
ld b, $0
add hl, bc
ld a, [hl]
and $3f
and PP_MASK
ld b, a
pop af
cp b

View File

@ -1388,7 +1388,7 @@ DisableEffect:
or [hl]
inc hl
or [hl]
and $3f
and PP_MASK
pop hl ; wBattleMonPP or wEnemyMonPP
jr z, .moveMissedPopHL ; nothing to do if all moves have no PP left
add hl, bc

View File

@ -50,7 +50,7 @@ HealParty:
push bc
ld b, a
ld a, [hl]
and $c0
and PP_UP_MASK
add b
ld [hl], a
pop bc

View File

@ -1,3 +1,12 @@
; TradeTextPointers1-3 indexes
const_def
const TRADETEXT_WANNA_TRADE ; 0
const TRADETEXT_NO_TRADE ; 1
const TRADETEXT_WRONG_MON ; 2
const TRADETEXT_THANKS ; 3
const TRADETEXT_AFTER_TRADE ; 4
DEF NUM_TRADE_TEXTS EQU const_value
DoInGameTradeDialogue:
; trigger the trade offer/action specified by wWhichTrade
call SaveScreenTilesToBuffer2
@ -30,7 +39,7 @@ DoInGameTradeDialogue:
ld a, [wInGameTradeReceiveMonSpecies]
ld de, wInGameTradeReceiveMonName
call InGameTrade_GetMonName
ld a, $4
ld a, TRADETEXT_AFTER_TRADE
ld [wInGameTradeTextPointerTableIndex], a
ld b, FLAG_TEST
call InGameTrade_FlagActionPredef
@ -38,10 +47,10 @@ DoInGameTradeDialogue:
and a
jr nz, .printText
; if the trade hasn't been done yet
ld a, $0
ld a, TRADETEXT_WANNA_TRADE
ld [wInGameTradeTextPointerTableIndex], a
call .printText
ld a, $1
ld a, TRADETEXT_NO_TRADE
ld [wInGameTradeTextPointerTableIndex], a
call YesNoChoice
ld a, [wCurrentMenuItem]
@ -87,13 +96,13 @@ InGameTrade_DoTrade:
push af
call InGameTrade_RestoreScreen
pop af
ld a, $1
ld a, TRADETEXT_NO_TRADE
jp c, .tradeFailed ; jump if the player didn't select a pokemon
ld a, [wInGameTradeGiveMonSpecies]
ld b, a
ld a, [wCurPartySpecies]
cp b
ld a, $2
ld a, TRADETEXT_WRONG_MON
jr nz, .tradeFailed ; jump if the selected mon's species is not the required one
ld a, [wWhichPokemon]
ld hl, wPartyMon1Level
@ -131,7 +140,7 @@ InGameTrade_DoTrade:
call InGameTrade_RestoreScreen
farcall RedrawMapView
and a
ld a, $3
ld a, TRADETEXT_THANKS
jr .tradeSucceeded
.tradeFailed
scf
@ -254,30 +263,38 @@ InGameTrade_TrainerString:
InGameTradeTextPointers:
; entries correspond to TRADE_DIALOGSET_* constants
table_width 2
dw TradeTextPointers1
dw TradeTextPointers2
dw TradeTextPointers3
assert_table_length NUM_TRADE_DIALOGSETS
TradeTextPointers1:
table_width 2
dw WannaTrade1Text
dw NoTrade1Text
dw WrongMon1Text
dw Thanks1Text
dw AfterTrade1Text
assert_table_length NUM_TRADE_TEXTS
TradeTextPointers2:
table_width 2
dw WannaTrade2Text
dw NoTrade2Text
dw WrongMon2Text
dw Thanks2Text
dw AfterTrade2Text
assert_table_length NUM_TRADE_TEXTS
TradeTextPointers3:
table_width 2
dw WannaTrade3Text
dw NoTrade3Text
dw WrongMon3Text
dw Thanks3Text
dw AfterTrade3Text
assert_table_length NUM_TRADE_TEXTS
ConnectCableText:
text_far _ConnectCableText

View File

@ -125,18 +125,15 @@ GetPrizeMenuId:
; put prices on the right side of the textbox
ld de, wPrize1Price
hlcoord 13, 5
; reg. c:
; [low nybble] number of bytes
; [bits 765 = %100] space-padding (not zero-padding)
ld c, (1 << 7) | 2
ld c, 2 | LEADING_ZEROES
call PrintBCDNumber
ld de, wPrize2Price
hlcoord 13, 7
ld c, (1 << 7) | 2
ld c, 2 | LEADING_ZEROES
call PrintBCDNumber
ld de, wPrize3Price
hlcoord 13, 9
ld c, (1 << 7) | 2
ld c, 2 | LEADING_ZEROES
jp PrintBCDNumber
NoThanksText:
@ -157,7 +154,7 @@ PrintPrizePrice:
call PlaceString
hlcoord 13, 1
ld de, wPlayerCoins
ld c, %10000010
ld c, 2 | LEADING_ZEROES
call PrintBCDNumber
ret

View File

@ -295,13 +295,13 @@ INCLUDE "data/pokemon/menu_icons.asm"
DEF INC_FRAME_1 EQUS "0, $20"
DEF INC_FRAME_2 EQUS "$20, $20"
BugIconFrame1: INCBIN "gfx/icons/bug.2bpp", INC_FRAME_1
PlantIconFrame1: INCBIN "gfx/icons/plant.2bpp", INC_FRAME_1
BugIconFrame2: INCBIN "gfx/icons/bug.2bpp", INC_FRAME_2
PlantIconFrame2: INCBIN "gfx/icons/plant.2bpp", INC_FRAME_2
SnakeIconFrame1: INCBIN "gfx/icons/snake.2bpp", INC_FRAME_1
BugIconFrame1: INCBIN "gfx/icons/bug.2bpp", INC_FRAME_1
PlantIconFrame1: INCBIN "gfx/icons/plant.2bpp", INC_FRAME_1
BugIconFrame2: INCBIN "gfx/icons/bug.2bpp", INC_FRAME_2
PlantIconFrame2: INCBIN "gfx/icons/plant.2bpp", INC_FRAME_2
SnakeIconFrame1: INCBIN "gfx/icons/snake.2bpp", INC_FRAME_1
QuadrupedIconFrame1: INCBIN "gfx/icons/quadruped.2bpp", INC_FRAME_1
SnakeIconFrame2: INCBIN "gfx/icons/snake.2bpp", INC_FRAME_2
SnakeIconFrame2: INCBIN "gfx/icons/snake.2bpp", INC_FRAME_2
QuadrupedIconFrame2: INCBIN "gfx/icons/quadruped.2bpp", INC_FRAME_2
TradeBubbleIconGFX: INCBIN "gfx/trade/bubble.2bpp"

View File

@ -2301,7 +2301,7 @@ ItemUsePPRestore:
cp MAX_ETHER
jr z, .fullyRestorePP
ld a, [hl] ; move PP
and %00111111 ; lower 6 bit bits store current PP
and PP_MASK
cp b ; does current PP equal max PP?
ret z ; if so, return
add 10 ; increase current PP by 10
@ -2314,7 +2314,7 @@ ItemUsePPRestore:
ld b, a
.storeNewAmount
ld a, [hl] ; move PP
and %11000000 ; PP Up counter bits
and PP_UP_MASK
add b
ld [hl], a
ret
@ -2684,7 +2684,7 @@ RestoreBonusPP:
jr nz, .nextMove
.skipMenuItemIDCheck
ld a, [hl]
and %11000000 ; have any PP Ups been used?
and PP_UP_MASK
call nz, AddBonusPP ; if so, add bonus PP
.nextMove
inc hl
@ -2791,7 +2791,7 @@ GetMaxPP:
.addPPOffset
add hl, bc
ld a, [hl] ; a = current PP
and %11000000 ; get PP Up count
and PP_UP_MASK
pop bc
or b ; place normal max PP in 6 lower bits of a
ASSERT wMoveData + MOVE_PP + 1 == wPPUpCountAndMaxPP
@ -2803,7 +2803,7 @@ GetMaxPP:
ld [wUsingPPUp], a
call AddBonusPP ; add bonus PP from PP Ups
ld a, [hl]
and %00111111 ; mask out the PP Up count
and PP_MASK
ld [wMaxPP], a ; store max PP
ret

View File

@ -570,7 +570,7 @@ DrawTrainerInfo:
call PlaceString
hlcoord 8, 4
ld de, wPlayerMoney
ld c, $e3
ld c, 3 | LEADING_ZEROES | LEFT_ALIGN | MONEY_SIGN
call PrintBCDNumber
hlcoord 9, 6
ld de, wPlayTimeHours ; hours

View File

@ -138,7 +138,7 @@ DisplayMoneyBox:
call ClearScreenArea
hlcoord 12, 1
ld de, wPlayerMoney
ld c, $a3
ld c, 3 | LEADING_ZEROES | MONEY_SIGN
call PrintBCDNumber
ld hl, wStatusFlags5
res BIT_NO_TEXT_DELAY, [hl]

View File

@ -252,7 +252,7 @@ HoFDisplayPlayerStats:
call PlaceString
hlcoord 4, 10
ld de, wPlayerMoney
ld c, $a3
ld c, 3 | LEADING_ZEROES | MONEY_SIGN
call PrintBCDNumber
ld hl, DexSeenOwnedText
call HoFPrintTextAndDelay

View File

@ -378,7 +378,7 @@ StatusScreen2:
ld bc, wPartyMon1PP - wPartyMon1Moves - 1
add hl, bc
ld a, [hl]
and $3f
and PP_MASK
ld [wStatusScreenCurrentPP], a
ld h, d
ld l, e

View File

@ -648,7 +648,7 @@ SlotMachine_SubtractBetFromPlayerCoins:
SlotMachine_PrintCreditCoins:
hlcoord 5, 1
ld de, wPlayerCoins
ld c, $2
ld c, 2
jp PrintBCDNumber
SlotMachine_PrintPayoutCoins:

View File

@ -293,7 +293,7 @@ DisplayChooseQuantityMenu::
ld de, SpacesBetweenQuantityAndPriceText
call PlaceString
ld de, hMoney ; total price
ld c, $a3
ld c, 3 | LEADING_ZEROES | MONEY_SIGN
call PrintBCDNumber
hlcoord 9, 10
.printQuantity
@ -417,7 +417,7 @@ PrintListMenuEntries::
pop hl
ld bc, SCREEN_WIDTH + 5 ; 1 row down and 5 columns right
add hl, bc
ld c, $a3 ; no leading zeroes, right-aligned, print currency symbol, 3 bytes
ld c, 3 | LEADING_ZEROES | MONEY_SIGN
call PrintBCDNumber
.skipPrintingItemPrice
ld a, [wListMenuID]

View File

@ -44,7 +44,7 @@ MACRO list_start
ENDM
MACRO li
ASSERT !STRIN(\1, "@"), STRCAT("String terminator \"@\" in list entry: ", \1)
ASSERT STRFIND(\1, "@") == -1, STRCAT("String terminator \"@\" in list entry: ", \1)
db \1, "@"
DEF list_index += 1
ENDM

View File

@ -11,9 +11,17 @@ MACRO validate_coords
ENDC
ENDM
DEF hlcoord EQUS "coord hl,"
DEF bccoord EQUS "coord bc,"
DEF decoord EQUS "coord de,"
MACRO hlcoord
coord hl, \#
ENDM
MACRO bccoord
coord bc, \#
ENDM
MACRO decoord
coord de, \#
ENDM
MACRO coord
; register, x, y[, origin]
@ -25,9 +33,17 @@ MACRO coord
ENDC
ENDM
DEF hlbgcoord EQUS "bgcoord hl,"
DEF bcbgcoord EQUS "bgcoord bc,"
DEF debgcoord EQUS "bgcoord de,"
MACRO hlbgcoord
bgcoord hl, \#
ENDM
MACRO bcbgcoord
bgcoord bc, \#
ENDM
MACRO debgcoord
bgcoord de, \#
ENDM
MACRO bgcoord
; register, x, y[, origin]
@ -39,9 +55,17 @@ MACRO bgcoord
ENDC
ENDM
DEF hlowcoord EQUS "owcoord hl,"
DEF bcowcoord EQUS "owcoord bc,"
DEF deowcoord EQUS "owcoord de,"
MACRO hlowcoord
owcoord hl, \#
ENDM
MACRO bcowcoord
owcoord bc, \#
ENDM
MACRO deowcoord
owcoord de, \#
ENDM
MACRO owcoord
; register, x, y, map width

View File

@ -225,8 +225,14 @@ MACRO connection
dw wOverworldMap + _win
ENDM
DEF def_script_pointers EQUS "const_def"
MACRO def_script_pointers
const_def
ENDM
DEF def_text_pointers EQUS "const_def 1"
MACRO def_text_pointers
const_def 1
ENDM
DEF object_const_def EQUS "const_def 1"
MACRO object_const_def
const_def 1
ENDM

View File

@ -1,13 +1,38 @@
DEF text EQUS "db TX_START," ; Start writing text.
DEF next EQUS "db \"<NEXT>\"," ; Move a line down.
DEF line EQUS "db \"<LINE>\"," ; Start writing at the bottom line.
DEF para EQUS "db \"<PARA>\"," ; Start a new paragraph.
DEF cont EQUS "db \"<CONT>\"," ; Scroll to the next line.
DEF done EQUS "db \"<DONE>\"" ; End a text box.
DEF prompt EQUS "db \"<PROMPT>\"" ; Prompt the player to end a text box (initiating some other event).
MACRO text
db TX_START, \# ; Start writing text
ENDM
DEF page EQUS "db \"<PAGE>\"," ; Start a new Pokédex page.
DEF dex EQUS "db \"<DEXEND>\", \"@\"" ; End a Pokédex entry.
MACRO next
db "<NEXT>", \# ; Move a line down
ENDM
MACRO line
db "<LINE>", \# ; Start writing at the bottom line
ENDM
MACRO para
db "<PARA>", \# ; Start a new paragraph
ENDM
MACRO cont
db "<CONT>", \# ; Scroll to the next line
ENDM
MACRO done
db "<DONE>" ; End a text box
ENDM
MACRO prompt
db "<PROMPT>" ; Prompt the player to end a text box (initiating some other event)
ENDM
MACRO page
db "<PAGE>", \# ; Start a new Pokédex page
ENDM
MACRO dex
db "<DEXEND>@" ; End a Pokédex entry
ENDM
; TextCommandJumpTable indexes (see home/text.asm)

View File

@ -1,6 +1,6 @@
IF !DEF(__RGBDS_MAJOR__) || !DEF(__RGBDS_MINOR__) || !DEF(__RGBDS_PATCH__)
fail "pokeyellow requires rgbds v0.9.0 or newer."
fail "pokeyellow requires rgbds v0.9.2 or newer."
ENDC
IF __RGBDS_MAJOR__ == 0 && __RGBDS_MINOR__ < 9
fail "pokeyellow requires rgbds v0.9.0 or newer."
IF __RGBDS_MAJOR__ == 0 && (__RGBDS_MINOR__ < 9 || (__RGBDS_MINOR__ == 9 && __RGBDS_PATCH__ < 2))
fail "pokeyellow requires rgbds v0.9.2 or newer."
ENDC

View File

@ -513,7 +513,7 @@ GameCornerDrawCoinBox:
call PlaceString
hlcoord 15, 5
ld de, wPlayerCoins
ld c, $82
ld c, 2 | LEADING_ZEROES
call PrintBCDNumber
ld hl, wStatusFlags5
res BIT_NO_TEXT_DELAY, [hl]

View File

@ -183,6 +183,16 @@ int parse_arg_value(const char *arg, bool absolute, const struct Symbol *symbols
return parse_number(arg, 0);
}
// Symbols may take the low or high part
enum { SYM_WHOLE, SYM_LOW, SYM_HIGH } part = SYM_WHOLE;
if (arg[0] == '<') {
part = SYM_LOW;
arg++;
} else if (arg[0] == '>') {
part = SYM_HIGH;
arg++;
}
// Symbols evaluate to their offset or address, plus an optional offset mod
int offset_mod = 0;
char *plus = strchr(arg, '+');
@ -190,9 +200,13 @@ int parse_arg_value(const char *arg, bool absolute, const struct Symbol *symbols
offset_mod = parse_number(plus, 0);
*plus = '\0';
}
// Symbols evaluate to their offset or address
const char *sym_name = !strcmp(arg, "@") ? patch_name : arg; // "@" is the current patch label
const struct Symbol *symbol = symbol_find(symbols, sym_name);
return (absolute ? symbol->offset : symbol->address) + offset_mod;
int value = (absolute ? symbol->offset : symbol->address) + offset_mod;
return part == SYM_LOW ? value & 0xff : part == SYM_HIGH ? value >> 8 : value;
}
void interpret_command(char *command, const struct Symbol *current_hook, const struct Symbol *symbols, struct Buffer *patches, FILE *restrict new_rom, FILE *restrict orig_rom, FILE *restrict output) {
@ -413,7 +427,7 @@ struct Buffer *process_template(const char *template_filename, const char *patch
int compare_patch(const void *patch1, const void *patch2) {
unsigned int offset1 = ((const struct Patch *)patch1)->offset;
unsigned int offset2 = ((const struct Patch *)patch2)->offset;
return offset1 > offset2 ? 1 : offset1 < offset2 ? -1 : 0;
return (offset1 > offset2) - (offset1 < offset2);
}
bool verify_completeness(FILE *restrict orig_rom, FILE *restrict new_rom, struct Buffer *patches) {