A2osX/BIN/ACOS.S.txt

673 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/acos
*--------------------------------------
CODESEG .EQ 4096
DATASEG .EQ 256
STRVSEG .EQ 8192
FWREF .EQ 1024
EXP.DEPTH.MAX .EQ 16
CCS.MAX .EQ 128
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.i
.INB inc/mli.e.i
*--------------------------------------
* Zero Page Segment, up to 32 bytes
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPInputBufPtr .BS 2
ZPCodeBufPtr .BS 2
ZPDataBufPtr .BS 2
ZPFWRefBufPtr .BS 2
STRID .BS 2
VAR.ID .BS 2
VAR.ADDR .BS 2
VAR.TYPE .BS 1
hStrings .BS 1
EXP.ADDR .BS 2
EXP.TYPE .BS 1
EXP.AOP .BS 1
ZPStrBuf1 .BS 2
ZPStrBuf2 .BS 2
hIn .BS 1
hOut .BS 1
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ArgIndex .EQ *
pCCS .BS 1
bFlag .BS 1
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #0 S.PS.F.EVENT
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data SegmentSize
.DA #256 Stack Size
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
*--------------------------------------
L.MSG.GREETINGS .DA MSG.GREETINGS
L.MSG.USAGE .DA MSG.USAGE
L.MSG.COMPILING .DA MSG.COMPILING
L.MSG.DEBUG .DA MSG.DEBUG
L.MSG.TRACE .DA MSG.TRACE
L.MSG.ERROR .DA MSG.ERROR
L.MSG.FWREF .DA MSG.FWREF
L.MSG.FWREFERR .DA MSG.FWREFERR
L.MSG.RUN .DA MSG.RUN
L.MSG.STR .DA MSG.STR
L.MSG.INT16 .DA MSG.INT16
L.OUT .DA OUT.ELW
.DA OUT.DLW
.DA OUT.CRLF
.DA OUT.BSSPBS
.DA OUT.CLRSCR
L.FMT.DATE .DA FMT.DATE
L.FMT.TIME .DA FMT.TIME
*--------------------------------------
L.ACOS.AOPS .DA ACOS.AOPS
L.ACOS.LOPS .DA ACOS.LOPS
L.ACOS.KW .DA ACOS.KW
J.ACOS.KW .DA KW.ADDINT
.DA KW.APPEND
.DA KW.BYTE
.DA KW.CLEAR
.DA KW.CLOCK
.DA KW.CLOSE
.DA KW.COPY
.DA KW.CREATE
.DA KW.ECHO
.DA KW.EDIT
.DA KW.ELSE
.DA KW.END
.DA KW.FILL
.DA KW.FLAG
KWID.FOR .EQ *-J.ACOS.KW
.DA KW.FOR
.DA KW.FREE
.DA KW.GET
.DA KW.GOSUB
.DA KW.GOTO
.DA KW.HOME
KWID.IF .EQ *-J.ACOS.KW
.DA KW.IF
.DA KW.INFO
.DA KW.INPUT
.DA KW.KILL
.DA KW.LINK
.DA KW.LOG
.DA KW.MARK
.DA KW.MODEM
.DA KW.MOVE
.DA KW.MSG
.DA KW.NEXT
.DA KW.NIBBLE
.DA KW.NOT
.DA KW.ON
.DA KW.NOCAR
.DA KW.OPEN
.DA KW.POKE
.DA KW.POP
.DA KW.POSITION
.DA KW.PRINT
.DA KW.PUBLIC
.DA KW.PUSH
.DA KW.RAM
.DA KW.RAM2
.DA KW.READ
.DA KW.READY
.DA KW.RETURN
.DA KW.REWIND
.DA KW.RIPCO
.DA KW.SET
.DA KW.SETINT
KWID.STEP .EQ *-J.ACOS.KW
.DA KW.STEP
.DA KW.TEXT
.DA KW.THEN
KWID.TO .EQ *-J.ACOS.KW
.DA KW.TO
.DA KW.TONE
.DA KW.UPDATE
.DA KW.USE
.DA KW.WHENd
.DA KW.WRITE
*--------------------------------------
L.ACOS.FN .DA ACOS.FN
J.ACOS.FN .DA FN.BYTE
.DA FN.CHRd
.DA FN.CLOCK
.DA FN.DATEd
.DA FN.FLAG
.DA FN.INFO
.DA FN.INSTR
.DA FN.KEY
.DA FN.LEFTd
.DA FN.LEN
.DA FN.MIDd
.DA FN.PDL
.DA FN.PEEK
.DA FN.RANDOM
.DA FN.RIGHTd
.DA FN.RNDd
.DA FN.STRd
.DA FN.TIMEd
.DA FN.VAL
.DA FN.WHENd
.DA FN.WIDTH
*--------------------------------------
J.RT
RT.GET.ID .EQ *-J.RT
.DA RT.GET
RT.INPUT.ID .EQ *-J.RT
.DA RT.INPUT
*--------------------------------------
RT.DATEd.ID .EQ *-J.RT
.DA RT.DATEd
RT.LEFTd.ID .EQ *-J.RT
.DA RT.LEFTd
RT.LEN.ID .EQ *-J.RT
.DA RT.LEN
RT.MIDd.ID .EQ *-J.RT
.DA RT.MIDd
RT.RIGHTd.ID .EQ *-J.RT
.DA RT.RIGHTd
RT.STRd.ID .EQ *-J.RT
.DA RT.STRd
RT.TIMEd.ID .EQ *-J.RT
.DA RT.TIMEd
RT.VAL.ID .EQ *-J.RT
.DA RT.VAL
*--------------------------------------
RT.NOT.ID .EQ *-J.RT
.DA RT.NOT
RT.StrAdd.ID .EQ *-J.RT
.DA RT.StrAdd
RT.StrCmp.ID .EQ *-J.RT
.DA RT.StrCmp
RT.StrSet.ID .EQ *-J.RT
.DA RT.StrSet
RT.StrOut.ID .EQ *-J.RT
.DA RT.StrOut
RT.IntSet.ID .EQ *-J.RT
.DA RT.IntSet
RT.IntUpd.ID .EQ *-J.RT
.DA RT.IntUpd
RT.IntGet.ID .EQ *-J.RT
.DA RT.IntGet
RT.IntOut.ID .EQ *-J.RT
.DA RT.IntOut
RT.OUTCRLF.ID .EQ *-J.RT
.DA RT.OUTCRLF
RT.OUTX.ID .EQ *-J.RT
.DA RT.OUTX
.DA 0
*--------------------------------------
* Called once at process creation
* Put code for loading LIB here
*--------------------------------------
CS.INIT clc
CS.INIT.RTS rts
*--------------------------------------
* Called until exit with CS
* if RUN exits with CC, RN entered again
*--------------------------------------
CS.RUN >PUSHW L.MSG.GREETINGS
>PUSHW A2osX.KVER
>PUSHBI 2
>SYSCALL PrintF
bcs CS.INIT.RTS
jsr CS.RUN.ARGS
bcs CS.INIT.RTS
jsr CORE.Init
bcs CS.INIT.RTS
>PUSHW L.MSG.COMPILING
>PUSHW ZPPtr2 File name
>PUSHBI 2
>SYSCALL PrintF
bcs CS.INIT.RTS
CS.RUN.LOOP >SLEEP
>LDA.G bDebug
bpl .2
jsr PrintDebugMsg
.2 jsr CS.RUN.FGetS
bcs .4
>LDA.G bTrace
bpl .3
jsr PrintTraceMsg
.3 jsr CORE.Compile
bcc CS.RUN.LOOP
cmp #MLI.E.EOF
beq CS.RUN.LOOP
.4 cmp #MLI.E.EOF
bne .9
lda #$60 RTS
sta (ZPCodeBufPtr)
lda #0
sta (ZPFWRefBufPtr)
jsr CS.FClose
jsr CORE.FWREF
bcs .99
jsr CORE.Run
bcc .8
.9 pha
jsr PrintErrorMsg
pla
sec
rts
.8 lda #0 Exit Code = Success
sec
.99 rts
*--------------------------------------
CS.RUN.ARGS inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs .7
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
ldy #1
lda (ZPPtr1),y
ldx #OptionVars-OptionList-1
.1 cmp OptionList,x
beq .2
dex
bpl .1
bra .90
.2 ldy OptionVars,x
lda #$ff
sta (pData),y
bra CS.RUN.ARGS
.4 >LDA.G hFile
bne .90
>LDYA ZPPtr1
>STYA ZPPtr2 for printing later
jsr CS.RUN.FOpen
bcc CS.RUN.ARGS
.9 rts
.7 >LDA.G hFile
beq .90
clc
rts
.90 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec QUIT Process
rts
*--------------------------------------
CS.RUN.FOpen >PUSHYA
>PUSHBI O.RDONLY
>PUSHBI S.FI.T.TXT
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
>STA.G hFile
>LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA.G InputBufPtr
txa
>STA.G hInputBuf
.9 rts
*--------------------------------------
CS.RUN.FGetS >LDYA.G InputBufPtr
>STYA ZPInputBufPtr
>INCW.G LineCounter
>PUSHB.G hFile
>PUSHW ZPInputBufPtr
>PUSHWI 256
>SYSCALL FGetS
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT jsr CORE.Quit
CS.FClose >LDA.G hFile
beq .1
>SYSCALL FClose
>STZ.G hFile
.1 >LDA.G hInputBuf
beq .8
>SYSCALL FreeMem
>STZ.G hInputBuf
.8
* clc
rts
*--------------------------------------
PrintDebugMsg >PUSHW L.MSG.DEBUG
>PUSHW ZPCodeBufPtr
>PUSHW ZPDataBufPtr
lda pStack
clc
adc #6
pha
lda pStack+1
adc #0
>PUSHA
pla
>PUSHA
>PUSHBI 6
>SYSCALL PrintF
rts
*--------------------------------------
PrintTraceMsg ldy #S.PS.hStdErr
lda (pPS),y
>PUSHA
>PUSHW L.MSG.TRACE
>PUSHW.G LineCounter
>PUSHW.G InputBufPtr
>PUSHBI 4
>SYSCALL FPrintF
rts
*--------------------------------------
PrintErrorMsg >LDA.G bTrace
bmi .1
jsr PrintTraceMsg
.1 lda ZPInputBufPtr
sec
>SBC.G InputBufPtr
tax
>LDYA.G InputBufPtr
>STYA ZPInputBufPtr
txa
beq .3
ldy #0
lda #'-'
.2 sta (ZPInputBufPtr),y
iny
dex
bne .2
txa
.3 sta (ZPInputBufPtr),y
.8 ldy #S.PS.hStdErr
lda (pPS),y
>PUSHA
>PUSHW L.MSG.ERROR
>PUSHW ZPInputBufPtr
>PUSHBI 2
>SYSCALL FPrintF
rts
*--------------------------------------
.INB usr/src/bin/acos.s.code
.INB usr/src/bin/acos.s.core
.INB usr/src/bin/acos.s.exp
.INB usr/src/bin/acos.s.fn
.INB usr/src/bin/acos.s.kw
.INB usr/src/bin/acos.s.rt
*--------------------------------------
CS.END
*--------------------------------------
* Pre-compiled code
*--------------------------------------
CCODE.PUSHYA >PUSHYA
CCODE.PUSHYA.LEN .EQ *-CCODE.PUSHYA
*--------------------------------------
CCODE.TESTTRUE lda (pStack)
inc pStack
ora (pStack)
php
inc pStack
plp
.1 bne .1+5
.HS 4C JMP abs
CCODE.TESTTRUE.LEN .EQ *-CCODE.TESTTRUE
*--------------------------------------
* Initialized DATA
*--------------------------------------
MSG.GREETINGS .CZ "\r\nACOS-Shell %d.%d\r\n\r\n"
MSG.USAGE .CS "Usage : ACOS <option> file\r\n"
.CS " -D : Debug Mode\r\n"
.CS " -T : Trace On"
OUT.CRLF .CZ "\r\n"
*--------------------------------------
MSG.COMPILING .CZ "***Compiling : %s...\r\n"
MSG.DEBUG .CZ "***CodePtr=%H DataPtr=%H StackPtr=%H\r\n"
MSG.TRACE .CZ "%05D>%s\r\n"
MSG.ERROR .CZ " %s^\r\n"
MSG.FWREF .CZ "***Resolving FWRefs..."
MSG.FWREFERR .CZ "***Unresolved FWRef : %s\r\n"
MSG.RUN .CZ "***Code size: %D, Data Size: %D, Running...\r\n"
MSG.STR .CZ "%s"
MSG.INT16 .CZ "%I"
*--------------------------------------
OUT.ELW .CZ "\e[?7h" Enable Line Wrap
OUT.DLW .CZ "\e[?7l" Disable Line Wrap
OUT.BSSPBS .CZ "\b \b"
OUT.CLRSCR .CS "\ec"
.CS "\e(B"
.CZ "\e)0"
*--------------------------------------
FMT.DATE .CZ "%m/%d/%y"
FMT.TIME .CZ "%H:%M:%S"
*--------------------------------------
OptionList .AS "DdTt"
OptionVars .DA #bDebug,#bDebug,#bTrace,#bTrace
*--------------------------------------
ACOS.OPSChars .AS "+-*/<>="
ACOS.OPSChars.Cnt .EQ *-ACOS.OPSChars
*--------------------------------------
ACOS.AOPS .AT "*"
.AT "/"
.AT "MOD"
.AT "+"
.AT "-"
.AT "<"
.AT "<="
.AT "=<"
.AT ">"
.AT ">="
.AT "=>"
.AT "<>"
.AT "><"
.AT "="
.HS 00
ACOS.LOPS .AT "AND"
.AT "OR"
.HS 00
*--------------------------------------
ACOS.AOPS2FPU .DA #FPU.iMUL,#FPU.iDIV,#FPU.iMOD,#FPU.iADD,#FPU.iSUB
.DA #FPU.iL,#FPU.iLE,#FPU.iLE
.DA #FPU.iG,#FPU.iGE,#FPU.iGE
.DA #FPU.iNE,#FPU.iNE,#FPU.iE
.DA #FPU.iLAND,#FPU.iLOR
*--------------------------------------
ACOS.KW .AT "ADDINT"
.AT "APPEND"
.AT "BYTE"
.AT "CLEAR"
.AT "CLOCK"
.AT "CLOSE"
.AT "COPY"
.AT "CREATE"
.AT "ECHO"
.AT "EDIT"
.AT "ELSE"
.AT "END"
.AT "FILL"
.AT "FLAG"
.AT "FOR"
.AT "FREE"
.AT "GET"
.AT "GOSUB"
.AT "GOTO"
.AT "HOME"
.AT "IF"
.AT "INFO"
.AT "INPUT"
.AT "KILL"
.AT "LINK"
.AT "LOG"
.AT "MARK"
.AT "MODEM"
.AT "MOVE"
.AT "MSG"
.AT "NEXT"
.AT "NIBBLE"
.AT "NOT"
.AT "ON"
.AT "NOCAR"
.AT "OPEN"
.AT "POKE"
.AT "POP"
.AT "POSITION"
.AT "PRINT"
.AT "PUBLIC"
.AT "PUSH"
.AT "RAM"
.AT "RAM2"
.AT "READ"
.AT "READY"
.AT "RETURN"
.AT "REWIND"
.AT "RIPCO"
.AT "SET"
.AT "SETINT"
.AT "STEP"
.AT "TEXT"
.AT "THEN"
.AT "TO"
.AT "TONE"
.AT "UPDATE"
.AT "USE"
.AT "WHEN$"
.AT "WRITE"
.HS 00
*--------------------------------------
ACOS.FN .AT "BYTE"
.AT "CHR$"
.AT "CLOCK"
.AT "DATE$"
.AT "FLAG"
.AT "INFO"
.AT "INSTR"
.AT "KEY"
.AT "LEFT$"
.AT "LEN"
.AT "MID$"
.AT "PDL"
.AT "PEEK"
.AT "RANDOM"
.AT "RIGHT$"
.AT "RND$"
.AT "STR$"
.AT "TIME$"
.AT "VAL"
.AT "WHEN$"
.AT "WIDTH"
.HS 00
*--------------------------------------
.DUMMY
.OR 0
DS.START
CCS .BS CCS.MAX
bDebug .BS 1
bTrace .BS 1
LineCounter .BS 2
hFile .BS 1
hInputBuf .BS 1
InputBufPtr .BS 2
hCodeBuf .BS 1
hDataBuf .BS 1
hLabels .BS 1
hVars .BS 1
hStrBuf1 .BS 1
hStrBuf2 .BS 1
hFWRefBuf .BS 1
TimeBuf .BS S.TIME
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/acos.s
ASM