From 89848dbfe2b3cf0c712c7059c52d059494cb2a67 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 11 May 2019 22:11:05 -0400 Subject: [PATCH] zasm: add support for .equ --- apps/zasm/directive.asm | 50 ++++++++++++++++++++++++++++++++++++++- apps/zasm/main.asm | 5 +++- apps/zasm/tests/test1.asm | 2 ++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/apps/zasm/directive.asm b/apps/zasm/directive.asm index 55946bc..6f00493 100644 --- a/apps/zasm/directive.asm +++ b/apps/zasm/directive.asm @@ -2,19 +2,25 @@ .equ D_DB 0x00 .equ D_DW 0x01 +.equ D_EQU 0x02 .equ D_BAD 0xff +; *** Variables *** +.equ DIREC_SCRATCHPAD DIREC_RAMSTART +.equ DIREC_RAMEND DIREC_SCRATCHPAD+SCRATCHPAD_SIZE ; *** CODE *** ; 4 bytes per row, fill with zero directiveNames: .db ".DB", 0 .db ".DW", 0 + .db ".EQU" ; This is a list of handlers corresponding to indexes in directiveNames directiveHandlers: .dw handleDB .dw handleDW + .dw handleEQU handleDB: push hl @@ -42,12 +48,54 @@ handleDW: pop hl ret +handleEQU: + call zasmIsFirstPass + jr z, .begin + ; first pass? .equ are noops + xor a + ret +.begin: + push hl + push de + push bc + ; Read our constant name + call toWord + call readWord + ; We can't register our symbol yet: we don't have our value! + ; Let's copy it over. + push hl + ld hl, scratchpad + ld de, DIREC_SCRATCHPAD + ld bc, SCRATCHPAD_SIZE + ldir + pop hl + + ; Now, read the value associated to it + call toWord + call readWord + ld hl, scratchpad + ld a, (hl) + call parseNumberOrSymbol + jr nz, .error + ld hl, DIREC_SCRATCHPAD + ld d, ixh + ld e, ixl + call symRegister + jr .end +.error: +.end: + xor a ; 0 bytes written + pop bc + pop de + pop hl + ret + ; Reads string in (HL) and returns the corresponding ID (D_*) in A. Sets Z if ; there's a match. getDirectiveID: push bc push de - ld b, D_DW+1 ; D_DW is last + ld b, D_EQU+1 ; D_EQU is last ld c, 4 ld de, directiveNames call findStringInList diff --git a/apps/zasm/main.asm b/apps/zasm/main.asm index a492016..d34ac11 100644 --- a/apps/zasm/main.asm +++ b/apps/zasm/main.asm @@ -47,8 +47,9 @@ jp zasmMain #include "tok.asm" #include "parse.asm" #include "instr.asm" +.equ DIREC_RAMSTART IO_RAMEND #include "directive.asm" -.equ SYM_RAMSTART IO_RAMEND +.equ SYM_RAMSTART DIREC_RAMEND #include "symbol.asm" ; Read file through blockdev ID in H and outputs its upcodes through blockdev @@ -134,6 +135,8 @@ parseLine: .direc: ld a, c ; D_* call parseDirective + or a ; cp 0 + jr z, .success ; if zero, shortcut through ld b, a ; save output byte count call incOutputOffset call zasmIsFirstPass diff --git a/apps/zasm/tests/test1.asm b/apps/zasm/tests/test1.asm index 5723960..5b1c87c 100644 --- a/apps/zasm/tests/test1.asm +++ b/apps/zasm/tests/test1.asm @@ -11,3 +11,5 @@ label2: .dw 3742 .dw 0x3742 ld a, (label1) +.equ foobar 0x1234 + ld hl, foobar