diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 5f457691..9412c957 100644 Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ diff --git a/SYS/KERNEL.S.DEF.txt b/SYS/KERNEL.S.DEF.txt index a3bb7e8f..32446368 100644 --- a/SYS/KERNEL.S.DEF.txt +++ b/SYS/KERNEL.S.DEF.txt @@ -41,15 +41,25 @@ DRV.BLK.BlkNum .EQ $47 *-------------------------------------- *INDEX .EQ $5E ->$5F LOAD.FAC.FROM.YA RESULT .EQ $62 ->$66 used in FMULT FDIV +TMP32.Sign .EQ RESULT +TMP32 .EQ RESULT+1 *-------------------------------------- ZPTMP .EQ $67 ->$84 29 bytes *-------------------------------------- FORPNT .EQ $85 ->$86 FAC .EQ $9D ->$A1 FAC.SIGN .EQ $A2 +* FAC.EXTENSION .EQ $AC +*-------------------------------------- +ACC32.Sign .EQ FAC +ACC32 .EQ FAC+1 +*-------------------------------------- ARG .EQ $A5 -> $A9 (5 bytes) ARG.SIGN .EQ $AA -* FAC.EXTENSION .EQ $AC +*-------------------------------------- +ARG32.Sign .EQ ARG +ARG32 .EQ ARG+1 +*-------------------------------------- * CHARGET .EQ $B1 * CHARGOT .EQ $B7 TXTPTR .EQ $B8 @@ -83,6 +93,8 @@ ROM.ATAN .EQ 38 *-------------------------------------- A2osX.SaveSM .EQ $100 Aux A2osX.SaveSX .EQ $101 Aux +A2osX.NumStrLen .EQ $102 Aux +A2osX.NumStrBuf .EQ $103 Aux *-------------------------------------- * Main $200 -> 2FF : (Used By ProDOS,Clock DRV....) * Main $300 -> 3EF : diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 4ba11a42..ce1fd413 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -602,11 +602,11 @@ ENV.SysVarsCPID ldy #S.PS.CPID lda (pPS),y -ENV.SysVarsNum jsr MEM.Byte2Str102 +ENV.SysVarsNum jsr NUM.A2STR10NP ldy #0 -.1 lda $102,y +.1 lda A2osX.NumStrBuf,y beq .8 iny diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index 91a2571c..a983b451 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -745,73 +745,6 @@ MEM.NextCharPtr2 inc ZPPtr2+1 .8 rts *-------------------------------------- -* Convert A to CSTR at $102 -*-------------------------------------- -MEM.Byte2Str102 stz .2+1 0xx - stz .3+1 x00 - - phx - - ldx #8 - - sed - -.1 asl - pha - -.2 lda #$ff Self Modified - adc .2+1 - sta .2+1 - -.3 lda #$ff Self Modified - adc .3+1 - sta .3+1 - - pla - dex - bne .1 - - cld - - ldx #0 - - lda .3+1 x00 - beq .4 - - jsr .8 - -.4 lda .2+1 - pha - - lsr - lsr - lsr - lsr 0x0 - - bne .5 - - cpx #0 - beq .6 - -.5 jsr .8 - -.6 pla - - and #$0f 00x - - jsr .8 - - stz $102,x - - plx - - rts - -.8 ora #$30 - sta $102,x - inx - rts -*-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.MEM LOAD USR/SRC/SYS/KERNEL.S diff --git a/SYS/KERNEL.S.NUM.txt b/SYS/KERNEL.S.NUM.txt index 9a966f77..ec5e7c8a 100644 --- a/SYS/KERNEL.S.NUM.txt +++ b/SYS/KERNEL.S.NUM.txt @@ -1,16 +1,119 @@ NEW AUTO 3,1 *-------------------------------------- -ACC32.Sign .EQ FAC -ACC32 .EQ FAC+1 +* http://6502.org/source/integers/32muldiv.htm +* http://nparker.llx.com/a2/mult.html *-------------------------------------- -NUM.A2STR10 jsr NUM.A2ACC32 +* ARG32*ACC32->TMP32 +*-------------------------------------- +NUM.MUL32 jsr NUM.TMP32ZERO + + ldx #32 + +.2 lsr ARG32+3 + ror ARG32+2 + ror ARG32+1 + ror ARG32 + + bcc .3 + clc + + lda TMP32 + adc ACC32 + sta TMP32 + + lda TMP32+1 + adc ACC32+1 + sta TMP32+1 + + lda TMP32+2 + adc ACC32+2 + sta TMP32+2 + + lda TMP32+3 + adc ACC32+3 + sta TMP32+3 + +.3 jsr ACC32.T2 + + dex + bne .2 + + clc + rts +*-------------------------------------- +* ARG32 = ARG32 div ACC32 +* TMP32 = ARG32 mod ACC32 +*-------------------------------------- +NUM.DIVMOD32 jsr NUM.TMP32ZERO + + ldx #32 + +.1 asl ARG32 + rol ARG32+1 + rol ARG32+2 + rol ARG32+3 + + rol TMP32 + rol TMP32+1 + rol TMP32+2 + rol TMP32+3 + + sec + + lda TMP32 + sbc ACC32 + pha + lda TMP32+1 + sbc ACC32+1 + pha + lda TMP32+2 + sbc ACC32+2 + pha + lda TMP32+3 + sbc ACC32+3 + bcs .2 + + pla + pla + pla + + dex + bne .1 + + rts + +.2 sta TMP32+3 + pla + sta TMP32+2 + pla + sta TMP32+1 + pla + sta TMP32 + + inc ARG32 bit0 always 0 because of .1 asl + + dex + bne .1 + + rts +*-------------------------------------- +NUM.A2STR10NP ldx #3 3 didgit max + ldy #0 Disable Padding +NUM.A2STR10 jsr NUM.A2ACC32 + clc unsigned *-------------------------------------- * CS = signed long * CC = unsigned long +* X = Pad Len +* Y = Pad Char *-------------------------------------- -NUM.ACC322STR10 bcc .1 +NUM.ACC322STR10 stx .5+1 Pad Len + sty .81+1 Pad Char + + stz A2osX.NumStrLen + bcc .1 clc @@ -21,17 +124,17 @@ NUM.ACC322STR10 bcc .1 sec -.1 php +.1 ror ACC32.Sign Save sign ldx #4 -.2 stz RESULT,x Clear all 5 bytes +.2 stz RESULT,x Clear all 5 bytes dex bpl .2 - sed switch to BCD mode + sed switch to BCD mode - ldx #32 let's roll 32 bits + ldx #32 let's roll 32 bits .3 asl ACC32 rol ACC32+1 @@ -50,49 +153,205 @@ NUM.ACC322STR10 bcc .1 bne .3 cld - - ldy #0 -* ldx #0 - - plp - bcc .5 + + ldx .5+1 no padding + beq .6 - lda #'-' - sta $102,x - inx - -.5 stz $102,x - -.50 tya + lda #10 starts at 10-padlen + sec +.5 sbc #$ff SELF MODIFIED + tax + +.6 txa lsr tay lda RESULT,y - - bcs .6 + bcs .7 lsr lsr lsr lsr - -.6 and #$0F - ora #$30 - cmp #$30 - - lda $102,x - sta $102,x -.7 sta $102,x - inx +.7 and #$0F + ora #$30 + + cmp #'0' + beq .80 -.8 iny - cpy #10 - bne .50 + ldy #'0' next 0s always printed + sty .81+1 - stz $102,x + bra .82 + +.80 cpx #9 last char, print always + beq .82 + +.81 lda #$ff SELF MODIFIED Get Padding char + beq .87 + +.82 bit ACC32.Sign "-" to print ? + bpl .86 + + pha + lda #'-' + jsr .88 + stz ACC32.Sign + pla + +.86 jsr .88 + +.87 inx + cpx #10 + bne .6 + + lda #0 + +.88 ldy A2osX.NumStrLen + inc A2osX.NumStrLen + sta A2osX.NumStrBuf,y + + rts +*-------------------------------------- +* Convert Hex int at ZPPtr2 to ACC32 +*-------------------------------------- +NUM.Hex2ACC32 lda (ZPPtr2) + beq .9 + + jsr MEM.IsHexDigit + bcs .9 + + jsr NUM.ACC32ZERO + + sta ACC32 + + ldy #0 + +.1 iny + lda (ZPPtr2),y + beq .8 + jsr MEM.IsHexDigit + bcs .8 + + pha + + ldx #4 + +.2 jsr ACC32.T2 + bcs .99 overflow!!! + dex + bne .2 + + pla + ora ACC32 + sta ACC32 + bra .1 + +.8 clc + rts + +.99 pla +.9 sec + rts +*-------------------------------------- +* Convert Decimal int at ZPPtr2 to ACC32 +*-------------------------------------- +NUM.Dec2ACC32 jsr NUM.ACC32ZERO clc -.99 rts + lda (ZPPtr2) + eor #'-' + bne .10 + + jsr MEM.NextCharPtr2 skip '-' + sec + +.10 ror .80+1 set pos/neg flag + + ldy #$ff + +.1 iny + lda (ZPPtr2),y + beq .8 + + jsr MEM.IsDigit + bcs .8 + + phy Save Y, pointing to next char + jsr ACC32.T10 + ply + + bcs .9 + + lda (ZPPtr2),y + and #$0F + +* clc + + adc ACC32 + sta ACC32 + bcc .1 + inc ACC32+1 + bne .1 + inc ACC32+2 + bne .1 + inc ACC32+3 + bne .1 if 0, overflow!!! + +.9 lda #E.INUM + sec + rts + +.8 tya no digit parsed...error + beq .9 + +.80 lda #$FF SELF MODIFIED + bpl .88 + + jsr NUM.ACC32NEG + +.88 clc + rts +*-------------------------------------- +ACC32.T10 ldx #3 + +.1 lda ACC32,x save ACC32 for 4+1 + pha + dex + bpl .1 + + jsr ACC32.T2 STDLIB.32 * 2 -> STDLIB.32 + bcs ACC32.9 overflow!!! + + jsr ACC32.T2 STDLIB.32 * 4 -> STDLIB.32 + bcs ACC32.9 overflow!!! + + ldx #0 + ldy #4 + +* clc + +.2 pla STDLIB.32 * 4 + STDLIB.32 -> STDLIB.32 + adc ACC32,x + sta ACC32,x + inx + dey + bne .2 + + bcs ACC32.RTS overflow!!! + +ACC32.T2 asl ACC32 + rol ACC32+1 + rol ACC32+2 + rol ACC32+3 + rts if CS, overflow!!! + +ACC32.9 pla discard saved STDLIB.32 + pla + pla + pla + +ACC32.RTS rts *-------------------------------------- NUM.A2ACC32 sta ACC32 .HS 2C BIT ABS @@ -102,6 +361,12 @@ NUM.ACC32ZERO stz ACC32 stz ACC32+3 rts *-------------------------------------- +NUM.TMP32ZERO stz TMP32 + stz TMP32+1 + stz TMP32+2 + stz TMP32+3 + rts +*-------------------------------------- NUM.ACC32NEG sec ldy #0 diff --git a/SYS/KERNEL.S.PWDX.txt b/SYS/KERNEL.S.PWDX.txt index 1f4111eb..82d2dd10 100644 --- a/SYS/KERNEL.S.PWDX.txt +++ b/SYS/KERNEL.S.PWDX.txt @@ -502,14 +502,14 @@ PWD.StoreString iny PWD.StoreByte php phx - jsr MEM.Byte2Str102 + jsr NUM.A2STR10NP plx plp ldy #0 -.1 lda $102,y +.1 lda A2osX.NumStrBuf,y beq PWD.GetRecordLen.RTS iny diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 052b1388..e689db39 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -1,10 +1,8 @@ NEW AUTO 3,1 *-------------------------------------- -HEXBUF .EQ FAC -K.PrintF.PadL .EQ FAC+4 -K.PrintF.PadC .EQ FAC+5 -HEXBUF.Signed .EQ ARG.SIGN +K.PrintF.PadL .EQ FAC+5 +K.PrintF.PadC .EQ ARG.SIGN */-------------------------------------- * # putchar (BLOCKING) * Print A (char) to StdOut @@ -291,8 +289,7 @@ K.PrintF.1 stz PrintF.Cnt bne .10 stz K.PrintF.PadL - lda #' ' - sta K.PrintF.PadC + stz K.PrintF.PadC ldy #0 @@ -321,6 +318,8 @@ K.PrintF.1 stz PrintF.Cnt bne .51 second digit... sta K.PrintF.PadL first digit, store. + lda #' ' + sta K.PrintF.PadC and set pad char as SPACE bra .2 .51 pha save it... @@ -372,12 +371,12 @@ K.PrintF.1 stz PrintF.Cnt >LDYA ZPPtr1 >STYA ZPPtr2 - jsr STDLIB.GetHex + jsr NUM.Hex2ACC32 bcs .99 jsr MEM.AddYToPtr1 -.14 lda HEXBUF +.14 lda ACC32 bra .20 .19 lda PrintFTBL2.OUT,x @@ -481,13 +480,13 @@ PrintF.I sec signed short .HS 90 BCC PrintF.D clc unsigned short (BYTE) - ror HEXBUF.Signed + ror ACC32.Sign jsr PrintF.GetByte bcs PrintF.BB.RTS - sta HEXBUF + sta ACC32 - stz HEXBUF+1 + stz ACC32+1 ldx #0 one byte @@ -497,150 +496,43 @@ PrintF.II sec signed int .HS 90 BCC PrintF.DD clc unsigned int (WORD) - ror HEXBUF.Signed + ror ACC32.Sign jsr PrintF.GetByte bcs PrintF.BB.RTS - sta HEXBUF + sta ACC32 jsr PrintF.GetByte bcs PrintF.BB.RTS - sta HEXBUF+1 + sta ACC32+1 ldx #1 two bytes -PrintF.DD.1 stz HEXBUF+2 - stz HEXBUF+3 - bra PrintF.U.1 +PrintF.DD.1 stz ACC32+2 + stz ACC32+3 + bra PrintF.NUM PrintF.L sec signed long .HS 90 BCC PrintF.U clc unsigned long (DWORD) - ror HEXBUF.Signed + ror ACC32.Sign ldx #$ff .1 jsr PrintF.GetByte bcs PrintF.BB.RTS inx - sta HEXBUF,x + sta ACC32,x cpx #3 bne .1 -* ldx #3 4 bytes - -PrintF.U.1 clc - bit HEXBUF.Signed - bpl PrintF.Hex2Dec unsigned, nothing to check - - lda HEXBUF,x get sign - bpl PrintF.Hex2Dec - - sec - - ldy #0 - -.1 lda HEXBUF,y two's complement of X bytes - eor #$ff - adc #0 - sta HEXBUF,y - iny - dex - bpl .1 - - sec tell to print a "-" sign.... -*-------------------------------------- -* Convert HEXBUF to ASCBUF decimal padded with 0 -*-------------------------------------- -PrintF.Hex2Dec ror HEXBUF.Signed - - ldx #4 - -.1 stz RESULT,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 RESULT,y - adc RESULT,y - sta RESULT,y - dey - bpl .3 - - dex - bne .2 - - cld - - bit HEXBUF.Signed - bpl .9 - - lda #'-' - jsr PrintF.COut - bcs .99 - -.9 lda K.PrintF.PadL any Len format ? - beq .4 no - - lda #10 - sec yes, Print only digits starting at pos 10-K.PrintF.PadL - sbc K.PrintF.PadL - -.4 tax x=0 if no K.PrintF.PadL, or x=10-K.PrintF.PadL - -.5 txa X range 0 to 9 - lsr CS if lo nibble (1,3,5,7,9) - tay - - lda RESULT,y - - bcs .6 - - lsr - lsr - lsr - lsr - -.6 and #$0F - ora #$30 - cmp #$30 - - beq .7 a zero? - - inc K.PrintF.PadL found a non zero, Print all digits, even if 0, next time - ldy #'0' - sty K.PrintF.PadC - bra .8 - -.7 cpx #9 last digit ? - beq .8 Print always - - ldy K.PrintF.PadL no pad to fill, do not Print 0 - beq .10 - - lda K.PrintF.PadC fill with K.PrintF.PadC - -.8 jsr PrintF.COut - bcs .99 - -.10 inx - cpx #10 - bne .5 - - clc -.99 rts +PrintF.NUM ldx K.PrintF.PadL + ldy K.PrintF.PadC + rol ACC32.Sign + jsr NUM.ACC322STR10 + bra PrintF.StrNum *-------------------------------------- * EXP(8) 1(s) 1significants(31) * http://apple2.org.za/gswv/a2zine/GS.WorldView/Resources/GS.TECH.INFO/AppleSoft/ @@ -656,7 +548,7 @@ PrintF.F clc cmp (pStack) bcc .1 - bne .9 CS + bne PrintF.StrNum.RTS .1 tya sec +1 @@ -673,13 +565,13 @@ PrintF.F clc adc #5 sta PrintF.GetByte+1 - ldy #3 In order not to trash A2osX.SaveSM,A2osX.SaveSX + ldy #A2osX.NumStrBuf+1 In order not to trash A2osX.SaveSM,A2osX.SaveSX ldx #ROM.FOUT jsr GP.ROMCALL - ldy #0 +PrintF.StrNum ldy #0 -.2 lda $102,y +.2 lda A2osX.NumStrBuf,y beq .8 iny @@ -690,6 +582,7 @@ PrintF.F clc .9 rts .8 clc +PrintF.StrNum.RTS rts *-------------------------------------- PrintF.S ldy #$ff CSTR @@ -1087,20 +980,20 @@ K.SScanF.L K.SScanF.U lda K.SScanFTBL+1,x Get VAR size pha Save VAL size - jsr STDLIB.GetDec + jsr NUM.Dec2ACC32 bra K.SScanF.GetVAL *-------------------------------------- K.SScanF.HH K.SScanF.H lda K.SScanFTBL+1,x Get VAR size pha - jsr STDLIB.GetHex + jsr NUM.Hex2ACC32 K.SScanF.GetVAL jsr K.SScanF.Fwd Y=char count parsed .1 ply get back VAL size -.2 lda STDLIB.32-1,y +.2 lda ACC32-1,y dey sta (ZPPtr3),y bne .2 diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index 0eeda129..dff72f57 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -87,21 +87,18 @@ K.StrToUL.rts rts * ## RETURN VALUE * On stack (long) *\-------------------------------------- -*STDLIB.32 .BS 4 32 bits max -STDLIB.32 .EQ FAC 32 bits max -*-------------------------------------- K.AToL >STYA ZPPtr2 C-String in Ptr2, Dst buffer in Ptr1 lda #10 base 10 sec signed -K.AToL.I jsr STDLIB.GetDec +K.AToL.I jsr NUM.Dec2ACC32 bcs .9 phy Save Count processed ldy #3 -.3 lda STDLIB.32,y +.3 lda ACC32,y >PUSHA dey bpl .3 @@ -126,171 +123,12 @@ K.atoi >STYA ZPPtr2 lda #10 base 10 sec signed - jsr STDLIB.GetDec + jsr NUM.Dec2ACC32 bcs .9 - >LDYA STDLIB.32 -.9 rts -*-------------------------------------- -* Convert Hex int at ZPPtr2 to STDLIB.32 -*-------------------------------------- -STDLIB.GetHex lda (ZPPtr2) - beq .9 - - jsr MEM.IsHexDigit - bcs .9 - - jsr STDLIB.32.Clear - - sta STDLIB.32 - - ldy #0 - -.1 iny - lda (ZPPtr2),y - beq .8 - jsr MEM.IsHexDigit - bcs .8 - - pha - - ldx #4 - -.2 jsr STDLIB.32.T2 - bcs .99 overflow!!! - dex - bne .2 - - pla - ora STDLIB.32 - sta STDLIB.32 - bra .1 - -.8 clc - rts - -.99 pla -.9 sec - rts -*-------------------------------------- -* Convert Decimal int at ZPPtr2 to STDLIB.32 -*-------------------------------------- -STDLIB.GetDec jsr STDLIB.32.Clear - - clc - lda (ZPPtr2) - eor #'-' - bne .10 - - jsr MEM.NextCharPtr2 skip '-' - sec - -.10 ror .80+1 set pos/neg flag - - ldy #$ff - -.1 iny - lda (ZPPtr2),y - beq .8 - - jsr MEM.IsDigit - bcs .8 - - phy Save Y, pointing to next char - jsr STDLIB.32.T10 - ply - - bcs .9 - - lda (ZPPtr2),y - and #$0F - -* clc - - adc STDLIB.32 - sta STDLIB.32 - bcc .1 - inc STDLIB.32+1 - bne .1 - inc STDLIB.32+2 - bne .1 - inc STDLIB.32+3 - bne .1 if 0, overflow!!! - -.9 lda #E.INUM - sec - rts - -.8 tya no digit parsed...error - beq .9 - -.80 lda #$FF SELF MODIFIED - bpl .88 - - ldx #4 - ldy #0 - - sec - -.81 lda STDLIB.32,y - eor #$ff - adc #0 - sta STDLIB.32,y - iny - dex - bne .81 - -.88 clc - rts -*-------------------------------------- -STDLIB.32.T10 ldx #3 - -.1 lda STDLIB.32,x save STDLIB.32 for 4+1 - pha - dex - bpl .1 - - jsr STDLIB.32.T2 STDLIB.32 * 2 -> STDLIB.32 - bcs STDLIB.32.9 overflow!!! - - jsr STDLIB.32.T2 STDLIB.32 * 4 -> STDLIB.32 - bcs STDLIB.32.9 overflow!!! - - ldx #0 - ldy #4 - -* clc - -.2 pla STDLIB.32 * 4 + STDLIB.32 -> STDLIB.32 - adc STDLIB.32,x - sta STDLIB.32,x - inx - dey - bne .2 - - bcs STDLIB.32.RTS overflow!!! - -* STDLIB.32 * 2 -> STDLIB.32 - -STDLIB.32.T2 asl STDLIB.32 - rol STDLIB.32+1 - rol STDLIB.32+2 - rol STDLIB.32+3 - rts if CS, overflow!!! - -STDLIB.32.9 pla discard saved STDLIB.32 - pla - pla - pla - -STDLIB.32.RTS rts -*-------------------------------------- -STDLIB.32.Clear ldx #3 - -.1 stz STDLIB.32,x - dex - bpl .1 - rts + >LDYA ACC32 +.9 +K.atoi.RTS rts */-------------------------------------- * # RealPath * Return the canonicalized absolute pathname @@ -315,7 +153,7 @@ STDLIB.realpath.I ldx #SYS.ExpandStr jsr K.SYSCALL2.BANK - bcs STDLIB.32.RTS + bcs K.atoi.RTS >STYA ZPPtr1 stx .99+1 save expanded buffer hMem diff --git a/SYS/KERNEL.S.TERM.txt b/SYS/KERNEL.S.TERM.txt index ec45876e..8c3d9206 100644 --- a/SYS/KERNEL.S.TERM.txt +++ b/SYS/KERNEL.S.TERM.txt @@ -1133,11 +1133,11 @@ DRV.TERM.CURBLNK.SET DRV.TERM.CURBLNK.RTS rts *-------------------------------------- -Decimal.Out jsr MEM.Byte2Str102 +Decimal.Out jsr NUM.A2STR10NP ldx #0 -.1 lda $102,x +.1 lda A2osX.NumStrBuf,x beq DRV.TERM.CURBLNK.RTS diff --git a/SYS/KERNEL.S.TIME.txt b/SYS/KERNEL.S.TIME.txt index c52d64f1..3347e8de 100644 --- a/SYS/KERNEL.S.TIME.txt +++ b/SYS/KERNEL.S.TIME.txt @@ -11,11 +11,6 @@ DAY0 .EQ 4 day 0 was a thursday .DUMMY .OR ZPTMP TIME.DWORD .BS 4 -TIME.DivDay .BS 2 -TIME.ModDay .BS 3 -TIME.Div60 .BS 2 -TIME.Mod .BS 1 -TIME.Div3600 .BS 1 TIME.Century .BS 1 TIME.Year .BS 1 .ED @@ -95,7 +90,7 @@ TIME.PTime2TimeP1P2 * 1/1/1970 was Thursday...if not leap, add one, if leap add 2 -K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) +K.ComputeWDAY lda #DAY0-1 Thursday : 4 (-1 for mod 7) pha lda #19 sta TIME.DWORD @@ -182,134 +177,43 @@ K.CTime2Time jsr MEM.SPtr1PPtr2 ldy #3 .1 lda (ZPPtr1),y - sta TIME.DWORD,y + sta ARG32,y ARG = ctime dey bpl .1 - stz TIME.DivDay - stz TIME.DivDay+1 + lda #SECSDAY ACC = SECSDAY + sta ACC32 -.2 lda TIME.DWORD - sta TIME.ModDay - sec - sbc #SECSDAY - pha + lda /SECSDAY + sta ACC32+1 - lda TIME.DWORD+1 - sta TIME.ModDay+1 - sbc /SECSDAY - pha + lda ^SECSDAY + sta ACC32+2 - lda TIME.DWORD+2 - sta TIME.ModDay+2 - sbc ^SECSDAY - pha + stz ACC32+3 + + jsr NUM.DIVMOD32 ARG32 = Days, TMP32 = remaining secs - lda TIME.DWORD+3 - sbc #0 - bcc .3 end of DIV/MOD ? - - sta TIME.DWORD+3 - - ldx #2 - -.21 pla - sta TIME.DWORD,x - dex - bpl .21 - - inc TIME.DivDay - bne .2 - inc TIME.DivDay+1 - bne .2 - -.3 pla - pla - pla - stz TIME.Div60 - stz TIME.Div60+1 - -.4 lda TIME.ModDay - sta TIME.Mod - sec - sbc #60 - pha - - lda TIME.ModDay+1 - sbc #0 - pha - - lda TIME.ModDay+2 - sbc #0 - - bcc .5 - - sta TIME.ModDay+2 - pla - sta TIME.ModDay+1 - pla - sta TIME.ModDay - - inc TIME.Div60 - bne .4 - inc TIME.Div60+1 - bne .4 - -.5 pla - pla - lda TIME.Mod - ldy #S.Time.SECOND - sta (ZPPtr2),y - - stz TIME.Div3600 - -.6 lda TIME.Div60 - sta TIME.Mod - sec - sbc #60 - pha - - lda TIME.Div60+1 - sbc #0 - pha - - bcc .7 - - sta TIME.Div60+1 - pla - sta TIME.Div60 - - inc TIME.Div3600 - bne .6 - -.7 pla - - lda TIME.Mod - dey ldy #S.Time.MINUTE - sta (ZPPtr2),y - - lda TIME.Div3600 - dey ldy #S.Time.HOUR - sta (ZPPtr2),y - - lda TIME.DivDay WDAY computation : (DivDay + DAY0) mod 7 + lda ARG32 WDAY computation : (ARG32 + DAY0) mod 7 clc adc #DAY0 pha - lda TIME.DivDay+1 + + lda ARG32+1 65535 days = 179 years adc /DAY0 eor #$ff tax + pla -.8 sta TIME.Mod +.2 tay sec sbc #7 - bcs .8 + bcs .2 inx - bne .8 + bne .2 - lda TIME.Mod + tya ldy #S.Time.WDAY sta (ZPPtr2),y @@ -318,7 +222,8 @@ K.CTime2Time jsr MEM.SPtr1PPtr2 lda #YEAR0 sta TIME.Year -K.CTime2Time.Year +K.CTime2Time.Year + .1 ldy TIME.Century lda TIME.Year jsr TIME.IsLeapYearYA if Leap year CS @@ -328,16 +233,16 @@ K.CTime2Time.Year eor #1 lsr - lda TIME.DivDay + lda ARG32 sbc #365 pha - lda TIME.DivDay+1 + lda ARG32+1 sbc /365 bcc .2 - sta TIME.DivDay+1 + sta ARG32+1 pla - sta TIME.DivDay + sta ARG32 inc TIME.Year lda TIME.Year @@ -348,13 +253,46 @@ K.CTime2Time.Year bne .1 .2 pla + lda TIME.Century * ldy #S.Time.CENTURY sta (ZPPtr2) + ldy #S.Time.YEAR lda TIME.Year sta (ZPPtr2),y + +K.CTime2Time.HMS + ldx #3 + +.1 lda TMP32,x + sta ARG32,x + dex + bpl .1 + + lda #60 + jsr NUM.A2ACC32 + + jsr NUM.DIVMOD32 + + ldy #S.TIME.SECOND + lda TMP32 + sta (ZPPtr2),y + + lda #60 + jsr NUM.A2ACC32 + + jsr NUM.DIVMOD32 + + ldy #S.TIME.MINUTE + lda TMP32 + sta (ZPPtr2),y + + ldy #S.TIME.HOUR + lda ARG32 + sta (ZPPtr2),y + clc rts *-------------------------------------- @@ -559,17 +497,14 @@ K.StrFTime.MM ldy #S.Time.MINUTE K.StrFTime.addDecPtr1Y lda (ZPPtr3),y K.StrFTime.addDecA - jsr MEM.Byte2Str102 + ldx #2 + ldy #'0' + clc + jsr NUM.A2STR10 - lda $102 - ldx $103 - - bne .1 - tax - lda #$30 - -.1 jsr MEM.PutCharPtr1 - txa + lda A2osX.NumStrBuf + jsr MEM.PutCharPtr1 + lda A2osX.NumStrBuf+1 jmp MEM.PutCharPtr1 *-------------------------------------- K.StrFTime.DAY >PSTR "Monday" diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 7e2ff311..d8a50bc0 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -46,6 +46,7 @@ A2osX.D1 .PH $D000 .INB USR/SRC/SYS/KERNEL.S.STDIO .INB USR/SRC/SYS/KERNEL.S.STDLIB .INB USR/SRC/SYS/KERNEL.S.DEV + .INB USR/SRC/SYS/KERNEL.S.FIO .EP A2osX.D2 .PH $D000 .DA #RRAMWRAMBNK2 @@ -60,11 +61,11 @@ A2osX.E0 .PH $E000 .INB USR/SRC/SYS/KERNEL.S.JMP .INB USR/SRC/SYS/KERNEL.S.IRQ .INB USR/SRC/SYS/KERNEL.S.MEM + .INB USR/SRC/SYS/KERNEL.S.NUM .INB USR/SRC/SYS/KERNEL.S.TERMLC ********* TMP ***** go to A2osX.D1 .INB USR/SRC/SYS/KERNEL.S.PFT .INB USR/SRC/SYS/KERNEL.S.IO - .INB USR/SRC/SYS/KERNEL.S.FIO ********* TMP ***** go to A2osX.D2 .INB USR/SRC/SYS/KERNEL.S.ARG .INB USR/SRC/SYS/KERNEL.S.PWD