A2osX/SYS/KERNEL.S.CIO.txt

657 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

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

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*/--------------------------------------
* #SScanF
* Scan a PStr (in progress)
* ##In:
* PUSHW PTR to target buffer
* PUSHW PSTR pattern (ex: "%d.%d.%d.%d")
* %d : byte
* PUSHW PSTR to scan (ex: "192.168.1.5")
* ##Out:
*\--------------------------------------
K.SScanF jsr PullPtr1Ptr2Ptr3
ldy #0 Y = PTR in pattern
lda (ZPQuickPtr1)
beq .9
tax X = COUNT to scan
inc ZPQuickPtr1
bne .1
inc ZPQuickPtr1+1
.1 txa End Of String?
beq .8
tya
cmp (ZPQuickPtr2) End of pattern?
beq .8
iny
lda (ZPQuickPtr2),y
cmp #'%' Escape?
beq .2
cmp (ZPQuickPtr1) Same char?
bne .9
jsr K.SScanF.IncPtr1
bne .1
clc
rts
.2 tya
cmp (ZPQuickPtr2) unexpected End of pattern after "%" ?
beq .9
iny
lda (ZPQuickPtr2),y
cmp #'d' BYTE ?
bne .3
stz ASCBUF
.20 lda (ZPQuickPtr1)
jsr K.SScanF.IsDigit
bcs .21
phx
inc ASCBUF
ldx ASCBUF
sta ASCBUF,x
plx
jsr K.SScanF.IncPtr1
bne .20 end of string ?
.21 jsr DEC2HEX
lda HEXBUF
sta (ZPQuickPtr3)
inc ZPQuickPtr3
bne .1
inc ZPQuickPtr3+1
bra .1
.3 cmp #'D' WORD ?
bne .4
bra .1
.4 cmp #'s' STRING ?
bne .9
bra .1
.8 clc
rts
.9 sec
rts
*--------------------------------------
K.SScanF.IncPtr1
dex
beq .1
inc ZPQuickPtr1
bne .1
inc ZPQuickPtr1+1 never Zero
.1 rts
*--------------------------------------
K.SScanF.IsDigit
cmp #'0'
bcc .1
cmp #'9'+1
bcs .1
rts
.1 sec
rts
*/--------------------------------------
* #PPrintFYA/CPrintFYA
* Prints Pascal/C-Style String
* ##In:
* Y,A = PTR to PStr/CStr
* %a : pull 2 bytes to Print Access right String 'drwxrwxrwx'
* %b : pull 1 byte to Print BIN
* %B : pull 2 bytes to Print BIN
* %d : pull 1 byte unsigned DEC 0..255
* %D : pull 2 bytes unsigned DEC 0..65535
* %u : pull 2 bytes PTR to 4 bytes long unsigned DEC 0..4294967295
* %e : pull 2 bytes PTR to 6 Bytes Real +1.23456789e+12
* %f : pull 2 bytes PTR to 6 Bytes Real 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 2 bytes PTR to 4 bytes signed DEC -2147483648..2147483647
* %n : pull 1 byte to Print low Nibble HEX
* %N : pull 1 byte to Print high Nibble HEX
* %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 'CR' ($0D,13)
* \\\\ : Print \
* \% : Print %
* Modifiers for len and padding :
* %d : '9' '12'
* %2d : ' 9' '12'
* %02d : '09' '12'
* %11s : 'ABCDEFGH '
* %011s : 'ABCDEFGH000'
* %2f : '3.14'
* ##Out:
* CC : success
* CS : I/O error from COut
*\--------------------------------------
K.PPrintFYA ldx #$01 PSTR
.HS 2C bit abs
K.CPrintFYA ldx #$00 CSTR
>STYA ZPQuickPtr1
stx CIO.GetCharAtPtr1Y+1
ldy #0
.1 jsr CIO.GetCharAtPtr1Y
beq .99
cmp #'%'
bne .10
stz PADLEN
lda #' '
sta PADCHAR
.2 ldx #PrintFTBL1.END-PrintFTBL1-1
jsr CIO.GetCharAtPtr1Y
beq .99
.3 cmp PrintFTBL1,x do we have a %x command?
beq .8 yes, jmp to it!
dex
bpl .3 no valid letter...
cmp #'0' ...a 0...mmm... padding char?
bne .4
ldx PADLEN PADLEN is not nul, so this 0 is second digit
bne .5
lda #'0'
sta PADCHAR no, this is the first 0, so make it PADCHAR
bra .2
.4 bcc .99 less than '0'....error
cmp #'9'+1
bcs .99 more than '9' ....error
.5 and #$0F we have a digit
pha save it...
lda PADLEN starts PADLEN * 10
asl
asl A=times 4
adc PADLEN CC by ASL, A=times 5
asl times 10
sta PADLEN
pla get back digit
adc PADLEN
sta PADLEN
bra .2 go get next char...
.8 phy
txa
asl
tax
jsr PrintFESC
ply
bcc .1
rts
.10 cmp #'\'
bne .20
ldx #PrintFTBL2.END-PrintFTBL2-1
jsr CIO.GetCharAtPtr1Y
beq .99
.12 cmp PrintFTBL2,x
beq .13
dex
bpl .12
bra .1
.13 lda PrintFTBL2.OUT,x
.20 jsr K.COutA
bcc .1
.99 rts
*--------------------------------------
PrintFESC jmp (PrintFJMP,x)
*--------------------------------------
PrintFTBL1 .AS "abBdDuefhHiILnNsS"
PrintFTBL1.END
PrintFTBL2 .AS "befn\%"
PrintFTBL2.END
PrintFTBL2.OUT .HS 08.1B.0C.0D \b\e\f\n
.DA #'\' \\
.DA #'%' \%
PrintFJMP .DA PrintF.A
.DA PrintF.B,PrintF.BB
.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.N,PrintF.NN
.DA PrintF.S,PrintF.SS
*--------------------------------------
PrintF.A >PULLW HEXBUF
lda HEXBUF+1
lsr
lsr
lsr
lsr
tax
lda TYPES,x
jsr K.COutA
bcs .9
ldx #0
.1 lda #'-'
lsr HEXBUF
bcc .2
lda ACCESS,x
.2 jsr K.COutA
bcs .9
inx
cpx #8
bne .1
.3 lda #'-'
lsr HEXBUF+1
bcc .4
lda ACCESS,x
.4 jmp K.COutA
.9 rts
*--------------------------------------
PrintF.BB >PULLA
pha
jsr PrintF.B
pla
bcc PrintF.B.1
PrintF.BB.RTS rts
*--------------------------------------
PrintF.B >PULLA
PrintF.B.1 ldx #8
.1 asl
pha
lda #'0'
adc #0 add Carry
jsr K.COutA
pla
bcs PrintF.BB.RTS
dex
bne .1
rts
*--------------------------------------
PrintF.D >PULLB HEXBUF
stz HEXBUF+1
bra PrintF.DD.1
PrintF.DD >PULLW HEXBUF
PrintF.DD.1 stz HEXBUF+2
stz HEXBUF+3
bra PrintF.U.1
PrintF.U >PULLW ZPQuickPtr2
ldy #3
.1 lda (ZPQuickPtr2),y
sta HEXBUF,y
dey
bpl .1
PrintF.U.1 stz SIGN
jsr HEX2DEC
jmp PrintDEC
*--------------------------------------
PrintF.E >PULLW ZPQuickPtr2
rts
*--------------------------------------
PrintF.F >PULLW ZPQuickPtr2
rts
*--------------------------------------
PrintF.HH >PULLA
pha
jsr PrintF.H
pla
bra PrintF.H.1
*--------------------------------------
PrintF.H >PULLA
PrintF.H.1 pha
jsr PrintF.NN.1
pla
jmp PrintF.N.1
*--------------------------------------
PrintF.I >PULLB HEXBUF
eor #$ff if positive, it becomes neg so branch if....minus!
clc
bmi .1
sec
inc 2s complement...
sta HEXBUF
.1 stz HEXBUF+1
bra PrintF.II.1
PrintF.II >PULLW HEXBUF A=HI
eor #$ff
clc
bmi PrintF.II.1
sec
tax
lda HEXBUF
eor #$ff
inc 2s complement...
sta HEXBUF
bne .1
inx
.1 sta HEXBUF
stx HEXBUF+1
PrintF.II.1 stz HEXBUF+2
stz HEXBUF+3
bra PrintF.L.1
PrintF.L >PULLW ZPQuickPtr2
ldy #3
.1 lda (ZPQuickPtr2),y
sta HEXBUF,y
dey
bpl .1
PrintF.L.1 ror SIGN
jsr HEX2DEC
jmp PrintDEC
*--------------------------------------
PrintF.N >PULLA
PrintF.N.1 and #$0F
bra PrintF.NN.2
PrintF.NN >PULLA
PrintF.NN.1 lsr
lsr
lsr
lsr
PrintF.NN.2 ora #$30
cmp #$3A
bcc .1
adc #6
.1 jmp K.COutA
*--------------------------------------
* CStr
*--------------------------------------
PrintF.S >PULLW ZPQuickPtr2
ldy #0
.1 lda (ZPQuickPtr2),y
beq .2
jsr K.COutA
bcs .9
iny
lda PADLEN
beq .1
cpy PADLEN
bne .1
rts
.2 lda PADLEN
beq .8
.3 lda PADCHAR
jsr K.COutA
bcs .9
iny
cpy PADLEN
bne .3
.8 clc
.9 rts
*--------------------------------------
* PStr
*--------------------------------------
PrintF.SS >PULLW ZPQuickPtr2
ldy #0
lda (ZPQuickPtr2),y
tax
beq .8
.1 iny
lda (ZPQuickPtr2),y
jsr K.COutA
bcs .9
lda PADLEN
beq .2
cpy PADLEN
beq .8
.2 dex
bne .1
lda PADLEN
beq .8
.3 lda PADCHAR
jsr K.COutA
bcs .9
iny
cpy PADLEN
bne .3
.8 clc
.9 rts
*--------------------------------------
CIO.GetCharAtPtr1Y
lda #$ff Self Modified PSTR/CSTR
bne .1
lda (ZPQuickPtr1),y CSTR
beq .9
iny advance to next char...
bne .9
inc ZPQuickPtr1+1 Allow >256 CStrings
rts
.1 tya PSTR
cmp (ZPQuickPtr1)
beq .9
iny
lda (ZPQuickPtr1),y NZ
.9 clc no error, but end of string
rts
*--------------------------------------
K.COutA phx
phy
cmp #13
bne .1
ldx #DEVMGR.COUT
jsr pDevJmp
bcs .2
lda #10
.1 ldx #DEVMGR.COUT
jsr pDevJmp
.2 ply
plx
rts
*/--------------------------------------
* #FPutCAY
* Print A (char) to File
* ##In:
* A : char to print
* Y = hFILE
* none.
* ##Out:
* CC = success
*\--------------------------------------
K.FPutCAY sta K.PutC.Char
sty K.PutC.Node
tya
bne K.PutCA.1
K.PutCA.8 clc
rts
*/--------------------------------------
* #PutCA
* Print A (char) to StdOut
* ##In:
* A : char to print
* none.
* ##Out:
* CC = success
*\--------------------------------------
K.PutCA sta K.PutC.Char
ldy #S.PS.hStdOut
lda (pPs),y
beq K.PutCA.8 NUL
K.PutCA.1 sta K.PutC.Node
jsr K.GetMemPtrA
>STYA pNode
ldy #S.NODE.T
lda (pNode),y
asl
tax
jmp (K.PutCA.Jmp,x)
*--------------------------------------
K.PutCA.Jmp .DA K.PutCA.REG
.DA K.PutCA.IOERR DIR
.DA K.PutCA.CDEV
.DA K.PutCA.IOERR BDEV
.DA K.PutCA.IOERR LNK
.DA K.PutCA.IOERR DSOCK
.DA K.PutCA.SSOCK
.DA K.PutCA.FIFO
*--------------------------------------
K.PutCA.REG lda K.PutC.Node
ldy K.PutC.Char
jmp K.FWriteAY
*--------------------------------------
K.PutCA.CDEV
*--------------------------------------
K.PutCA.SSOCK
*--------------------------------------
K.PutCA.FIFO ldy #S.NODE.FIFO.S
lda (pNode),y
beq .9 Remote PS did not opened yet the pipe
cmp #S.NODE.FIFO.S.Closed
beq .99 Remote PS closed the Pipe
ldy #S.NODE.FIFO.hMem
lda (pNode),y
jsr K.GetMemPtrA
>STYA .1+2
ldy #S.NODE.FIFO.Head
lda (pNode),y
inc
iny
cmp (pNode),y
beq .9 FIFO is full
dey
sta (pNode),y
tay
lda K.PutC.Char
.1 sta $ffff,y
clc
rts
.9 lda #MLI.ERR.VOLFULL
sec
rts
.99 lda #MLI.ERR.EOF
sec
rts
*--------------------------------------
K.PutCA.IOERR lda #MLI.ERR.IO
sec
rts
*--------------------------------------
K.PutC.Char .BS 1
K.PutC.Node .BS 1
*--------------------------------------
K.FGetC
*--------------------------------------
K.FPutSYA
*--------------------------------------
K.FGetS
*--------------------------------------
PRINTDEC lda PADLEN any Len format ?
beq .1 no
lda #10
sec yes, Print only digits starting at pos 10-padlen
sbc PADLEN
.1 tax x=0 if no padlen, or x=10-padlen
.2 lda ASCBUF,x
cmp #'0' a zero?
beq .3
inc PADLEN found a non zero, Print all digits, even if 0, next time
ldy #'0'
sty PADCHAR
bra .4
.3 cpx #9 last digit ?
beq .4 Print always
ldy PADLEN no pad to fill, do not Print 0
beq .6
lda PADCHAR fill with PADCHAR
.4 bit SIGN a sign to print before digits ?
bpl .5
pha yes, save whatever we have to print....
lda #'-'
jsr K.COutA
stz SIGN reset flag for next char...
pla
.5 jsr K.COutA
bcs .9
.6 inx
cpx #10
bne .2
clc
.9 rts
*--------------------------------------
TYPES .AS "-dbclssp"
ACCESS .AS "rwxrwxrwx"
SIGN .BS 1
PADLEN .BS 1
PADCHAR .BS 1
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.CIO
LOAD SYS/KERNEL.S
ASM