From 4c8724899bed124faa848a9b5459d5933997173c Mon Sep 17 00:00:00 2001 From: Rangi <35663410+Rangi42@users.noreply.github.com> Date: Thu, 17 Jul 2025 15:49:28 -0400 Subject: [PATCH] Support `SIZEOF(reg)` to distinguish 8- and 16-bit registers (#1758) --- man/rgbasm.5 | 3 +++ src/asm/parser.y | 29 +++++++++++++++++++++++++++++ test/asm/sizeof-reg.asm | 30 ++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 test/asm/sizeof-reg.asm diff --git a/man/rgbasm.5 b/man/rgbasm.5 index ab0f01c5..53cad5e5 100644 --- a/man/rgbasm.5 +++ b/man/rgbasm.5 @@ -715,6 +715,9 @@ is a string, this function returns the size of the section named If .Ar arg is a section type keyword, it returns the size of that section type. +If +.Ar arg +is an 8-bit or 16-bit register, it returns the size of that register. The result is not constant, since only RGBLINK can compute its value. .It Fn STARTOF arg Ta If .Ar arg diff --git a/src/asm/parser.y b/src/asm/parser.y index 85a520ac..061b3c1c 100644 --- a/src/asm/parser.y +++ b/src/asm/parser.y @@ -1520,6 +1520,12 @@ relocexpr_no_str: | OP_STARTOF LPAREN sect_type RPAREN { $$.makeStartOfSectionType($3); } + | OP_SIZEOF LPAREN MODE_R8 RPAREN { + $$.makeNumber(1); + } + | OP_SIZEOF LPAREN MODE_R16 RPAREN { + $$.makeNumber(2); + } | OP_DEF { lexer_ToggleStringExpansion(false); } LPAREN scoped_sym RPAREN { @@ -2551,6 +2557,29 @@ op_sp_offset: // Registers and condition codes. +MODE_R8: + MODE_A + | MODE_B + | MODE_C + | MODE_D + | MODE_E + | MODE_H + | MODE_L + | LBRACK MODE_BC RBRACK + | LBRACK MODE_DE RBRACK + | LBRACK MODE_HL RBRACK + | hl_ind_inc + | hl_ind_dec +; + +MODE_R16: + MODE_AF + | MODE_BC + | MODE_DE + | MODE_HL + | MODE_SP +; + MODE_A: TOKEN_A | OP_HIGH LPAREN MODE_AF RPAREN diff --git a/test/asm/sizeof-reg.asm b/test/asm/sizeof-reg.asm new file mode 100644 index 00000000..7019fc2b --- /dev/null +++ b/test/asm/sizeof-reg.asm @@ -0,0 +1,30 @@ +assert sizeof(a) == 1 +assert sizeof(b) == 1 +assert sizeof(c) == 1 +assert sizeof(d) == 1 +assert sizeof(e) == 1 +assert sizeof(h) == 1 +assert sizeof(l) == 1 + +assert sizeof([bc]) == 1 +assert sizeof([de]) == 1 +assert sizeof([hl]) == 1 + +assert sizeof([hli]) == 1 +assert sizeof([hl+]) == 1 +assert sizeof([hld]) == 1 +assert sizeof([hl-]) == 1 + +assert sizeof(af) == 2 +assert sizeof(bc) == 2 +assert sizeof(de) == 2 +assert sizeof(hl) == 2 +assert sizeof(sp) == 2 + +assert sizeof(high(af)) == 1 +assert sizeof(high(bc)) == 1 +assert sizeof(low(bc)) == 1 +assert sizeof(high(de)) == 1 +assert sizeof(low(de)) == 1 +assert sizeof(high(hl)) == 1 +assert sizeof(low(hl)) == 1