diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index bec3ad66..cff90e21 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -50,23 +50,21 @@ A2osX.SaveSX .EQ $101 Aux * Aux $200 -> 3FD : /RAM Driver * Aux $3FE -> 3FF : IRQ Vector *-------------------------------------- -*D.STACK.BASE .EQ $0300 $03EF... -D.STACK.TOP .EQ $03F0 ...Down to $0300 +K.S.STAT .EQ $0300 S.STAT for internal kernel operations +K.S.DEVSTAT .EQ $0340 S.DEVSTAT=25 or higher depends on dev type +K.SP.PARAMS .EQ $0380 Max 9 bytes +K.MLI.PARAMS .EQ $0390 Main, 18 bytes min for GetFileInfo (ATLK needs MORE!!!...32 max for now) +K.MLI.PATH .EQ $03B0 64+1 -> $03D0 *-------------------------------------- *** $3F0-$3FF IRQ Handler.... *** *-------------------------------------- * Main/Aux $400 -> $7FF : Console Screen * Main/Aux $800 -> $BFF : System Screen *-------------------------------------- -UsrBuf256 .EQ $0C00 Main +*UsrBuf256 .EQ $0C00 Main *-------------------------------------- KrnBuf256 .EQ $0D00 Main *-------------------------------------- -K.MLI.PARAMS .EQ $0E00 Main, 18 bytes min for GetFileInfo -K.MLI.PATH .EQ K.MLI.PARAMS+32 (ATLK needs MORE!!!...32 max for now -K.S.STAT .EQ K.MLI.PATH+64 S.STAT for internal kernel operations (DIR,FIO) -K.S.DEVSTAT .EQ K.S.STAT+64 -K.S.PORTCALL .EQ K.S.DEVSTAT+64 S.DEVSTAT=25 or higher depends on dev type *-------------------------------------- *** Z80 Reserved $0F00-10FF*** *-------------------------------------- @@ -432,10 +430,10 @@ S.PS.PID .EQ 2 S.PS.CPID .EQ 3 S.PS.hCS .EQ 4 S.PS.hDS .EQ 5 -S.PS.hPREFIX .EQ 6 +S.PS.hSS .EQ 6 S.PS.hENV .EQ 7 S.PS.hCMDLINE .EQ 8 -S.PS.UID .EQ 9 +S.PS.hPREFIX .EQ 9 S.PS.hStdIn .EQ 10 S.PS.hStdOut .EQ 11 S.PS.hStdErr .EQ 12 diff --git a/INC/MACROS.I.txt b/INC/MACROS.I.txt index 78b21f94..64a4d296 100644 --- a/INC/MACROS.I.txt +++ b/INC/MACROS.I.txt @@ -50,7 +50,7 @@ AUTO 6 .DO ]1=MLIDESTROY lda #1 .FIN - .DO ]1=MLIRename + .DO ]1=MLIRENAME lda #2 .FIN .DO ]1=MLISETFILEINFO diff --git a/SYS/KERNEL.S.ARG.txt b/SYS/KERNEL.S.ARG.txt index 91c0b296..9a9be783 100644 --- a/SYS/KERNEL.S.ARG.txt +++ b/SYS/KERNEL.S.ARG.txt @@ -30,7 +30,7 @@ K.GetArgC jsr ARG.InitArgPtr1 * A = argument index. * ## Out: * CC : success -* Y,A = PStr To Arg[A] +* Y,A = CStr To Arg[A] * CS : Out Of Bound *\-------------------------------------- K.GetArgA sta .2+1 @@ -64,11 +64,15 @@ ARG.InitArgPtr1 ldy #S.PS.hCMDLINE >STYA ZPPtr1 rts *-------------------------------------- -ARG.NextArgPtr1 lda ZPPtr1 - sec - adc (ZPPtr1) - sta ZPPtr1 - bcc .8 +ARG.NextArgPtr1 inc ZPPtr1 + bne .1 + inc ZPPtr1+1 + +.1 lda (ZPPtr1) + bne ARG.NextArgPtr1 + + inc ZPPtr1 + bne .8 inc ZPPtr1+1 .8 rts *-------------------------------------- diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index 878a90f2..4cb9bc52 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -12,11 +12,11 @@ AUTO 6 * X = hMem of Code Segment *-------------------------------------- K.LoadEXEYA >STYA K.LoadEXEYA.Filename - >SYSCALL PStrUprYA Y,A unmodified + >SYSCALL StrUprYA Y,A unmodified jsr MEM.GetMemByNameYA bcs K.LoadEXEYA.1 not already loaded - >STYA ZPPtr1 Save base address + >STYA ZPPtr1 Save base address ldy #S.MEM.REFCNT lda (ZPPtr1),y inc @@ -41,9 +41,9 @@ K.LoadEXEYA.1 >PUSHWI K.S.STAT jsr K.LoadFile .9 bcs .99 Error Loading file - stx K.LoadEXEYA.hMem save hMem + stx K.LoadEXEYA.hMem save hMem - pha YA=CODE+DATA size + pha YA=CODE+DATA size tya * clc CC from bcs .99 diff --git a/SYS/KERNEL.S.CHR.txt b/SYS/KERNEL.S.CHR.txt index f7794e57..1cb03960 100644 --- a/SYS/KERNEL.S.CHR.txt +++ b/SYS/KERNEL.S.CHR.txt @@ -3,235 +3,6 @@ PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 -*/-------------------------------------- -* # FPutCAY -* Print A (char) to File -* ## In: -* A : char to print -* Y = hFILE -* ## Out: -* CC = success -*\-------------------------------------- -K.FPutCAY sta K.PutC.Char - sty K.PutC.Node - tya - phy - bne K.PutCharA.1 -K.PutCharA.8 ply - clc - rts -*/-------------------------------------- -* # PutCharA -* Print A (char) to StdOut -* ## In: -* A : char to print -* ## Out: -* CC = success -*\-------------------------------------- -K.PutCharA sta K.PutC.Char - phy - ldy #S.PS.hStdOut - lda (pPs),y - beq K.PutCharA.8 NUL - - phx - -K.PutCharA.1 sta K.PutC.Node - jsr K.GetMemPtrA - >STYA pDev - - ldy #S.NODE.T - lda (pDev),y - asl - tax - jsr K.PutCharA.Jmp - - plx - ply - rts -*-------------------------------------- -K.PutCharA.Jmp jmp (.1,x) -.1 .DA K.PutCharA.REG - .DA K.CHR.IOERR DIR - .DA K.PutCharA.CDEV - .DA K.CHR.IOERR BDEV - .DA K.CHR.IOERR LNK - .DA K.CHR.IOERR DSOCK - .DA K.PutCharA.SSOCK - .DA K.PutCharA.FIFO -*-------------------------------------- -K.PutCharA.REG lda K.PutC.Node - ldy K.PutC.Char - jmp K.FWriteAY -*-------------------------------------- -K.PutCharA.CDEV ldy #S.NODE.DEV.JMP - lda (pDev),y - sta .1+1 - iny - lda (pDev),y - sta .1+2 - lda K.PutC.Char - ldx #DEVMGR.WRITE -.1 jmp $ffff -*-------------------------------------- -K.PutCharA.SSOCK - lda (pDev) #S.NODE.HANDLER - jsr K.GetMemPtrA - >STYA .1 - - ldy #S.NODE.SSOCK.HSKT - >PUSHB (pDev),y - >PUSHB K.PutC.Char - - ldy #S.NODE.SSOCK.WRITE - lda (pDev),y - tax Function Offset for write -.1 jmp $ffff -*-------------------------------------- -K.PutCharA.FIFO ldy #S.NODE.FIFO.S - lda (pDev),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 (pDev),y - jsr K.GetMemPtrA - >STYA .1+2 - - ldy #S.NODE.FIFO.Head - lda (pDev),y - inc - dey #S.NODE.FIFO.Tail - cmp (pDev),y - beq .9 FIFO is full - iny - sta (pDev),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.PutC.Char .BS 1 -K.PutC.Node .BS 1 -*/-------------------------------------- -* # GetChar -* Get char from StdIn -* ## In: -* none. -* ## Out: -* CC = success -* A = char -*\-------------------------------------- -K.GetChar ldy #S.PS.hStdIn - lda (pPs),y -*/-------------------------------------- -* # GetCA -* Get char from File -* ## In: -* A = hFILE -* ## Out: -* CC = success -* A = char -*\-------------------------------------- -K.GetCA sta K.PutC.Node - - jsr K.GetMemPtrA - >STYA pDev - - ldy #S.NODE.T - lda (pDev),y - asl - tax - jmp (.1,x) - -.1 .DA K.GetC.REG - .DA K.CHR.IOERR DIR - .DA K.GetC.CDEV - .DA K.CHR.IOERR BDEV - .DA K.CHR.IOERR LNK - .DA K.CHR.IOERR DSOCK - .DA K.GetC.SSOCK - .DA K.GetC.FIFO -*-------------------------------------- -K.GetC.REG lda K.PutC.Node - jmp K.FReadA -*-------------------------------------- -K.GetC.CDEV ldx #DEVMGR.READ - ldy #S.NODE.DEV.JMP - lda (pDev),y - sta .1+1 - iny - lda (pDev),y - sta .1+2 -.1 jmp $ffff -*-------------------------------------- -K.GetC.SSOCK lda (pDev) #S.NODE.HANDLER - jsr K.GetMemPtrA - >STYA .1 - - ldy #S.NODE.SSOCK.READ - lda (pDev),y - tax Function Offset for READ - - ldy #S.NODE.SSOCK.HSKT - lda (pDev),y - -.1 jmp $ffff -*-------------------------------------- -K.GetC.FIFO -*/-------------------------------------- -* # FPutS -* Write String to FILE -* ## In: -* PUSHW : CPtr -* PUSHB : hFILE -* ## Out: -* CC = success -*\-------------------------------------- -K.FPutS -*/-------------------------------------- -* # PutSYA -* Write String to StdOut -* ## In: -* Y,A : CPtr -* ## Out: -* CC = success -*\-------------------------------------- -K.PutSYA -*/-------------------------------------- -* # FGetS -* Read String From FILE -* ## In: -* PUSHW : CPtr -* PUSHB : hFILE -* ## Out: -* CC = success -*\-------------------------------------- -K.FGetS -*/-------------------------------------- -* # GetSYA -* Read String From StdIn -* ## In: -* Y,A : CPtr -* ## Out: -* CC = success -*\-------------------------------------- -K.GetSYA - bra * -*-------------------------------------- -K.CHR.IOERR lda #MLI.ERR.IO - sec - rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.CHR diff --git a/SYS/KERNEL.S.CIO.txt b/SYS/KERNEL.S.CIO.txt index 6c848835..f87438f2 100644 --- a/SYS/KERNEL.S.CIO.txt +++ b/SYS/KERNEL.S.CIO.txt @@ -3,503 +3,6 @@ PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 -*/-------------------------------------- -* # 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 (ZPPtr1) - beq .9 - tax X = COUNT to scan - inc ZPPtr1 - bne .1 - inc ZPPtr1+1 - -.1 txa End Of String? - beq .8 - tya - cmp (ZPPtr2) End of pattern? - beq .8 - iny - lda (ZPPtr2),y - cmp #'%' Escape? - beq .2 - cmp (ZPPtr1) Same char? - bne .9 - jsr K.SScanF.IncPtr1 - bne .1 - clc - rts - -.2 tya - cmp (ZPPtr2) unexpected End of pattern after "%" ? - beq .9 - - iny - lda (ZPPtr2),y - cmp #'d' BYTE ? - bne .3 - - stz ASCBUF -.20 lda (ZPPtr1) - 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 (ZPPtr3) - inc ZPPtr3 - bne .1 - inc ZPPtr3+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 ZPPtr1 - bne .1 - inc ZPPtr1+1 never Zero -.1 rts -*-------------------------------------- -K.SScanF.IsDigit - cmp #'0' - bcc .1 - cmp #'9'+1 - bcs .1 - rts -.1 sec - rts -*/-------------------------------------- -* # PrintFYA/SPrintFYA/FPrintFYA -* Prints C-Style String -* ## In: -* PrintFYA : -* Y,A = PTR to CStr -* SPrintFYA : -* Y,A = PTR to CStr -* PULLW = Ptr to Dst Buffer -* FPrintFYA : -* Y,A = PTR to CStr -* PULLB = hNode -* ## Out: -* CC : success -* CS : error code from Output -* Specifiers : -* %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 'LF' ($0A,10) -* \r : 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' -*\-------------------------------------- -K.SPrintFYA >STYA ZPPtr1 - >PULLW Printf.Cout.Ptr+1 - -K.FPrintFYA >STYA ZPPtr1 - -K.PrintFYA >STYA ZPPtr1 - - ldy #0 - -.1 lda (ZPPtr1),y - beq .99 - iny - cmp #'%' - bne .10 - - stz PADLEN - lda #' ' - sta PADCHAR - -.2 ldx #PrintFTBL2-PrintFTBL1-1 - lda (ZPPtr1),y - beq .99 - iny - -.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.OUT-PrintFTBL2-1 - lda (ZPPtr1),y - beq .99 - iny - -.12 cmp PrintFTBL2,x - beq .13 - dex - bpl .12 - bra .1 - -.13 lda PrintFTBL2.OUT,x - -.20 jsr Printf.Cout - bcc .1 -.99 rts -*-------------------------------------- -PrintFESC jmp (PrintFJMP,x) -*-------------------------------------- -PrintFTBL1 .AS "abBdDuefhHiILnNsS" -PrintFTBL2 .AS "befnr\%" -PrintFTBL2.OUT .HS 08.1B.0C.0A.0D \b\e\f\n\r - .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 Printf.Cout - bcs .9 - - ldx #0 - -.1 lda #'-' - lsr HEXBUF - bcc .2 - lda ACCESS,x - -.2 jsr Printf.Cout - bcs .9 - - inx - cpx #8 - bne .1 - -.3 lda #'-' - lsr HEXBUF+1 - bcc .4 - lda ACCESS,x - -.4 jmp Printf.Cout - -.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 Printf.Cout - 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 ZPPtr2 - ldy #3 - -.1 lda (ZPPtr2),y - sta HEXBUF,y - dey - bpl .1 - -PrintF.U.1 stz SIGN - jsr HEX2DEC - jmp PrintDEC -*-------------------------------------- -PrintF.E >PULLW ZPPtr2 - rts -*-------------------------------------- -PrintF.F >PULLW ZPPtr2 - 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 ZPPtr2 - ldy #3 - -.1 lda (ZPPtr2),y - sta HEXBUF,y - dey - bpl .1 - - -PrintF.L.1 ror SIGN - jsr HEX2DEC -*-------------------------------------- -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 Printf.Cout - stz SIGN reset flag for next char... - pla - -.5 jsr Printf.Cout - bcs .9 - -.6 inx - cpx #10 - bne .2 - - clc -.9 rts -*-------------------------------------- -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 Printf.Cout -*-------------------------------------- -PrintF.S ldy #$ff CSTR - .HS 2C bit abs -PrintF.SS ldy #$00 PSTR - - >PULLW ZPPtr2 - - lda (ZPPtr2) if CSTR:last char=0, if PSTR:len=0 - beq .8 - - sty .1+1 - -.1 lda #$ff Self Modified - bne .11 CSTR - - tya PSTR - cmp (ZPPtr2) len check - beq .2 - -.11 iny - - lda (ZPPtr2),y - beq .2 - - jsr Printf.Cout - bcs .9 - - lda PADLEN - beq .1 - - cpy PADLEN - bne .1 - clc - rts - -.2 lda PADLEN - beq .8 - -.3 lda PADCHAR - jsr Printf.Cout - bcs .9 - iny - cpy PADLEN - bne .3 - -.8 clc -.9 rts -*-------------------------------------- -Printf.Cout jmp K.PutCharA - -Printf.Cout.Ptr sta $ffff Self modified *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.CIO diff --git a/SYS/KERNEL.S.CNV.txt b/SYS/KERNEL.S.CNV.txt index c42d858f..20b160bf 100644 --- a/SYS/KERNEL.S.CNV.txt +++ b/SYS/KERNEL.S.CNV.txt @@ -4,133 +4,6 @@ LOMEM $A00 INC 1 AUTO 6 *-------------------------------------- -* 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 jsr HEXBUF.ROL - - 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 - - lda ASCBUF - beq .8 - - ldx #0 - -.1 lda HEXBUF+3 save HEXBUF for 4+1 - pha - lda HEXBUF+2 - pha - lda HEXBUF+1 - pha - lda HEXBUF - pha - - jsr HEXBUF.ROL HEXBUF * 2 -> HEXBUF -* bcs .9 overflow!!! - - jsr HEXBUF.ROL HEXBUF * 4 -> HEXBUF -* 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!!! - - jsr HEXBUF.ROL HEXBUF * 10 -> HEXBUF -* 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 - -.8 rts - -*.9 pla discard saved HEXBUF -* pla -* pla -* pla -*.99 rts -*-------------------------------------- -HEXBUF.ROL asl HEXBUF - rol HEXBUF+1 - rol HEXBUF+2 - rol HEXBUF+3 - 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) -*-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.CNV LOAD /A2OSX.SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.D01.txt b/SYS/KERNEL.S.D01.txt index f47da608..3a49f605 100644 --- a/SYS/KERNEL.S.D01.txt +++ b/SYS/KERNEL.S.D01.txt @@ -19,9 +19,9 @@ A2osX.PrtDrv .DA A2osX.PrtDrv.S STATUS *-------------------------------------- A2osX.PrtDrv.S jsr A2osX.PrtDrv.GetDev >LDYAI K.S.DEVSTAT - >STYA K.S.PORTCALL+2 + >STYA K.SP.PARAMS+2 lda #3 - sta K.S.PORTCALL+4 + sta K.SP.PARAMS+4 jsr A2osX.PrtDrv.Go bcs .9 >LDYAI K.S.DEVSTAT @@ -41,7 +41,7 @@ A2osX.PrtDrv.Go ldy #S.DEV.ROM.JMP .8 jsr $ffff A2osX.PrtDrv.Go.Cmd .BS 1 - .DA K.S.PORTCALL + .DA K.SP.PARAMS rts *-------------------------------------- A2osX.PrtDrv.GetParam @@ -51,7 +51,7 @@ A2osX.PrtDrv.GetParam ldy #7 .1 lda (ZPDRV),y - sta K.S.PORTCALL+2,y + sta K.SP.PARAMS+2,y dey bpl .1 rts @@ -62,10 +62,10 @@ A2osX.PrtDrv.GetDev sta A2osX.PrtDrv.Go.Cmd tax lda A2osX.PrtDrv.Cnt,x - sta K.S.PORTCALL + sta K.SP.PARAMS ldy #S.DEV.DEVID lda (pDev),y - sta K.S.PORTCALL+1 + sta K.SP.PARAMS+1 rts A2osX.PrtDrv.Cnt .HS 03030301030101010404 diff --git a/SYS/KERNEL.S.FILE.txt b/SYS/KERNEL.S.FILE.txt index 29425da3..ad83e014 100644 --- a/SYS/KERNEL.S.FILE.txt +++ b/SYS/KERNEL.S.FILE.txt @@ -4,450 +4,6 @@ LOMEM $A00 INC 1 AUTO 6 *-------------------------------------- -* For All SYS.xxxx calls, X = #SYSCall -* Must be kept in X before calling -* PFT.Check -*/-------------------------------------- -* # FOpen -* Open a file -* ## In : -* PUSHW = AUXTYPE -* PUSHB = TYPE -* PUSHB = MODE -* SYS.FOpen.R : if R and !exists -> ERROR -* SYS.FOpen.W : if W and !exists -> CREATE -* SYS.FOpen.A : Append -* SYS.FOpen.T : Open/Append in Text mode -* SYS.FOpen.X : Create if not exists -* PUSHW = PATH (PSTR) -* ## Out : -* CC : A = hFILE -* CS : A = EC -*\-------------------------------------- -K.FOpen jsr PFT.CheckPathSTK - >PULLW K.MLI.PARAMS+1 - >PULLB K.FOpen.MODE - >PULLB K.FOpen.TYPE - >PULLW K.FOpen.AUXTYPE - - >MLICALL MLIGETFILEINFO - bcc K.FOpen.10 Already Exists - - bit K.FOpen.MODE Create if not exists ? - bpl K.FOpen.9 No, return MLI error - - lda #S.FILEINFO.ACCESS.FULL Yes, Create... - sta K.MLI.PARAMS+3 Access - lda K.FOpen.TYPE - sta K.MLI.PARAMS+4 File type - >LDYA K.FOpen.AUXTYPE - >STYA K.MLI.PARAMS+5 Aux type - lda #S.FILEINFO.STORETYPE.STD - sta K.MLI.PARAMS+7 - - ldx #3 - -.1 lda DATELO,x - sta K.MLI.PARAMS+8,x - dex - bpl .1 - - >MLICALL MLICREATE - bcc K.FOpen.10 -K.FOpen.9 rts - -K.FOpen.10 >LDYAI S.NODE.REG - jsr K.GetMem0YA - bcs K.FOpen.9 - - >STYA ZPPtr1 - stx hFILE - - jsr FILE.SetIOBUF - bcs .98 - - >MLICALL MLIOPEN - bcs .98 - - lda K.MLI.PARAMS+5 get ref_num - ldy #S.NODE.REG.REF - sta (ZPPtr1),y - - sta K.MLI.PARAMS+1 Next MLI Calls are REF_NUM based - - lda K.FOpen.MODE - bit #SYS.FOpen.W - beq .20 Write mode ? - - and #SYS.FOpen.A Append ? - bne .11 yes, go to end of file - - stz K.MLI.PARAMS+2 - stz K.MLI.PARAMS+3 - stz K.MLI.PARAMS+4 - >MLICALL MLISETEOF no, reset size to 0 - bcs .98 - bra .20 - -.11 >MLICALL MLIGETEOF - bcs .98 - - >MLICALL MLISETMARK - bcs .98 - -.20 lda K.FOpen.MODE - and #SYS.FOpen.T Text Mode ? - beq .30 - - lda #$FF - sta K.MLI.PARAMS+2 - lda #$0D - sta K.MLI.PARAMS+3 - >MLICALL MLINEWLINE - -.30 ldy #S.NODE.T - lda #S.NODE.T.REG - sta (ZPPtr1),y - lda hFILE - clc - rts CC - -.98 pha save MLI error - lda hFILE - jsr K.FCloseA.1 - pla get back MLI error - sec - rts -*-------------------------------------- -K.FOpen.MODE .BS 1 -K.FOpen.TYPE .BS 1 -K.FOpen.AUXTYPE .BS 2 -hFILE .BS 1 -*/-------------------------------------- -* # FCloseA -* Close a file -* ## In : -* A = hFILE -* ## Out : -*\-------------------------------------- -K.FCloseA jsr PFT.CheckNodeA - pha - jsr K.GetMemPtrA - >STYA ZPPtr1 - pla - -K.FCloseA.1 sta K.FCloseA.2+1 - ldy #S.NODE.REG.REF - lda (ZPPtr1),y - beq .1 - sta K.MLI.PARAMS+1 - >MLICALL MLICLOSE - -.1 ldy #S.NODE.REG.IOBUF - lda (ZPPtr1),y - beq K.FCloseA.2 - jsr K.FreeMemA - -K.FCloseA.2 lda #$ff Self Modified - jmp K.FreeMemA -*/-------------------------------------- -* # FReadA -* Read ONE byte from file -* ## In : -* A = hFILE -* ## Out : -* A = Byte Read -*\-------------------------------------- -K.FReadA jsr PFT.CheckNodeA - ldx #MLIREAD - bra K.FReadWrite.0 -*/-------------------------------------- -* # FWriteAY -* ## In: -* A = hFILE -* Y = char -* # Out: -* Y,A = Bytes Written -*\-------------------------------------- -K.FWriteAY jsr PFT.CheckNodeA - sty K.FWriteAY.Buf - ldx #MLIWRITE -K.FReadWrite.0 jsr FILE.SetupPrt1A - >LDYAI K.FWriteAY.Buf - >STYA K.MLI.PARAMS+2 - lda #1 - sta K.MLI.PARAMS+4 - stz K.MLI.PARAMS+5 - lda #4 Param Count = 4 for MLIREAD & MLIWRITE - jsr A2osX.MLICALL - bcs .9 - lda K.FWriteAY.Buf -.9 rts -K.FWriteAY.Buf .BS 1 -*/-------------------------------------- -* # FRead -* Read bytes from file -* ## In : -* PUSHW = Dest Ptr -* PUSHW = Bytes To Read -* PUSHB = hFILE -* ## Out : -* Y,A = Bytes Read -*\-------------------------------------- -K.FRead jsr PFT.CheckNodeSTK - ldx #MLIREAD - bra K.FReadWrite.1 -*/-------------------------------------- -* # FWrite -* ## In: -* PUSHW = Src Ptr -* PUSHW = Bytes To Write -* PUSHB = hFILE -* # Out: -* Y,A = Bytes Written -*\-------------------------------------- -K.FWrite jsr PFT.CheckNodeSTK - ldx #MLIWRITE -K.FReadWrite.1 >PULLA - jsr FILE.SetupPrt1A - >PULLW K.MLI.PARAMS+4 - >PULLW K.MLI.PARAMS+2 - - lda #4 Param Count = 4 for MLIREAD & MLIWRITE - jsr A2osX.MLICALL - bcs .9 - >LDYA K.MLI.PARAMS+6 -.9 rts -*/-------------------------------------- -* # FFlushA -* ## In: -* A = hFILE -*\-------------------------------------- -K.FFlushA jsr PFT.CheckNodeA - jsr FILE.SetupPrt1A - >MLICALL MLIFLUSH - rts -*/------------------------------------- -* # FSeek -* ## In: -* PUSHW = OffsetHi -* PUSHW = OffsetLo -* PUSHB = From -* PUSHB = hFILE -*\------------------------------------- -K.FSeek jsr PFT.CheckNodeSTK - >PULLA - jsr FILE.SetupPrt1A - >PULLA FROM - tax - >PULLW K.FSeek.OFFSET - >PULLW K.FSeek.OFFSET+2 - - cpx #SYS.FSeek.SET - - bne .1 - stz K.MLI.PARAMS+2 - stz K.MLI.PARAMS+3 - stz K.MLI.PARAMS+4 - bra .8 - -.1 cpx #SYS.FSeek.CUR - bne .2 - >MLICALL MLIGETMARK - bcc .8 - rts - -.2 cpx #SYS.FSeek.END - bne .98 - >MLICALL MLIGETEOF - bcs .9 - -.8 ldx #0 - ldy #3 - - clc - -.81 lda K.MLI.PARAMS+2,x - adc K.FSeek.OFFSET,x - sta K.MLI.PARAMS+2,x - - inx - dey - bne .81 - - bcs .99 Offset out of range! - - >MLICALL MLISETMARK - -.9 rts - -.98 lda #SYSMGR.ERRSYN - .HS 2C bit abs -.99 lda #SYSMGR.ERRFTB - sec - rts -*-------------------------------------- -K.FSeek.OFFSET .BS 4 -*/-------------------------------------- -* # FTellA -* ## In: -* A = hFILE -* ## Out: -* Y,A,X = Offset -*\-------------------------------------- -K.FTellA jsr PFT.CheckNodeA -K.FTellA.1 jsr FILE.SetupPrt1A - >MLICALL MLIGETMARK - bcs .9 - >LDYA K.MLI.PARAMS+2 - ldx K.MLI.PARAMS+4 -.9 rts -*/-------------------------------------- -* # FEOFA -* ## In: -* A = hFILE -* ## Out: -* CC : -* A=0 EOF -* A !=0 NOT EOF -* CS : -*\-------------------------------------- -K.FEOFA jsr PFT.CheckNodeA - jsr FILE.SetupPrt1A - jsr K.FTellA.1 - bcs .9 - >STYA K.FEOFA.MARK - stx K.FEOFA.MARK+2 - - >MLICALL MLIGETEOF - bcs .9 - - sec - lda K.MLI.PARAMS+2 - sbc K.FEOFA.MARK - bne .8 - lda K.MLI.PARAMS+3 - sbc K.FEOFA.MARK+1 - bne .8 - lda K.MLI.PARAMS+4 - sbc K.FEOFA.MARK+2 -.8 clc -.9 rts -K.FEOFA.MARK .BS 3 -*/-------------------------------------- -* # RemoveYA -*\-------------------------------------- -K.RemoveYA jsr PFT.CheckPathYA - >STYA K.MLI.PARAMS+1 - >MLICALL MLIDESTROY - rts -*/-------------------------------------- -* # Rename -* Rename a file -* ## In : -* PUSHW = New Name -* PUSHW = Old Name -* ## Out : -*\-------------------------------------- -K.Rename jsr PFT.CheckPathSTK - >PULLW K.MLI.PARAMS+1 - >PULLW K.MLI.PARAMS+3 - >MLICALL MLIRename - rts -*/-------------------------------------- -* # Stat -* Return information about a file -* ## In : -* PUSHW = PTR to S.STAT buffer -* PUSHW = PTR to Filename (PSTR) -* ## Out : -*\-------------------------------------- -K.Stat jsr PFT.CheckPathSTK - >PULLW K.MLI.PARAMS+1 - >PULLW K.Stat.StoreY+1 - >MLICALL MLIGETFILEINFO - bcs .9 - - ldx K.MLI.PARAMS+S.FILEINFO.ACCESS - - lda #S.STAT.MODE.XO+S.STAT.MODE.WO+S.STAT.MODE.RO - cpx #S.FILEINFO.ACCESS.FULL - beq .2 - - lda #S.STAT.MODE.XO+S.STAT.MODE.RO - cpx #S.FILEINFO.ACCESS.R - beq .2 - - lda #0 - -.2 ldy #S.STAT.MODE - jsr K.Stat.StoreY - - ldx #K.Stat.DST-K.Stat.SRC - -.3 ldy K.Stat.SRC-1,x - lda K.MLI.PARAMS,y - ldy K.Stat.DST-1,x - jsr K.Stat.StoreY - dex - bne .3 - - ldy #S.STAT.SIZE - lda #0 - jsr K.Stat.StoreY - - iny - - lda K.MLI.PARAMS+S.FILEINFO.BLOCKSUSED - asl - jsr K.Stat.StoreY - - iny - - lda K.MLI.PARAMS+S.FILEINFO.BLOCKSUSED+1 - rol - jsr K.Stat.StoreY - - iny - - lda #0 - rol - jsr K.Stat.StoreY - - clc -.9 rts - -K.Stat.StoreY sta $ffff,y - rts -*-------------------------------------- -K.Stat.SRC .DA #S.FILEINFO.TYPE - .DA #S.FILEINFO.AUXTYPE,#S.FILEINFO.AUXTYPE+1 - .DA #S.FILEINFO.BLOCKSUSED,#S.FILEINFO.BLOCKSUSED+1 - -K.Stat.DST .DA #S.STAT.P.TYPE - .DA #S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1 - .DA #S.STAT.BLOCKS,#S.STAT.BLOCKS+1 -* .DA #S.STAT.SIZE+1,#S.STAT.SIZE+2 - -*-------------------------------------- -FILE.SetIOBUF >PUSHWI 1024 get a ProDOS IOBUF - >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE - jsr K.GetMem - bcs .9 - - >STYA K.MLI.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call - txa - ldy #S.NODE.REG.IOBUF - sta (ZPPtr1),y -.9 rts -*-------------------------------------- -FILE.SetupPrt1A jsr K.GetMemPtrA - >STYA ZPPtr1 - ldy #S.NODE.REG.REF - lda (ZPPtr1),y - sta K.MLI.PARAMS+1 - rts -*-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.FILE LOAD /A2OSX.SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index 5a8244dc..b7d0b292 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -353,8 +353,8 @@ PS.DupEnvA jsr K.GetMemPtrA clc .9 rts */-------------------------------------- -* # PStr2StrArrayYA -* Convert a PSTR (e.g. : command Line) to a Array of PSTRs (Args[]) +* # Str2StrArrayYA +* Convert a CSTR (e.g. : command Line) to a Array of CSTRs (Args[]) * ## In: * Y,A = PTR to String * ## Out: @@ -364,7 +364,7 @@ PS.DupEnvA jsr K.GetMemPtrA * CS : error * A = SYS error code *\-------------------------------------- -PS.PStr2StrArrayYA +PS.Str2StrArrayYA >STYA ZPPtr1 lda (ZPPtr1) Get mem size STRLEN+1 inc diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index bcfcfb1f..3c16a16e 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -232,6 +232,521 @@ K.GetSYA K.CHR.IOERR lda #MLI.ERR.IO sec rts +*/-------------------------------------- +* # 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 (ZPPtr1) + beq .9 + tax X = COUNT to scan + inc ZPPtr1 + bne .1 + inc ZPPtr1+1 + +.1 txa End Of String? + beq .8 + tya + cmp (ZPPtr2) End of pattern? + beq .8 + iny + lda (ZPPtr2),y + cmp #'%' Escape? + beq .2 + cmp (ZPPtr1) Same char? + bne .9 + jsr K.SScanF.IncPtr1 + bne .1 + clc + rts + +.2 tya + cmp (ZPPtr2) unexpected End of pattern after "%" ? + beq .9 + + iny + lda (ZPPtr2),y + cmp #'d' BYTE ? + bne .3 + + stz ASCBUF +.20 lda (ZPPtr1) + 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 (ZPPtr3) + inc ZPPtr3 + bne .1 + inc ZPPtr3+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 ZPPtr1 + bne .1 + inc ZPPtr1+1 never Zero +.1 rts +*-------------------------------------- +K.SScanF.IsDigit + cmp #'0' + bcc .1 + cmp #'9'+1 + bcs .1 + rts +.1 sec + rts +*/-------------------------------------- +* # PrintFYA/SPrintFYA/FPrintFYA +* Prints C-Style String +* ## In: +* PrintFYA : +* Y,A = PTR to CStr +* SPrintFYA : +* Y,A = PTR to CStr +* PULLW = Ptr to Dst Buffer +* FPrintFYA : +* Y,A = PTR to CStr +* PULLB = hNode +* ## Out: +* CC : success +* CS : error code from Output +* Specifiers : +* %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 'LF' ($0A,10) +* \r : 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' +*\-------------------------------------- +K.SPrintFYA >STYA ZPPtr1 + >PULLW Printf.Cout.Ptr+1 + +K.FPrintFYA >STYA ZPPtr1 + +K.PrintFYA >STYA ZPPtr1 + + ldy #0 + +.1 lda (ZPPtr1),y + beq .99 + iny + cmp #'%' + bne .10 + + stz PADLEN + lda #' ' + sta PADCHAR + +.2 ldx #PrintFTBL2-PrintFTBL1-1 + lda (ZPPtr1),y + beq .99 + iny + +.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.OUT-PrintFTBL2-1 + lda (ZPPtr1),y + beq .99 + iny + +.12 cmp PrintFTBL2,x + beq .13 + dex + bpl .12 + bra .1 + +.13 lda PrintFTBL2.OUT,x + +.20 jsr Printf.Cout + bcc .1 +.99 rts +*-------------------------------------- +PrintFESC jmp (PrintFJMP,x) +*-------------------------------------- +PrintFTBL1 .AS "abBdDuefhHiILnNsS" +PrintFTBL2 .AS "befnr\%" +PrintFTBL2.OUT .HS 08.1B.0C.0A.0D \b\e\f\n\r + .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 Printf.Cout + bcs .9 + + ldx #0 + +.1 lda #'-' + lsr HEXBUF + bcc .2 + lda ACCESS,x + +.2 jsr Printf.Cout + bcs .9 + + inx + cpx #8 + bne .1 + +.3 lda #'-' + lsr HEXBUF+1 + bcc .4 + lda ACCESS,x + +.4 jmp Printf.Cout + +.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 Printf.Cout + 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 ZPPtr2 + ldy #3 + +.1 lda (ZPPtr2),y + sta HEXBUF,y + dey + bpl .1 + +PrintF.U.1 stz SIGN + jsr HEX2DEC + jmp PrintDEC +*-------------------------------------- +PrintF.E >PULLW ZPPtr2 + rts +*-------------------------------------- +PrintF.F >PULLW ZPPtr2 + 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 ZPPtr2 + ldy #3 + +.1 lda (ZPPtr2),y + sta HEXBUF,y + dey + bpl .1 + + +PrintF.L.1 ror SIGN + jsr HEX2DEC +*-------------------------------------- +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 Printf.Cout + stz SIGN reset flag for next char... + pla + +.5 jsr Printf.Cout + bcs .9 + +.6 inx + cpx #10 + bne .2 + + clc +.9 rts +*-------------------------------------- +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 Printf.Cout +*-------------------------------------- +PrintF.S ldy #$ff CSTR + .HS 2C bit abs +PrintF.SS ldy #$00 PSTR + + >PULLW ZPPtr2 + + lda (ZPPtr2) if CSTR:last char=0, if PSTR:len=0 + beq .8 + + sty .1+1 + +.1 lda #$ff Self Modified + bne .11 CSTR + + tya PSTR + cmp (ZPPtr2) len check + beq .2 + +.11 iny + + lda (ZPPtr2),y + beq .2 + + jsr Printf.Cout + bcs .9 + + lda PADLEN + beq .1 + + cpy PADLEN + bne .1 + clc + rts + +.2 lda PADLEN + beq .8 + +.3 lda PADCHAR + jsr Printf.Cout + bcs .9 + iny + cpy PADLEN + bne .3 + +.8 clc +.9 rts +*-------------------------------------- +Printf.Cout jmp K.PutCharA + +Printf.Cout.Ptr sta $ffff Self modified +*-------------------------------------- +FILE.SetIOBUF >PUSHWI 1024 get a ProDOS IOBUF + >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE + jsr K.GetMem + bcs .9 + + >STYA K.MLI.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call + txa + ldy #S.NODE.REG.IOBUF + sta (ZPPtr1),y +.9 rts +*-------------------------------------- +FILE.SetupPrt1A jsr K.GetMemPtrA + >STYA ZPPtr1 + ldy #S.NODE.REG.REF + lda (ZPPtr1),y + sta K.MLI.PARAMS+1 + rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STDIO diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index aa9aabe0..81bca8ec 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -57,6 +57,133 @@ SIGN .BS 1 PADLEN .BS 1 PADCHAR .BS 1 *-------------------------------------- +* 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 jsr HEXBUF.ROL + + 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 + + lda ASCBUF + beq .8 + + ldx #0 + +.1 lda HEXBUF+3 save HEXBUF for 4+1 + pha + lda HEXBUF+2 + pha + lda HEXBUF+1 + pha + lda HEXBUF + pha + + jsr HEXBUF.ROL HEXBUF * 2 -> HEXBUF +* bcs .9 overflow!!! + + jsr HEXBUF.ROL HEXBUF * 4 -> HEXBUF +* 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!!! + + jsr HEXBUF.ROL HEXBUF * 10 -> HEXBUF +* 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 + +.8 rts + +*.9 pla discard saved HEXBUF +* pla +* pla +* pla +*.99 rts +*-------------------------------------- +HEXBUF.ROL asl HEXBUF + rol HEXBUF+1 + rol HEXBUF+2 + rol HEXBUF+3 + 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) +*-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STDLIB LOAD /A2OSX.SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index cdd22372..73fd4ba8 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -3,239 +3,6 @@ PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 -*/-------------------------------------- -* # NewPStrYA -* Create a new copy of PSTR -* ## In: -* Y,A = PTR to buffer -* ## Out: -* CC : success -* Y,A = PTR to String -* X = hMem (PSTR) -* CS : error -* A = SYS error code -*\-------------------------------------- -K.NewPStrYA >STYA ZPPtr2 - lda (ZPPtr2) - inc - tay - lda #0 Y,A = len of new string - jsr K.GetMemYA - bcs .9 - - >STYA ZPPtr1 - - jsr K.PStrCpyPtr2Ptr1 - - >LDYA ZPPtr1 - - clc -.9 rts -*/-------------------------------------- -* # PStrCpy -* Copy string -* ## In: -* PUSHW = Ptr to SRC (PSTR) -* PUSHW = Ptr to DST (PSTR) -* ## Out: -* DST = SRC (PSTR) -*\-------------------------------------- -K.PStrCpy jsr PullPtr1Ptr2 - -K.PStrCpyPtr2Ptr1 - lda (ZPPtr2) - sta (ZPPtr1) - tay - beq .2 - -.1 lda (ZPPtr2),y - sta (ZPPtr1),y - dey - bne .1 - -.2 clc - rts -*/-------------------------------------- -* # PStrCat -* Append SRC to DST -* ## In: -* PUSHW = Ptr to SRC (PSTR) -* PUSHW = Ptr to DST (PSTR) -* ## Out: -* DST = DST+SRC (PSTR) -*\-------------------------------------- -K.PStrCat jsr PullPtr1Ptr2 - - lda (ZPPtr2) - tax - - lda (ZPPtr1) - tay - -.1 cpy #255 - beq .8 - - iny - - inc ZPPtr2 - bne .2 - inc ZPPtr2+1 - -.2 lda (ZPPtr2) - sta (ZPPtr1),y - dex - bne .1 - -.8 tya - sta (ZPPtr1) - clc - rts -*/-------------------------------------- -* # PStrMatch -* Compare a String against pattern -* ## In: -* PUSHW = PTR to Pattern (e.g. '*test?.txt') -* PUSHW = PTR to Src String -* ## Out: -* CC : match -* CS : no match -*\-------------------------------------- -K.PStrMatch jsr PullPtr1Ptr2 - - lda (ZPPtr2) Keep Pattern Length in X - tax - beq .8 Match always if empty - ldy #0 - -.1 inc ZPPtr2 Make PTR1 advance to next char - bne .2 - inc ZPPtr2+1 - -.2 lda (ZPPtr2) get pattern char - cmp #'*' - beq .5 - -.3 tya we must match ? or regular char - cmp (ZPPtr1) check if at end of string - beq .9 yes, no char left, exit with error - - iny advance to next char to compare - - lda (ZPPtr2) get back pattern char - cmp #'?' - beq .4 no need to compare, any char will match - cmp (ZPPtr1),y Regular Char, compare with string at Y - bne .9 no match, exit - -.4 dex char matched, check if end of pattern - bne .1 continue if remaining char in pattern - - tya end of pattern, but end of string ? - cmp (ZPPtr1) end of string ? - beq .8 yes, string matched entirely - bra .9 no, remaining char in string, no match - -.5 dex we have '*', last char of pattern ? - beq .8 yes, match everything, including empty string - - inc ZPPtr2 Make PTR1 advance to next char - bne .6 - inc ZPPtr2+1 - -.6 lda (ZPPtr2) get next char of pattern - cmp #'*' another '*' ? - beq .5 yes, '**' = '*', go next char - cmp #'?' '*?' ??? we must match a least one char - beq .3 - -.7 tya we need at least one remaining char in string, - cmp (ZPPtr1) check if at end of string - beq .9 no chance to match ? or regular char - - iny - lda (ZPPtr2) get again char in pattern - cmp (ZPPtr1),y compare with char in string - bne .7 not equal to next non wildcard in pattern - - bra .4 go check remaining char in pattern... - -.8 clc - rts - -.9 sec - rts -*/-------------------------------------- -* # PStrUprYA/PStrLwrYA -* Convert string to UPPERCASE/lowercase -* ## In: -* Y,A = PTR to String (PSTR) -* ## Out: -* Uppercased/lowercased String in Buffer -*\-------------------------------------- -K.PStrUprYA ldx #0 - .HS 2C bit abs -K.PStrLwrYA ldx #2 - >STYA ZPPtr1 - - pha save Y,A to restore them at exit - phy - - lda (ZPPtr1) - tay - -.1 lda (ZPPtr1),y - cmp K.PStrUprLwr,x - bcc .2 - cmp K.PStrUprLwr+1,x - bcs .2 - eor #$20 - sta (ZPPtr1),y -.2 dey - bne .1 - - ply - pla - clc - rts -*-------------------------------------- -K.PStrUprLwr .AS "azAZ" -*-------------------------------------- -K.PStr2CStrYA >STYA ZPPtr1 - lda (ZPPtr1) - beq .8 - pha - - tay - -.1 lda (ZPPtr1),y - dey - sta (ZPPtr1),y - tya - bne .1 - ply - sta (ZPPtr1),y Ending 0 - -.8 rts -*-------------------------------------- -K.CStr2PStrYA >STYA ZPPtr1 - - ldy #0 - -.1 lda (ZPPtr1),y - beq .9 - -.2 pha - iny - lda (ZPPtr1),y - tax - pla - sta (ZPPtr1),y - txa - bne .2 - -.8 tya - sta (ZPPtr1) -.9 rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STR diff --git a/SYS/KERNEL.S.STRING.txt b/SYS/KERNEL.S.STRING.txt index 250544d1..952f6c6b 100644 --- a/SYS/KERNEL.S.STRING.txt +++ b/SYS/KERNEL.S.STRING.txt @@ -4,6 +4,29 @@ LOMEM $A00 INC 1 AUTO 6 */-------------------------------------- +* # StrLen.YA +* Returns Length of C-String +* ## In: +* Y,A = Ptr to CSTR +* ## Out: +* Y,A = String length +*\-------------------------------------- +K.StrLen.YA >STYA ZPPtr1 + + ldy #0 + ldx #0 + +.1 lda (ZPPtr1),y + beq .8 + iny + bne .1 + inx + inc ZPPtr1+1 + bra .1 + +.8 txa + rts +*/-------------------------------------- * # StrCat * Append SRC to DST * ## In: @@ -156,248 +179,6 @@ K.StrLwrYA ldx #2 rts *-------------------------------------- K.PStrUprLwr .AS "azAZ" -*/-------------------------------------- -* # StrFTime -* Convert S.TIME struct to CSTR -* ## In: -* PUSHW = Dst PTR To CSTR Buf -* PUSHW = Src PTR To Format String -* %a : Abbreviated weekday name : Thu -* %A : Full weekday name : Thursday -* %b : Abbreviated month name : Aug -* %B : Full month name : August -* %d : Day of the month, zero-padded (01-31) -* %H : Hour in 24h format (00-23) 14 -* %I : Hour in 12h format (01-12) 02 -* %m : Month as a decimal number (01-12) 08 -* %M : Minute (00-59) 55 -* %p : AM or PM designation PM -* %S : Second (00-61) 02 -* %w : Weekday as a decimal number with Sunday as 0 (0-6) -* %y : Year, last two digits (00-99) -* %Y : Year four digits 2001 -* PUSHW = Src PTR To S.Time -* ## Out: -* none. always succeed. -*\-------------------------------------- -K.StrFTime jsr PullPtr1Ptr2Ptr3 - - ldy #0 - -.1 lda (ZPPtr2),y - beq .8 - - iny - - cmp #'%' - beq .2 - - jsr K.StrFTime.addChar - bra .1 - -.2 ldx #K.StrFTime.JMPL-K.StrFTime.Tbl-1 - - lda (ZPPtr2),y - beq .8 - iny - -.3 cmp K.StrFTime.Tbl,x - beq .4 - dex - bpl .3 - bra .1 - -.4 lda K.StrFTime.JMPL,x - sta .5+1 - lda K.StrFTime.JMPH,x - sta .5+2 - phy -.5 jsr $ffff - ply - bra .1 - -.8 lda #0 Terminate C string - sta (ZPPtr3) - rts -*-------------------------------------- -K.StrFTime.TBL .AS "aAbBdHImMpSwyY" -K.StrFTime.JMPL .DA #K.StrFTime.A - .DA #K.StrFTime.AA - .DA #K.StrFTime.B - .DA #K.StrFTime.BB - .DA #K.StrFTime.D - .DA #K.StrFTime.HH - .DA #K.StrFTime.II - .DA #K.StrFTime.M - .DA #K.StrFTime.MM - .DA #K.StrFTime.P - .DA #K.StrFTime.SS - .DA #K.StrFTime.W - .DA #K.StrFTime.Y - .DA #K.StrFTime.YY -*-------------------------------------- -K.StrFTime.JMPH .DA /K.StrFTime.A - .DA /K.StrFTime.AA - .DA /K.StrFTime.B - .DA /K.StrFTime.BB - .DA /K.StrFTime.D - .DA /K.StrFTime.HH - .DA /K.StrFTime.II - .DA /K.StrFTime.M - .DA /K.StrFTime.MM - .DA /K.StrFTime.P - .DA /K.StrFTime.SS - .DA /K.StrFTime.W - .DA /K.StrFTime.Y - .DA /K.StrFTime.YY -*-------------------------------------- -K.StrFTime.A ldx #3 Short day of week, 3 chars... - .HS 2C Bit abs - -K.StrFTime.AA ldx #15 full DoW - >LDYAI K.StrFTime.DAY - >STYA ZPPtr4 - ldy #S.Time.WDAY - bra K.StrFTime.STR - -K.StrFTime.B ldx #3 Short Month, 3 chars.... - .HS 2C Bit abs - -K.StrFTime.BB ldx #15 full Month.... - >LDYAI K.StrFTime.MON - >STYA ZPPtr4 - ldy #S.Time.MONTH - -K.StrFTime.STR lda (ZPPtr1),y get required S.Time field value - tay - beq .9 Illegal value - -.1 dey range 0..x - beq .2 - lda (ZPPtr4) - sec - adc ZPPtr4 - sta ZPPtr4 - bcc .1 - inc ZPPtr4+1 - bra .1 - -.2 ldy #0 - -.3 iny - lda (ZPPtr4),y - phy - jsr K.StrFTime.addChar - pla - cmp (ZPPtr4) - beq .8 - - tay - dex - bne .3 -.8 rts - -.9 ldx #3 - lda #'?' -.99 jsr K.StrFTime.addChar - dex - bne .99 - rts -*-------------------------------------- -K.StrFTime.D ldy #S.Time.DAY - bra K.StrFTime.addDecPtr1Y -K.StrFTime.HH ldy #S.Time.HOUR - bra K.StrFTime.addDecPtr1Y -K.StrFTime.II ldy #S.Time.HOUR - lda (ZPPtr1),y - cmp #12 - bcc .1 - sbc #12 -.1 bra K.StrFTime.addDecA -K.StrFTime.M ldy #S.Time.MONTH - bra K.StrFTime.addDecPtr1Y -K.StrFTime.MM ldy #S.Time.MINUTE - bra K.StrFTime.addDecPtr1Y -K.StrFTime.P ldy #S.Time.HOUR - lda (ZPPtr1),y - cmp #12 - bcc .1 - lda #'p' - .HS 2C bit abs -.1 lda #'a' - jsr K.StrFTime.addChar - lda #'m' - bra K.StrFTime.addChar -K.StrFTime.SS ldy #S.Time.SECOND - bra K.StrFTime.addDecPtr1Y -K.StrFTime.W ldy #S.Time.WDAY - bra K.StrFTime.addDecPtr1Y -K.StrFTime.YY ldy #S.Time.CENTURY - jsr K.StrFTime.addDecPtr1Y -K.StrFTime.Y ldy #S.Time.YEAR -*-------------------------------------- -K.StrFTime.addDecPtr1Y - lda (ZPPtr1),y -K.StrFTime.addDecA - sta K.StrFTime.BIN - stz K.StrFTime.DEC - - sed - ldx #8 - -.1 asl K.StrFTime.BIN - - lda K.StrFTime.DEC - adc K.StrFTime.DEC - sta K.StrFTime.DEC - - dex - bne .1 - - cld - -* lda K.StrFTime.DEC already in A - pha - lsr - lsr - lsr - lsr - ora #$30 - jsr K.StrFTime.addChar - pla - and #$0f - ora #$30 -*-------------------------------------- -K.StrFTime.addChar - sta (ZPPtr3) - inc ZPPtr3 - bne .8 - inc ZPPtr3+1 -.8 rts -*-------------------------------------- -K.StrFTime.DAY >PSTR "Monday" - >PSTR "Tuesday" - >PSTR "Wednesday" - >PSTR "Thursday" - >PSTR "Friday" - >PSTR "Saturday" - >PSTR "Sunday" -*-------------------------------------- -K.StrFTime.MON >PSTR "January" - >PSTR "February" - >PSTR "March" - >PSTR "April" - >PSTR "May" - >PSTR "June" - >PSTR "July" - >PSTR "August" - >PSTR "September" - >PSTR "October" - >PSTR "November" - >PSTR "December" -*-------------------------------------- -K.StrFTime.BIN .BS 1 -K.StrFTime.DEC .BS 1 always < 100 *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STRING diff --git a/SYS/KERNEL.S.TIME.txt b/SYS/KERNEL.S.TIME.txt index 461f4cbd..6fd3232e 100644 --- a/SYS/KERNEL.S.TIME.txt +++ b/SYS/KERNEL.S.TIME.txt @@ -374,6 +374,249 @@ K.CTime.Div3600 .BS 1 K.CTime.Mod .BS 1 K.CTime.Century .BS 1 K.CTime.Year .BS 1 +*/-------------------------------------- +* # StrFTime +* Convert S.TIME struct to CSTR +* ## In: +* PUSHW = Dst PTR To CSTR Buf +* PUSHW = Src PTR To Format String +* %a : Abbreviated weekday name : Thu +* %A : Full weekday name : Thursday +* %b : Abbreviated month name : Aug +* %B : Full month name : August +* %d : Day of the month, zero-padded (01-31) +* %H : Hour in 24h format (00-23) 14 +* %I : Hour in 12h format (01-12) 02 +* %m : Month as a decimal number (01-12) 08 +* %M : Minute (00-59) 55 +* %p : AM or PM designation PM +* %S : Second (00-61) 02 +* %w : Weekday as a decimal number with Sunday as 0 (0-6) +* %y : Year, last two digits (00-99) +* %Y : Year four digits 2001 +* PUSHW = Src PTR To S.Time +* ## Out: +* none. always succeed. +*\-------------------------------------- +K.StrFTime jsr PullPtr1Ptr2Ptr3 + + ldy #0 + +.1 lda (ZPPtr2),y + beq .8 + + iny + + cmp #'%' + beq .2 + + jsr K.StrFTime.addChar + bra .1 + +.2 ldx #K.StrFTime.JMPL-K.StrFTime.Tbl-1 + + lda (ZPPtr2),y + beq .8 + iny + +.3 cmp K.StrFTime.Tbl,x + beq .4 + dex + bpl .3 + bra .1 + +.4 lda K.StrFTime.JMPL,x + sta .5+1 + lda K.StrFTime.JMPH,x + sta .5+2 + phy +.5 jsr $ffff + ply + bra .1 + +.8 lda #0 Terminate C string + sta (ZPPtr3) + rts +*-------------------------------------- +K.StrFTime.TBL .AS "aAbBdHImMpSwyY" +K.StrFTime.JMPL .DA #K.StrFTime.A + .DA #K.StrFTime.AA + .DA #K.StrFTime.B + .DA #K.StrFTime.BB + .DA #K.StrFTime.D + .DA #K.StrFTime.HH + .DA #K.StrFTime.II + .DA #K.StrFTime.M + .DA #K.StrFTime.MM + .DA #K.StrFTime.P + .DA #K.StrFTime.SS + .DA #K.StrFTime.W + .DA #K.StrFTime.Y + .DA #K.StrFTime.YY +*-------------------------------------- +K.StrFTime.JMPH .DA /K.StrFTime.A + .DA /K.StrFTime.AA + .DA /K.StrFTime.B + .DA /K.StrFTime.BB + .DA /K.StrFTime.D + .DA /K.StrFTime.HH + .DA /K.StrFTime.II + .DA /K.StrFTime.M + .DA /K.StrFTime.MM + .DA /K.StrFTime.P + .DA /K.StrFTime.SS + .DA /K.StrFTime.W + .DA /K.StrFTime.Y + .DA /K.StrFTime.YY +*-------------------------------------- +K.StrFTime.A ldx #3 Short day of week, 3 chars... + .HS 2C Bit abs + +K.StrFTime.AA ldx #15 full DoW + >LDYAI K.StrFTime.DAY + >STYA ZPPtr4 + ldy #S.Time.WDAY + bra K.StrFTime.STR + +K.StrFTime.B ldx #3 Short Month, 3 chars.... + .HS 2C Bit abs + +K.StrFTime.BB ldx #15 full Month.... + >LDYAI K.StrFTime.MON + >STYA ZPPtr4 + ldy #S.Time.MONTH + +K.StrFTime.STR lda (ZPPtr1),y get required S.Time field value + tay + beq .9 Illegal value + +.1 dey range 0..x + beq .2 + lda (ZPPtr4) + sec + adc ZPPtr4 + sta ZPPtr4 + bcc .1 + inc ZPPtr4+1 + bra .1 + +.2 ldy #0 + +.3 iny + lda (ZPPtr4),y + phy + jsr K.StrFTime.addChar + pla + cmp (ZPPtr4) + beq .8 + + tay + dex + bne .3 +.8 rts + +.9 ldx #3 + lda #'?' +.99 jsr K.StrFTime.addChar + dex + bne .99 + rts +*-------------------------------------- +K.StrFTime.D ldy #S.Time.DAY + bra K.StrFTime.addDecPtr1Y +K.StrFTime.HH ldy #S.Time.HOUR + bra K.StrFTime.addDecPtr1Y +K.StrFTime.II ldy #S.Time.HOUR + lda (ZPPtr1),y + cmp #12 + bcc .1 + sbc #12 +.1 bra K.StrFTime.addDecA +K.StrFTime.M ldy #S.Time.MONTH + bra K.StrFTime.addDecPtr1Y +K.StrFTime.MM ldy #S.Time.MINUTE + bra K.StrFTime.addDecPtr1Y +K.StrFTime.P ldy #S.Time.HOUR + lda (ZPPtr1),y + cmp #12 + bcc .1 + lda #'p' + .HS 2C bit abs +.1 lda #'a' + jsr K.StrFTime.addChar + lda #'m' + bra K.StrFTime.addChar +K.StrFTime.SS ldy #S.Time.SECOND + bra K.StrFTime.addDecPtr1Y +K.StrFTime.W ldy #S.Time.WDAY + bra K.StrFTime.addDecPtr1Y +K.StrFTime.YY ldy #S.Time.CENTURY + jsr K.StrFTime.addDecPtr1Y +K.StrFTime.Y ldy #S.Time.YEAR +*-------------------------------------- +K.StrFTime.addDecPtr1Y + lda (ZPPtr1),y +K.StrFTime.addDecA + sta K.StrFTime.BIN + stz K.StrFTime.DEC + + sed + ldx #8 + +.1 asl K.StrFTime.BIN + + lda K.StrFTime.DEC + adc K.StrFTime.DEC + sta K.StrFTime.DEC + + dex + bne .1 + + cld + +* lda K.StrFTime.DEC already in A + pha + lsr + lsr + lsr + lsr + ora #$30 + jsr K.StrFTime.addChar + pla + and #$0f + ora #$30 +*-------------------------------------- +K.StrFTime.addChar + sta (ZPPtr3) + inc ZPPtr3 + bne .8 + inc ZPPtr3+1 +.8 rts +*-------------------------------------- +K.StrFTime.DAY >PSTR "Monday" + >PSTR "Tuesday" + >PSTR "Wednesday" + >PSTR "Thursday" + >PSTR "Friday" + >PSTR "Saturday" + >PSTR "Sunday" +*-------------------------------------- +K.StrFTime.MON >PSTR "January" + >PSTR "February" + >PSTR "March" + >PSTR "April" + >PSTR "May" + >PSTR "June" + >PSTR "July" + >PSTR "August" + >PSTR "September" + >PSTR "October" + >PSTR "November" + >PSTR "December" +*-------------------------------------- +K.StrFTime.BIN .BS 1 +K.StrFTime.DEC .BS 1 always < 100 +*-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.Time LOAD /A2OSX.SRC/SYS/KERNEL.S