Browse Source

zasm: Constants now override labels at all times

Will be important for a mega-commit I'm preparing.
pull/85/head
Virgil Dupras 4 years ago
parent
commit
6e714875dc
3 changed files with 24 additions and 12 deletions
  1. +7
    -5
      apps/zasm/README.md
  2. +7
    -7
      apps/zasm/symbol.asm
  3. +10
    -0
      tools/tests/unit/test_core.asm

+ 7
- 5
apps/zasm/README.md View File

@@ -76,6 +76,12 @@ forward-reference labels.


However, they *cannot* forward-reference other constants. However, they *cannot* forward-reference other constants.


When defining a constant, 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.

It's also important to note that constants always override labels, regardless
of declaration order.


## Expressions ## Expressions


@@ -119,12 +125,8 @@ allowed. An included file cannot have an `.inc` directive.


**.equ**: Binds a symbol named after the first parameter to the value of the **.equ**: Binds a symbol named after the first parameter to the value of the
expression written as the second parameter. Example: expression written as the second parameter. Example:
`.equ foo 0x42+'A'`
`.equ foo 0x42+'A'`. See "Constants" above.
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 **.fill**: Outputs the number of null bytes specified by its argument, an
expression. Often used with `$` to fill our binary up to a certain expression. Often used with `$` to fill our binary up to a certain
offset. For example, if we want to place an instruction exactly at offset. For example, if we want to place an instruction exactly at


+ 7
- 7
apps/zasm/symbol.asm View File

@@ -112,11 +112,11 @@ symRegister:
push de ; --> lvl 3 push de ; --> lvl 3
ld d, 0 ld d, 0
ld e, c ld e, c
add hl, de ; if carry set here, sbc will carry too
add hl, de ; if carry set here, sbc will carry too
ld e, (ix+2) ; DE --> pointer to record list, which is also ld e, (ix+2) ; DE --> pointer to record list, which is also
ld d, (ix+3) ; the end of names pool ld d, (ix+3) ; the end of names pool
; DE --> names end ; DE --> names end
sbc hl, de ; compares hl and de destructively sbc hl, de ; compares hl and de destructively
pop de ; <-- lvl 3 pop de ; <-- lvl 3
pop hl ; <-- lvl 2 pop hl ; <-- lvl 2
@@ -192,11 +192,11 @@ _symFind:
jr z, .end ; match! Z already set, IY and HL placed. jr z, .end ; match! Z already set, IY and HL placed.
.skip: .skip:
; ok, next! ; ok, next!
push de ; --> lvl 1 push de ; --> lvl 1
ld de, 0x0003 ld de, 0x0003
add iy, de ; faster and shorter than three inc's add iy, de ; faster and shorter than three inc's
ld e, (iy-3) ; offset is also compulsory, so no extra bytes used
ld e, (iy-3) ; offset is also compulsory, so no extra bytes used
; (iy-3) holds the name length of the string just processed ; (iy-3) holds the name length of the string just processed
add hl, de ; advance HL by (iy-3) characters add hl, de ; advance HL by (iy-3) characters
pop de ; <-- lvl 1 pop de ; <-- lvl 1
@@ -219,13 +219,13 @@ symFindVal:
push ix push ix
call symIsLabelLocal call symIsLabelLocal
jr z, .local jr z, .local
; global. Let's try labels first, then consts
; global. Let's try consts first, then symbols
push hl ; --> lvl 1. we'll need it again if not found. push hl ; --> lvl 1. we'll need it again if not found.
ld ix, SYM_GLOBAL_REGISTRY
ld ix, SYM_CONST_REGISTRY
call _symFind call _symFind
pop hl ; <-- lvl 1 pop hl ; <-- lvl 1
jr z, .found jr z, .found
ld ix, SYM_CONST_REGISTRY
ld ix, SYM_GLOBAL_REGISTRY
call _symFind call _symFind
jr nz, .end jr nz, .end
.found: .found:


+ 10
- 0
tools/tests/unit/test_core.asm View File

@@ -2,8 +2,11 @@ jp test


.inc "core.asm" .inc "core.asm"


dummyLabel:
testNum: .db 1 testNum: .db 1


.equ dummyLabel 0x42

test: test:
ld hl, 0xffff ld hl, 0xffff
ld sp, hl ld sp, hl
@@ -30,6 +33,13 @@ test:
jp p, fail ; negative jp p, fail ; negative
call nexttest call nexttest


; Test that .equ can override label
ld a, 0x42
ld hl, dummyLabel
cp l
jp nz, fail
call nexttest

; *** cpHLDE *** ; *** cpHLDE ***
ld hl, 0x42 ld hl, 0x42
ld de, 0x42 ld de, 0x42


Loading…
Cancel
Save