mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Allow to JR to numeric constants
Previously, JR was only allowed to labels (in the same section, or different sections). When trying to JR to an address specified as a numeric value, rgbasm would fail to calculate the JR offset (as it doesn't know the final address of the JR so it can't calculate the difference). This patch makes rgblink calculate the offset whenever there is a JR. Signed-off-by: Antonio Niño Díaz <antonio_nd@outlook.com>
This commit is contained in:
@@ -579,7 +579,7 @@ void setup_lexer(void)
|
||||
lex_FloatAddRange(id, '@', '@');
|
||||
lex_FloatAddRange(id, '#', '#');
|
||||
|
||||
//@ID
|
||||
// "@"
|
||||
|
||||
id = lex_FloatAlloc(&tIDToken);
|
||||
lex_FloatAddFirstRange(id, '@', '@');
|
||||
|
||||
@@ -882,24 +882,16 @@ void out_PCRelByte(struct Expression *expr)
|
||||
{
|
||||
checkcodesection();
|
||||
checksectionoverflow(1);
|
||||
if (rpn_isReloc(expr)) {
|
||||
if (nPass == 2) {
|
||||
pCurrentSection->tData[nPC] = 0;
|
||||
createpatch(PATCH_BYTE_JR, expr);
|
||||
}
|
||||
pCurrentSection->nPC += 1;
|
||||
nPC += 1;
|
||||
pPCSymbol->nValue += 1;
|
||||
} else {
|
||||
int32_t b = expr->nVal;
|
||||
|
||||
b = (int16_t)((b & 0xFFFF) - (nPC + 1));
|
||||
|
||||
if (nPass == 2 && ((b < -128) || (b > 127)))
|
||||
yyerror("PC-relative value must be 8-bit");
|
||||
|
||||
out_AbsByte(b & 0xFF);
|
||||
/* Always let the linker calculate the offset. */
|
||||
if (nPass == 2) {
|
||||
pCurrentSection->tData[nPC] = 0;
|
||||
createpatch(PATCH_BYTE_JR, expr);
|
||||
}
|
||||
pCurrentSection->nPC += 1;
|
||||
nPC += 1;
|
||||
pPCSymbol->nValue += 1;
|
||||
|
||||
rpn_Reset(expr);
|
||||
}
|
||||
|
||||
|
||||
@@ -314,7 +314,7 @@ void Patch(void)
|
||||
/* t contains the destination of the jump */
|
||||
t = (int16_t)((t & 0xFFFF) - (nPatchOrg + 1));
|
||||
|
||||
if (t >= -128 && t <= 255) {
|
||||
if (t >= -128 && t <= 127) {
|
||||
t &= 0xFF;
|
||||
pSect->pData[pPatch->nOffset] =
|
||||
(uint8_t)t;
|
||||
|
||||
Reference in New Issue
Block a user