mirror of
https://github.com/A2osX/A2osX.git
synced 2024-10-31 08:05:30 +00:00
496 lines
14 KiB
Plaintext
496 lines
14 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
*--------------------------------------
|
||
* INITIALIZE SYMBOL TABLE
|
||
* 1. SET EOT TO BOT
|
||
* 2. CLEAR HASH POINTER TABLE
|
||
*--------------------------------
|
||
STINIT LDA LO.MEM START OF SYMBOL TABLE
|
||
STA EOT
|
||
LDA LO.MEM+1
|
||
STA EOT+1
|
||
STA MACLBL+1 PRIVATE LABELS GO DOWN FROM THERE
|
||
LDX #56 # BYTES IN HASH POINTER TABLE
|
||
LDA #0
|
||
STA MACLBL
|
||
STA CURRENT.MAJOR.LABEL+1
|
||
.1 STA HSHTBL-1,X
|
||
DEX
|
||
BNE .1
|
||
.DO AUXMEM
|
||
LDA RDRAM
|
||
LDA RDRAM
|
||
LDX #AUX.IMAGE.LEN-1
|
||
.2 LDA AUX.IMAGE,X
|
||
STA AUX.CODE,X
|
||
DEX
|
||
BPL .2
|
||
BACK.TO.ROM
|
||
PHA
|
||
LDA RDROM
|
||
PLA
|
||
.FIN
|
||
RTS RETURN WITH X=0
|
||
*--------------------------------
|
||
.DO AUXMEM
|
||
LDA.STPNTR
|
||
BIT RDRAM
|
||
JSR LDA.STPNTR.AUX
|
||
JMP BACK.TO.ROM
|
||
*
|
||
ADC.STPNTR
|
||
BIT RDRAM
|
||
JSR ADC.STPNTR.AUX
|
||
JMP BACK.TO.ROM
|
||
*
|
||
SBC.STPNTR
|
||
BIT RDRAM
|
||
JSR SBC.STPNTR.AUX
|
||
JMP BACK.TO.ROM
|
||
*
|
||
LDA.PNTR
|
||
BIT RDRAM
|
||
JSR LDA.PNTR.AUX
|
||
JMP BACK.TO.ROM
|
||
*
|
||
LDA.TPTR
|
||
BIT RDRAM
|
||
JSR LDA.TPTR.AUX
|
||
JMP BACK.TO.ROM
|
||
*
|
||
LDA.SRCP
|
||
BIT RDRAM
|
||
JSR LDA.SRCP.AUX
|
||
JMP BACK.TO.ROM
|
||
*
|
||
STA.PNTR
|
||
STA WRAUX
|
||
STA (PNTR),Y
|
||
STA WRMAIN
|
||
RTS
|
||
STA.STPNTR
|
||
STA WRAUX
|
||
STA (STPNTR),Y
|
||
STA WRMAIN
|
||
RTS
|
||
*--------------------------------
|
||
AUX.IMAGE
|
||
LDA.STPNTR.AUX .EQ *-AUX.IMAGE+AUX.CODE
|
||
STA RDAUX
|
||
LDA (STPNTR),Y
|
||
STA RDMAIN
|
||
RTS
|
||
ADC.STPNTR.AUX .EQ *-AUX.IMAGE+AUX.CODE
|
||
STA RDAUX
|
||
ADC (STPNTR),Y
|
||
STA RDMAIN
|
||
RTS
|
||
SBC.STPNTR.AUX .EQ *-AUX.IMAGE+AUX.CODE
|
||
STA RDAUX
|
||
SBC (STPNTR),Y
|
||
STA RDMAIN
|
||
RTS
|
||
LDA.PNTR.AUX .EQ *-AUX.IMAGE+AUX.CODE
|
||
STA RDAUX
|
||
LDA (PNTR),Y
|
||
STA RDMAIN
|
||
RTS
|
||
LDA.TPTR.AUX .EQ *-AUX.IMAGE+AUX.CODE
|
||
STA RDAUX
|
||
LDA (TPTR),Y
|
||
STA RDMAIN
|
||
RTS
|
||
LDA.SRCP.AUX .EQ *-AUX.IMAGE+AUX.CODE
|
||
STA RDAUX
|
||
LDA (SRCP),Y
|
||
STA RDMAIN
|
||
RTS
|
||
AUX.IMAGE.LEN .EQ *-AUX.IMAGE
|
||
.FIN
|
||
*--------------------------------
|
||
* A table of 28 pointers begins at $130, called HSHTBL.
|
||
* Each pointer points to the beginning of a chain of
|
||
* symbol entries. The entries on a chain are kept
|
||
* in alphabetical order. If a chain is empty, the
|
||
* pointer = $0000.
|
||
*
|
||
* HSHTBL+$00: Chain for target file entries
|
||
* HSHTBL+$02: Chain for labels starting with "A"
|
||
* HSHTBL+$04: Chain for labels starting with "B"
|
||
* - - -
|
||
* HSHTBL+$34: Chain for labels starting with "Z"
|
||
* HSHTBL+$36: Chain for Macro Names and Skeletons
|
||
*
|
||
* Format of Target File Entry:
|
||
* 0,1 -- Forward chain pointer (0=end of chain)
|
||
* 2,3 -- Length of target file in bytes
|
||
* 4 -- Length of code name = $02
|
||
* 5,6 -- Target file code name:
|
||
* 5: "@" = $40
|
||
* 6: $40 + target file number ($00-$1F)
|
||
*
|
||
* Format of Label Entry:
|
||
* 0,1 -- Forward chain pointer (0=end of chain)
|
||
* 2-5 -- Value of label
|
||
* 6 -- Flags and length of label name:
|
||
* Bits 5-0: length of label name ($01-$20)
|
||
* Bit 6: =1 if forward reference
|
||
* Bit 7: =1 if has local labels
|
||
* 7 -- First character of label name, and flag.
|
||
* Bit 7 = 1 if label is .SEt label.
|
||
* thru 6+n -- The rest of the label name, with bit 7 = 0
|
||
*
|
||
* If the label has local labels, they follow.
|
||
* Each local label occupies two bytes:
|
||
* 1 -- Label number (0-99) +128
|
||
* 2 -- Label value (distance from value of
|
||
* named label)
|
||
* The local label list is terminated with a $00
|
||
* in the label number position.
|
||
*
|
||
* Format of Macro Definition Entry:
|
||
* 0,1 -- Chain to next macro name
|
||
* 2,3 -- $0000
|
||
* 4 -- Length of macro name
|
||
* 5 -- "[" + $5B
|
||
* 6-n -- Rest of Macro name
|
||
* etc.-- The packed skeleton lines, each
|
||
* terminated by $00. A final $00
|
||
* terminates the skeleton.
|
||
*
|
||
* Private Labels are kept in a separate table.
|
||
* Each label takes 7 bytes. Bytes 0-3 are the
|
||
* value, byte 4 is the colon number + $80,
|
||
* and bytes 5 and 6 are the macro call number.
|
||
* The Private Label table grows downward from
|
||
* MACLBL toward $0800.
|
||
*
|
||
*--------------------------------
|
||
* PACK SYMBOL FROM INPUT LINE
|
||
* UP TO 32 CHARACTERS PACKED AT SYMBOL+7
|
||
* AND FOLLOWING.
|
||
* # CHARS STORED IN SYMBOL+6
|
||
* RETURN CARRY CLEAR IF NO SYMBOL
|
||
* RETURN CARRY SET IF GOOD SYMBOL
|
||
*--------------------------------
|
||
PACK LDX #0 POINT AT 1ST CHAR IN NAME
|
||
CMP #CHR.PERIOD LOCAL SYMBOL?
|
||
BEQ .1 YES
|
||
CMP #': COLON MEANS MACRO PRIVATE LABEL
|
||
BNE .3 NO, NORMAL SYMBOL
|
||
.1 STA SYMBOL+7 SAVE PERIOD OR COLON
|
||
JSR GNC.UC GET NEXT CHAR
|
||
JSR CHECK.DIGIT
|
||
BCC .4 NO, BAD SYMBOL
|
||
JSR DECN CONVERT TO BINARY
|
||
LDX #0 IN CASE BAD SYMBOL...
|
||
LDA DGTCNT VALUE MUST BE < 100
|
||
CMP #3 SO MUST BE 1 OR 2 DIGITS
|
||
BCS .4 ...TOO MANY DIGITS, BAD SYMBOL
|
||
LDA SYM.VALUE
|
||
ORA #$80 BE SURE NOT 00
|
||
STA SYMBOL+8 SAVE VALUE
|
||
LDA CALL.NUM JUST IN CASE IT'S A
|
||
STA SYMBOL+9 MACRO PRIVATE LABEL
|
||
LDA CALL.NUM+1
|
||
STA SYMBOL+10
|
||
INX SIGNAL GOOD SYMBOL
|
||
BNE .4 ...ALWAYS
|
||
*--------------------------------
|
||
.3 JSR PACK.NAME
|
||
.4 JSR BACKUP.CHAR.PNTR
|
||
STX SYMBOL+6 SAVE LENGTH
|
||
CPX #1 CARRY SET IF AT LEAST ONE CHAR
|
||
LDX #0 CLEAR X AGAIN
|
||
RTS
|
||
*--------------------------------
|
||
* PACK A NAME INTO SYMBOL
|
||
*--------------------------------
|
||
PACK.NAME
|
||
JSR CHECK.LETTER
|
||
BCC .4 NOT A LETTER
|
||
.1 CPX #32 SEE IF ALREADY 32 CHARACTERS
|
||
BEQ .2 YES, IGNORE
|
||
STA SYMBOL+7,X PUT CHAR IN ENTRY
|
||
INX POINT AT NEXT SLOT
|
||
.2 JSR GNC.UC GET NEXT CHAR FROM LINE
|
||
JSR CHECK.DOT.DIGIT.OR.LETTER
|
||
BCS .1 VALID CHAR
|
||
.4 RTS END OF NAME
|
||
*--------------------------------
|
||
* SEARCH SYMBOL TABLE
|
||
* # OF CHARS STORED AT SYMBOL+6
|
||
* SYMBOL ITSELF AT SYMBOL+7 AND FOLLOWING
|
||
* JSR STSRCH
|
||
* IF FOUND: CARRY CLEAR
|
||
* (STPNTR)=ADDRESS OF ENTRY
|
||
* IF NOT FOUND: CARRY SET
|
||
* (STPNTR)=ADDRESS OF
|
||
* POINTER CELL WHICH
|
||
* SHOULD POINT AT ENTRY
|
||
*--------------------------------
|
||
STSRCH SEC CONVERT FIRST CHARACTER
|
||
LDA SYMBOL+7 OF SYMBOL TO HASH TABLE INDEX
|
||
CMP #CHR.PERIOD SEE IF LOCAL SYMBOL
|
||
BEQ .8 YES
|
||
CMP #': COLON, THEN PRIVATE LABEL
|
||
BNE .12 NO, NORMAL LABEL
|
||
JMP SEARCH.PRIVATE.LABELS
|
||
.12 SBC #$40 AT-SIGN
|
||
ASL DOUBLE INDEX, CLEAR CARRY
|
||
ADC #HSHTBL
|
||
STA STPNTR
|
||
LDA /HSHTBL
|
||
ADC #0
|
||
STA STPNTR+1
|
||
.1 LDY #0
|
||
>SYM LDA,STPNTR GET POINTER FROM ENTRY
|
||
STA TPTR
|
||
INY
|
||
>SYM LDA,STPNTR
|
||
BEQ .4 END OF CHAIN, NOT IN TABLE
|
||
STA TPTR+1
|
||
LDX SYMBOL+6 # CHARS IN SYMBOL
|
||
LDY #6 POINT AT LENGTH
|
||
>SYM LDA,TPTR USE MINIMUM LENGTH
|
||
AND #$3F ISOLATE LENGTH
|
||
CMP SYMBOL,Y
|
||
INY
|
||
BCS .2
|
||
TAX
|
||
.2 >SYM LDA,TPTR COMPARE BYTES FROM BOTH
|
||
AND #$7F ALLOW FLAG BITS IN SYMBOL
|
||
CMP SYMBOL,Y
|
||
BCC .3 NOT THIS ONE, BUT KEEP LOOKING
|
||
BNE .4 NOT IN THIS CHAIN
|
||
DEX
|
||
BEQ .5 THE NAME IS THE SAME OR A SUBSET
|
||
INY NEXT BYTE PAIR
|
||
BNE .2 ...ALWAYS
|
||
.3 JSR .7 UPDATE POINTER, CLEAR CARRY
|
||
BCC .1 ...ALWAYS
|
||
.4 SEC DID NOT FIND
|
||
LDX #0 RESTORE X=0
|
||
RTS
|
||
.5 LDY #6 TEST LENGTHS
|
||
>SYM LDA,TPTR
|
||
AND #$3F ISOLATE LENGTH
|
||
CMP SYMBOL+6 # CHARS IN SYMBOL IN TABLE
|
||
BEQ .6 SAME EXACTLY
|
||
BCS .4 NEW SYMBOL IS SHORTER
|
||
BCC .3 NEW SYMBOL IS LONGER
|
||
.6 LDY #2 POINT AT VALUE
|
||
.65 >SYM LDA,TPTR SET UP VALUE FOR EXPR SCAN
|
||
STA SYM.VALUE-2,Y
|
||
INY
|
||
CPY #6
|
||
BCC .65
|
||
.7 LDA TPTR
|
||
STA STPNTR
|
||
LDA TPTR+1
|
||
STA STPNTR+1
|
||
CLC SIGNAL DID FIND IT
|
||
RTS
|
||
*--------------------------------
|
||
.8 LDA CURRENT.MAJOR.LABEL
|
||
STA STPNTR
|
||
LDA CURRENT.MAJOR.LABEL+1
|
||
BEQ .11
|
||
STA STPNTR+1
|
||
CLC
|
||
LDY #6 POINT AT LENGTH
|
||
>SYM LDA,STPNTR GET LENGTH OF MAJOR SYMBOL
|
||
BPL .4 NO LOCAL SYMBOLS YET
|
||
AND #$3F MASK TO REAL LENGTH
|
||
ADC #7 POINT AT LOCALS
|
||
TAY
|
||
.9 >SYM LDA,STPNTR
|
||
BEQ .4 END OF LOCALS, NOT FOUND
|
||
CMP SYMBOL+8 COMPARE TO NAME OF LOCAL
|
||
BEQ .10 FOUND IT!
|
||
INY SKIP TO NEXT LOCAL
|
||
INY
|
||
BNE .9 ...ALWAYS
|
||
.10 INY POINT AT VALUE OFFSET
|
||
>SYM LDA,STPNTR
|
||
CLC
|
||
LDY #2 POINT AT MAJOR VALUE
|
||
>SYM ADC,STPNTR
|
||
STA SYM.VALUE
|
||
INY
|
||
>SYM LDA,STPNTR
|
||
ADC #0
|
||
STA SYM.VALUE+1
|
||
INY
|
||
>SYM LDA,STPNTR
|
||
ADC #0
|
||
STA SYM.VALUE+2
|
||
INY
|
||
>SYM LDA,STPNTR
|
||
ADC #0
|
||
STA SYM.VALUE+3
|
||
CLC
|
||
RTS
|
||
.11 LDY #QER9 NO NORMAL LABEL YET
|
||
JMP SOFT.ERROR
|
||
*--------------------------------
|
||
* SEARCH PRIVATE LABEL TABLE
|
||
*--------------------------------
|
||
SEARCH.PRIVATE.LABELS
|
||
LDA MACLBL
|
||
STA STPNTR
|
||
LDA MACLBL+1
|
||
.1 STA STPNTR+1
|
||
CMP LO.MEM+1 END OF TABLE YET?
|
||
BCS .3 ...YES, NO MORE LABELS
|
||
LDY #6
|
||
>SYM LDA,STPNTR
|
||
AND #$3F ISOLATE FROM FLAG BITS
|
||
CMP SYMBOL+10
|
||
BNE .2 NO
|
||
DEY
|
||
>SYM LDA,STPNTR
|
||
CMP SYMBOL+9
|
||
BNE .2 NO
|
||
DEY
|
||
>SYM LDA,STPNTR
|
||
CMP SYMBOL+8
|
||
BEQ .4 YES, FOUND IT!
|
||
.2 CLC BUMP PNTR TO NEXT LABEL
|
||
LDA STPNTR
|
||
ADC #7
|
||
STA STPNTR
|
||
LDA STPNTR+1
|
||
ADC #0
|
||
BNE .1 ...ALWAYS
|
||
*--------------------------------
|
||
.3 SEC SIGNAL NOT FOUND
|
||
RTS
|
||
*--------------------------------
|
||
.4 DEY
|
||
.5 >SYM LDA,STPNTR
|
||
STA SYM.VALUE,Y
|
||
DEY
|
||
BPL .5
|
||
CLC
|
||
RTS
|
||
*--------------------------------
|
||
* ADD SYMBOL TO TABLE
|
||
*--------------------------------
|
||
STADD LDA SYMBOL+7 SEE IF LOCAL SYMBOL
|
||
CMP #CHR.PERIOD
|
||
BEQ .5 YES
|
||
CMP #': COLON, PRIVATE LABEL
|
||
BNE .11 NO, NORMAL LABEL
|
||
JMP ADD.PRIVATE.LABEL
|
||
.11 LDY #1 POINT AT POINTER
|
||
.1 >SYM LDA,STPNTR GET CURRENT POINTER
|
||
STA SYMBOL,Y
|
||
LDA EOT,Y
|
||
>SYM STA,STPNTR
|
||
STA PNTR,Y
|
||
STA CURRENT.MAJOR.LABEL,Y
|
||
LDA ORGN,Y VALUE
|
||
STA SYMBOL+2,Y
|
||
LDA ORGN+2,Y
|
||
STA SYMBOL+4,Y
|
||
DEY
|
||
BPL .1
|
||
CLC COMPUTE ENTRY SIZE
|
||
LDA SYMBOL+6 FROM SYMBOL SIZE
|
||
ADC #7
|
||
.2 PHA SAVE SIZE
|
||
LDY EOT+1
|
||
CLC
|
||
ADC EOT SEE IF ROOM FOR NEW ENTRY
|
||
BCC .10
|
||
INY
|
||
.DO AUXMEM
|
||
.10 CPY /$C000
|
||
BCS .4 MEM FULL ERR
|
||
STA EOT
|
||
.ELSE
|
||
.10 CMP MACSTK
|
||
TAX SAVE LOW BYTE
|
||
TYA GET HIGH BYTE
|
||
SBC MACSTK+1
|
||
BCS .4 MEM FULL ERR
|
||
STX EOT
|
||
.FIN
|
||
STY EOT+1
|
||
PLA GET SIZE
|
||
TAY
|
||
DEY CORRECT FOR INDEXING
|
||
.3 LDA SYMBOL,Y
|
||
>SYM STA,PNTR
|
||
DEY
|
||
BPL .3
|
||
RTS
|
||
.4 JMP MFER MEM FULL ERR
|
||
*--------------------------------
|
||
.5 LDY #6 LENGTH BYTE
|
||
>SYM LDA,STPNTR
|
||
BMI .6 ALREADY HAVE SOME LOCAL LABELS
|
||
ORA #$80 SET LOCAL FLAG
|
||
>SYM STA,STPNTR
|
||
BNE .8 ...ALWAYS
|
||
.6 LDA EOT BACK UP EOT
|
||
BNE .7 OVER 00 TERMINATOR
|
||
DEC EOT+1 OF LOCALS
|
||
.7 DEC EOT
|
||
.8 LDA SYMBOL+8 NAME OF LOCAL
|
||
STA SYMBOL SET UP TO ADD TO SYMBOL TABLE
|
||
SEC
|
||
LDY #1
|
||
JSR CALC.OFFSET.BYTE
|
||
JSR CALC.OFFSET.BYTE
|
||
BNE .9 ERROR > 255
|
||
JSR CALC.OFFSET.BYTE
|
||
BNE .9 ERROR > 255
|
||
JSR CALC.OFFSET.BYTE
|
||
BNE .9 ERROR > 255
|
||
LDA EOT
|
||
STA PNTR
|
||
LDA EOT+1
|
||
STA PNTR+1
|
||
LDA #3 SIZE IS 3 BYTES
|
||
BNE .2 ...ALWAYS
|
||
.9 JMP GT255ERR VALUE > 255
|
||
*--------------------------------
|
||
CALC.OFFSET.BYTE
|
||
INY
|
||
LDA ORGN-2,Y
|
||
>SYM SBC,STPNTR
|
||
STA SYMBOL-1,Y
|
||
RTS
|
||
*--------------------------------
|
||
* ADD A PRIVATE LABEL
|
||
*--------------------------------
|
||
ADD.PRIVATE.LABEL
|
||
SEC
|
||
LDA MACLBL
|
||
SBC #7
|
||
STA MACLBL
|
||
STA STPNTR
|
||
LDA MACLBL+1
|
||
SBC #0
|
||
STA MACLBL+1
|
||
STA STPNTR+1
|
||
CMP #8 BELOW $0800?
|
||
BCC .3 YES, NO MORE ROOM
|
||
LDY #6 POINT AT LAST BYTE
|
||
.1 LDA SYMBOL+4,Y
|
||
CPY #4
|
||
BCS .2
|
||
LDA ORGN,Y
|
||
.2 >SYM STA,STPNTR
|
||
DEY
|
||
BPL .1
|
||
RTS
|
||
.3 JMP MFER
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE usr/src/scmasm.30/scmasm.s.symt
|
||
LOAD usr/src/scmasm.30/scmasm.s
|
||
ASM
|