1 line
29 KiB
NASM
1 line
29 KiB
NASM
|
keep obj/symbol
mcopy symbol.mac
****************************************************************
*
* Symbol Tables
*
* This module contains the subroutines used to create, search
* and manipulate the symbol table.
*
****************************************************************
copy directPage
****************************************************************
*
* SymbolCommon - global data for the symbol table module
*
****************************************************************
*
SymbolCommon privdata
;
; Symbol table entry
;
symNext equ 0 pointer to the next symbol
symAlpha equ 4 alphabetized list pointer
symVal equ 8 value of the label (or ptr to expression)
symSeg equ 12 segment number
symFile equ 14 file number
symData equ 16 data area number
symExp equ 18 is the value an expression?
symFlag equ 20 pass 1/2 resolved flags
symPriv equ 22 is the symbol private?
symLength equ 24 length attribute
symType equ 26 type attribute
symName equ 28 symbol name (p-string)
symSize equ 28 size of a symbol, sans symbol name
;
; Constants
;
hashSize equ 877 number of hash buckets
blockSize equ 4096 symbol table blocking factor
;
; Symbol table variables
;
alpha ds 4 head of alphabetized list
hashDisp ds 2 disp in hash table; saved for efficiency
poolPtr ds 4 ptr to next byte in symbol table pool
poolSize ds 2 # of bytes left in the current pool
table ds hashSize*4 symbol table
end
****************************************************************
*
* AllocatePool - allocate a new symbol table pool
*
* Outputs:
* poolPtr - pointer to the first byte of the pool
* poolSize - size of the block, in bytes
*
****************************************************************
*
AllocatePool private
using SymbolCommon
ph4 #blockSize
jsr MLalloc
sta poolPtr
stx poolPtr+2
lda #blockSize
sta poolSize
rts
end
****************************************************************
*
* AlphaInsert - insert the symbol in the alphabetized list
*
* Inputs:
* sym - pointer to the new symbol
* alpha - head of the alphabetized list
*
****************************************************************
*
AlphaInsert private
using SymbolCommon
p1 equ 1 work pointers
p2 equ 5
p3 equ 9
sub (4:sym),12
lda alpha if alpha = nil then
ora alpha+2
bne lb1
move4 sym,alpha alpha = sym
ldy #symAlpha sym^.alpha = nil
lda #0
sta [sym],Y
iny
iny
sta [sym],Y
brl lb8 return
lb1 move4 alpha,p1 p1 = alpha
stz p2 p2 = nil
stz p2+2
add4 sym,#symName while sym^.symName >= p1^.symName do
lda [sym]
and #$00FF
sta len1
lb2 add4 p1,#symName,p3
lda len1
sta lens
lda [p3]
and #$00FF
sta len2
cmp lens
bge lb3
sta lens
lb3 short M
ldy #1
lb4 lda [sym],Y
cmp [p3],Y
bne lb5
iny
dec lens
bne lb4
lda len1
cmp len2
lb5 long M
blt lb6
move4 p1,p2 p2 = p1
ldy #symAlpha p1 = p2^.symAlpha
lda [p2],Y
sta p1
iny
iny
lda [p2],Y
sta p1+2
ora p1 quit if at the end of the list
bne lb2 endwhile
lb6 sub4 sym,#symName fix sym
ldy #symAlpha sym^.symAlpha = p1
lda p1
sta [sym],Y
iny
iny
lda p1+2
sta [sym],Y
lda p2 if p2 = nil then
ora p2+2
bne lb7
move4 sym,alpha alpha = sym
bra lb8 return
lb7 ldy #symAlpha p2^.symAlpha = sym
lda sym
sta [p2],Y
iny
iny
lda sym+2
sta [p2],Y
lb8 ret
;
; Local data
;
lens ds 2 shortest string length
len1 ds 2 length(sym^.symName)
len2 ds 2 length(p1^.symName)
end
****************************************************************
*
* CreateSymbol - create a new symbol table entry
*
* Inputs:
* name - name of the new entry
* hashDisp - disp in hash table for the entry
*
* Outputs:
* returns a pointer to the new symbol table entry
*
****************************************************************
*
CreateSymbol private
using Common
using OutCommon
using SymbolCommon
entryLength equ 1 length of the symbol table entry
sym equ 3 ptr to symbol table entry
p1 equ 7 work pointer
sub (4:name),10
lda [name] no match - create a symbol table entry
and #$00FF
sec
adc #symSize
sta entryLength
cmp poolSize
ble cs2
jsr AllocatePool no room - get a new pool
cs2 sub2 po
|