From a2b5b1efabbc975ff5a758eacf5a5d679aa11243 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Wed, 15 May 2019 14:30:41 -0400 Subject: [PATCH] zasm: add one layer of indirection in symbol registry We'll need it for an upcoming "local labels" registry. --- apps/zasm/symbol.asm | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/apps/zasm/symbol.asm b/apps/zasm/symbol.asm index 87f739e..c72662a 100644 --- a/apps/zasm/symbol.asm +++ b/apps/zasm/symbol.asm @@ -36,7 +36,12 @@ ; symSetContext call .equ SYM_CONTEXT_PTR SYM_CONTEXT_IDX+1 -.equ SYM_RAMEND SYM_CONTEXT_PTR+2 +; Pointer to the currently selected registry +.equ SYM_CTX_NAMES SYM_CONTEXT_PTR+2 +.equ SYM_CTX_NAMESEND SYM_CTX_NAMES+2 +.equ SYM_CTX_VALUES SYM_CTX_NAMESEND+2 + +.equ SYM_RAMEND SYM_CTX_VALUES+2 ; *** Code *** @@ -65,6 +70,12 @@ symInit: ld (SYM_CONTEXT_IDX), a ld hl, SYM_CONTEXT_PTR ld (SYM_CONTEXT_PTR), hl + ld hl, SYM_NAMES + ld (SYM_CTX_NAMES), hl + ld hl, SYM_NAMES+SYM_BUFSIZE + ld (SYM_CTX_NAMESEND), hl + ld hl, SYM_VALUES + ld (SYM_CTX_VALUES), hl ret ; Sets Z according to whether label in (HL) is local (starts with a dot) @@ -73,7 +84,7 @@ symIsLabelLocal: cp (hl) ret -; Place HL at the end of SYM_NAMES end (that is, at the point where we have two +; Place HL at the end of (SYM_CTX_NAMES) end (that is, at the point where we have two ; consecutive null chars. We return the index of that new name in A. ; If we're within bounds, Z is set, otherwise unset. symNamesEnd: @@ -81,8 +92,8 @@ symNamesEnd: push de ld b, 0 - ld hl, SYM_NAMES - ld de, SYM_NAMES+SYM_BUFSIZE + ld hl, (SYM_CTX_NAMES) + ld de, (SYM_CTX_NAMESEND) .loop: call _symNext jr nz, .success ; We've reached the end of the chain. @@ -125,7 +136,7 @@ symRegister: ; Is our new name going to make us go out of bounds? push hl push de - ld de, SYM_NAMES+SYM_BUFSIZE + ld de, (SYM_CTX_NAMESEND) ld a, c call JUMP_ADDHL call cpHLDE @@ -144,17 +155,17 @@ symRegister: ; I'd say we're pretty good just about now. What we need to do is to ; save the value in our original DE that is just on top of the stack - ; into the proper index in SYM_VALUES. Our index, remember, is + ; into the proper index in (SYM_CTX_VALUES). Our index, remember, is ; currently in A'. ex af, af' pop de push de ; push it right back to avoid stack imbalance - ld hl, SYM_VALUES + ld hl, (SYM_CTX_VALUES) call JUMP_ADDHL call JUMP_ADDHL ; twice because our values are words ; Everything is set! DE is our value HL points to the proper index in - ; SYM_VALUES. Let's just write it (little endian). + ; (SYM_CTX_VALUES). Let's just write it (little endian). ld (hl), e inc hl ld (hl), d @@ -165,7 +176,7 @@ symRegister: pop hl ret -; Find name (HL) in SYM_NAMES and returns matching index in A. +; Find name (HL) in (SYM_CTX_NAMES) and returns matching index in A. ; If we find something, Z is set, otherwise unset. symFind: push hl @@ -188,7 +199,7 @@ _symFind: ex hl, de ; it's easier if HL is haystack and DE is ; needle. ld b, 0 - ld hl, SYM_NAMES + ld hl, (SYM_CTX_NAMES) jr nz, .loop ; not local? jump right to loop ; local? then we need to adjust B and HL ld hl, (SYM_CONTEXT_PTR)