mirror of https://github.com/A2osX/A2osX.git
Kernel 0.94+
This commit is contained in:
parent
5886c5810c
commit
d8c0f5e1e3
|
@ -895,9 +895,9 @@ string is then terminated with a null byte.
|
|||
|
||||
## ASM
|
||||
**In:**
|
||||
`>PUSHW n`
|
||||
`>PUSHB hFILE`
|
||||
`>PUSHW s`
|
||||
`lda hFILE`
|
||||
`>PUSHW n`
|
||||
`>SYSCALL fgets`
|
||||
|
||||
## RETURN VALUE
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -133,6 +133,7 @@ CS.RUN.LOOP ldy #S.PS.hStdIn
|
|||
eor #$ff
|
||||
sta bPause
|
||||
bne CS.RUN.LOOP
|
||||
|
||||
.10 lda bPause
|
||||
bne CS.RUN.LOOP Pause...
|
||||
|
||||
|
@ -155,10 +156,9 @@ CS.RUN.LOOP ldy #S.PS.hStdIn
|
|||
|
||||
sta hFile
|
||||
|
||||
.2 >PUSHWI 254 Leave room for CRLF
|
||||
.2 >PUSHA
|
||||
>PUSHW ZPBufPtr
|
||||
lda hFile
|
||||
|
||||
>PUSHWI 254 Leave room for CRLF
|
||||
>SYSCALL FGetS
|
||||
bcs .7
|
||||
|
||||
|
|
|
@ -5,9 +5,10 @@ NEW
|
|||
PathBuf .BS 65
|
||||
|
||||
hFileBuf .BS 1
|
||||
hIncludeBuf .BS 1
|
||||
|
||||
CSH.Buf .BS 2
|
||||
CSH.BufPtrSave .BS 2
|
||||
|
||||
CSH.CmdSave .BS 1
|
||||
CSH.LookupOpt .BS 1
|
||||
|
||||
|
@ -27,6 +28,9 @@ CSH.DataPtr .BS 2
|
|||
CSH.hStack .BS 1
|
||||
CSH.StackPtr .BS 1
|
||||
|
||||
CSH.SaveInclude .BS 2
|
||||
CSH.SaveDefine .BS 2
|
||||
|
||||
CSH.VarDef .BS 6
|
||||
*--------------------------------------
|
||||
MAN
|
||||
|
|
|
@ -2,10 +2,10 @@ NEW
|
|||
AUTO 3,1
|
||||
.LIST OFF
|
||||
*--------------------------------------
|
||||
CSH.Q.CONST .EQ %10000000
|
||||
CSH.Q.POINTER .EQ %00100000
|
||||
CSH.Q.PPOINTER .EQ %01000000
|
||||
CSH.Q.PPPOINTER .EQ %01100000
|
||||
CSH.Q.POINTER .EQ %01000000
|
||||
CSH.Q.PPOINTER .EQ %10000000
|
||||
CSH.Q.PPPOINTER .EQ %11000000
|
||||
CSH.Q.CONST .EQ %00100000
|
||||
CSH.Q.FUNC .EQ %00010000
|
||||
CSH.T.VOID .EQ 0
|
||||
CSH.T.CHAR .EQ 1
|
||||
|
@ -99,9 +99,13 @@ CSH.TYPES >PSTR "void"
|
|||
>PSTR "float"
|
||||
>PSTR "signed" char,int,long
|
||||
>PSTR "unsigned" char,int,long
|
||||
>PSTR "short" int
|
||||
CSH.STYPES >PSTR "char"
|
||||
>PSTR "int"
|
||||
>PSTR "long"
|
||||
.HS 00
|
||||
*--------------------------------------
|
||||
CSH.FTYPES >PSTR "fastcall"
|
||||
* .HS 00
|
||||
*--------------------------------------
|
||||
CSH.TYPESIZE .HS 0001020401020405 VOID,CHAR,INT,LONG,UCHAR,UINT,ULONG,FLOAT....
|
||||
|
|
|
@ -50,6 +50,7 @@ L.CSH.DIRS .DA CSH.DIRS
|
|||
L.CSH.KW .DA CSH.KW
|
||||
L.CSH.TYPES .DA CSH.TYPES
|
||||
L.CSH.STYPES .DA CSH.STYPES
|
||||
L.CSH.FTYPES .DA CSH.FTYPES
|
||||
J.CSH.DIRS .DA CSH.DIR.DEFINE
|
||||
.DA CSH.DIR.INCLUDE
|
||||
J.CSH.KW .DA CSH.IF
|
||||
|
@ -68,14 +69,13 @@ J.CSH.KW .DA CSH.IF
|
|||
.DA CSH.FLOAT
|
||||
.DA CSH.SIGNED
|
||||
.DA CSH.UNSIGNED
|
||||
.DA CSH.SHORT
|
||||
J.CSH.STYPES .DA CSH.CHAR
|
||||
.DA CSH.INT
|
||||
.DA CSH.LONG
|
||||
J.CSH.UTYPES .DA CSH.UCHAR
|
||||
.DA CSH.UINT
|
||||
.DA CSH.ULONG
|
||||
*J.CSH.KW.START .DA CSH.IF.START
|
||||
* .DA CSH.WHILE.START
|
||||
J.CSH.KW.END .DA CSH.IF.END
|
||||
.DA CSH.WHILE.END
|
||||
*--------------------------------------
|
||||
|
|
|
@ -73,12 +73,12 @@ CSH.Quit >LDA.G CSH.hSymbols
|
|||
>PUSHA
|
||||
>SYSCALL SListFree
|
||||
|
||||
.3 >LDA.G hIncludeBuf
|
||||
.3 lda hInclude
|
||||
beq .4
|
||||
|
||||
>SYSCALL FClose
|
||||
|
||||
.4 lda ZPhMacro
|
||||
.4 lda hDefine
|
||||
jsr .7
|
||||
|
||||
>LDA.G hFileBuf
|
||||
|
@ -240,7 +240,7 @@ CSH.DIR.DEFINE jsr CSH.CheckSpace
|
|||
ldy #$ff
|
||||
|
||||
.1 iny
|
||||
lda (ZPFileBufPtr),y
|
||||
lda (ZPInputBufPtr),y
|
||||
beq .2
|
||||
|
||||
cmp #C.CR
|
||||
|
@ -254,7 +254,7 @@ CSH.DIR.DEFINE jsr CSH.CheckSpace
|
|||
|
||||
>PUSHB.G CSH.hDefines
|
||||
>PUSHW ZPVarID
|
||||
>PUSHW ZPFileBufPtr
|
||||
>PUSHW ZPInputBufPtr
|
||||
|
||||
ply
|
||||
lda #0
|
||||
|
@ -313,16 +313,22 @@ CSH.DIR.INCLUDE >STZ.G PathBuf
|
|||
|
||||
.8 jsr CSH.GetNextChar skip " or >
|
||||
|
||||
>LDA.G hIncludeBuf
|
||||
lda hInclude
|
||||
bne .90
|
||||
|
||||
lda hDefine
|
||||
bne .90
|
||||
|
||||
>LDYA ZPInputBufPtr
|
||||
>STYA.G CSH.SaveInclude
|
||||
|
||||
>LDYA pData
|
||||
jsr CS.RUN.LoadFile
|
||||
bcs .99
|
||||
|
||||
>STA.G hIncludeBuf
|
||||
stx hInclude
|
||||
>STYA ZPInputBufPtr
|
||||
>STYA.G CSH.Buf For printing error message
|
||||
|
||||
rts
|
||||
*--------------------------------------
|
||||
|
@ -334,7 +340,7 @@ CSH.SkipLine jsr CSH.GetNextChar
|
|||
clc
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
CSH.SavePtr >LDYA ZPFileBufPtr
|
||||
CSH.SavePtr >LDYA ZPInputBufPtr
|
||||
>STYA.G CSH.BufPtrSave
|
||||
rts
|
||||
*--------------------------------------
|
||||
|
@ -353,27 +359,32 @@ CSH.LookupOP >STYA ZPPtr1
|
|||
|
||||
CSH.Lookup phy Y = len
|
||||
ldx #0
|
||||
|
||||
.1 lda (ZPPtr1)
|
||||
beq .9 Ending 0, not found....
|
||||
|
||||
pla
|
||||
pha Get Back Len
|
||||
cmp (ZPPtr1) Same Len ?
|
||||
bne .4
|
||||
|
||||
tay
|
||||
.2 lda (ZPPtr1),y
|
||||
|
||||
.3 dey
|
||||
cmp (ZPFileBufPtr),y
|
||||
cmp (ZPInputBufPtr),y
|
||||
bne .4
|
||||
tya
|
||||
|
||||
tya
|
||||
bne .2
|
||||
|
||||
pla Found keyword...
|
||||
clc
|
||||
adc ZPFileBufPtr ..advance Ptr to char after it..
|
||||
sta ZPFileBufPtr
|
||||
adc ZPInputBufPtr ..advance Ptr to char after it..
|
||||
sta ZPInputBufPtr
|
||||
bcc .31
|
||||
inc ZPFileBufPtr+1
|
||||
|
||||
inc ZPInputBufPtr+1
|
||||
|
||||
.31 lda ZPPtr1
|
||||
sec
|
||||
|
@ -418,7 +429,7 @@ CSH.ZPPtr1AddAp1
|
|||
inc ZPPtr1+1
|
||||
.1 rts
|
||||
*--------------------------------------
|
||||
* Input : ZPFileBufPtr
|
||||
* Input : ZPInputBufPtr
|
||||
* Output : Y,A = VarID
|
||||
*--------------------------------------
|
||||
CSH.AddSymbol >LDA.G CSH.hSymbols
|
||||
|
@ -464,10 +475,11 @@ CSH.TMISMATCH lda #CSH.E.TMISMATCH
|
|||
*--------------------------------------
|
||||
CSH.AddFunction lda #CSH.Q.FUNC
|
||||
tsb ZPVarType
|
||||
|
||||
|
||||
jsr CSH.GetNextCharNB Skip (
|
||||
bcs .9
|
||||
|
||||
|
||||
>DEBUG
|
||||
.1 cmp #')'
|
||||
beq .5
|
||||
|
||||
|
@ -489,18 +501,18 @@ CSH.AddFunction lda #CSH.Q.FUNC
|
|||
.99 rts
|
||||
*--------------------------------------
|
||||
CSH.NewKey >PUSHA
|
||||
>PUSHW ZPFileBufPtr
|
||||
>PUSHW ZPInputBufPtr
|
||||
>SYSCALL SListNewKey
|
||||
bcs .9
|
||||
|
||||
pha
|
||||
txa
|
||||
* clc
|
||||
adc ZPFileBufPtr
|
||||
sta ZPFileBufPtr
|
||||
adc ZPInputBufPtr
|
||||
sta ZPInputBufPtr
|
||||
bcc .1
|
||||
|
||||
inc ZPFileBufPtr+1
|
||||
inc ZPInputBufPtr+1
|
||||
|
||||
.1 clc
|
||||
pla
|
||||
|
@ -546,22 +558,20 @@ CSH.GetDefine >PUSHB.G CSH.hDefines
|
|||
>SYSCALL SListGetData
|
||||
bcs .9
|
||||
|
||||
stx ZPhMacro
|
||||
stx hDefine
|
||||
|
||||
lda ZPFileBufPtr
|
||||
sta ZPFileBufPtrBak
|
||||
lda ZPFileBufPtr+1
|
||||
sta ZPFileBufPtrBak+1
|
||||
>LDYA ZPInputBufPtr
|
||||
>STYA.G CSH.SaveDefine
|
||||
|
||||
txa
|
||||
>SYSCALL GetMemPtr
|
||||
>STYA ZPFileBufPtr
|
||||
>STYA ZPInputBufPtr
|
||||
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
CSH.GetVar >PUSHB.G CSH.hSymbols
|
||||
|
||||
CSH.Get >PUSHW ZPFileBufPtr
|
||||
CSH.Get >PUSHW ZPInputBufPtr
|
||||
>SYSCALL SListLookup
|
||||
bcs .9
|
||||
|
||||
|
@ -569,10 +579,10 @@ CSH.Get >PUSHW ZPFileBufPtr
|
|||
|
||||
txa
|
||||
* clc
|
||||
adc ZPFileBufPtr
|
||||
sta ZPFileBufPtr
|
||||
adc ZPInputBufPtr
|
||||
sta ZPInputBufPtr
|
||||
bcc .1
|
||||
inc ZPFileBufPtr+1
|
||||
inc ZPInputBufPtr+1
|
||||
clc
|
||||
.1 pla Y,A = VarID
|
||||
.9 rts
|
||||
|
@ -740,7 +750,7 @@ CSH.Pop >LDA.G CSH.StackPtr
|
|||
*--------------------------------------
|
||||
CSH.GetOPLen ldy #0
|
||||
.1 iny
|
||||
lda (ZPFileBufPtr),y
|
||||
lda (ZPInputBufPtr),y
|
||||
beq .8
|
||||
|
||||
jsr CSH.IsOPChar
|
||||
|
@ -750,7 +760,7 @@ CSH.GetOPLen ldy #0
|
|||
*--------------------------------------
|
||||
CSH.GetIDLen ldy #0
|
||||
.1 iny
|
||||
lda (ZPFileBufPtr),y
|
||||
lda (ZPInputBufPtr),y
|
||||
beq .8
|
||||
|
||||
jsr CSH.IsLetterOrDigit
|
||||
|
@ -828,30 +838,42 @@ CSH.CheckCharNB cmp #C.SPACE
|
|||
clc
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
CSH.GetNextChar inc ZPFileBufPtr
|
||||
CSH.GetNextChar inc ZPInputBufPtr
|
||||
bne CSH.GetChar
|
||||
inc ZPFileBufPtr+1
|
||||
inc ZPInputBufPtr+1
|
||||
*--------------------------------------
|
||||
CSH.GetChar lda (ZPFileBufPtr)
|
||||
CSH.GetChar lda (ZPInputBufPtr)
|
||||
bne .8
|
||||
|
||||
lda ZPhMacro
|
||||
beq .9
|
||||
lda hDefine
|
||||
beq .1
|
||||
|
||||
stz ZPhMacro
|
||||
stz hDefine
|
||||
|
||||
phx
|
||||
phy
|
||||
>SYSCALL FreeMem
|
||||
|
||||
>LDYA.G CSH.SaveDefine
|
||||
>STYA ZPInputBufPtr
|
||||
|
||||
ply
|
||||
plx
|
||||
bra CSH.GetChar
|
||||
|
||||
.1 lda hInclude
|
||||
beq .9
|
||||
|
||||
stz hInclude
|
||||
phx
|
||||
phy
|
||||
>SYSCALL FreeMem
|
||||
|
||||
lda ZPFileBufPtrBak
|
||||
sta ZPFileBufPtr
|
||||
|
||||
lda ZPFileBufPtrBak+1
|
||||
sta ZPFileBufPtr+1
|
||||
>LDYA.G CSH.SaveInclude
|
||||
>STYA ZPInputBufPtr
|
||||
|
||||
ply
|
||||
plx
|
||||
bra CSH.GetChar
|
||||
|
||||
.8 clc
|
||||
|
|
|
@ -3,7 +3,7 @@ NEW
|
|||
.LIST OFF
|
||||
*--------------------------------------
|
||||
* Input:
|
||||
* ZPFileBufPtr, A = Expected type
|
||||
* ZPInputBufPtr, A = Expected type
|
||||
* Output:
|
||||
* CS, A = EC
|
||||
* CC, X = Var Type, Value on Stack
|
||||
|
@ -93,8 +93,10 @@ CSH.ExpEval ldx ZPPtr1
|
|||
|
||||
.31 cmp #','
|
||||
beq .80
|
||||
|
||||
cmp #')'
|
||||
beq .80
|
||||
|
||||
cmp #';'
|
||||
beq .80
|
||||
|
||||
|
@ -196,14 +198,14 @@ CSH.GetNumOnStack
|
|||
bcc .1
|
||||
bne .99
|
||||
|
||||
>PUSHW ZPFileBufPtr
|
||||
>PUSHWI ZPFileBufPtr
|
||||
>PUSHW ZPInputBufPtr
|
||||
>PUSHWI ZPInputBufPtr
|
||||
>SYSCALL StrToF
|
||||
clc
|
||||
rts
|
||||
|
||||
.1 >PUSHW ZPFileBufPtr
|
||||
>PUSHWI ZPFileBufPtr
|
||||
.1 >PUSHW ZPInputBufPtr
|
||||
>PUSHWI ZPInputBufPtr
|
||||
>PUSHBI 10
|
||||
phx
|
||||
cpx #CSH.T.UCHAR
|
||||
|
|
|
@ -56,28 +56,13 @@ CSH.IF jsr CSH.GetCharNB
|
|||
sec
|
||||
.99 rts
|
||||
*--------------------------------------
|
||||
*CSH.Keyword.Start
|
||||
* >LDA.G CSH.CmdSave get back Token ("IF" or "WHILE")
|
||||
* tax
|
||||
* jmp (J.CSH.KW.START,x)
|
||||
*--------------------------------------
|
||||
*CSH.IF.START jmp CSH.Push Push "IF" Token
|
||||
*--------------------------------------
|
||||
*CSH.WHILE.START pha
|
||||
* >LDA.G CSH.BufPtrSave+1 WHILE : push loop address...
|
||||
* jsr CSH.Push
|
||||
* >LDA.G CSH.BufPtrSave
|
||||
* jsr CSH.Push
|
||||
* pla
|
||||
* jmp CSH.Push Push "WHILE" Token
|
||||
*--------------------------------------
|
||||
CSH.IF.END clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CSH.WHILE.END jsr CSH.Pop
|
||||
sta ZPFileBufPtr
|
||||
sta ZPInputBufPtr
|
||||
jsr CSH.Pop
|
||||
sta ZPFileBufPtr+1
|
||||
sta ZPInputBufPtr+1
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
|
@ -146,10 +131,26 @@ CSH.UNSIGNED clc
|
|||
.8 jmp (J.CSH.STYPES,x)
|
||||
|
||||
.9 plp
|
||||
|
||||
lda #CSH.E.SYNTAX
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
CSH.SHORT jsr CSH.CheckSpace
|
||||
bcs .9
|
||||
|
||||
>LDYA L.CSH.STYPES
|
||||
jsr CSH.LookupID
|
||||
|
||||
bcs CSH.UCHAR
|
||||
|
||||
cpx #2
|
||||
beq CSH.CHAR
|
||||
|
||||
.9 lda #CSH.E.SYNTAX
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
CSH.VOID ldx #CSH.T.VOID
|
||||
bra CSH.TYPE
|
||||
CSH.CHAR ldx #CSH.T.CHAR
|
||||
|
@ -168,32 +169,55 @@ CSH.ULONG ldx #CSH.T.ULONG
|
|||
CSH.FLOAT ldx #CSH.T.FLOAT
|
||||
|
||||
CSH.TYPE stx ZPVarType
|
||||
jsr CSH.CheckSpace
|
||||
|
||||
.11 jsr CSH.GetNextCharNB
|
||||
bcs .9
|
||||
|
||||
.11 cmp #'*'
|
||||
cmp #'*'
|
||||
bne .10
|
||||
|
||||
lda #CSH.Q.POINTER
|
||||
tsb ZPVarType
|
||||
jsr CSH.GetNextCharNB Skip *
|
||||
bra .11
|
||||
lda ZPVarType
|
||||
clc
|
||||
adc #CSH.Q.POINTER
|
||||
sta ZPVarType
|
||||
bcc .11
|
||||
|
||||
bra .9 more than ***
|
||||
|
||||
.10 jsr CSH.IsLetter
|
||||
bcs .9
|
||||
|
||||
jsr CSH.AddSymbol add with undef value...
|
||||
>LDYA L.CSH.FTYPES
|
||||
jsr CSH.LookupID
|
||||
bcs .12
|
||||
|
||||
sec
|
||||
ror bFastCall
|
||||
|
||||
jsr CSH.GetNextCharNB
|
||||
bcs .9
|
||||
|
||||
jsr CSH.AddSymbol
|
||||
bcs .99
|
||||
|
||||
jsr CSH.GetCharNB
|
||||
bcs .9
|
||||
|
||||
bra .13
|
||||
|
||||
.12 jsr CSH.AddSymbol add with undef value...
|
||||
bcs .99 OOM or DUP
|
||||
|
||||
jsr CSH.GetCharNB
|
||||
bcs .9
|
||||
|
||||
cmp #';'
|
||||
beq .8
|
||||
|
||||
cmp #'='
|
||||
beq .2
|
||||
|
||||
cmp #'('
|
||||
.13 cmp #'('
|
||||
bne .9
|
||||
|
||||
jmp CSH.AddFunction
|
||||
|
@ -222,7 +246,7 @@ CSH.TYPE stx ZPVarType
|
|||
.99 rts
|
||||
*--------------------------------------
|
||||
* Input:
|
||||
* ZPFileBufPtr, A = Expected type
|
||||
* ZPInputBufPtr, A = Expected type
|
||||
* Output:
|
||||
* CS, A = EC
|
||||
* CC, Result on Stack, X = Type
|
||||
|
|
|
@ -28,17 +28,21 @@ ZPVarType .BS 2
|
|||
ZPVarSizeOf .BS 2
|
||||
ZPVarDataPtr .BS 2
|
||||
|
||||
ZPFileBuf .BS 2
|
||||
ZPFileBufPtr .BS 2
|
||||
ZPFileBufPtrBak .BS 2
|
||||
ZPInputBufPtr .BS 2
|
||||
|
||||
|
||||
ZPhMacro .BS 1
|
||||
ArgIndex .BS 1
|
||||
bFastCall .BS 1
|
||||
bCompil .BS 1
|
||||
|
||||
hDefine .BS 1
|
||||
hInclude .BS 1
|
||||
|
||||
ZPPtr1 .BS 2
|
||||
ZPPtr2 .BS 2
|
||||
ZPPtr3 .BS 2
|
||||
|
||||
ArgIndex .BS 1
|
||||
|
||||
ZS.END .ED
|
||||
*--------------------------------------
|
||||
* File Header (16 Bytes)
|
||||
|
@ -80,8 +84,7 @@ CS.INIT.RTS rts
|
|||
* if RUN exits with CC, RN entered again
|
||||
*--------------------------------------
|
||||
CS.RUN >PUSHW L.MSG.GREETINGS
|
||||
>PUSHB #K.VER
|
||||
>PUSHB /K.VER
|
||||
>PUSHW A2osX.KVER
|
||||
>PUSHBI 2
|
||||
>SYSCALL PrintF
|
||||
bcs CS.INIT.RTS
|
||||
|
@ -96,14 +99,17 @@ CS.RUN >PUSHW L.MSG.GREETINGS
|
|||
|
||||
>LDA.G bDebug
|
||||
bpl .2
|
||||
|
||||
jsr PrintDebugMsg
|
||||
.2 >LDA.G bTrace
|
||||
bpl .3
|
||||
>LDYA ZPFileBufPtr
|
||||
|
||||
>LDYA ZPInputBufPtr
|
||||
jsr PrintTraceMsg
|
||||
|
||||
.3 jsr CSH.Run
|
||||
bcc .1
|
||||
|
||||
cmp #MLI.E.EOF
|
||||
beq .8
|
||||
|
||||
|
@ -153,6 +159,10 @@ CS.RUN.ARGS inc ArgIndex
|
|||
jsr CS.RUN.LoadFile
|
||||
bcs .9
|
||||
|
||||
>STYA ZPInputBufPtr
|
||||
>STYA.G CSH.Buf For printing error message
|
||||
|
||||
txa
|
||||
>STA.G hFileBuf
|
||||
bra CS.RUN.ARGS
|
||||
|
||||
|
@ -176,9 +186,7 @@ CS.RUN.LoadFile >SYSCALL LoadTxtFile
|
|||
phx
|
||||
txa
|
||||
>SYSCALL GetMemPtr
|
||||
>STYA ZPFileBuf
|
||||
>STYA ZPFileBufPtr
|
||||
pla
|
||||
plx
|
||||
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
|
@ -189,16 +197,13 @@ CS.QUIT jsr CSH.Quit
|
|||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
PrintErrMsg lda ZPhMacro
|
||||
PrintErrMsg lda hDefine
|
||||
beq .10
|
||||
|
||||
lda ZPFileBufPtrBak
|
||||
sta ZPFileBufPtr
|
||||
>LDYA.G CSH.SaveDefine
|
||||
>STYA ZPInputBufPtr
|
||||
|
||||
lda ZPFileBufPtrBak+1
|
||||
sta ZPFileBufPtr+1
|
||||
|
||||
.10 >LDYA ZPFileBuf
|
||||
.10 >LDYA.G CSH.Buf
|
||||
>STYA ZPPtr1
|
||||
stz ZPPtr2
|
||||
stz ZPPtr2+1 Line counter
|
||||
|
@ -218,9 +223,9 @@ PrintErrMsg lda ZPhMacro
|
|||
.3 cmp #C.CR
|
||||
bne .20 Scan until EoL
|
||||
ldx ZPPtr1
|
||||
cpx ZPFileBufPtr
|
||||
cpx ZPInputBufPtr
|
||||
lda ZPPtr1+1
|
||||
sbc ZPFileBufPtr+1
|
||||
sbc ZPInputBufPtr+1
|
||||
bcc .1 not this line....
|
||||
|
||||
.4 >LDA.G bTrace
|
||||
|
@ -229,17 +234,20 @@ PrintErrMsg lda ZPhMacro
|
|||
jsr PrintTraceMsg.3
|
||||
|
||||
.5 lda ZPPtr3
|
||||
cmp ZPFileBufPtr
|
||||
cmp ZPInputBufPtr
|
||||
bne .6
|
||||
|
||||
lda ZPPtr3+1
|
||||
cmp ZPFileBufPtr+1
|
||||
cmp ZPInputBufPtr+1
|
||||
beq .8
|
||||
|
||||
.6 >PUSHBI '-'
|
||||
ldy #S.PS.hStdErr
|
||||
lda (pPS),y
|
||||
>SYSCALL FPutC
|
||||
inc ZPPtr3
|
||||
bne .5
|
||||
|
||||
inc ZPPtr3+1
|
||||
bra .5
|
||||
|
||||
|
|
|
@ -157,11 +157,11 @@ CS.RUN lda #C.SPACE
|
|||
*--------------------------------------
|
||||
CS.RUN.LOOP >SLEEP
|
||||
|
||||
>PUSHWI 256
|
||||
>PUSHW ZPBufPtr
|
||||
ldy #S.PS.hStdIn
|
||||
lda (pPS),y
|
||||
|
||||
>PUSHA
|
||||
>PUSHW ZPBufPtr
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs .8
|
||||
|
||||
|
|
|
@ -480,9 +480,9 @@ CFG.Read.Close2 lda CFG.hCfgFile
|
|||
plp
|
||||
rts
|
||||
*--------------------------------------
|
||||
CFG.Read.GetS >PUSHWI 255
|
||||
CFG.Read.GetS >PUSHB CFG.hCfgFile
|
||||
>PUSHW BufPtr
|
||||
lda CFG.hCfgFile
|
||||
>PUSHWI 255
|
||||
>SYSCALL FGetS
|
||||
rts
|
||||
*--------------------------------------
|
||||
|
|
|
@ -13,8 +13,25 @@ CP.RUN cpx #KW.CONLY
|
|||
|
||||
.1 jmp (J.KEYWORDS,x)
|
||||
*--------------------------------------
|
||||
CP.DO jsr CP.Emit.DO
|
||||
jsr CP.PushCodePtr for compiling LOOP later
|
||||
CP.DO jsr CP.Emit.DO I,n -> RP
|
||||
* >DEBUG
|
||||
ldy RP
|
||||
|
||||
lda ZPCodePtr+1
|
||||
sta (pData),y
|
||||
dey
|
||||
|
||||
lda ZPCodePtr
|
||||
sta (pData),y
|
||||
dey push CodePtr=DOTEST on RP for LOOP/LEAVE
|
||||
|
||||
sty RP
|
||||
|
||||
jsr CP.Emit.DOTEST CODE: I < n ?
|
||||
|
||||
ldx #KW.DO.ID
|
||||
jsr CP.Emit.JMP0000 to put jmp LOOPEND
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
|
@ -24,69 +41,130 @@ CP.LOOP lda #$00
|
|||
lda #$01 >PUSHBI 1
|
||||
jsr CP.Emit.PUSHBI
|
||||
*--------------------------------------
|
||||
CP.pLOOP jsr CP.Emit.LOOP
|
||||
jsr CP.Emit.JMPBack
|
||||
CP.pLOOP ldy RP
|
||||
* >DEBUG
|
||||
iny
|
||||
bmi .9
|
||||
|
||||
lda (pData),y
|
||||
cmp #KW.DO.ID
|
||||
bne .9
|
||||
|
||||
phy
|
||||
jsr CP.Emit.LOOP CODE: I=I+n
|
||||
ply
|
||||
|
||||
iny POP LOOPEND@ -> Ptr1
|
||||
lda (pData),y
|
||||
sta ZPPtr1
|
||||
|
||||
iny
|
||||
lda (pData),y
|
||||
sta ZPPtr1+1
|
||||
|
||||
jsr CP.Emit.JMPBack CODE: JMP to DOTEST
|
||||
|
||||
sty RP discard ID DOTEST@ LOOPEND@
|
||||
|
||||
jsr CP.UpdatePtr1 update JMP LOOPEND@ with CodePtr
|
||||
|
||||
jsr CP.Emit.LOOPEND
|
||||
|
||||
inc RP
|
||||
inc RP
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
.9 lda #E.NODO
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.I jsr CP.Emit.I
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.LEAVE jsr CP.Emit.LEAVE
|
||||
jsr CP.Emit.JMPBack
|
||||
CP.LEAVE ldy RP
|
||||
* >DEBUG
|
||||
.1 iny
|
||||
bmi .9
|
||||
|
||||
lda (pData),y
|
||||
cmp #KW.DO.ID
|
||||
beq .2
|
||||
|
||||
iny
|
||||
iny
|
||||
bpl .1 skip 3 bytes on RP
|
||||
|
||||
.9 lda #E.NODO
|
||||
sec
|
||||
rts
|
||||
|
||||
.2 phy
|
||||
jsr CP.Emit.LEAVE set I = END on RP
|
||||
ply
|
||||
|
||||
iny skip LOOPEND ptr
|
||||
iny
|
||||
|
||||
jsr CP.Emit.JMPBack jmp DOTEST
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.IF jsr CP.Emit.TESTTRUE
|
||||
ldx #KW.IF.ID
|
||||
jsr CP.Emit.JMP0000 to put jmp -> ELSE/ENDIF later
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.ELSE jsr CP.PopPtr1 get previous JMP -> ptr1
|
||||
CP.ELSE jsr CP.PopCodePtr get previous JMP -> ptr1
|
||||
ldx #KW.IF.ID
|
||||
jsr CP.Emit.JMP0000 to put jmp -> ENDIF later
|
||||
jsr CP.UpdatePtr1
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.ENDIF jsr CP.PopPtr1
|
||||
CP.ENDIF jsr CP.PopCodePtr
|
||||
jsr CP.UpdatePtr1
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.BEGIN jsr CP.PushCodePtr
|
||||
CP.BEGIN jsr CP.PushCodePtr X = BEGIN ID
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.UNTIL jsr CP.Emit.TESTFALSE
|
||||
jsr CP.Emit.JMPBack
|
||||
jsr CP.Emit.RPDROP2
|
||||
|
||||
clc
|
||||
rts
|
||||
bra CP.WHILE.1
|
||||
*--------------------------------------
|
||||
CP.REPEAT jsr CP.Emit.JMPBack
|
||||
CP.REPEAT ldy RP
|
||||
iny
|
||||
bmi CP.E.NOBEGIN
|
||||
|
||||
jsr CP.Emit.JMPBack
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.WHILE jsr CP.Emit.TESTTRUE
|
||||
|
||||
CP.WHILE.1 ldy RP
|
||||
iny
|
||||
bmi CP.E.NOBEGIN
|
||||
|
||||
jsr CP.Emit.JMPBack
|
||||
jsr CP.Emit.RPDROP2
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.E.NOBEGIN lda #E.NOFOR
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.Emit.JMP0000 lda #$4C JMP
|
||||
jsr CP.Emit.Byte
|
||||
|
||||
|
@ -100,8 +178,7 @@ CP.Emit.JMP0000 lda #$4C JMP
|
|||
*--------------------------------------
|
||||
CP.Emit.JMPBack lda #$4C JMP
|
||||
jsr CP.Emit.Byte
|
||||
|
||||
ldy RP
|
||||
|
||||
iny
|
||||
lda (pData),y
|
||||
jsr CP.Emit.Byte
|
||||
|
@ -184,6 +261,17 @@ CP.Emit.DO ldx #CODE.DO.L
|
|||
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.Emit.DOTEST ldx #CODE.DOTEST.L
|
||||
ldy #0
|
||||
|
||||
.1 lda CODE.DOTEST,y
|
||||
jsr CP.Emit.Byte
|
||||
iny
|
||||
dex
|
||||
bne .1
|
||||
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.Emit.LOOP ldx #CODE.LOOP.L
|
||||
ldy #0
|
||||
|
||||
|
@ -251,10 +339,19 @@ CP.PushCodePtr ldy RP
|
|||
sta (pData),y
|
||||
dey
|
||||
|
||||
txa
|
||||
sta (pData),y
|
||||
dey
|
||||
|
||||
sty RP
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.PopPtr1 ldy RP
|
||||
CP.PopCodePtr ldy RP
|
||||
iny
|
||||
lda (pData),y
|
||||
cmp #KW.IF.ID
|
||||
bne .9
|
||||
|
||||
iny
|
||||
lda (pData),y
|
||||
sta ZPPtr1
|
||||
|
@ -265,6 +362,11 @@ CP.PopPtr1 ldy RP
|
|||
|
||||
sty RP
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
.9 lda #E.NOIF
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
CP.UpdatePtr1 lda ZPCodePtr
|
||||
|
|
|
@ -8,6 +8,8 @@ GFX.Open >PUSHBI 0
|
|||
|
||||
>STA.G hDevGFX
|
||||
|
||||
rts
|
||||
|
||||
ldy #S.PS.hStdIn
|
||||
lda (pPS),y
|
||||
bit #1
|
||||
|
@ -56,7 +58,7 @@ GFX.WriteX ldy #1
|
|||
lda (pStack)
|
||||
sta (pStack),y
|
||||
|
||||
lda #S.CB.M.MONO
|
||||
lda #S.CB.M.C16
|
||||
sta (pStack)
|
||||
|
||||
>PUSHBI S.CB.OP.SET
|
||||
|
|
|
@ -190,11 +190,13 @@ KW.ECOLON.ID .EQ *-J.KEYWORDS
|
|||
*--------------------------------------
|
||||
KW.CONLY .EQ *-J.KEYWORDS
|
||||
*--------------------------------------
|
||||
KW.DO.ID .EQ *-J.KEYWORDS
|
||||
.DA CP.DO
|
||||
.DA CP.LOOP
|
||||
.DA CP.pLOOP
|
||||
.DA CP.I
|
||||
.DA CP.LEAVE
|
||||
KW.IF.ID .EQ *-J.KEYWORDS
|
||||
.DA CP.IF
|
||||
.DA CP.ELSE
|
||||
.DA CP.ENDIF
|
||||
|
@ -362,10 +364,9 @@ CS.FORTH.Run jsr CL.Reset
|
|||
CS.FORTH.Run.File
|
||||
>INCW.G LineCounter
|
||||
|
||||
>PUSHWI 256
|
||||
>PUSHB.G hFile
|
||||
>PUSHW ZPCLBuf
|
||||
|
||||
>LDA.G hFile
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs .9
|
||||
|
||||
|
@ -464,8 +465,8 @@ CS.RUN.EXEC lda (ZPCLBufPtr)
|
|||
|
||||
.71 jmp CP.RUN COMPILE
|
||||
|
||||
.80
|
||||
* >DEBUG
|
||||
.80
|
||||
* >DEBUG
|
||||
jmp (ZPAddrPtr)
|
||||
*--------------------------------------
|
||||
CS.RUN.ARGS inc ArgIndex
|
||||
|
@ -951,14 +952,34 @@ CODE.DO lda RP
|
|||
ldx #4
|
||||
|
||||
.1 >PULLA
|
||||
sta (pData),y
|
||||
iny
|
||||
sta (pData),y
|
||||
dex
|
||||
bne .1
|
||||
CODE.DO.L .EQ *-CODE.DO
|
||||
*--------------------------------------
|
||||
CODE.DOTEST ldy RP
|
||||
iny
|
||||
|
||||
lda (pData),y I LO
|
||||
iny
|
||||
iny
|
||||
cmp (pData),y END LO
|
||||
|
||||
dey
|
||||
|
||||
lda (pData),y I HI
|
||||
iny
|
||||
iny
|
||||
sbc (pData),y END HI
|
||||
|
||||
.1 bcc .1+5 Skip JMP LOOPEND
|
||||
CODE.DOTEST.L .EQ *-CODE.DOTEST
|
||||
*--------------------------------------
|
||||
CODE.LOOP >PULLA
|
||||
ldy RP
|
||||
iny
|
||||
|
||||
clc
|
||||
adc (pData),y
|
||||
sta (pData),y
|
||||
|
@ -968,31 +989,17 @@ CODE.LOOP >PULLA
|
|||
adc (pData),y
|
||||
sta (pData),y
|
||||
|
||||
dey
|
||||
|
||||
lda (pData),y
|
||||
iny
|
||||
iny
|
||||
cmp (pData),y
|
||||
|
||||
dey
|
||||
|
||||
lda (pData),y
|
||||
iny
|
||||
iny
|
||||
sbc (pData),y
|
||||
|
||||
.1 bcs .1+5
|
||||
CODE.LOOP.L .EQ *-CODE.LOOP
|
||||
*--------------------------------------
|
||||
CODE.LOOPEND lda RP POP 4 bytes
|
||||
clc
|
||||
adc #4
|
||||
sta RP
|
||||
clc
|
||||
CODE.LOOPEND.L .EQ *-CODE.LOOPEND
|
||||
*--------------------------------------
|
||||
CODE.I ldy RP
|
||||
iny
|
||||
|
||||
iny
|
||||
lda (pData),y
|
||||
>PUSHA
|
||||
|
@ -1003,18 +1010,23 @@ CODE.I.L .EQ *-CODE.I
|
|||
*--------------------------------------
|
||||
CODE.LEAVE ldy RP
|
||||
iny
|
||||
|
||||
iny skip I
|
||||
iny
|
||||
lda (pData),y
|
||||
|
||||
lda (pData),y get end LO
|
||||
tax
|
||||
|
||||
iny
|
||||
lda (pData),y
|
||||
lda (pData),y get end HI
|
||||
|
||||
dey
|
||||
dey
|
||||
sta (pData),y
|
||||
sta (pData),y I HI
|
||||
|
||||
txa
|
||||
dey
|
||||
sta (pData),y
|
||||
>DEBUG
|
||||
sta (pData),y I LO
|
||||
CODE.LEAVE.L .EQ *-CODE.LEAVE
|
||||
*--------------------------------------
|
||||
.DUMMY
|
||||
|
@ -1039,7 +1051,6 @@ hFile .BS 1
|
|||
LineCounter .BS 2
|
||||
hSList .BS 1
|
||||
hDevGFX .BS 1
|
||||
GFX.CB .BS S.CB
|
||||
DS.END .ED
|
||||
*--------------------------------------
|
||||
MAN
|
||||
|
|
|
@ -127,21 +127,24 @@ CS.RUN
|
|||
.80 >LDYAI 256
|
||||
>SYSCALL GetMem
|
||||
bcs .9
|
||||
|
||||
>STYA ZPBufPtr
|
||||
stx hBuf
|
||||
stz LineNum
|
||||
stz LineNum+1
|
||||
CS.RUN.LOOP >SLEEP
|
||||
|
||||
>PUSHWI 256
|
||||
>PUSHB hFile
|
||||
>PUSHW ZPBufPtr
|
||||
|
||||
lda hFile
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs .9
|
||||
|
||||
inc LineNum
|
||||
bne .2
|
||||
|
||||
inc LineNum+1
|
||||
|
||||
.2 jsr CS.RUN.PRINT
|
||||
|
||||
bcc CS.RUN.LOOP
|
||||
|
|
|
@ -731,9 +731,9 @@ LIBTCPIP .AZ "libtcpip"
|
|||
hLIBTCPIP .BS 1
|
||||
MSG.IPKO .AZ "TCP/IP Not Loaded/Configured."
|
||||
MSG.USAGE .AS "Usage : HTTPGET <ip|host> [port]\r\n"
|
||||
.AS " -U Url\r\n"
|
||||
.AS " -F UrlFile\r\n"
|
||||
.AS " -O OutputFile"
|
||||
.AS " -U : Url\r\n"
|
||||
.AS " -F : UrlFile\r\n"
|
||||
.AS " -O : OutputFile"
|
||||
MSG.CRLF .AZ "\r\n"
|
||||
MSG.UNKNOWN .AZ "%s: Unknown host\r\n"
|
||||
MSG.CONNECT .AZ "Connecting to %d.%d.%d.%d:%D (%s)..."
|
||||
|
|
|
@ -330,7 +330,9 @@ CFG.Read.Open stz CFG.hCfgFile
|
|||
>PUSHWZ
|
||||
>SYSCALL FOpen
|
||||
bcs .9
|
||||
|
||||
sta CFG.hCfgFile
|
||||
|
||||
* clc
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
|
@ -338,14 +340,16 @@ CFG.Read.Close php
|
|||
pha
|
||||
CFG.Read.Close2 lda CFG.hCfgFile
|
||||
beq .8
|
||||
|
||||
>SYSCALL FClose
|
||||
|
||||
.8 pla
|
||||
plp
|
||||
rts
|
||||
*--------------------------------------
|
||||
CFG.Read.GetS >PUSHWI 255
|
||||
CFG.Read.GetS >PUSHB CFG.hCfgFile
|
||||
>PUSHW ZPTmpPtr1
|
||||
lda CFG.hCfgFile
|
||||
>PUSHWI 255
|
||||
>SYSCALL FGetS
|
||||
rts
|
||||
*--------------------------------------
|
||||
|
|
|
@ -315,7 +315,7 @@ CS.RUN.MkNod >PUSHEA.G NodBuf
|
|||
>SYSCALL SPrintF
|
||||
bcs .9
|
||||
|
||||
>PUSHEA.G NodBuf
|
||||
>PUSHEA.G NodBuf+5
|
||||
>PUSHW 0
|
||||
>PUSHB hSocket
|
||||
>SYSCALL MKNod
|
||||
|
@ -653,9 +653,9 @@ CS.RUN.CMD.376
|
|||
>SYSCALL PrintF
|
||||
rts
|
||||
*--------------------------------------
|
||||
CS.RUN.GetMsg >PUSHWI MSGSIZE
|
||||
CS.RUN.GetMsg >PUSHB hFile
|
||||
>PUSHW ZPMsgPtr
|
||||
lda hFile
|
||||
>PUSHWI MSGSIZE
|
||||
>SYSCALL FGetS
|
||||
bcs .9
|
||||
|
||||
|
|
|
@ -251,15 +251,17 @@ CS.RUN.GETC lda hFile
|
|||
.1 >SYSCALL GetChar
|
||||
rts
|
||||
*--------------------------------------
|
||||
CS.RUN.GETLINE >PUSHWI 256
|
||||
>PUSHW ZPBufPtr
|
||||
lda hFile
|
||||
CS.RUN.GETLINE lda hFile
|
||||
bne .1
|
||||
|
||||
ldy #S.PS.hStdIn
|
||||
lda (pPS),y
|
||||
|
||||
.1 >SYSCALL FGetS
|
||||
.1 >PUSHA
|
||||
|
||||
>PUSHW ZPBufPtr
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
rts
|
||||
*--------------------------------------
|
||||
CS.RUN.PRINT lda bLineNum
|
||||
|
|
|
@ -0,0 +1,434 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
.LIST OFF
|
||||
.OP 65C02
|
||||
.OR $2000
|
||||
.TF bin/ntpdate
|
||||
*--------------------------------------
|
||||
.INB inc/macros.i
|
||||
.INB inc/a2osx.i
|
||||
.INB inc/mli.i
|
||||
.INB inc/eth.i
|
||||
.INB inc/libtcpip.i
|
||||
*--------------------------------------
|
||||
TIMEOUT.MAX .EQ 250 25 sec.
|
||||
*--------------------------------------
|
||||
.DUMMY
|
||||
.OR ZPBIN
|
||||
ZS.START
|
||||
ZPIPCfgPtr .BS 2
|
||||
ZPPtr .BS 2
|
||||
hSocket .BS 1
|
||||
hFrame .BS 1
|
||||
TimeOut .BS 1
|
||||
iArg .BS 1
|
||||
|
||||
iHost .BS 1
|
||||
bSet .BS 1
|
||||
bDaemon .BS 1
|
||||
|
||||
Time1900 .BS 4
|
||||
Adjust .BS 4
|
||||
|
||||
STime .BS S.TIME
|
||||
|
||||
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 #S.PS.F.EVENT
|
||||
.DA #0
|
||||
.DA CS.END-CS.START Code Length To Relocate
|
||||
.DA DS.END-DS.START Data Segment to Allocate
|
||||
.DA #16 SS
|
||||
.DA #ZS.END-ZS.START Zero Page Size
|
||||
.DA 0
|
||||
*--------------------------------------
|
||||
.1 .DA CS.INIT
|
||||
.DA CS.RUN
|
||||
.DA CS.DOEVENT
|
||||
.DA CS.QUIT
|
||||
J.CheckArgs .DA CheckArgs.A
|
||||
.DA CheckArgs.S
|
||||
.DA CheckArgs.D
|
||||
L.LIBTCPIP .DA LIBTCPIP
|
||||
L.SA.LOCAL .DA SA.LOCAL
|
||||
L.SA.REMOTE .DA SA.REMOTE
|
||||
L.SA.REMOTE.AD .DA SA.REMOTE+S.SOCKADDR.ADDR
|
||||
L.NTP.Request .DA NTP.Request
|
||||
L.MSG.USAGE .DA MSG.USAGE
|
||||
L.MSG.IPKO .DA MSG.IPKO
|
||||
L.MSG.UNKNOWN .DA MSG.UNKNOWN
|
||||
L.MSG.SOCKET .DA MSG.SOCKET
|
||||
L.MSG.TIMEOUT .DA MSG.TIMEOUT
|
||||
L.MSG.TIME .DA MSG.TIME
|
||||
.DA 0
|
||||
*--------------------------------------
|
||||
CS.INIT >LDYA L.LIBTCPIP
|
||||
>SYSCALL LoadLib
|
||||
bcs .9
|
||||
|
||||
sta hLIBTCPIP
|
||||
|
||||
clc
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
CS.RUN jsr CheckArgs
|
||||
bcs .9
|
||||
|
||||
jsr OpenSocket
|
||||
bcs .9
|
||||
|
||||
.1 jsr SendNTPRequest
|
||||
bcs .2
|
||||
|
||||
jsr DecodeNTPReply
|
||||
bcs .2
|
||||
|
||||
bit bSet
|
||||
bpl .2
|
||||
|
||||
jsr SetProDOSTime
|
||||
|
||||
.2 bit bDaemon
|
||||
bpl .7
|
||||
|
||||
lda #TIMEOUT.MAX
|
||||
sta TimeOut
|
||||
|
||||
.3 >SLEEP
|
||||
|
||||
lda TimeOut
|
||||
bne .3
|
||||
|
||||
bra .1
|
||||
|
||||
.7 bcc .8
|
||||
rts
|
||||
|
||||
.8 lda #0
|
||||
sec
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
CS.DOEVENT lda (pEvent)
|
||||
bpl .9 is it a TIMER event?
|
||||
|
||||
lda TimeOut
|
||||
beq .9
|
||||
|
||||
dec TimeOut
|
||||
|
||||
.9 sec do not discard TIMER event
|
||||
rts
|
||||
*--------------------------------------
|
||||
CS.QUIT lda hSocket
|
||||
beq .1
|
||||
|
||||
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
|
||||
|
||||
.1 lda hLIBTCPIP
|
||||
beq .8
|
||||
|
||||
>SYSCALL UnloadLib
|
||||
|
||||
.8 clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CheckArgs inc iArg
|
||||
lda iArg
|
||||
>SYSCALL ArgV
|
||||
bcs .8
|
||||
|
||||
>STYA ZPPtr
|
||||
lda (ZPPtr)
|
||||
cmp #'-'
|
||||
bne .4
|
||||
|
||||
ldy #2
|
||||
lda (ZPPtr),y
|
||||
bne .9
|
||||
|
||||
dey
|
||||
lda (ZPPtr),y
|
||||
|
||||
ldx #OptionCnt-2
|
||||
|
||||
.2 cmp OptionList,x
|
||||
beq .3
|
||||
|
||||
cmp OptionList+1,x
|
||||
beq .3
|
||||
|
||||
dex
|
||||
dex
|
||||
bpl .2
|
||||
|
||||
bra .9
|
||||
|
||||
.3 inc iArg
|
||||
|
||||
jsr .5
|
||||
bcc CheckArgs
|
||||
bcs .9
|
||||
|
||||
.4 lda iHost
|
||||
bne .9
|
||||
|
||||
lda iArg
|
||||
sta iHost
|
||||
bra CheckArgs
|
||||
|
||||
.5 jmp (J.CheckArgs,x)
|
||||
|
||||
.8 lda iHost
|
||||
beq .9
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
.9 >PUSHW L.MSG.USAGE
|
||||
>PUSHBI 0
|
||||
>SYSCALL PrintF
|
||||
lda #E.SYN
|
||||
sec
|
||||
rts
|
||||
|
||||
CheckArgs.A lda iArg
|
||||
>SYSCALL ArgV
|
||||
bcs .9
|
||||
|
||||
>SYSCALL AToL
|
||||
>PUSHWI 0
|
||||
>PUSHWI 3600
|
||||
>FPU IMUL32
|
||||
>PULLL Adjust
|
||||
|
||||
clc
|
||||
|
||||
.9 rts
|
||||
|
||||
CheckArgs.S sec
|
||||
ror bSet
|
||||
rts
|
||||
|
||||
CheckArgs.D sec
|
||||
ror bDaemon
|
||||
rts
|
||||
*--------------------------------------
|
||||
OpenSocket >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ?
|
||||
bcs .99
|
||||
|
||||
>STYA ZPIPCfgPtr
|
||||
|
||||
lda (ZPIPCfgPtr) Configured ?
|
||||
bmi .10
|
||||
|
||||
.99 >LDYA L.MSG.IPKO
|
||||
>SYSCALL PutS
|
||||
sec
|
||||
rts
|
||||
|
||||
.10 ldy #S.IPCFG.IP+3
|
||||
ldx #3
|
||||
|
||||
.1 lda (ZPIPCfgPtr),y
|
||||
sta SA.LOCAL+S.SOCKADDR.ADDR,x
|
||||
dey
|
||||
dex
|
||||
bpl .1
|
||||
|
||||
lda #TIMEOUT.MAX
|
||||
sta TimeOut
|
||||
|
||||
.2 >PUSHW L.SA.REMOTE.AD
|
||||
lda iHost
|
||||
>SYSCALL ArgV
|
||||
>PUSHYA
|
||||
>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GetByName
|
||||
bcc .3
|
||||
|
||||
>SLEEP
|
||||
lda TimeOut
|
||||
bne .2
|
||||
|
||||
>PUSHW L.MSG.UNKNOWN
|
||||
lda iHost
|
||||
>SYSCALL ArgV
|
||||
>PUSHYA
|
||||
>PUSHBI 2
|
||||
>SYSCALL PrintF
|
||||
sec
|
||||
rts
|
||||
|
||||
.3 >PUSHBI S.IP.PROTOCOL.UDP
|
||||
lda #S.SOCKET.T.DGRAM
|
||||
>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
|
||||
bcs .9
|
||||
|
||||
sta hSocket
|
||||
|
||||
>PUSHW L.SA.LOCAL
|
||||
lda hSocket
|
||||
>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
|
||||
bcs .9
|
||||
|
||||
>PUSHW L.SA.REMOTE
|
||||
lda hSocket
|
||||
>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
|
||||
bcc .8
|
||||
|
||||
.9 pha
|
||||
>PUSHW L.MSG.SOCKET
|
||||
>PUSHBI 0
|
||||
>SYSCALL PrintF
|
||||
pla
|
||||
sec
|
||||
.8 rts
|
||||
*--------------------------------------
|
||||
SendNTPRequest >PUSHWI NTP.Request.End-NTP.Request
|
||||
>PUSHW L.NTP.Request
|
||||
|
||||
lda hSocket
|
||||
>LIBCALL hLIBTCPIP,LIBTCPIP.Send
|
||||
bcs .9
|
||||
|
||||
lda #TIMEOUT.MAX
|
||||
sta TimeOut
|
||||
|
||||
.1 lda hSocket
|
||||
>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
|
||||
bcc .8
|
||||
|
||||
>SLEEP
|
||||
lda TimeOut
|
||||
bne .1
|
||||
|
||||
.9 >PUSHW L.MSG.TIMEOUT
|
||||
lda iHost
|
||||
>SYSCALL ArgV
|
||||
>PUSHYA
|
||||
>PUSHBI 2
|
||||
>SYSCALL PrintF
|
||||
|
||||
sec
|
||||
.8 rts
|
||||
*--------------------------------------
|
||||
DecodeNTPReply sta hFrame
|
||||
>SYSCALL GetMemPtr
|
||||
>STYA ZPPtr
|
||||
|
||||
lda #S.UDP+40
|
||||
|
||||
clc
|
||||
adc ZPPtr
|
||||
sta ZPPtr
|
||||
lda /S.UDP+40
|
||||
adc ZPPtr+1
|
||||
sta ZPPtr+1
|
||||
|
||||
ldy #3
|
||||
ldx #0
|
||||
|
||||
clc
|
||||
|
||||
.1 lda (ZPPtr),y
|
||||
adc Adjust,x
|
||||
sta Time1900,x
|
||||
inx
|
||||
dey
|
||||
bpl .1
|
||||
|
||||
>PUSHWI Time1900
|
||||
>PUSHWI STime
|
||||
>SYSCALL CTime2Time
|
||||
|
||||
lda STime+S.TIME.YEAR
|
||||
sec
|
||||
sbc #70
|
||||
sta STime+S.TIME.YEAR
|
||||
|
||||
>PUSHW L.MSG.TIME
|
||||
|
||||
ldy #0
|
||||
|
||||
.2 >PUSHB STime,y
|
||||
iny
|
||||
cpy #7
|
||||
bne .2
|
||||
|
||||
>PUSHBI 7
|
||||
>SYSCALL PrintF
|
||||
|
||||
lda hFrame
|
||||
>SYSCALL FreeMem
|
||||
|
||||
rts
|
||||
*--------------------------------------
|
||||
SetProDOSTime lda STime+S.TIME.MONTH
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
sta DATELO
|
||||
|
||||
lda STime+S.TIME.YEAR
|
||||
rol
|
||||
sta DATELO+1
|
||||
|
||||
lda STime+S.TIME.DAY
|
||||
ora DATELO
|
||||
sta DATELO
|
||||
|
||||
lda STime+S.TIME.HOUR
|
||||
sta TIMELO+1
|
||||
|
||||
lda STime+S.TIME.MINUTE
|
||||
sta TIMELO
|
||||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------
|
||||
CS.END
|
||||
LIBTCPIP .AZ "libtcpip"
|
||||
hLIBTCPIP .BS 1
|
||||
*--------------------------------------
|
||||
OptionList .AS "AaSsDd"
|
||||
OptionCnt .EQ *-OptionList
|
||||
*--------------------------------------
|
||||
MSG.USAGE .AS "Usage : NTPDATE <ip|host>\r\n"
|
||||
.AS " -A (-)nn : TZ offset\r\n"
|
||||
.AS " -S : Set ProDOS date\r\n"
|
||||
.AZ " -D : Run as Daemon\r\n"
|
||||
MSG.IPKO .AZ "TCP/IP Not Loaded/Configured."
|
||||
MSG.UNKNOWN .AZ "%s: Unknown host\r\n"
|
||||
MSG.SOCKET .AZ "Failed to open socket\r\n"
|
||||
MSG.TIMEOUT .AZ "No response from %s\r\n"
|
||||
MSG.TIME .AS "NTPDATE:%02d%02d/%02d/%02d %02d:%02d:%02d\r\n"
|
||||
*--------------------------------------
|
||||
SA.LOCAL .DA #AF.INET S.SOCKADDR.AF
|
||||
.BS 1
|
||||
.BS 4 S.SOCKADDR.ADDR
|
||||
.BS 2 S.SOCKADDR.PORT
|
||||
*--------------------------------------
|
||||
SA.REMOTE .DA #AF.INET S.SOCKADDR.AF
|
||||
.BS 1
|
||||
.BS 4 S.SOCKADDR.ADDR
|
||||
.DA UDP.PORT.NTP
|
||||
*--------------------------------------
|
||||
NTP.Request .HS 1B
|
||||
.BS 47
|
||||
NTP.Request.End .EQ *
|
||||
*--------------------------------------
|
||||
.DUMMY
|
||||
.OR 0
|
||||
DS.START
|
||||
DS.END .ED
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE usr/src/bin/ntpdate.s
|
||||
ASM
|
|
@ -1082,12 +1082,11 @@ CMD.NEXT.FILEEXEC.POP
|
|||
*--------------------------------------
|
||||
CMD.NEXT.LINE jsr CMD.NEXT.GetVarNamePtr
|
||||
|
||||
>PUSHWI 256
|
||||
>PUSHW ZPCLBuf
|
||||
|
||||
dey
|
||||
lda (pData),y hFILE/hPIPE
|
||||
|
||||
>PUSHA
|
||||
>PUSHW ZPCLBuf
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs CMD.NEXT.END
|
||||
|
||||
|
|
|
@ -284,9 +284,9 @@ CS.RUN.FILE jsr FilterMatch
|
|||
.99 rts
|
||||
*--------------------------------------
|
||||
CS.RUN.FILE.LOOP
|
||||
.1 >PUSHWI 256
|
||||
.1 >PUSHB hFile
|
||||
>PUSHW ZPLineBuf
|
||||
lda hFile
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs .8
|
||||
|
||||
|
|
|
@ -3,68 +3,46 @@ NEW
|
|||
#!/bin/forth
|
||||
|
||||
140 CONSTANT MAXX
|
||||
70 CONSTANT CENTERX
|
||||
110 CONSTANT CENTERX
|
||||
192 CONSTANT MAXY
|
||||
92 CONSTANT CENTERY
|
||||
100 CONSTANT ZOOM
|
||||
96 CONSTANT CENTERY
|
||||
16 CONSTANT MAXITER
|
||||
|
||||
0 VARIABLE X
|
||||
0 VARIABLE Y
|
||||
0 VARIABLE CX
|
||||
0 VARIABLE CY
|
||||
|
||||
0 VARIABLE ZX
|
||||
0 VARIABLE ZY
|
||||
0 VARIABLE ZX2
|
||||
0 VARIABLE ZY2
|
||||
0 VARIABLE CX
|
||||
0 VARIABLE CY
|
||||
0 VARIABLE TMP
|
||||
0 VARIABLE ITER
|
||||
|
||||
\for y in range(0,200)
|
||||
\ for x in range(0,300)
|
||||
\ zx = 0
|
||||
\ zy = 0
|
||||
\ cx = (x - 200) / ZOOM
|
||||
\ cy = (y - 100) / ZOOM
|
||||
\ for iter in range(MAX_ITER)
|
||||
\ if zx*zx + zy*zy > 4 then break
|
||||
\ tmp = zx * zx - zy * zy + cx
|
||||
\ zy = 2 * zx * zy + cy
|
||||
\ zx = tmp
|
||||
\ end for
|
||||
\ if iter then
|
||||
\ gfx.setPixel x, y, rgb(255-iter*6, 0, iter*6)
|
||||
\ end if
|
||||
\ end for
|
||||
\end for
|
||||
|
||||
0 VARIABLE COLOR
|
||||
|
||||
: CELL
|
||||
0 ZX !
|
||||
0 ZY !
|
||||
0 ITER !
|
||||
X CENTERX - ZOOM / CX !
|
||||
Y CENTERY - ZOOM / CY !
|
||||
|
||||
X @ CENTERX - CX !
|
||||
Y @ CENTERY - CY !
|
||||
0 COLOR !
|
||||
MAXITER 0 DO
|
||||
ZX ZX * ZX2 !
|
||||
ZY ZY * ZY2 !
|
||||
ZX2 ZY2 + 4 > IF I ITER ! LEAVE ENDIF
|
||||
ZX2 ZY2 - CX + TMP !
|
||||
ZX ZY * 2 * CY + ZY !
|
||||
TMP ZX !
|
||||
ZX @ ZX @ * 50 / ZX2 !
|
||||
ZY @ ZY @ * 100 / ZY2 !
|
||||
ZX2 @ ZY2 @ + 1000 > IF I COLOR ! LEAVE ENDIF
|
||||
ZX @ ZY @ * 25 / CY @ + ZY !
|
||||
ZX2 @ ZY2 @ - CX @ + ZX !
|
||||
LOOP
|
||||
\ Y 4 / X ITER PLOT
|
||||
Y @ . X @ . ITER @ . CR ;
|
||||
Y @ X @ 4 * COLOR @ PLOT ;
|
||||
|
||||
: MANDELBROT
|
||||
\ 191 559 0 0 0 RECT
|
||||
MAXY 0 DO
|
||||
I Y !
|
||||
MAXX 0 DO
|
||||
I X !
|
||||
CELL
|
||||
LOOP
|
||||
LOOP ;
|
||||
MAXY 0 DO
|
||||
I Y !
|
||||
MAXX 0 DO
|
||||
I X !
|
||||
CELL
|
||||
LOOP
|
||||
LOOP ;
|
||||
|
||||
MANDELBROT
|
||||
MAN
|
||||
|
|
|
@ -122,6 +122,7 @@ E.NOIF .EQ $C6
|
|||
E.BADFTYPE .EQ $C7
|
||||
E.FUNDEF .EQ $C8
|
||||
E.UNEXPEOF .EQ $C9
|
||||
E.NODO .EQ $CA
|
||||
*--------------------------------------
|
||||
E.OOM .EQ $7F Out Of Memory Error
|
||||
E.OOH .EQ $7E Out Of Handle Error
|
||||
|
@ -225,7 +226,6 @@ SYS.FEOF .EQ $3E
|
|||
|
||||
SYS.Remove .EQ $40
|
||||
SYS.Rename .EQ $42
|
||||
* STDIO2
|
||||
SYS.PrintF .EQ $44
|
||||
SYS.FPrintF .EQ $46
|
||||
SYS.SPrintF .EQ $48
|
||||
|
@ -326,7 +326,6 @@ SYS.SListGetData .EQ $E0
|
|||
SYS.SListAddData .EQ $E2
|
||||
SYS.SListSetData .EQ $E4
|
||||
SYS.SListGetByID .EQ $E6
|
||||
|
||||
SYS.SListNewKey .EQ $E8
|
||||
SYS.SListLookup .EQ $EA
|
||||
SYS.SListFree .EQ $EC
|
||||
|
|
|
@ -71,6 +71,7 @@ ERR.ARP.PENDING .EQ $B5
|
|||
*--------------------------------------
|
||||
UDP.PORT.DNS .EQ 53
|
||||
UDP.PORT.PMAP .EQ 111
|
||||
UDP.PORT.NTP .EQ 123
|
||||
*--------------------------------------
|
||||
*S.IPCFG.STATUS .EQ 0
|
||||
S.IPCFG.STATUS.OFF .EQ %00000000 TCPIP Unconfigured
|
||||
|
|
|
@ -1,32 +1,32 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
|
||||
#DEFINE O_RDONLY 1
|
||||
#DEFINE O_WRONLY 2
|
||||
#DEFINE O_RDWR 3
|
||||
#DEFINE O_TRUNC 4
|
||||
#DEFINE O_APPEND 8
|
||||
#DEFINE O_TEXT 64
|
||||
#DEFINE O_CREATE 128
|
||||
|
||||
fastcall int putchar(short int);
|
||||
#define O_RDONLY 1
|
||||
#define O_WRONLY 2
|
||||
#define O_RDWR 3
|
||||
#define O_TRUNC 4
|
||||
#define O_APPEND 8
|
||||
#define O_TEXT 64
|
||||
#define O_CREATE 128
|
||||
|
||||
int fastcall putchar(short int);
|
||||
// int fputc ( hFILE stream , short int character );
|
||||
fastcall int puts(const char*);
|
||||
int fastcall puts(const char*);
|
||||
int fputs (short int, const char*);
|
||||
// char *fgets(hFILE stream, char * s, int n);
|
||||
char* fgets(hFILE stream, char* s, int n);
|
||||
short int getchar();
|
||||
fastcall short int getc(short int);
|
||||
short int fastcall getc(short int);
|
||||
// short int ungetc(short int c, short int );
|
||||
|
||||
short int fopen( const char*,short int,short int,int);
|
||||
int fclose(short int);
|
||||
// int fread (short int stream, void * ptr, int count );
|
||||
// int fwrite (short int stream, const void * ptr, int count );
|
||||
fastcall int fflush(short int);
|
||||
int fastcall fflush(short int);
|
||||
// int fseek( short int stream, long offset, short int whence );
|
||||
fastcall int feof(short int);
|
||||
fastcall long ftell(short int);
|
||||
fastcall int remove(const char*);
|
||||
int fastcall feof(short int);
|
||||
long fastcall ftell(short int);
|
||||
int fastcall remove(const char*);
|
||||
int rename(const char*,const char*);
|
||||
|
||||
int printf(const char*,...);
|
||||
|
|
|
@ -7,8 +7,8 @@ float atof(const char*);
|
|||
long strtol(const char*,char**,int);
|
||||
unsigned long strtoul(const char*,char**,int);
|
||||
|
||||
fastcall long atol(const char*);
|
||||
fastcall int atoi(const char*);
|
||||
long fastcall atol(const char*);
|
||||
int fastcall atoi(const char*);
|
||||
|
||||
char *realpath(const char*,char*);
|
||||
char *expand(const char*,char*);
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
|
||||
fastcall int strlen(char*);
|
||||
int fastcall strlen(char*);
|
||||
// char* strcat(char*,const char*);
|
||||
// char* strcpy(char*,const char*);
|
||||
fastcall char* strdup (char*);
|
||||
fastcall char* strupr (char*);
|
||||
fastcall char* strlwr (char*);
|
||||
char* fastcall strdup (char*);
|
||||
char* fastcall strupr (char*);
|
||||
char* fastcall strlwr (char*);
|
||||
// int strcmp(const char *s1, const char *s2);
|
||||
// int strcasecmp(const char *s1, const char *s2);
|
||||
MAN
|
||||
|
|
|
@ -213,9 +213,9 @@ CS.RUN.CONF >PUSHW L.ETCHTTPDCONF
|
|||
|
||||
sta hFile
|
||||
|
||||
.1 >PUSHWI 256
|
||||
.1 >PUSHB hFile
|
||||
>PUSHW ZPLinePtr
|
||||
lda hFile
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs .8
|
||||
|
||||
|
|
|
@ -148,9 +148,9 @@ CS.RUN.ETCINIT >LDYAI 256
|
|||
|
||||
.10 sta hFile
|
||||
|
||||
.1 >PUSHWI 256
|
||||
.1 >PUSHB hFile
|
||||
>PUSHW BufPtr
|
||||
lda hFile
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs .80
|
||||
|
||||
|
|
|
@ -286,9 +286,9 @@ CS.RUN.DumpFile >PUSHYA
|
|||
>STYA ZPBufPtr
|
||||
stx ZPhBuf
|
||||
|
||||
.1 >PUSHWI 256
|
||||
.1 >PUSHB ZPhFile
|
||||
>PUSHW ZPBufPtr
|
||||
lda ZPhFile
|
||||
>PUSHWI 256
|
||||
>SYSCALL FGetS
|
||||
bcs .7
|
||||
|
||||
|
|
|
@ -209,9 +209,9 @@ CS.INIT.CONF >LDYAI 64
|
|||
|
||||
sta hEtcNetwork
|
||||
|
||||
.1 >PUSHWI 64
|
||||
.1 >PUSHB hEtcNetwork
|
||||
>PUSHW pBuf
|
||||
lda hEtcNetwork
|
||||
>PUSHWI 64
|
||||
>SYSCALL FGetS
|
||||
bcs .80
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ ERRORX.GetErrorMessage
|
|||
|
||||
clc
|
||||
rts
|
||||
*--------------------------------------MLI
|
||||
*-------------------------------------- MLI
|
||||
ERRORX.Codes .DA #MLI.E.BADCALL
|
||||
.DA #MLI.E.IO
|
||||
.DA #MLI.E.NODEV
|
||||
|
@ -73,7 +73,7 @@ ERRORX.Codes .DA #MLI.E.BADCALL
|
|||
.DA #MLI.E.LOCKED
|
||||
.DA #MLI.E.OPEN
|
||||
.DA #MLI.E.BADBUF
|
||||
*--------------------------------------KERNEL
|
||||
*-------------------------------------- KERNEL
|
||||
.DA #E.OOM
|
||||
.DA #E.OOH
|
||||
.DA #E.INVH
|
||||
|
@ -87,7 +87,7 @@ ERRORX.Codes .DA #MLI.E.BADCALL
|
|||
.DA #E.FTB
|
||||
.DA #E.INUM
|
||||
.DA #3 Ctrl-C
|
||||
*--------------------------------------PARSER
|
||||
*-------------------------------------- PARSER
|
||||
.DA #E.CSYN
|
||||
.DA #E.ESYN
|
||||
.DA #E.STACKERROR
|
||||
|
@ -98,6 +98,7 @@ ERRORX.Codes .DA #MLI.E.BADCALL
|
|||
.DA #E.BADFTYPE
|
||||
.DA #E.FUNDEF
|
||||
.DA #E.UNEXPEOF
|
||||
.DA #E.NODO
|
||||
*--------------------------------------
|
||||
ERRORX.Count .EQ *-ERRORX.Codes
|
||||
*--------------------------------------
|
||||
|
@ -144,6 +145,7 @@ ERRORX.Messages .AT "Bad MLI Call"
|
|||
.AT "Bad File Type"
|
||||
.AT "Undef. Function"
|
||||
.AT "Unexp. EOF"
|
||||
.AT "LOOP Without DO"
|
||||
*--------------------------------------
|
||||
.AT "Unknown Error"
|
||||
*--------------------------------------
|
||||
|
|
|
@ -433,6 +433,7 @@ MATH32.Dec2ACC32
|
|||
lda (ZPPtr2)
|
||||
eor #'-'
|
||||
bne .10
|
||||
|
||||
jsr SHARED.NextCharPtr2 skip '-'
|
||||
sec
|
||||
.10 ror .80+1 set pos/neg flag
|
||||
|
|
|
@ -178,37 +178,33 @@ K.FPutS.RTS rts
|
|||
* `char *fgets(hFILE stream, char * s, int n);`
|
||||
* ## ASM
|
||||
* **In:**
|
||||
* `>PUSHW n`
|
||||
* `>PUSHB hFILE`
|
||||
* `>PUSHW s`
|
||||
* `lda hFILE`
|
||||
* `>PUSHW n`
|
||||
* `>SYSCALL fgets`
|
||||
* ## RETURN VALUE
|
||||
* Y,A: s
|
||||
* CC = success
|
||||
*\--------------------------------------
|
||||
* (pStack)+2 n
|
||||
* (pStack)+0 s
|
||||
* (pStack)+4 h
|
||||
* (pStack)+2 s -> ZPPtr2
|
||||
* (pStack)+0 n -> ZPPtr1
|
||||
*--------------------------------------
|
||||
K.FGetS jsr PFT.CheckNodeA
|
||||
K.FGetS jsr PFT.CheckNode4
|
||||
bcs K.FPutS.RTS
|
||||
|
||||
lda (pStack)
|
||||
sta ZPPtr2 s LO
|
||||
ldy #1
|
||||
lda (pStack),y
|
||||
sta ZPPtr2+1 s HI
|
||||
ldy #3
|
||||
|
||||
iny
|
||||
lda (pStack),y n LO
|
||||
sta ZPPtr1
|
||||
|
||||
iny
|
||||
lda (pStack),y n HI
|
||||
sta ZPPtr1+1
|
||||
bmi .3 already something in buffer
|
||||
.1 lda (pStack),y
|
||||
sta ZPPtr1,y
|
||||
dey
|
||||
bpl .1
|
||||
|
||||
lda ZPPtr1+1
|
||||
bmi .4 already something in buffer
|
||||
|
||||
.1 jsr STDIO.Get.1
|
||||
bcc .2
|
||||
.2 jsr STDIO.Get.1
|
||||
bcc .3
|
||||
|
||||
cmp #MLI.E.EOF
|
||||
beq .9
|
||||
|
@ -220,59 +216,52 @@ K.FGetS jsr PFT.CheckNodeA
|
|||
lda #0 BLOCKING
|
||||
rts
|
||||
|
||||
.2 lda K.IOBuf
|
||||
.3 lda K.IOBuf
|
||||
cmp #C.LF Discard any leading LF from a prev CR/LF
|
||||
beq .1
|
||||
|
||||
cmp #C.CR
|
||||
beq .8 empty string
|
||||
|
||||
jsr SHARED.PutCharPtr2
|
||||
beq .2
|
||||
|
||||
clc set n = !n + 1
|
||||
lda ZPPtr1
|
||||
eor #$ff
|
||||
adc #1
|
||||
sta ZPPtr1
|
||||
|
||||
lda ZPPtr1+1
|
||||
eor #$ff
|
||||
adc #0
|
||||
sta ZPPtr1+1
|
||||
|
||||
bra .5
|
||||
*--------------------------------------
|
||||
.3 inc ZPPtr1
|
||||
bne .4
|
||||
inc ZPPtr1+1
|
||||
beq .8 Buffer full
|
||||
|
||||
.4 jsr STDIO.Get.1
|
||||
bcs .5
|
||||
bcs .6
|
||||
|
||||
lda K.IOBuf
|
||||
.5 lda K.IOBuf
|
||||
cmp #C.CR
|
||||
beq .8
|
||||
|
||||
jsr SHARED.PutCharPtr2
|
||||
bra .3
|
||||
|
||||
inc ZPPtr1
|
||||
bne .4
|
||||
inc ZPPtr1+1
|
||||
bne .4
|
||||
|
||||
.5 cmp #MLI.E.EOF
|
||||
beq .8 Buffer full
|
||||
|
||||
.6 cmp #MLI.E.EOF
|
||||
beq .8 String terminated by EOF
|
||||
|
||||
cmp #E.NODATA
|
||||
sec
|
||||
bne .9 I/O error
|
||||
|
||||
lda ZPPtr2 NO DATA, but string not yet terminated
|
||||
sta (pStack) s
|
||||
ldy #3
|
||||
|
||||
ldy #1
|
||||
lda ZPPtr2+1
|
||||
sta (pStack),y s
|
||||
|
||||
iny
|
||||
lda ZPPtr1
|
||||
sta (pStack),y !n LO
|
||||
|
||||
iny
|
||||
lda ZPPtr1+1
|
||||
sta (pStack),y !n HI
|
||||
.7 lda ZPPtr1,y NO DATA, but string not yet terminated
|
||||
sta (pStack),y
|
||||
dey
|
||||
bpl .7
|
||||
|
||||
lda #0 BLOCKING
|
||||
* sec
|
||||
|
@ -281,7 +270,7 @@ K.FGetS jsr PFT.CheckNodeA
|
|||
.8 lda #0
|
||||
sta (ZPPtr2) terminate string
|
||||
clc
|
||||
.9 >RET 4
|
||||
.9 >RET 5
|
||||
*/--------------------------------------
|
||||
* # getchar (BLOCKING)
|
||||
* Get char from StdIn
|
||||
|
@ -661,6 +650,733 @@ K.Rename jsr PFT.CheckPath2
|
|||
>MLICALL MLIRENAME
|
||||
|
||||
.9 >RET 4
|
||||
*/--------------------------------------
|
||||
* # PrintF (BLOCKING)
|
||||
* # FPrintF (BLOCKING)
|
||||
* # SPrintF
|
||||
* Prints C-Style String
|
||||
* ## C
|
||||
* `int printf ( const char *format, ... );`
|
||||
* `int fprintf ( short int stream, const char *format, ... );`
|
||||
* `int sprintf ( char *str, const char *format, ... );`
|
||||
* ## ASM
|
||||
* **In:**
|
||||
* PrintF : (example is for printing Y,A as integer : format="%I", 2 bytes)
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW i`
|
||||
* `...`
|
||||
* `>PUSHBI 2` #bytecount
|
||||
* `>SYSCALL PrintF`
|
||||
* FPrintF :
|
||||
* `>PUSHB hFILE`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW i`
|
||||
* `...`
|
||||
* `>PUSHBI 2` #bytecount
|
||||
* `>SYSCALL fprintf`
|
||||
* SPrintF :
|
||||
* `>PUSHW str`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW i`
|
||||
* `...`
|
||||
* `>PUSHBI 2` #bytecount
|
||||
* `>SYSCALL sprintf`
|
||||
* ## RETURN VALUE
|
||||
* CC : success, Y,A = bytes sent
|
||||
* CS : error, A = code from Output
|
||||
* Specifiers :
|
||||
* + %b : pull 1 byte to Print BIN
|
||||
* + %d : pull 1 byte unsigned DEC 0..255
|
||||
* + %D : pull 2 bytes unsigned DEC 0..65535
|
||||
* + %u : pull 4 bytes long unsigned DEC 0..4294967295
|
||||
* + %e : pull 5 Bytes float (-)1.23456789e+12
|
||||
* + %f : pull 5 Bytes float (-)3.1415
|
||||
* + %h : pull 1 byte to Print HEX
|
||||
* + %H : pull 2 bytes to Print HEX
|
||||
* + %i : pull 1 byte to Print signed DEC -128..127
|
||||
* + %I : pull 2 bytes to Print signed DEC -32768..32767
|
||||
* + %L : pull 4 bytes signed DEC -2147483648..2147483647
|
||||
* + %s : pull 2 bytes ptr to C-Style String
|
||||
* + %S : pull 2 bytes ptr to P-Style String
|
||||
* + \b : Print 'BS' (08)
|
||||
* + \e : Print 'ESC' ($1B,27)
|
||||
* + \f : Print 'FF' ($0C,12)
|
||||
* + \n : Print 'LF' ($0A,10)
|
||||
* + \r : Print 'CR' ($0D,13)
|
||||
* + \t : Print 'TAB' ($09,09)
|
||||
* + \v : Print 'VT' ($0B,11)
|
||||
* + \xHH : Print byte with hexadecimal value HH (1 to 2 digits)
|
||||
* + \\\\ : Print \
|
||||
* + \\% : Print %
|
||||
* Modifiers for len and padding :
|
||||
* + %d : '9' '12'
|
||||
* + %2d : ' 9' '12'
|
||||
* + %02d : '09' '12'
|
||||
* + %11s : 'ABCDEFGH '
|
||||
* + %011s : 'ABCDEFGH000'
|
||||
* + %2f : '3.14'
|
||||
*\--------------------------------------
|
||||
.DUMMY ZPTMP+5,5 Used by : STDIO2
|
||||
.OR ZPTMP+5 5 Bytes
|
||||
PrintF.Cnt .BS 2
|
||||
PrintF.hFILE .BS 1
|
||||
STDIO.StackBytePtr .BS 1
|
||||
STDIO.ExitPopCnt .BS 1
|
||||
.ED
|
||||
*--------------------------------------
|
||||
K.PrintF.PadL .EQ FAC+5
|
||||
K.PrintF.PadC .EQ ARG.SIGN
|
||||
*--------------------------------------
|
||||
K.PrintF ldy #S.PS.hStdOut
|
||||
lda (pPS),y
|
||||
sta PrintF.hFILE
|
||||
|
||||
ldx #1
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.FPrintf ldx #2
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.SPrintf ldx #3
|
||||
*--------------------------------------
|
||||
K.PrintF.1 sec format string->ptr2
|
||||
jsr STDIO.GetParams
|
||||
|
||||
stx pIOBuf
|
||||
sta pIOBuf+1 Output buffer->pIOBuf
|
||||
|
||||
sty STDIO.ExitPopCnt Total bytes to POP
|
||||
|
||||
.1 jsr SHARED.GetCharPtr2
|
||||
bne .22
|
||||
|
||||
jmp .8 end of format..
|
||||
|
||||
.22 cmp #'%'
|
||||
bne .10
|
||||
stz K.PrintF.PadL
|
||||
stz K.PrintF.PadC
|
||||
lda (ZPPtr2)
|
||||
beq .7 end of format... print % and exit
|
||||
|
||||
jsr ZP.IsDigit
|
||||
bcs .6 no digit....go check specifier
|
||||
cmp #'0' ...a 0...mmm... padding char?
|
||||
bne .4
|
||||
sta K.PrintF.PadC
|
||||
jsr SHARED.NextCharPtr2 skip 0 ...
|
||||
lda (ZPPtr2)
|
||||
beq .7
|
||||
|
||||
jsr ZP.IsDigit
|
||||
bcs .6 %0x ??????
|
||||
|
||||
.4 jsr MATH32.Dec2ACC32
|
||||
bcs .99
|
||||
lda ACC32
|
||||
sta K.PrintF.PadL
|
||||
lda K.PrintF.PadC
|
||||
bne .5
|
||||
lda #C.SPACE
|
||||
sta K.PrintF.PadC
|
||||
|
||||
.5 jsr SHARED.AddYToPtr2 skip all processed chars
|
||||
|
||||
lda (ZPPtr2)
|
||||
beq .7
|
||||
|
||||
.6 ldx #PrintFTBL1.Cnt-1 do we have a %x command?
|
||||
.61 cmp PrintFTBL1,x
|
||||
beq .62
|
||||
dex
|
||||
bpl .61
|
||||
bra .20 unknown ...
|
||||
|
||||
.62 jsr SHARED.NextCharPtr2
|
||||
txa yes, jmp to it!
|
||||
asl
|
||||
tax
|
||||
jsr PrintF.ESC
|
||||
.11 bcc .1
|
||||
bra .99
|
||||
.7 lda #'%'
|
||||
bra .20
|
||||
*--------------------------------------
|
||||
.10 cmp #'\'
|
||||
bne .20
|
||||
|
||||
jsr SHARED.GetCharPtr2
|
||||
beq .99
|
||||
ldx #PrintFTBL2.Cnt-1
|
||||
.12 cmp PrintFTBL2,x
|
||||
beq .19
|
||||
dex
|
||||
bpl .12
|
||||
|
||||
cmp #'x' \xHH
|
||||
bne .1
|
||||
|
||||
jsr MATH32.Hex2ACC32
|
||||
bcs .99
|
||||
|
||||
jsr SHARED.AddYToPtr2
|
||||
.14 lda ACC32
|
||||
bra .20
|
||||
.19 lda PrintFTBL2.OUT,x
|
||||
|
||||
.20 jsr PrintF.PutC
|
||||
bcc .11
|
||||
*--------------------------------------
|
||||
.99 lda #E.BADARG
|
||||
sec
|
||||
jmp STDIO.Exit
|
||||
*--------------------------------------
|
||||
.8 ldx PrintF.hFILE
|
||||
beq .80 Writing to buffer, append \0
|
||||
|
||||
>PUSHW PrintF.Cnt Writing to File/dev...
|
||||
>PUSHWI K.IOBuf
|
||||
|
||||
txa
|
||||
jsr K.FWrite
|
||||
bcc .81
|
||||
|
||||
tay
|
||||
bne .9
|
||||
|
||||
>RET 4 0=BLOCKING
|
||||
|
||||
.80 ldy PrintF.Cnt A=0, Writing to buffer, append \0
|
||||
sta (pIOBuf),y
|
||||
clc
|
||||
.81 >LDYA PrintF.Cnt
|
||||
* clc
|
||||
.9 jmp STDIO.Exit
|
||||
*--------------------------------------
|
||||
PrintFTBL1 .AS "bdDuefhHiILsS"
|
||||
PrintFTBL1.Cnt .EQ *-PrintFTBL1
|
||||
PrintFTBL2 .AS "abefnrtv\%"
|
||||
PrintFTBL2.Cnt .EQ *-PrintFTBL2
|
||||
PrintFTBL2.OUT .HS 07.08.1B.0C.0A.0D.09.0B \a\b\e\f\n\r\t\v
|
||||
.DA #'\' \\
|
||||
.DA #'%' \%
|
||||
*--------------------------------------
|
||||
PrintF.ESC jmp (.1,x)
|
||||
.1 .DA PrintF.B
|
||||
.DA PrintF.D,PrintF.DD,PrintF.U
|
||||
.DA PrintF.E,PrintF.F
|
||||
.DA PrintF.H,PrintF.HH
|
||||
.DA PrintF.I,PrintF.II,PrintF.L
|
||||
.DA PrintF.S,PrintF.SS
|
||||
*--------------------------------------
|
||||
PrintF.B jsr STDIO.GetStackByte
|
||||
bcs PrintF.B.RTS
|
||||
ldy #8
|
||||
|
||||
.1 asl
|
||||
pha
|
||||
lda #'0'/2
|
||||
rol
|
||||
jsr PrintF.PutC
|
||||
bcs .9
|
||||
pla
|
||||
dey
|
||||
bne .1
|
||||
rts
|
||||
|
||||
.9 ply
|
||||
PrintF.B.RTS
|
||||
rts
|
||||
*--------------------------------------
|
||||
PrintF.I sec signed short
|
||||
.HS 90 BCC
|
||||
PrintF.D clc unsigned short (BYTE)
|
||||
|
||||
ldy #1
|
||||
bra PrintF.NUM
|
||||
|
||||
PrintF.II sec signed int
|
||||
.HS 90 BCC
|
||||
PrintF.DD clc unsigned int (WORD)
|
||||
|
||||
ldy #2
|
||||
bra PrintF.NUM
|
||||
|
||||
PrintF.L sec signed long
|
||||
.HS 90 BCC
|
||||
PrintF.U clc unsigned long (DWORD)
|
||||
|
||||
ldy #4
|
||||
|
||||
PrintF.NUM sty .2+1
|
||||
|
||||
ror ACC32.Sign save signed/unsigned flag
|
||||
jsr MATH32.ACC32ZERO
|
||||
|
||||
.1 jsr STDIO.GetStackByte
|
||||
bcs PrintF.B.RTS
|
||||
|
||||
sta ACC32-1,y PULL 4,2 or 1
|
||||
dey
|
||||
bne .1
|
||||
|
||||
bit ACC32.Sign
|
||||
bpl .4
|
||||
|
||||
.2 ldy #$ff SELF MODIFIED
|
||||
|
||||
lda ACC32-1,y Get highest Byte
|
||||
bpl .4 positive....
|
||||
|
||||
lda #$ff
|
||||
|
||||
.3 cpy #4
|
||||
beq .4
|
||||
|
||||
iny
|
||||
sta ACC32-1,y
|
||||
bra .3
|
||||
|
||||
.4 ldx K.PrintF.PadL
|
||||
ldy K.PrintF.PadC
|
||||
|
||||
rol ACC32.Sign get back signed/unsigned flag
|
||||
jsr MATH32.ACC322STR10
|
||||
bra PrintF.StrNum
|
||||
*--------------------------------------
|
||||
* EXP(8) 1(s) 1significants(31)
|
||||
* http://apple2.org.za/gswv/a2zine/GS.WorldView/Resources/GS.TECH.INFO/AppleSoft/
|
||||
*--------------------------------------
|
||||
PrintF.E sec Force "E+12"
|
||||
.HS 90 BCC
|
||||
PrintF.F clc
|
||||
|
||||
lda (pStack) get current stack Ptr
|
||||
sec at least 5 bytes remaining ?
|
||||
sbc #5
|
||||
bcc PrintF.StrNum.Err
|
||||
sta (pStack)
|
||||
|
||||
* sec
|
||||
adc pStack
|
||||
ldy pStack+1 A,Y = float
|
||||
ldx #FPU.SETFAC
|
||||
jsr GP.ROMCALL
|
||||
ldy #A2osX.NumStrBuf+1 FOUT.1 will do a DEY
|
||||
ldx #FPU.FOUT
|
||||
jsr GP.ROMCALL
|
||||
|
||||
PrintF.StrNum ldy #0
|
||||
.2 lda A2osX.NumStrBuf,y
|
||||
beq .8
|
||||
iny
|
||||
jsr PrintF.PutC
|
||||
bcc .2
|
||||
|
||||
.9 rts
|
||||
|
||||
.8 clc
|
||||
rts
|
||||
PrintF.StrNum.Err
|
||||
lda #E.STACK
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
PrintF.S ldy #$ff CSTR
|
||||
.HS 2C bit abs
|
||||
PrintF.SS ldy #$00 PSTR
|
||||
|
||||
sty .1+1
|
||||
|
||||
jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
|
||||
sta ZPPtr1+1
|
||||
jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
|
||||
sta ZPPtr1
|
||||
|
||||
lda (ZPPtr1) if CSTR:last char=0, if PSTR:len=0
|
||||
beq .8
|
||||
|
||||
ldy .1+1
|
||||
|
||||
.1 lda #$ff Self Modified
|
||||
bne .11 CSTR
|
||||
|
||||
tya PSTR
|
||||
cmp (ZPPtr1) len check
|
||||
|
||||
beq .2
|
||||
|
||||
.11 iny
|
||||
lda (ZPPtr1),y
|
||||
beq .2
|
||||
|
||||
jsr PrintF.PutC
|
||||
bcs .9
|
||||
|
||||
lda K.PrintF.PadL
|
||||
beq .1
|
||||
cpy K.PrintF.PadL
|
||||
bne .1
|
||||
.8 clc
|
||||
rts
|
||||
|
||||
.2 lda K.PrintF.PadL
|
||||
beq .8
|
||||
|
||||
.3 cpy K.PrintF.PadL
|
||||
beq .8
|
||||
|
||||
lda K.PrintF.PadC
|
||||
jsr PrintF.PutC
|
||||
bcs .9
|
||||
|
||||
iny
|
||||
bne .3
|
||||
|
||||
* clc
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
PrintF.HH jsr STDIO.GetStackByte
|
||||
bcs PrintF.PutC.RTS
|
||||
pha LO byte
|
||||
jsr STDIO.GetStackByte
|
||||
plx
|
||||
bcs PrintF.PutC.RTS
|
||||
pha
|
||||
txa
|
||||
jsr PrintF.H.1
|
||||
plx
|
||||
bcs PrintF.PutC.RTS
|
||||
txa
|
||||
bra PrintF.H.1
|
||||
*--------------------------------------
|
||||
PrintF.H jsr STDIO.GetStackByte
|
||||
bcs PrintF.PutC.RTS
|
||||
PrintF.H.1 jsr MATH32.AToHexAX
|
||||
jsr PrintF.PutC
|
||||
bcs PrintF.PutC.RTS
|
||||
txa
|
||||
*--------------------------------------
|
||||
PrintF.PutC phy
|
||||
ldy PrintF.Cnt
|
||||
sta (pIOBuf),y
|
||||
ply
|
||||
inc PrintF.Cnt
|
||||
bne .8
|
||||
lda PrintF.hFILE
|
||||
bne .9
|
||||
|
||||
inc pIOBuf+1
|
||||
inc PrintF.Cnt+1
|
||||
.8 clc
|
||||
rts
|
||||
|
||||
.9 lda #E.BUF
|
||||
sec
|
||||
PrintF.PutC.RTS rts
|
||||
*/--------------------------------------
|
||||
* # ScanF (BLOCKING)
|
||||
* # FScanF (BLOCKING)
|
||||
* # SScanF
|
||||
* Read formatted data from string
|
||||
* ## C
|
||||
* `int scanf( const char *format, ... );`
|
||||
* `int fscanf( short int stream, const char *format, ... );`
|
||||
* `int sscanf ( const char *s, const char *format, ... );`
|
||||
* ## ASM
|
||||
* **In:**
|
||||
* ScanF :
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW ptr`
|
||||
* `...`
|
||||
* `>PUSHB bytecount`
|
||||
* `>SYSCALL scanf`
|
||||
* FScanF :
|
||||
* `>PUSHB stream`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW ptr`
|
||||
* `...`
|
||||
* `>PUSHB bytecount`
|
||||
* `>SYSCALL fscanf`
|
||||
* SScanF :
|
||||
* `>PUSHW s`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW ptr`
|
||||
* `...`
|
||||
* `>PUSHB bytecount`
|
||||
* `>SYSCALL sscanf`
|
||||
* Specifiers :
|
||||
* + %i : short int
|
||||
* + %d : byte
|
||||
* + %I : int
|
||||
* + %D : word
|
||||
* + %L : long int
|
||||
* + %U : dword
|
||||
* + %h : HEX byte
|
||||
* + %H : HEX word
|
||||
* + %s : string
|
||||
* TODO : %10s
|
||||
* ## RETURN VALUE
|
||||
* A = Number of arguments filled.
|
||||
*\--------------------------------------
|
||||
K.ScanF ldy #S.PS.hStdIn
|
||||
lda (pPS),y
|
||||
sta PrintF.hFILE
|
||||
|
||||
ldx #1
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.FScanF ldx #2
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.SScanF ldx #3
|
||||
*--------------------------------------
|
||||
K.SScanF.1 clc format string->ptr1
|
||||
jsr STDIO.GetParams
|
||||
|
||||
stx ZPPtr2
|
||||
sta ZPPtr2+1 Output buffer->ZPPtr2
|
||||
|
||||
sty STDIO.ExitPopCnt Total bytes to POP
|
||||
|
||||
ldx PrintF.hFILE
|
||||
beq .1
|
||||
|
||||
txa
|
||||
>PUSHA
|
||||
>PUSHW pIOBuf
|
||||
>PUSHWI 256
|
||||
jsr K.FGetS
|
||||
bcc .1
|
||||
|
||||
tax
|
||||
bne PrintF.PutC.RTS
|
||||
>RET 4
|
||||
|
||||
.1 jsr SHARED.GetCharPtr1 End Of format?
|
||||
beq .8
|
||||
|
||||
cmp #'%' Escape ?
|
||||
beq .2
|
||||
|
||||
cmp #C.SPACE Space ?
|
||||
beq .12
|
||||
|
||||
sta .11+1
|
||||
|
||||
jsr SHARED.GetCharPtr2
|
||||
beq .9
|
||||
|
||||
.11 cmp #$ff Same char in string?
|
||||
beq .1
|
||||
|
||||
bra .9
|
||||
|
||||
.12 jsr SHARED.GetCharPtr2
|
||||
beq .9
|
||||
cmp #C.SPACE
|
||||
bne .9
|
||||
|
||||
.13 jsr SHARED.GetCharPtr2
|
||||
cmp #C.SPACE another space ?
|
||||
beq .13
|
||||
|
||||
bra .1
|
||||
|
||||
.2 jsr SHARED.GetCharPtr1 Get specifier after %
|
||||
beq .9 unexpected End of format after "%" ?
|
||||
|
||||
ldx #K.SScanFJMP-K.SScanFTBL-2
|
||||
|
||||
.3 cmp K.SScanFTBL,x
|
||||
beq .4
|
||||
dex
|
||||
dex
|
||||
bpl .3
|
||||
|
||||
.9 lda #MLI.E.EOF
|
||||
sec
|
||||
jmp STDIO.Exit
|
||||
|
||||
.4 jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
sta ZPPtr3+1
|
||||
jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
sta ZPPtr3
|
||||
|
||||
jsr .5
|
||||
bcs .9 out of Ptr on stack
|
||||
|
||||
inc .8+1 parsed one more arg!
|
||||
bra .1
|
||||
|
||||
.8 lda #$ff SELF MODIFIED Arg processed
|
||||
clc
|
||||
jmp STDIO.Exit
|
||||
*--------------------------------------
|
||||
.5 jmp (K.SScanFJMP,x)
|
||||
*--------------------------------------
|
||||
K.SScanFTBL .DA #'i,#1,#'d,#1,#'I,#2,#'D,#2,#'l,#4,#'u,#4,#'h,#1,#'H,#2,#'s,#2
|
||||
K.SScanFJMP .DA K.SScanF.I
|
||||
.DA K.SScanF.D
|
||||
.DA K.SScanF.II
|
||||
.DA K.SScanF.DD
|
||||
.DA K.SScanF.L
|
||||
.DA K.SScanF.U
|
||||
.DA K.SScanF.H
|
||||
.DA K.SScanF.HH
|
||||
.DA K.SScanF.S
|
||||
*--------------------------------------
|
||||
K.SScanF.I
|
||||
K.SScanF.D
|
||||
K.SScanF.II
|
||||
K.SScanF.DD
|
||||
K.SScanF.L
|
||||
K.SScanF.U lda K.SScanFTBL+1,x Get VAR size
|
||||
pha Save VAL size
|
||||
|
||||
jsr MATH32.Dec2ACC32
|
||||
bra K.SScanF.GetVAL
|
||||
*--------------------------------------
|
||||
K.SScanF.HH
|
||||
K.SScanF.H lda K.SScanFTBL+1,x Get VAR size
|
||||
pha
|
||||
|
||||
jsr MATH32.Hex2ACC32
|
||||
|
||||
K.SScanF.GetVAL jsr SHARED.AddYToPtr2 Y=char count parsed
|
||||
|
||||
.1 ply get back VAL size
|
||||
|
||||
.2 lda ACC32-1,y
|
||||
dey
|
||||
sta (ZPPtr3),y
|
||||
bne .2
|
||||
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
K.SScanF.S ldy #$ff
|
||||
|
||||
.1 iny
|
||||
lda (ZPPtr2),y Get char in string to scan
|
||||
sta (ZPPtr3),y store in param ptr
|
||||
beq K.SScanF.Fwd end of string to scan ?
|
||||
|
||||
cmp (ZPPtr1) match format next char ?
|
||||
beq .2
|
||||
|
||||
cmp #C.SPACE is it a space ?
|
||||
bne .1
|
||||
|
||||
.2 lda #0 add \0 to param ptr
|
||||
sta (ZPPtr3),y
|
||||
|
||||
K.SScanF.Fwd jmp SHARED.AddYToPtr2 Y=char count parsed
|
||||
*--------------------------------------
|
||||
* IN:
|
||||
* CC : format in ZPPtr1
|
||||
* CS : format in ZPPtr2
|
||||
* X = 3 : get format & buffer
|
||||
* X = 2 : get format & hFile
|
||||
* X = 1 : get format only
|
||||
* OUT:
|
||||
* X = Buf LO
|
||||
* A = Buf HI
|
||||
* format on stack
|
||||
* Y = BytePtr
|
||||
*--------------------------------------
|
||||
STDIO.GetParams stz PrintF.Cnt
|
||||
stz PrintF.Cnt+1
|
||||
|
||||
lda (pStack) Bytecount
|
||||
|
||||
tay
|
||||
sty STDIO.StackBytePtr
|
||||
|
||||
iny
|
||||
lda (pStack),y format LO
|
||||
pha
|
||||
|
||||
iny
|
||||
lda (pStack),y format HI
|
||||
bcs .10
|
||||
|
||||
sta ZPPtr1+1
|
||||
pla
|
||||
sta ZPPtr1
|
||||
bra .11
|
||||
|
||||
.10 sta ZPPtr2+1
|
||||
pla
|
||||
sta ZPPtr2
|
||||
|
||||
.11 dex
|
||||
beq .1
|
||||
|
||||
dex
|
||||
beq .2
|
||||
|
||||
.3 stz PrintF.hFILE
|
||||
|
||||
iny
|
||||
lda (pStack),y str LO
|
||||
tax
|
||||
|
||||
iny
|
||||
lda (pStack),y str HI
|
||||
|
||||
rts
|
||||
|
||||
.2 iny
|
||||
lda (pStack),y hFILE
|
||||
sta PrintF.hFILE
|
||||
|
||||
.1 ldx #K.IOBuf
|
||||
lda /K.IOBuf
|
||||
|
||||
STDIO.GetParams.RTS
|
||||
rts
|
||||
*--------------------------------------
|
||||
STDIO.GetStackPtr
|
||||
jsr STDIO.GetStackByte
|
||||
bcs STDIO.GetParams.RTS
|
||||
tax
|
||||
*--------------------------------------
|
||||
STDIO.GetStackByte
|
||||
phy
|
||||
|
||||
ldy STDIO.StackBytePtr
|
||||
beq .9
|
||||
|
||||
lda (pStack),y
|
||||
dec STDIO.StackBytePtr
|
||||
|
||||
ply
|
||||
clc
|
||||
rts
|
||||
|
||||
.9 lda #E.STACK
|
||||
|
||||
ply
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
STDIO.Exit php
|
||||
pha
|
||||
|
||||
lda pStack
|
||||
sec
|
||||
adc STDIO.ExitPopCnt
|
||||
sta pStack
|
||||
|
||||
pla
|
||||
plp
|
||||
rts
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE usr/src/sys/kernel.s.stdio
|
||||
|
|
|
@ -1,733 +0,0 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
*/--------------------------------------
|
||||
* # PrintF (BLOCKING)
|
||||
* # FPrintF (BLOCKING)
|
||||
* # SPrintF
|
||||
* Prints C-Style String
|
||||
* ## C
|
||||
* `int printf ( const char *format, ... );`
|
||||
* `int fprintf ( short int stream, const char *format, ... );`
|
||||
* `int sprintf ( char *str, const char *format, ... );`
|
||||
* ## ASM
|
||||
* **In:**
|
||||
* PrintF : (example is for printing Y,A as integer : format="%I", 2 bytes)
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW i`
|
||||
* `...`
|
||||
* `>PUSHBI 2` #bytecount
|
||||
* `>SYSCALL PrintF`
|
||||
* FPrintF :
|
||||
* `>PUSHB hFILE`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW i`
|
||||
* `...`
|
||||
* `>PUSHBI 2` #bytecount
|
||||
* `>SYSCALL fprintf`
|
||||
* SPrintF :
|
||||
* `>PUSHW str`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW i`
|
||||
* `...`
|
||||
* `>PUSHBI 2` #bytecount
|
||||
* `>SYSCALL sprintf`
|
||||
* ## RETURN VALUE
|
||||
* CC : success, Y,A = bytes sent
|
||||
* CS : error, A = code from Output
|
||||
* Specifiers :
|
||||
* + %b : pull 1 byte to Print BIN
|
||||
* + %d : pull 1 byte unsigned DEC 0..255
|
||||
* + %D : pull 2 bytes unsigned DEC 0..65535
|
||||
* + %u : pull 4 bytes long unsigned DEC 0..4294967295
|
||||
* + %e : pull 5 Bytes float (-)1.23456789e+12
|
||||
* + %f : pull 5 Bytes float (-)3.1415
|
||||
* + %h : pull 1 byte to Print HEX
|
||||
* + %H : pull 2 bytes to Print HEX
|
||||
* + %i : pull 1 byte to Print signed DEC -128..127
|
||||
* + %I : pull 2 bytes to Print signed DEC -32768..32767
|
||||
* + %L : pull 4 bytes signed DEC -2147483648..2147483647
|
||||
* + %s : pull 2 bytes ptr to C-Style String
|
||||
* + %S : pull 2 bytes ptr to P-Style String
|
||||
* + \b : Print 'BS' (08)
|
||||
* + \e : Print 'ESC' ($1B,27)
|
||||
* + \f : Print 'FF' ($0C,12)
|
||||
* + \n : Print 'LF' ($0A,10)
|
||||
* + \r : Print 'CR' ($0D,13)
|
||||
* + \t : Print 'TAB' ($09,09)
|
||||
* + \v : Print 'VT' ($0B,11)
|
||||
* + \xHH : Print byte with hexadecimal value HH (1 to 2 digits)
|
||||
* + \\\\ : Print \
|
||||
* + \\% : Print %
|
||||
* Modifiers for len and padding :
|
||||
* + %d : '9' '12'
|
||||
* + %2d : ' 9' '12'
|
||||
* + %02d : '09' '12'
|
||||
* + %11s : 'ABCDEFGH '
|
||||
* + %011s : 'ABCDEFGH000'
|
||||
* + %2f : '3.14'
|
||||
*\--------------------------------------
|
||||
.DUMMY ZPTMP+5,5 Used by : STDIO2
|
||||
.OR ZPTMP+5 5 Bytes
|
||||
PrintF.Cnt .BS 2
|
||||
PrintF.hFILE .BS 1
|
||||
STDIO.StackBytePtr .BS 1
|
||||
STDIO.ExitPopCnt .BS 1
|
||||
.ED
|
||||
*--------------------------------------
|
||||
K.PrintF.PadL .EQ FAC+5
|
||||
K.PrintF.PadC .EQ ARG.SIGN
|
||||
*--------------------------------------
|
||||
K.PrintF ldy #S.PS.hStdOut
|
||||
lda (pPS),y
|
||||
sta PrintF.hFILE
|
||||
|
||||
ldx #1
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.FPrintf ldx #2
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.SPrintf ldx #3
|
||||
*--------------------------------------
|
||||
K.PrintF.1 sec format string->ptr2
|
||||
jsr STDIO.GetParams
|
||||
|
||||
stx pIOBuf
|
||||
sta pIOBuf+1 Output buffer->pIOBuf
|
||||
|
||||
sty STDIO.ExitPopCnt Total bytes to POP
|
||||
|
||||
.1 jsr SHARED.GetCharPtr2
|
||||
bne .22
|
||||
|
||||
jmp .8 end of format..
|
||||
|
||||
.22 cmp #'%'
|
||||
bne .10
|
||||
stz K.PrintF.PadL
|
||||
stz K.PrintF.PadC
|
||||
lda (ZPPtr2)
|
||||
beq .7 end of format... print % and exit
|
||||
|
||||
jsr ZP.IsDigit
|
||||
bcs .6 no digit....go check specifier
|
||||
cmp #'0' ...a 0...mmm... padding char?
|
||||
bne .4
|
||||
sta K.PrintF.PadC
|
||||
jsr SHARED.NextCharPtr2 skip 0 ...
|
||||
lda (ZPPtr2)
|
||||
beq .7
|
||||
|
||||
jsr ZP.IsDigit
|
||||
bcs .6 %0x ??????
|
||||
|
||||
.4 jsr MATH32.Dec2ACC32
|
||||
bcs .99
|
||||
lda ACC32
|
||||
sta K.PrintF.PadL
|
||||
lda K.PrintF.PadC
|
||||
bne .5
|
||||
lda #C.SPACE
|
||||
sta K.PrintF.PadC
|
||||
|
||||
.5 jsr SHARED.AddYToPtr2 skip all processed chars
|
||||
|
||||
lda (ZPPtr2)
|
||||
beq .7
|
||||
|
||||
.6 ldx #PrintFTBL1.Cnt-1 do we have a %x command?
|
||||
.61 cmp PrintFTBL1,x
|
||||
beq .62
|
||||
dex
|
||||
bpl .61
|
||||
bra .20 unknown ...
|
||||
|
||||
.62 jsr SHARED.NextCharPtr2
|
||||
txa yes, jmp to it!
|
||||
asl
|
||||
tax
|
||||
jsr PrintF.ESC
|
||||
.11 bcc .1
|
||||
bra .99
|
||||
.7 lda #'%'
|
||||
bra .20
|
||||
*--------------------------------------
|
||||
.10 cmp #'\'
|
||||
bne .20
|
||||
|
||||
jsr SHARED.GetCharPtr2
|
||||
beq .99
|
||||
ldx #PrintFTBL2.Cnt-1
|
||||
.12 cmp PrintFTBL2,x
|
||||
beq .19
|
||||
dex
|
||||
bpl .12
|
||||
|
||||
cmp #'x' \xHH
|
||||
bne .1
|
||||
|
||||
jsr MATH32.Hex2ACC32
|
||||
bcs .99
|
||||
|
||||
jsr SHARED.AddYToPtr2
|
||||
.14 lda ACC32
|
||||
bra .20
|
||||
.19 lda PrintFTBL2.OUT,x
|
||||
|
||||
.20 jsr PrintF.PutC
|
||||
bcc .11
|
||||
*--------------------------------------
|
||||
.99 lda #E.BADARG
|
||||
sec
|
||||
jmp STDIO.Exit
|
||||
*--------------------------------------
|
||||
.8 ldx PrintF.hFILE
|
||||
beq .80 Writing to buffer, append \0
|
||||
|
||||
>PUSHW PrintF.Cnt Writing to File/dev...
|
||||
>PUSHWI K.IOBuf
|
||||
|
||||
txa
|
||||
jsr K.FWrite
|
||||
bcc .81
|
||||
|
||||
tay
|
||||
bne .9
|
||||
|
||||
>RET 4 0=BLOCKING
|
||||
|
||||
.80 ldy PrintF.Cnt A=0, Writing to buffer, append \0
|
||||
sta (pIOBuf),y
|
||||
clc
|
||||
.81 >LDYA PrintF.Cnt
|
||||
* clc
|
||||
.9 jmp STDIO.Exit
|
||||
*--------------------------------------
|
||||
PrintFTBL1 .AS "bdDuefhHiILsS"
|
||||
PrintFTBL1.Cnt .EQ *-PrintFTBL1
|
||||
PrintFTBL2 .AS "abefnrtv\%"
|
||||
PrintFTBL2.Cnt .EQ *-PrintFTBL2
|
||||
PrintFTBL2.OUT .HS 07.08.1B.0C.0A.0D.09.0B \a\b\e\f\n\r\t\v
|
||||
.DA #'\' \\
|
||||
.DA #'%' \%
|
||||
*--------------------------------------
|
||||
PrintF.ESC jmp (.1,x)
|
||||
.1 .DA PrintF.B
|
||||
.DA PrintF.D,PrintF.DD,PrintF.U
|
||||
.DA PrintF.E,PrintF.F
|
||||
.DA PrintF.H,PrintF.HH
|
||||
.DA PrintF.I,PrintF.II,PrintF.L
|
||||
.DA PrintF.S,PrintF.SS
|
||||
*--------------------------------------
|
||||
PrintF.B jsr STDIO.GetStackByte
|
||||
bcs PrintF.B.RTS
|
||||
ldy #8
|
||||
|
||||
.1 asl
|
||||
pha
|
||||
lda #'0'/2
|
||||
rol
|
||||
jsr PrintF.PutC
|
||||
bcs .9
|
||||
pla
|
||||
dey
|
||||
bne .1
|
||||
rts
|
||||
|
||||
.9 ply
|
||||
PrintF.B.RTS
|
||||
rts
|
||||
*--------------------------------------
|
||||
PrintF.I sec signed short
|
||||
.HS 90 BCC
|
||||
PrintF.D clc unsigned short (BYTE)
|
||||
|
||||
ldy #1
|
||||
bra PrintF.NUM
|
||||
|
||||
PrintF.II sec signed int
|
||||
.HS 90 BCC
|
||||
PrintF.DD clc unsigned int (WORD)
|
||||
|
||||
ldy #2
|
||||
bra PrintF.NUM
|
||||
|
||||
PrintF.L sec signed long
|
||||
.HS 90 BCC
|
||||
PrintF.U clc unsigned long (DWORD)
|
||||
|
||||
ldy #4
|
||||
|
||||
PrintF.NUM sty .2+1
|
||||
|
||||
ror ACC32.Sign save signed/unsigned flag
|
||||
jsr MATH32.ACC32ZERO
|
||||
|
||||
.1 jsr STDIO.GetStackByte
|
||||
bcs PrintF.B.RTS
|
||||
|
||||
sta ACC32-1,y PULL 4,2 or 1
|
||||
dey
|
||||
bne .1
|
||||
|
||||
bit ACC32.Sign
|
||||
bpl .4
|
||||
|
||||
.2 ldy #$ff SELF MODIFIED
|
||||
|
||||
lda ACC32-1,y Get highest Byte
|
||||
bpl .4 positive....
|
||||
|
||||
lda #$ff
|
||||
|
||||
.3 cpy #4
|
||||
beq .4
|
||||
|
||||
iny
|
||||
sta ACC32-1,y
|
||||
bra .3
|
||||
|
||||
.4 ldx K.PrintF.PadL
|
||||
ldy K.PrintF.PadC
|
||||
|
||||
rol ACC32.Sign get back signed/unsigned flag
|
||||
jsr MATH32.ACC322STR10
|
||||
bra PrintF.StrNum
|
||||
*--------------------------------------
|
||||
* EXP(8) 1(s) 1significants(31)
|
||||
* http://apple2.org.za/gswv/a2zine/GS.WorldView/Resources/GS.TECH.INFO/AppleSoft/
|
||||
*--------------------------------------
|
||||
PrintF.E sec Force "E+12"
|
||||
.HS 90 BCC
|
||||
PrintF.F clc
|
||||
|
||||
lda (pStack) get current stack Ptr
|
||||
sec at least 5 bytes remaining ?
|
||||
sbc #5
|
||||
bcc PrintF.StrNum.Err
|
||||
sta (pStack)
|
||||
|
||||
* sec
|
||||
adc pStack
|
||||
ldy pStack+1 A,Y = float
|
||||
ldx #FPU.SETFAC
|
||||
jsr GP.ROMCALL
|
||||
ldy #A2osX.NumStrBuf+1 FOUT.1 will do a DEY
|
||||
ldx #FPU.FOUT
|
||||
jsr GP.ROMCALL
|
||||
|
||||
PrintF.StrNum ldy #0
|
||||
.2 lda A2osX.NumStrBuf,y
|
||||
beq .8
|
||||
iny
|
||||
jsr PrintF.PutC
|
||||
bcc .2
|
||||
|
||||
.9 rts
|
||||
|
||||
.8 clc
|
||||
rts
|
||||
PrintF.StrNum.Err
|
||||
lda #E.STACK
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
PrintF.S ldy #$ff CSTR
|
||||
.HS 2C bit abs
|
||||
PrintF.SS ldy #$00 PSTR
|
||||
|
||||
sty .1+1
|
||||
|
||||
jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
|
||||
sta ZPPtr1+1
|
||||
jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
|
||||
sta ZPPtr1
|
||||
|
||||
lda (ZPPtr1) if CSTR:last char=0, if PSTR:len=0
|
||||
beq .8
|
||||
|
||||
ldy .1+1
|
||||
|
||||
.1 lda #$ff Self Modified
|
||||
bne .11 CSTR
|
||||
|
||||
tya PSTR
|
||||
cmp (ZPPtr1) len check
|
||||
|
||||
beq .2
|
||||
|
||||
.11 iny
|
||||
lda (ZPPtr1),y
|
||||
beq .2
|
||||
|
||||
jsr PrintF.PutC
|
||||
bcs .9
|
||||
|
||||
lda K.PrintF.PadL
|
||||
beq .1
|
||||
cpy K.PrintF.PadL
|
||||
bne .1
|
||||
.8 clc
|
||||
rts
|
||||
|
||||
.2 lda K.PrintF.PadL
|
||||
beq .8
|
||||
|
||||
.3 cpy K.PrintF.PadL
|
||||
beq .8
|
||||
|
||||
lda K.PrintF.PadC
|
||||
jsr PrintF.PutC
|
||||
bcs .9
|
||||
|
||||
iny
|
||||
bne .3
|
||||
|
||||
* clc
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
PrintF.HH jsr STDIO.GetStackByte
|
||||
bcs PrintF.PutC.RTS
|
||||
pha LO byte
|
||||
jsr STDIO.GetStackByte
|
||||
plx
|
||||
bcs PrintF.PutC.RTS
|
||||
pha
|
||||
txa
|
||||
jsr PrintF.H.1
|
||||
plx
|
||||
bcs PrintF.PutC.RTS
|
||||
txa
|
||||
bra PrintF.H.1
|
||||
*--------------------------------------
|
||||
PrintF.H jsr STDIO.GetStackByte
|
||||
bcs PrintF.PutC.RTS
|
||||
PrintF.H.1 jsr MATH32.AToHexAX
|
||||
jsr PrintF.PutC
|
||||
bcs PrintF.PutC.RTS
|
||||
txa
|
||||
*--------------------------------------
|
||||
PrintF.PutC phy
|
||||
ldy PrintF.Cnt
|
||||
sta (pIOBuf),y
|
||||
ply
|
||||
inc PrintF.Cnt
|
||||
bne .8
|
||||
lda PrintF.hFILE
|
||||
bne .9
|
||||
|
||||
inc pIOBuf+1
|
||||
inc PrintF.Cnt+1
|
||||
.8 clc
|
||||
rts
|
||||
|
||||
.9 lda #E.BUF
|
||||
sec
|
||||
PrintF.PutC.RTS rts
|
||||
*/--------------------------------------
|
||||
* # ScanF (BLOCKING)
|
||||
* # FScanF (BLOCKING)
|
||||
* # SScanF
|
||||
* Read formatted data from string
|
||||
* ## C
|
||||
* `int scanf( const char *format, ... );`
|
||||
* `int fscanf( short int stream, const char *format, ... );`
|
||||
* `int sscanf ( const char *s, const char *format, ... );`
|
||||
* ## ASM
|
||||
* **In:**
|
||||
* ScanF :
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW ptr`
|
||||
* `...`
|
||||
* `>PUSHB bytecount`
|
||||
* `>SYSCALL scanf`
|
||||
* FScanF :
|
||||
* `>PUSHB stream`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW ptr`
|
||||
* `...`
|
||||
* `>PUSHB bytecount`
|
||||
* `>SYSCALL fscanf`
|
||||
* SScanF :
|
||||
* `>PUSHW s`
|
||||
* `>PUSHW format`
|
||||
* `>PUSHW ptr`
|
||||
* `...`
|
||||
* `>PUSHB bytecount`
|
||||
* `>SYSCALL sscanf`
|
||||
* Specifiers :
|
||||
* + %i : short int
|
||||
* + %d : byte
|
||||
* + %I : int
|
||||
* + %D : word
|
||||
* + %L : long int
|
||||
* + %U : dword
|
||||
* + %h : HEX byte
|
||||
* + %H : HEX word
|
||||
* + %s : string
|
||||
* TODO : %10s
|
||||
* ## RETURN VALUE
|
||||
* A = Number of arguments filled.
|
||||
*\--------------------------------------
|
||||
K.ScanF ldy #S.PS.hStdIn
|
||||
lda (pPS),y
|
||||
sta PrintF.hFILE
|
||||
|
||||
ldx #1
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.FScanF ldx #2
|
||||
.HS 2C BIT ABS
|
||||
*--------------------------------------
|
||||
K.SScanF ldx #3
|
||||
*--------------------------------------
|
||||
K.SScanF.1 clc format string->ptr1
|
||||
jsr STDIO.GetParams
|
||||
|
||||
stx ZPPtr2
|
||||
sta ZPPtr2+1 Output buffer->ZPPtr2
|
||||
|
||||
sty STDIO.ExitPopCnt Total bytes to POP
|
||||
|
||||
ldx PrintF.hFILE
|
||||
beq .1
|
||||
|
||||
>PUSHWI 256
|
||||
>PUSHW pIOBuf
|
||||
txa
|
||||
jsr K.FGetS
|
||||
bcc .1
|
||||
|
||||
tax
|
||||
bne PrintF.PutC.RTS
|
||||
>RET 4
|
||||
|
||||
.1 jsr SHARED.GetCharPtr1 End Of format?
|
||||
beq .8
|
||||
|
||||
cmp #'%' Escape ?
|
||||
beq .2
|
||||
|
||||
cmp #C.SPACE Space ?
|
||||
beq .12
|
||||
|
||||
sta .11+1
|
||||
|
||||
jsr SHARED.GetCharPtr2
|
||||
beq .9
|
||||
|
||||
.11 cmp #$ff Same char in string?
|
||||
beq .1
|
||||
|
||||
bra .9
|
||||
|
||||
.12 jsr SHARED.GetCharPtr2
|
||||
beq .9
|
||||
cmp #C.SPACE
|
||||
bne .9
|
||||
|
||||
.13 jsr SHARED.GetCharPtr2
|
||||
cmp #C.SPACE another space ?
|
||||
beq .13
|
||||
|
||||
bra .1
|
||||
|
||||
.2 jsr SHARED.GetCharPtr1 Get specifier after %
|
||||
beq .9 unexpected End of format after "%" ?
|
||||
|
||||
ldx #K.SScanFJMP-K.SScanFTBL-2
|
||||
|
||||
.3 cmp K.SScanFTBL,x
|
||||
beq .4
|
||||
dex
|
||||
dex
|
||||
bpl .3
|
||||
|
||||
.9 lda #MLI.E.EOF
|
||||
sec
|
||||
jmp STDIO.Exit
|
||||
|
||||
.4 jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
sta ZPPtr3+1
|
||||
jsr STDIO.GetStackByte
|
||||
bcs .9
|
||||
sta ZPPtr3
|
||||
|
||||
jsr .5
|
||||
bcs .9 out of Ptr on stack
|
||||
|
||||
inc .8+1 parsed one more arg!
|
||||
bra .1
|
||||
|
||||
.8 lda #$ff SELF MODIFIED Arg processed
|
||||
clc
|
||||
jmp STDIO.Exit
|
||||
*--------------------------------------
|
||||
.5 jmp (K.SScanFJMP,x)
|
||||
*--------------------------------------
|
||||
K.SScanFTBL .DA #'i,#1,#'d,#1,#'I,#2,#'D,#2,#'l,#4,#'u,#4,#'h,#1,#'H,#2,#'s,#2
|
||||
K.SScanFJMP .DA K.SScanF.I
|
||||
.DA K.SScanF.D
|
||||
.DA K.SScanF.II
|
||||
.DA K.SScanF.DD
|
||||
.DA K.SScanF.L
|
||||
.DA K.SScanF.U
|
||||
.DA K.SScanF.H
|
||||
.DA K.SScanF.HH
|
||||
.DA K.SScanF.S
|
||||
*--------------------------------------
|
||||
K.SScanF.I
|
||||
K.SScanF.D
|
||||
K.SScanF.II
|
||||
K.SScanF.DD
|
||||
K.SScanF.L
|
||||
K.SScanF.U lda K.SScanFTBL+1,x Get VAR size
|
||||
pha Save VAL size
|
||||
|
||||
jsr MATH32.Dec2ACC32
|
||||
bra K.SScanF.GetVAL
|
||||
*--------------------------------------
|
||||
K.SScanF.HH
|
||||
K.SScanF.H lda K.SScanFTBL+1,x Get VAR size
|
||||
pha
|
||||
|
||||
jsr MATH32.Hex2ACC32
|
||||
|
||||
K.SScanF.GetVAL jsr SHARED.AddYToPtr2 Y=char count parsed
|
||||
|
||||
.1 ply get back VAL size
|
||||
|
||||
.2 lda ACC32-1,y
|
||||
dey
|
||||
sta (ZPPtr3),y
|
||||
bne .2
|
||||
|
||||
.9 rts
|
||||
*--------------------------------------
|
||||
K.SScanF.S ldy #$ff
|
||||
|
||||
.1 iny
|
||||
lda (ZPPtr2),y Get char in string to scan
|
||||
sta (ZPPtr3),y store in param ptr
|
||||
beq K.SScanF.Fwd end of string to scan ?
|
||||
|
||||
cmp (ZPPtr1) match format next char ?
|
||||
beq .2
|
||||
|
||||
cmp #C.SPACE is it a space ?
|
||||
bne .1
|
||||
|
||||
.2 lda #0 add \0 to param ptr
|
||||
sta (ZPPtr3),y
|
||||
|
||||
K.SScanF.Fwd jmp SHARED.AddYToPtr2 Y=char count parsed
|
||||
*--------------------------------------
|
||||
* IN:
|
||||
* CC : format in ZPPtr1
|
||||
* CS : format in ZPPtr2
|
||||
* X = 3 : get format & buffer
|
||||
* X = 2 : get format & hFile
|
||||
* X = 1 : get format only
|
||||
* OUT:
|
||||
* X = Buf LO
|
||||
* A = Buf HI
|
||||
* format on stack
|
||||
* Y = BytePtr
|
||||
*--------------------------------------
|
||||
STDIO.GetParams stz PrintF.Cnt
|
||||
stz PrintF.Cnt+1
|
||||
|
||||
lda (pStack) Bytecount
|
||||
|
||||
tay
|
||||
sty STDIO.StackBytePtr
|
||||
|
||||
iny
|
||||
lda (pStack),y format LO
|
||||
pha
|
||||
|
||||
iny
|
||||
lda (pStack),y format HI
|
||||
bcs .10
|
||||
|
||||
sta ZPPtr1+1
|
||||
pla
|
||||
sta ZPPtr1
|
||||
bra .11
|
||||
|
||||
.10 sta ZPPtr2+1
|
||||
pla
|
||||
sta ZPPtr2
|
||||
|
||||
.11 dex
|
||||
beq .1
|
||||
|
||||
dex
|
||||
beq .2
|
||||
|
||||
.3 stz PrintF.hFILE
|
||||
|
||||
iny
|
||||
lda (pStack),y str LO
|
||||
tax
|
||||
|
||||
iny
|
||||
lda (pStack),y str HI
|
||||
|
||||
rts
|
||||
|
||||
.2 iny
|
||||
lda (pStack),y hFILE
|
||||
sta PrintF.hFILE
|
||||
|
||||
.1 ldx #K.IOBuf
|
||||
lda /K.IOBuf
|
||||
|
||||
STDIO.GetParams.RTS
|
||||
rts
|
||||
*--------------------------------------
|
||||
STDIO.GetStackPtr
|
||||
jsr STDIO.GetStackByte
|
||||
bcs STDIO.GetParams.RTS
|
||||
tax
|
||||
*--------------------------------------
|
||||
STDIO.GetStackByte
|
||||
phy
|
||||
|
||||
ldy STDIO.StackBytePtr
|
||||
beq .9
|
||||
|
||||
lda (pStack),y
|
||||
dec STDIO.StackBytePtr
|
||||
|
||||
ply
|
||||
clc
|
||||
rts
|
||||
|
||||
.9 lda #E.STACK
|
||||
|
||||
ply
|
||||
sec
|
||||
rts
|
||||
*--------------------------------------
|
||||
STDIO.Exit php
|
||||
pha
|
||||
|
||||
lda pStack
|
||||
sec
|
||||
adc STDIO.ExitPopCnt
|
||||
sta pStack
|
||||
|
||||
pla
|
||||
plp
|
||||
rts
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE usr/src/sys/kernel.s.stdio2
|
||||
LOAD usr/src/sys/kernel.s
|
||||
ASM
|
|
@ -326,12 +326,13 @@ K.ComputeWDAY.1 ldx #$ff SELF MODIFIED : month
|
|||
* clc
|
||||
jmp SHARED.FORPNT.PutY
|
||||
*--------------------------------------
|
||||
TIMEX.MDAY .DA #3,#0,#3,#2,#3,#2,#3,#3,#2,#3,#2,#3
|
||||
* TXTPTR ctime
|
||||
* FORPNT S.TIME
|
||||
*--------------------------------------
|
||||
TIMEX.CTime2Time
|
||||
ldy #3
|
||||
|
||||
.1 lda (ZPPtr1),y
|
||||
.1 jsr SHARED.TXTPTR.GetY
|
||||
sta ARG32,y ARG = ctime
|
||||
dey
|
||||
bpl .1
|
||||
|
@ -365,12 +366,13 @@ TIMEX.CTime2Time
|
|||
|
||||
tya
|
||||
ldy #S.Time.WDAY
|
||||
sta (ZPPtr2),y
|
||||
jsr SHARED.FORPNT.PutY
|
||||
|
||||
ldy #CENT0
|
||||
sty ZPPtr3
|
||||
lda #YEAR0
|
||||
sta ZPPtr3+1
|
||||
K.CTime2Time.Year
|
||||
K.CTime2Time.Y
|
||||
.1 ldy ZPPtr3
|
||||
lda ZPPtr3+1
|
||||
jsr TIMEX.IsLeap if Leap year CS
|
||||
|
@ -387,40 +389,89 @@ K.CTime2Time.Year
|
|||
sta ARG32+1
|
||||
pla
|
||||
sta ARG32
|
||||
inc ZPPtr3
|
||||
lda ZPPtr3
|
||||
inc ZPPtr3+1
|
||||
lda ZPPtr3+1
|
||||
cmp #100
|
||||
bne .1
|
||||
|
||||
stz ZPPtr3
|
||||
inc ZPPtr3+1
|
||||
bne .1
|
||||
stz ZPPtr3+1
|
||||
inc ZPPtr3
|
||||
bra .1
|
||||
|
||||
.2 pla
|
||||
|
||||
lda ZPPtr3+1
|
||||
* ldy #S.Time.CENTURY
|
||||
sta (ZPPtr2)
|
||||
lda ZPPtr3
|
||||
ldy #S.Time.CENTURY
|
||||
jsr SHARED.FORPNT.PutY
|
||||
|
||||
ldy #S.Time.YEAR
|
||||
lda ZPPtr3
|
||||
sta (ZPPtr2),y
|
||||
lda ZPPtr3+1
|
||||
jsr SHARED.FORPNT.PutY
|
||||
K.CTime2Time.MD
|
||||
ldx #1 X = January
|
||||
|
||||
.1 clc
|
||||
txa
|
||||
eor #2
|
||||
|
||||
bne .2
|
||||
|
||||
>LDYA ZPPtr3 Current Year
|
||||
jsr TIMEX.IsLeap
|
||||
|
||||
.2 lda TIMEX.MDAY-1,x
|
||||
adc #28 A = days of X
|
||||
|
||||
sta .3+1
|
||||
|
||||
lda ARG32 ARG32/ARG32+1 = 0 .. 364 or 365
|
||||
sec
|
||||
|
||||
.3 sbc #$ff SELF MODIFIED
|
||||
pha
|
||||
lda ARG32+1
|
||||
sbc #0
|
||||
bcc .4
|
||||
|
||||
sta ARG32+1
|
||||
pla
|
||||
sta ARG32
|
||||
inx
|
||||
bra .1
|
||||
|
||||
.4 pla
|
||||
ldy #S.TIME.MONTH
|
||||
txa
|
||||
jsr SHARED.FORPNT.PutY
|
||||
|
||||
iny S.TIME.DAY
|
||||
|
||||
lda ARG32
|
||||
inc
|
||||
jsr SHARED.FORPNT.PutY
|
||||
|
||||
K.CTime2Time.HMS
|
||||
ldx #3
|
||||
|
||||
.1 lda TMP32,x
|
||||
sta ARG32,x
|
||||
dex
|
||||
bpl .1
|
||||
|
||||
ldy #S.TIME.SECOND
|
||||
jsr .2
|
||||
|
||||
dey #S.TIME.MINUTE
|
||||
|
||||
jsr .2
|
||||
|
||||
dey #S.TIME.HOUR
|
||||
lda ARG32
|
||||
sta (ZPPtr2),y
|
||||
jsr SHARED.FORPNT.PutY
|
||||
|
||||
clc
|
||||
rts
|
||||
|
||||
.2 phy
|
||||
|
||||
lda #60
|
||||
|
@ -428,7 +479,7 @@ K.CTime2Time.HMS
|
|||
jsr MATH32.DIVMOD
|
||||
ply
|
||||
lda TMP32
|
||||
sta (ZPPtr2),y
|
||||
jsr SHARED.FORPNT.PutY
|
||||
rts
|
||||
*--------------------------------------
|
||||
* In :
|
||||
|
@ -458,6 +509,8 @@ TIMEX.IsLeap cmp #0 Year = 00 ?
|
|||
.9 sec Leap
|
||||
rts
|
||||
*--------------------------------------
|
||||
TIMEX.MDAY .DA #3,#0,#3,#2,#3,#2,#3,#3,#2,#3,#2,#3
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE usr/src/sys/kernel.s.timex
|
||||
LOAD usr/src/sys/kernel.s
|
||||
|
|
|
@ -80,7 +80,6 @@ A2osX.D1.B .PH $D000
|
|||
.INB usr/src/sys/kernel.s.dirent
|
||||
.INB usr/src/sys/kernel.s.unistd
|
||||
.INB usr/src/sys/kernel.s.stdio
|
||||
.INB usr/src/sys/kernel.s.stdio2
|
||||
.INB usr/src/sys/kernel.s.dev
|
||||
.INB usr/src/sys/kernel.s.pipe
|
||||
.EP
|
||||
|
|
Loading…
Reference in New Issue