Linker/symbol.asm

1 line
29 KiB
NASM
Raw Normal View History

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