mirror of
https://github.com/A2osX/A2osX.git
synced 2024-10-31 23:09:33 +00:00
371 lines
10 KiB
Plaintext
371 lines
10 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
*--------------------------------------
|
||
* .MA DIRECTIVE
|
||
*--------------------------------
|
||
PSMA LDA PASS WHICH PASS?
|
||
BNE .2 PASS 2, SO SET FLAG AND IGNORE
|
||
LDA #'Z+1 RIGHT BRACKET CODE
|
||
STA SYMBOL+7
|
||
LDA #0 CLEAR VALUE BYTES
|
||
LDX #3
|
||
.1 STA SYMBOL+2,X
|
||
DEX
|
||
BPL .1
|
||
JSR GNNB GET FIRST CHAR OF MACRO NAME
|
||
LDX #1
|
||
JSR PACK.NAME
|
||
CPX #2 NEED AT LEAST TWO CHARS, COUNTING BRACKET
|
||
BCC .3 NO MACRO NAME
|
||
STX SYMBOL+6 LENGTH
|
||
JSR STSRCH
|
||
BCC .4 DOUBLE DEFN
|
||
JSR STADD ENTER INTO SYMBOL TABLE
|
||
.2 SEC SET "INSIDE MACRO DEFINITION" FLAG
|
||
ROR FLAG.MA
|
||
RTS RETURN TO MAIN LEVEL OF ASM
|
||
.3 LDY #QNONAM NO MACRO NAME
|
||
.HS 2C SKIP NEXT TWO BYTES
|
||
.4 LDY #QER4 EXTRA DEF'N
|
||
JMP FIRM.ERROR
|
||
*--------------------------------
|
||
* PACK MACRO LINE
|
||
*--------------------------------
|
||
PACK.MACRO.LINE
|
||
JSR SCAN.TO.OPCODE
|
||
LDX FLAG.MA IN A MACRO DEF'N?
|
||
BPL D.SET ...NO, TRY .SE DIRECTIVE
|
||
LDX PASS WHICH PASS?
|
||
BNE .10 PASS 2
|
||
*---PASS 1-----------------------
|
||
BCS .4 ...OPCODE IS NOT A DIRECTIVE
|
||
LDX #DIR.QT.MA
|
||
JSR DIR.SCAN.OR.FAIL
|
||
BCC .2 NOT .MA
|
||
.1 LDY #QER2 "BAD OPCODE"
|
||
JMP SOFT.ERROR
|
||
.2 JSR DIR.SCAN.OR.FAIL
|
||
BCC .3 NOT .EM
|
||
LDA #0 TERMINATE THE SKELETON
|
||
STA CURRENT.MAJOR.LABEL+1 KILL POSSIBILITY OF LOCAL LABELS
|
||
* UNTIL ANOTHER MAJOR LABEL
|
||
JSR ADD.CHAR.TO.SKELETON
|
||
.11 LSR FLAG.MA
|
||
.12 SEC
|
||
RTS
|
||
*--------------------------------
|
||
.3 JSR DIR.SCAN.OR.FAIL SEE IF .IN
|
||
BCS .1 YES, SO ILLEGAL!
|
||
* FALL INTO ACCEPTABLE LINE CODE
|
||
*--------------------------------
|
||
.4 LDY #0 BACK TO BEGINNING OF LINE
|
||
BEQ .5 ...ALWAYS
|
||
.55 LDX #$80 COMPRESSED BLANK TOKEN
|
||
.6 INX COUNT THE BLANK
|
||
CPX #$BF MAX BLANK COUNT?
|
||
BCS .7 YES, OUTPUT TOKEN NOW
|
||
JSR GNC2 GET NEXT CHARACTER
|
||
BCS .7 END OF LINE
|
||
BEQ .6 BLANK, SO COMPRESS IT
|
||
DEY NON-BLANK, SO BACK UP PNTR
|
||
.7 TXA COMPRESSED BLANK TOKEN
|
||
.8 JSR ADD.CHAR.TO.SKELETON
|
||
.5 JSR GNC2 GET NEXT CHARACTER
|
||
BCS .9 END OF LINE
|
||
BEQ .55 ...it is a blank
|
||
CMP #']' MACRO PARAMETER?
|
||
BNE .8 ...NO
|
||
TAX save ']' in X
|
||
JSR GNC2 GET PARAMETER CODE
|
||
BCS .7 ...eol, add ']' and end
|
||
CMP #']'
|
||
BEQ .8 ...two makes one
|
||
CMP #'#'
|
||
BEQ .81 ...]# is valid parameter
|
||
CMP #'9'+1 HOW ABOUT 1...9
|
||
BCS .82 ...not a parameter
|
||
CMP #'1'
|
||
BCC .82 ...not a parameter
|
||
.81 LDX #$7F valid parameter
|
||
.82 DEY back up char pntr
|
||
JMP .7 go add $7F or ']'
|
||
*--------------------------------
|
||
.9 LDA #0 TERMINATE THE LINE
|
||
JSR ADD.CHAR.TO.SKELETON
|
||
SEC
|
||
RTS
|
||
*---PASS 2-----------------------
|
||
* IF NOT ".EM", JUST LIST THE LINE
|
||
.10 BCS .12 ...OPCODE IS NOT A DIRECTIVE
|
||
LDX #DIR.QT.EM
|
||
JSR DIR.SCAN.OR.FAIL
|
||
BCC .12 NOT .EM
|
||
BCS .11 ...ALWAYS
|
||
*--------------------------------
|
||
* .SET DIRECTIVE
|
||
*--------------------------------
|
||
D.SET
|
||
BCS .1 NOT A DIRECTIVE
|
||
LDX #DIR.QT.SE
|
||
JSR DIR.SCAN.OR.FAIL
|
||
BCS .2 FOUND .SE
|
||
.1 CLC
|
||
RTS
|
||
.2 JSR EXPR.DEFINED GET VALUE
|
||
JSR GNC.UC.START CHECK FOR VALID LABEL
|
||
BEQ .6 ...NO LABEL ERROR
|
||
JSR CHECK.LETTER MUST BE NORMAL LABEL
|
||
BCC .7 ...DOES NOT START WITH A-Z
|
||
JSR PACK
|
||
BCC .7 ...BAD SYMBOL
|
||
JSR STSRCH
|
||
BCC .3 ...IN TABLE ALREADY
|
||
LDA SYMBOL+7
|
||
ORA #$80
|
||
STA SYMBOL+7 SET THE .SE FLAG
|
||
JSR STADD
|
||
JMP .4
|
||
.3 LDY #7 CK .SE FLAG
|
||
>SYM LDA,TPTR
|
||
BPL .9 DOUBLE DEF IF NOT SET!
|
||
LDA TPTR USE SAME PTR AS STADD
|
||
STA PNTR
|
||
LDA TPTR+1
|
||
STA PNTR+1
|
||
LDA PASS HANDLE FORWARD REFERENCES
|
||
BEQ .5 ...IN PASS ONE
|
||
DEY POINT AT FLAGS
|
||
>SYM LDA,PNTR
|
||
ORA #$40
|
||
>SYM STA,PNTR
|
||
.4 JSR P.EXP.VALUE.DASH (IF LISTING)
|
||
.5 LDY #2 PUT VALUE IN SYMBOL TABLE
|
||
.8 LDA EXP.VALUE-2,Y
|
||
>SYM STA,PNTR
|
||
INY
|
||
CPY #6
|
||
BCC .8
|
||
RTS RETURN TO ASM WITH .CS.
|
||
.6 JMP NOLBLERR
|
||
.7 JMP ERR.BS
|
||
.9 JMP ERR.DBLDF
|
||
*--------------------------------
|
||
* ADD CHARACTER TO SKELETON
|
||
*--------------------------------
|
||
ADD.CHAR.TO.SKELETON
|
||
PHA SAVE CHAR
|
||
.DO AUXMEM
|
||
LDA EOT+1
|
||
CMP /$C000
|
||
BCC .1
|
||
JMP MFER MEM FULL ERROR
|
||
.1 STA WRAUX
|
||
LDX #0
|
||
PLA
|
||
STA (EOT,X)
|
||
STA WRMAIN
|
||
.ELSE
|
||
LDA EOT
|
||
CMP PP
|
||
LDA EOT+1
|
||
SBC PP+1
|
||
BCC .1 ROOM
|
||
JMP MFER MEM FULL ERROR
|
||
.1 LDX #0
|
||
PLA
|
||
STA (EOT,X)
|
||
.FIN
|
||
>INCD EOT
|
||
RTS
|
||
*--------------------------------
|
||
* SCAN TO OPCODE
|
||
*--------------------------------
|
||
SCAN.TO.OPCODE
|
||
JSR GNC.START GET FIRST CHAR
|
||
BEQ .2 ...BLANK OR END
|
||
JSR CHECK.COMMENT.CHAR
|
||
BEQ .3 ...YES, IT IS A COMMENT
|
||
.1 JSR GNC SCAN TO A BLANK
|
||
BNE .1 ...NOT BLANK YET
|
||
.2 JSR GNNB SCAN TO NON-BLANK
|
||
BCS .3 ...END OF LINE
|
||
CMP #'.' DIRECTIVE?
|
||
BNE .3 ...NO
|
||
JSR GNC.UC GET NEXT BYTE
|
||
CLC SIGNAL IT IS A DIRECTIVE
|
||
RTS
|
||
.3 SEC SIGNAL IT IS NOT A DIRECTIVE
|
||
RTS
|
||
*--------------------------------
|
||
* PROCESS MACRO CALL
|
||
*--------------------------------
|
||
MACER1 LDY #QNONAM
|
||
.HS 2C
|
||
MACER2 LDY #QERR.MACRO
|
||
JMP SOFT.ERROR
|
||
*--------------------------------
|
||
MACRO.CALL
|
||
LDA #'Z+1 MACRO KEY IN SYMBOL TABLE
|
||
STA SYMBOL+7
|
||
LDX #1
|
||
JSR GNC.UC GET FIRST CHAR OF MACRO NAME
|
||
JSR PACK.NAME
|
||
CPX #2
|
||
BCC MACER1 ERROR, NO NAME
|
||
STX SYMBOL+6 LENGTH OF NAME
|
||
JSR STSRCH
|
||
BCS MACER2 ERROR, NO SUCH MACRO
|
||
JSR P.ORIGIN
|
||
JSR LIST.SOURCE.IF.LISTING
|
||
JSR GNNB SCAN TO PARAMETER LIST
|
||
JSR BACKUP.CHAR.PNTR
|
||
LDA MACSTK+1 SAVE PNTR FOR LATER
|
||
PHA
|
||
LDA MACSTK
|
||
PHA
|
||
LDX #0 PROCESS PARAMETER LIST
|
||
LDA #9 FIND 9 PARAMETERS
|
||
STA PARAM.CNT
|
||
.1 JSR GET.ONE.PARAMETER
|
||
DEC PARAM.CNT
|
||
BNE .1
|
||
.2 LDA WBUF-1,X
|
||
JSR PUSH.MACSTK
|
||
DEX
|
||
BNE .2
|
||
PLA PUT OLD MACSTK PNTR ON MACRO STACK
|
||
JSR PUSH.MACSTK (LOW BYTE)
|
||
PLA
|
||
JSR PUSH.MACSTK (HIGH BYTE)
|
||
LDA SRCP
|
||
JSR PUSH.MACSTK
|
||
LDA SRCP+1
|
||
JSR PUSH.MACSTK
|
||
LDA LF.ALL save current list option
|
||
JSR PUSH.MACSTK
|
||
LDA CALL.NUM STACK CURRENT CALL #
|
||
JSR PUSH.MACSTK
|
||
LDA CALL.NUM+1
|
||
JSR PUSH.MACSTK
|
||
CLC COMPUTE ADDRESS OF SKELETON
|
||
LDA #7
|
||
LDY #6 POINT AT LENGTH OF MACRO NAME
|
||
>SYM ADC,STPNTR NAME LENGTH+7
|
||
ADC STPNTR
|
||
STA SRCP
|
||
LDA STPNTR+1
|
||
ADC #0
|
||
STA SRCP+1
|
||
LDA LF.MACRO
|
||
ORA LF.ALL DON'T LIST EXPANSION IF NOT LISTING
|
||
STA LF.ALL
|
||
INC MACRO.LEVEL
|
||
>INCD CALL.CNTR COUNT THIS MACRO CALL
|
||
LDA CALL.CNTR
|
||
STA CALL.NUM
|
||
LDA CALL.CNTR+1
|
||
STA CALL.NUM+1
|
||
JMP ASM2
|
||
*--------------------------------
|
||
* PUSH A BYTE ON MACSTK
|
||
*--------------------------------
|
||
PUSH.MACSTK
|
||
PHA SAVE BYTE TO BE PUSHED
|
||
.DO AUXMEM
|
||
LDA MACSTK+1
|
||
CMP /$0800
|
||
BCS .1
|
||
.ELSE
|
||
LDA EOT
|
||
CMP MACSTK
|
||
LDA EOT+1
|
||
SBC MACSTK+1
|
||
BCC .1 STILL ROOM
|
||
.FIN
|
||
JMP MFER NO ROOM
|
||
.1 LDA MACSTK
|
||
BNE .2
|
||
DEC MACSTK+1
|
||
.2 DEC MACSTK
|
||
PLA BYTE TO BE PUSHED
|
||
LDY #0
|
||
STA (MACSTK),Y
|
||
RTS
|
||
*--------------------------------
|
||
* GET ONE PARAMETER FROM MACRO CALL LINE
|
||
*--------------------------------
|
||
GET.ONE.PARAMETER
|
||
JSR GNC
|
||
BEQ .2 SPACE OR EOL, NO MORE PARAMETERS
|
||
CMP #', COMMA
|
||
BEQ .3 NULL PARAMETER
|
||
CMP #'" QUOTE
|
||
BEQ .4 QUOTED PARAMETER
|
||
.1 STA WBUF,X NORMAL PARAMETER
|
||
INX
|
||
JSR GNC
|
||
BEQ .2 END OF PARAMETER
|
||
CMP #', COMMA
|
||
BNE .1 MORE TO PARAMETER
|
||
BEQ .3 END OF PARAMETER
|
||
.2 JSR BACKUP.CHAR.PNTR
|
||
.3 LDA #0
|
||
STA WBUF,X
|
||
INX
|
||
RTS
|
||
.4 JSR GNC QUOTED PARAMETER
|
||
BCS .3 END OF LINE
|
||
CMP #'"
|
||
BEQ .5 END OF QUOTED PARAMETER
|
||
.6 STA WBUF,X
|
||
INX
|
||
BNE .4 ...ALWAYS
|
||
.5 JSR GNC
|
||
BEQ .2 END OF PARAMETER LIST
|
||
CMP #', COMMA
|
||
BEQ .3
|
||
BNE .6 ...ALWAYS
|
||
*--------------------------------
|
||
* DIRECTIVE SCAN OR FAIL
|
||
* COMPARE NEXT TWO CHARS WITH TABLE ENTRY
|
||
* ENTER: FIRST CHAR SET UP BY GNC.UC
|
||
* (X)=OFFSET OF TWO-BYTE ENTRY IN DIR.QTS
|
||
*--------------------------------
|
||
DIR.SCAN.OR.FAIL
|
||
CMP DIR.QTS,X
|
||
BNE .1 FAIL
|
||
LDY CHAR.PNTR
|
||
LDA WBUF,Y NEXT CHAR
|
||
AND #$DF MAP LOWER CASE TO UPPER CASE
|
||
CMP DIR.QTS+1,X
|
||
BNE .1 FAIL
|
||
JSR GNC.UC SCAN OVER SECOND CHAR
|
||
SEC SIGNAL SUCCESS
|
||
RTS
|
||
.1 CLC SIGNAL FAILURE
|
||
LDA CURRENT.CHAR RESTORE (A)
|
||
INX ADVANCE TO NEXT QUOTE
|
||
INX
|
||
RTS
|
||
*--------------------------------
|
||
DIR.QTS
|
||
DIR.QT.DO .EQ *-DIR.QTS
|
||
.AS /DO/
|
||
DIR.QT.EL .EQ *-DIR.QTS
|
||
.AS /EL/
|
||
DIR.QT.FI .EQ *-DIR.QTS
|
||
.AS /FI/
|
||
DIR.QT.MA .EQ *-DIR.QTS
|
||
.AS /MA/
|
||
DIR.QT.EM .EQ *-DIR.QTS
|
||
.AS /EM/
|
||
DIR.QT.IN .EQ *-DIR.QTS
|
||
.AS /IN/
|
||
DIR.QT.SE .EQ *-DIR.QTS
|
||
.AS /SE/
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE usr/src/scmasm.30/scmasm.s.macro
|
||
LOAD usr/src/scmasm.30/scmasm.s
|
||
ASM
|