PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * https://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/lib/ansi/gmtime.c *-------------------------------------- SECSDAY .EQ 86400 60*60*24 CENTURY0 .EQ 19 YEAR0 .EQ 70 DAY0 .EQ 4 day 0 was a thursday *-------------------------------------- * S.TimeYA get System Time * In : * Y,A = PTR to S.TIME * Out : * S.TIME filled with ProDOS MLI date/time *-------------------------------------- S.TimeYA >STYA ZPQuickPtr2 >MLICALL MLIGETTIME >LDYAI DATELO >STYA ZPQuickPtr1 bra S.PTime2Time.1 *-------------------------------------- * In : * PULLW = Src PDATE/TIME (DWORD) * PULLW = Dst PTR To S.TIME *-------------------------------------- S.PTime2Time >PULLW ZPQuickPtr1 >PULLW ZPQuickPtr2 S.PTime2Time.1 lda (ZPQuickPtr1) Get Year lsr C is high bit of month ldy #S.TIME.YEAR sta (ZPQuickPtr2),y set year pha save it for century adjust ldy #1 lda (ZPQuickPtr1),y Get Month/day pha save Day ror lsr lsr lsr lsr ldy #S.TIME.MONTH sta (ZPQuickPtr2),y set month pla get back day and #$1F iny sta (ZPQuickPtr2),y set day pla get back year cmp #70 if before 70's CC lda #19 adc #0 set date before 1970 -> 20xx sta (ZPQuickPtr2) set Century ldy #3 lda (ZPQuickPtr1),y Get Min tax dey lda (ZPQuickPtr1),y Get Hour ldy #S.TIME.HOUR sta (ZPQuickPtr2),y set hour iny txa sta (ZPQuickPtr2),y set min iny lda #0 sta (ZPQuickPtr2),y set seconds (ProDOS does not provide it) S.ComputeWDAY clc rts *-------------------------------------- * S.CTime2Time * In : * PULLW = Src CTIME DWORD * PULLW = Dst PTR To S.TIME *-------------------------------------- S.CTime2Time >PULLW ZPQuickPtr1 >PULLW ZPQuickPtr2 ldy #3 .1 lda (ZPQuickPtr1),y sta S.CTime.DWORD,y dey bpl .1 stz S.CTime.DivDay stz S.CTime.DivDay+1 .2 lda S.CTime.DWORD sta S.CTime.ModDay sec sbc #SECSDAY pha lda S.CTime.DWORD+1 sta S.CTime.ModDay+1 sbc /SECSDAY pha lda S.CTime.DWORD+2 sta S.CTime.ModDay+2 sbc #0 pha lda S.CTime.DWORD+3 sbc #0 bcc .3 end of DIV/MOD ? sta S.CTime.DWORD+3 pla sta S.CTime.DWORD+2 pla sta S.CTime.DWORD+1 pla sta S.CTime.DWORD inc S.CTime.DivDay bne .2 inc S.CTime.DivDay+1 bne .2 .3 pla pla pla stz S.CTime.Div60 stz S.CTime.Div60+1 .4 lda S.CTime.ModDay sta S.CTime.Mod sec sbc #60 pha lda S.CTime.ModDay+1 sbc #0 pha lda S.CTime.ModDay+2 sbc #0 bcc .5 sta S.CTime.ModDay+2 pla sta S.CTime.ModDay+1 pla sta S.CTime.ModDay inc S.CTime.Div60 bne .4 inc S.CTime.Div60+1 bne .4 .5 pla pla lda S.CTime.Mod ldy #S.TIME.SECOND sta (ZPQuickPtr2),y stz S.CTime.Div3600 .6 lda S.CTime.Div60 sta S.CTime.Mod sec sbc #60 pha lda S.CTime.Div60+1 sbc #0 pha bcc .7 sta S.CTime.Div60+1 pla sta S.CTime.Div60 inc S.CTime.Div3600 bne .6 .7 pla lda S.CTime.Mod dey ldy #S.TIME.MINUTE sta (ZPQuickPtr2),y lda S.CTime.Div3600 dey ldy #S.TIME.HOUR sta (ZPQuickPtr2),y lda S.CTime.DivDay WDAY computation : (DivDay + DAY0) mod 7 clc adc #DAY0 pha lda S.CTime.DivDay+1 adc /DAY0 eor #$ff tax pla .8 sta S.CTime.Mod sec sbc #7 bcs .8 inx bne .8 lda S.CTime.Mod ldy #S.TIME.WDAY sta (ZPQuickPtr2),y lda #CENTURY0 sta S.CTime.Century lda #YEAR0 sta S.CTime.Year S.CTime2Time.Year .1 ldy S.CTime.Century lda S.CTime.Year jsr S.IsLeapYearYA if Leap year CC lda S.CTime.DivDay sbc #365 pha lda S.CTime.DivDay+1 sbc /365 bcc .2 sta S.CTime.DivDay+1 pla sta S.CTime.DivDay inc S.CTime.Year lda S.CTime.Year cmp #100 bne .1 stz S.CTime.Year inc S.CTime.Century bne .1 .2 pla lda S.CTime.Century * ldy #S.TIME.CENTURY sta (ZPQuickPtr2) ldy #S.TIME.YEAR lda S.CTime.Year sta (ZPQuickPtr2),y clc rts *-------------------------------------- S.CTime.DWORD .BS 4 S.CTime.DivDay .BS 2 S.CTime.ModDay .BS 3 S.CTime.Div60 .BS 2 S.CTime.Div3600 .BS 1 S.CTime.Mod .BS 1 S.CTime.Century .BS 1 S.CTime.Year .BS 1 *-------------------------------------- * S.StrFTime * In : * PULLW = Src PTR To S.TIME * PULLW = Src PTR To Format String * PULLW = Dst PTR To PSTR Buf * %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 * PULLW = Dst PSTR Buffer *-------------------------------------- S.StrFTime >PULLW ZPQuickPtr1 >PULLW ZPQuickPtr2 >PULLW ZPQuickPtr3 lda #0 sta (ZPQuickPtr3) Reset target PSTR length tay .1 iny lda (ZPQuickPtr2),y cmp #'%' beq .2 phy jsr S.StrFTime.addChar ply .10 tya cmp (ZPQuickPtr2) bne .1 rts .2 tya cmp (ZPQuickPtr2) beq .8 iny ldx #S.StrFTime.JMPL-S.StrFTime.Table .3 lda (ZPQuickPtr2),y cmp S.StrFTime.Table-1,x beq .4 dex bne .3 beq .10 .4 lda S.StrFTime.JMPL,x sta .5+1 lda S.StrFTime.JMPH,x sta .5+2 phy .5 jsr $ffff ply bra .10 .8 rts *-------------------------------------- S.StrFTime.A S.StrFTime.AA S.StrFTime.B S.StrFTime.BB S.StrFTime.D ldy #S.TIME.DAY bra S.StrFTime.addDecPtr1Y S.StrFTime.HH ldy #S.TIME.HOUR bra S.StrFTime.addDecPtr1Y S.StrFTime.II ldy #S.TIME.HOUR lda (ZPQuickPtr1),y cmp #12 bcc .1 sbc #12 .1 bra S.StrFTime.addDecA S.StrFTime.M ldy #S.TIME.MONTH bra S.StrFTime.addDecPtr1Y S.StrFTime.MM ldy #S.TIME.MINUTE bra S.StrFTime.addDecPtr1Y S.StrFTime.P ldy #S.TIME.HOUR lda (ZPQuickPtr1),y cmp #12 bcc .1 lda #'p' .HS 2C bit abs .1 lda #'a' jsr S.StrFTime.addChar lda #'m' bra S.StrFTime.addChar S.StrFTime.SS ldy #S.TIME.SECOND bra S.StrFTime.addDecPtr1Y S.StrFTime.W ldy #S.TIME.WDAY bra S.StrFTime.addDecPtr1Y S.StrFTime.YY ldy #S.TIME.CENTURY jsr S.StrFTime.addDecPtr1Y S.StrFTime.Y ldy #S.TIME.YEAR *-------------------------------------- S.StrFTime.addDecPtr1Y lda (ZPQuickPtr1),y S.StrFTime.addDecA pha lsr lsr lsr lsr ora #$30 jsr S.StrFTime.addChar pla and #$0f ora #$30 *-------------------------------------- S.StrFTime.addChar pha lda (ZPQuickPtr3) inc sta (ZPQuickPtr3) tay pla sta (ZPQuickPtr3),y rts *-------------------------------------- S.StrFTime.Table .AS "aAbBdHImMpSwyY" S.StrFTime.JMPL .DA #S.StrFTime.A .DA #S.StrFTime.AA .DA #S.StrFTime.B .DA #S.StrFTime.BB .DA #S.StrFTime.D .DA #S.StrFTime.HH .DA #S.StrFTime.II .DA #S.StrFTime.M .DA #S.StrFTime.MM .DA #S.StrFTime.P .DA #S.StrFTime.SS .DA #S.StrFTime.W .DA #S.StrFTime.Y .DA #S.StrFTime.YY *-------------------------------------- S.StrFTime.JMPH .DA /S.StrFTime.A .DA /S.StrFTime.AA .DA /S.StrFTime.B .DA /S.StrFTime.BB .DA /S.StrFTime.D .DA /S.StrFTime.HH .DA /S.StrFTime.II .DA /S.StrFTime.M .DA /S.StrFTime.MM .DA /S.StrFTime.P .DA /S.StrFTime.SS .DA /S.StrFTime.W .DA /S.StrFTime.Y .DA /S.StrFTime.YY *-------------------------------------- S.StrFTime.SDAY >PSTRING "Mon" >PSTRING "Tue" >PSTRING "Wed" >PSTRING "Thu" >PSTRING "Fri" >PSTRING "Sat" >PSTRING "Sun" *-------------------------------------- S.StrFTime.LDAY >PSTRING "Monday" >PSTRING "Tuesday" >PSTRING "Wednesday" >PSTRING "Thursday" >PSTRING "Friday" >PSTRING "Saturday" >PSTRING "Sunday" *-------------------------------------- S.StrFTime.SMON >PSTRING "Jan" >PSTRING "Feb" >PSTRING "Mar" >PSTRING "Apr" >PSTRING "May" >PSTRING "Jun" >PSTRING "Jul" >PSTRING "Aug" >PSTRING "Sep" >PSTRING "Oct" >PSTRING "Nov" >PSTRING "Dec" *-------------------------------------- S.StrFTime.LMON >PSTRING "January" >PSTRING "February" >PSTRING "March" >PSTRING "April" >PSTRING "May" >PSTRING "June" >PSTRING "July" >PSTRING "August" >PSTRING "September" >PSTRING "October" >PSTRING "November" >PSTRING "December" *-------------------------------------- * Y = Century * A = Year (0..99) * if (year mod 400 = 0) * or * if not (year mod 100 = 0) and (year mod 4 = 0) *-------------------------------------- S.IsLeapYearYA tax Year = 00 ? bne .1 no tya year = 00, get century in a and #$3 mod 4 = 0 ? beq .9 leap year .8 sec not leap rts .1 and #$3 mod 4 = 0 ? bne .8 .9 clc Leap rts *-------------------------------------- MAN SAVE SYS/KERNEL.S.TIME LOAD SYS/KERNEL.S ASM