Kernel 0.94+

This commit is contained in:
Rémy GIBERT 2020-12-23 15:54:57 +01:00
parent 5886c5810c
commit d8c0f5e1e3
41 changed files with 1699 additions and 1062 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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....

View File

@ -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
*--------------------------------------

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
*--------------------------------------

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)..."

View File

@ -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
*--------------------------------------

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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*,...);

View File

@ -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*);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"
*--------------------------------------

View File

@ -433,6 +433,7 @@ MATH32.Dec2ACC32
lda (ZPPtr2)
eor #'-'
bne .10
jsr SHARED.NextCharPtr2 skip '-'
sec
.10 ror .80+1 set pos/neg flag

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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