A2osX/SYS/KERNEL.S.CIO.txt

531 lines
8.9 KiB
Plaintext
Raw 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
*--------------------------------------
* K.PrintFYA :
* Prints C-Style String
* Y,A = PTR to Sting,Last Byte negative
* %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
* \e Print 'ESC' ($1B,27)
* \n Print CR=13
* \\ Print \
* \% Print %
* len/padding :
* %d '9' '12'
* %2d ' 9' '12'
* %02d '09' '12'
* %11s 'ABCDEFGH '
* %011s 'ABCDEFGH000'
* %2f '3.14'
*--------------------------------------
K.PrintFYA >STYA ZPQuickPtr1
ldy #0
.1 lda (ZPQuickPtr1),y
beq .99
cmp #'%'
bne .10
stz PADLEN
lda #' '
sta PADCHAR
.2 ldx #PrintFTBL1.END-PrintFTBL1-1
iny
lda (ZPQuickPtr1),y
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
iny
bne .1
rts
.10 cmp #'\'
bne .20
ldx #PrintFTBL2.END-PrintFTBL2-1
iny
lda (ZPQuickPtr1),y
beq .99
.12 cmp PrintFTBL2,x
beq .13
dex
bpl .12
bra .80
.13 lda PrintFTBL2.OUT,x
.20 jsr K.COutA
.80 iny
bne .1
.99 rts
*--------------------------------------
PrintFESC jmp (PrintFJMP,x)
*--------------------------------------
PrintFTBL1 .AS "abBdDuefhHiILnNsS"
PrintFTBL1.END
PrintFTBL2 .AS "en\%"
PrintFTBL2.END
PrintFTBL2.OUT .HS 1B.0D \e\n
.DA #'\' \\
.DA #'%' \%
PrintFJMP .DA PrintF.D,PrintF.DD,PrintF.U
PADLEN .BS 1
PADCHAR .BS 1
DWORDBUF .BS 4
*--------------------------------------
PrintF.D >PULLA DWORDBUF
stz DWORDBUF+1
bra PrintF.DD.1
PrintF.DD >PULLYA DWORDBUF
PrintF.DD.1 stz DWORDBUF+2
stz DWORDBUF+3
bra PrintF.U.1
PrintF.U >PULLW ZPQuickPtr2
ldy #3
.1 lda (ZPQuickPtr2),y
sta DWORDBUF,y
dey
bpl .1
PrintF.U.1 rts
*--------------------------------------
K.DecOutA tay
lda #0
K.DecOutYA >STYA HEX
stz BCD
stz BCD+1
stz BCD+2
ldx #16 let's roll 16 bits
sed
.2 asl HEX
rol HEX+1
php cpy will disturb carry while BCD adc
ldy #0
.3 plp
lda BCD,y
adc BCD,y
sta BCD,y
php
iny
cpy #3 Last byte of BCDBUF?
bne .3
plp
dex
bne .2
cld
stz bL0Flag
ldx #2
.4 lda BCD,x
lsr
lsr
lsr
lsr
bne .5
bit bL0Flag
bpl .6
.5 sec
ror bL0Flag
ora #$30
jsr K.COutA
bcs .9
.6 lda BCD,x
and #$0F
bne .7
bit bL0Flag
bpl .8
.7 sec
ror bL0Flag
ora #$30
jsr K.COutA
bcs .9
.8 dex
bpl .4
bit bL0Flag
bmi .9
lda #$30
jsr K.COutA
.9 rts
*--------------------------------------
K.HexOutYA phy
jsr K.HexOutA
bcs K.COutA.RTS
pla
*--------------------------------------
K.HexOutA pha
lsr
lsr
lsr
lsr
ora #$30
cmp #$3A
bcc .1
adc #6
.1 jsr K.COutA
bcs K.COutA.RTS
pla
and #$0F
ora #$30
cmp #$3A
bcc K.COutA
adc #6
*--------------------------------------
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
K.COutA.RTS rts
*--------------------------------------
* Mini printf for PSTR
* %d : byte
* %D : word
* %h : hex byte
* %H : hex word
* %s : hSTR
* %S : PSTR
* \e : ESC
* \n : CR
*--------------------------------------
K.PStrOutYA >STYA ZPQuickPtr1
ldy #0
.1 jsr K.PStrOut.Next
bne .12
.8 clc
rts
.12 cmp #'\'
bne .2
jsr K.PStrOut.Next
beq .8
cmp #'e'
bne .11
lda #27
bra .6
.11 cmp #'n'
bne .6
lda #13
bra .6
.2 cmp #'%'
bne .6
jsr K.PStrOut.Next
beq .8
cmp #'d'
bne .3
phy
>PULLA
jsr K.DecOutA
ply
bcc .1
rts
.3 cmp #'D'
bne .4
phy
>PULLYA
jsr K.DecOutYA
ply
bcc .1
rts
.4 cmp #'h'
bne .5
phy
>PULLA
jsr K.HexOutA
ply
bcc .1
rts
.5 cmp #'H'
bne .51
phy
>PULLYA
jsr K.HexOutYA
ply
bcc .1
rts
.51 cmp #'s'
bne .52
jsr K.PStrOutYAS1
bcc .1
rts
.52 cmp #'S'
bne .53
jsr K.PStrOutYAS2
bcc .10
rts
.53 tax
lda #'%'
jsr K.COutA
bcs .9
txa
.6 jsr K.COutA
bcs .9
.10 jmp .1
.9 rts
*--------------------------------------
K.PStrOut.Next tya
eor (ZPQuickPtr1)
beq .8
iny
lda (ZPQuickPtr1),y
.8 rts
*--------------------------------------
K.PStrOutYAS1 phy
>PULLA
jsr K.GetMemPtrA
bra K.PStrOutYAS
K.PStrOutYAS2 phy
>PULLYA
K.PStrOutYAS >STYA ZPQuickPtr2
clc
lda (ZPQuickPtr2)
tax
beq .9
ldy #1
.1 lda (ZPQuickPtr2),y
jsr K.COutA
bcs .9
iny
dex
bne .1
.9 ply
rts
*--------------------------------------
* Convert HEXBUF to ASCBUF decimal padded with 0
*--------------------------------------
HEX2DEC ldx #4
.1 stz BCDBUF,x Clear all 5 bytes
dex
bpl .1
sed switch to BCD mode
ldx #32 let's roll 32 bits
.2 asl HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
ldy #4
.3 lda BCDBUF,y
adc BCDBUF,y
sta BCDBUF,y
dey
bpl .3
dex
bne .2
cld
ldy #4
ldx #9
.4 lda BCDBUF,y
pha
and #$0F
ora #$30
sta ASCBUF,x
dex
pla
lsr
lsr
lsr
lsr
ora #$30
sta ASCBUF,x
dey
dex
bpl .4
rts
*--------------------------------------
* Convert ASCBUF decimal to HEXBUF
*--------------------------------------
DEC2HEX stz HEXBUF
stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
ldx #0
.1 lda HEXBUF+3 save HEXBUF for 4+1
pha
lda HEXBUF+2
pha
lda HEXBUF+1
pha
lda HEXBUF
pha
asl HEXBUF HEXBUF * 2 -> HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
bcs .9 overflow!!!
asl HEXBUF HEXBUF * 4 -> HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
bcs .9 overflow!!!
pla HEXBUF * 4 + HEXBUF -> HEXBUF
adc HEXBUF
sta HEXBUF
pla
adc HEXBUF+1
sta HEXBUF+1
pla
adc HEXBUF+2
sta HEXBUF+2
pla
adc HEXBUF+3
sta HEXBUF+3
bcs .99 overflow!!!
asl HEXBUF HEXBUF * 10 -> HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
bcs .99 overflow!!!
inx
lda ASCBUF,x
and #$0F
adc HEXBUF
sta HEXBUF
bcc .2
inc HEXBUF+1
bne .2
inc HEXBUF+2
bne .2
inc HEXBUF+3
.2 cpx ASCBUF
bne .1
rts
.9 pla discard saved HEXBUF
pla
pla
pla
.99 rts
*--------------------------------------
HEXBUF .BS 4 32 bits max
BCDBUF .BS 5 5, enough to handle 10 digits (32bits)
ASCBUF .BS 12 LEN + sign + 10 digits ($FFFFFFFF=4.294.967.295)
*--------------------------------------
HEX .BS 2
BCD .BS 3
bL0Flag .BS 1
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.CIO
LOAD SYS/KERNEL.S
ASM