diff --git a/apps/zasm/README.md b/apps/zasm/README.md index 335660b..ac678db 100644 --- a/apps/zasm/README.md +++ b/apps/zasm/README.md @@ -115,6 +115,10 @@ allowed. An included file cannot have an `#inc` directive. **.equ**: Binds a symbol named after the first parameter to the value of the expression written as the second parameter. Example: `.equ foo 0x42+'A'` + + If the symbol specified has already been defined, no error occur and + the first value defined stays intact. This allows for "user override" + of programs. **.fill**: Outputs the number of null bytes specified by its argument, an expression. Often used with `$` to fill our binary up to a certain diff --git a/apps/zasm/directive.asm b/apps/zasm/directive.asm index e25ab4d..4bf8afc 100644 --- a/apps/zasm/directive.asm +++ b/apps/zasm/directive.asm @@ -149,6 +149,13 @@ handleEQU: ld hl, DIREC_SCRATCHPAD push ix \ pop de call symRegisterConst ; A and Z set + jr z, .end ; success + ; register ended up in error. We need to figure which error. If it's + ; a duplicate error, we ignore it and return success because, as per + ; ".equ" policy, it's fine to define the same const twice. The first + ; value has precedence. + cp ERR_DUPSYM + ; whatever the value of Z, it's the good one, return jr .end .badfmt: ld a, ERR_BAD_FMT diff --git a/tools/emul/zasm/zasm.bin b/tools/emul/zasm/zasm.bin index f74da55..7a7a56f 100644 Binary files a/tools/emul/zasm/zasm.bin and b/tools/emul/zasm/zasm.bin differ diff --git a/tools/tests/zasm/errtests.sh b/tools/tests/zasm/errtests.sh index 87537a9..dd4a76b 100755 --- a/tools/tests/zasm/errtests.sh +++ b/tools/tests/zasm/errtests.sh @@ -55,5 +55,5 @@ chkerr "#inc foo" 19 chkerr "ld a, 0x100" 20 chkerr ".db 0x100" 20 chkerr "#inc \"doesnotexist\"" 21 -chkerr ".equ foo 42 \\ .equ foo 42" 22 +chkerr "foo:\\foo:" 22 chkoom diff --git a/tools/tests/zasm/test7.asm b/tools/tests/zasm/test7.asm new file mode 100644 index 0000000..c5976ad --- /dev/null +++ b/tools/tests/zasm/test7.asm @@ -0,0 +1,5 @@ +; It's fine to declare the same constant twice. Only the first value is +; kept +.equ FOO 42 +.equ FOO 22 +ld a, FOO diff --git a/tools/tests/zasm/test7.asm.expected b/tools/tests/zasm/test7.asm.expected new file mode 100644 index 0000000..29cc4ea --- /dev/null +++ b/tools/tests/zasm/test7.asm.expected @@ -0,0 +1 @@ +>* \ No newline at end of file