PR#3 PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 *-------------------------------------- * 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 *-------------------------------------- * K.TimeYA get System Time * In : * Y,A = PTR to S.TIME * Out : * S.TIME filled with System date/time *-------------------------------------- K.TimeYA >STYA ZPPtr2 >MLICALL MLIGETTIME >LDYAI DATELO >STYA ZPPtr1 bra K.PTime2Time.1 *-------------------------------------- * In : * PULLW = Src PDATE/TIME (DWORD) * PULLW = Dst PTR To S.TIME *-------------------------------------- K.PTime2Time jsr PullPtr1Ptr2 K.PTime2Time.1 ldy #1 lda (ZPPtr1),y Get Year lsr C is high bit of month ldy #S.Time.YEAR sta (ZPPtr2),y set year sta K.CTime.Year for conputing Century/WDAY later lda (ZPPtr1) Get Month/day pha save Day ror lsr lsr lsr lsr ldy #S.Time.MONTH sta (ZPPtr2),y set month pla get back day and #$1F iny sta (ZPPtr2),y set day lda K.CTime.Year get back year cmp #69 if before 70 CC,if > 70, CS lda #0 rol get back C in bit 0 eor #1 toggle C adc #19 set date before 1970 -> 20xx sta (ZPPtr2) set Century sta K.CTime.Century for conputing WDAY later ldy #2 lda (ZPPtr1),y Get Min tax iny lda (ZPPtr1),y Get Hour ldy #S.Time.HOUR sta (ZPPtr2),y set hour iny txa sta (ZPPtr2),y set min iny lda #0 sta (ZPPtr2),y set seconds (ProDOS does not provide it) * 1/1/1970 was Thursday...if not leap, add one, if leap add 2 K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) pha lda #19 sta K.CTime.DWORD lda #70 sta K.CTime.DWORD+1 .1 ldy K.CTime.DWORD lda K.CTime.DWORD+1 cpy K.CTime.Century bne .2 cmp K.CTime.Year beq .4 .2 jsr TIME.IsLeapYearYA CC = Leap lda #0 rol eor #1 lsr pla adc #1 cmp #7 bcc .3 sbc #7 MOD 7 .3 pha inc K.CTime.DWORD+1 lda K.CTime.DWORD+1 cmp #100 bne .1 lda #0 sta K.CTime.DWORD+1 inc K.CTime.DWORD bra .1 .4 ldy #S.Time.MONTH lda (ZPPtr2),y get month tax .5 lda K.StrFTime.MDAY-1,x get day count in this month bne .6 february ? ldy K.CTime.Century lda K.CTime.Year jsr TIME.IsLeapYearYA CC = Leap lda #0 rol eor #1 lsr .6 pla adc K.StrFTime.MDAY-1,x cmp #7 bcc .7 sbc #7 .7 pha dex bne .5 pla ldy #S.Time.DAY adc (ZPPtr2),y get month (1..31) dec adjust range 0.31 for MOD 7 .8 cmp #7 MOD 7 bcc .80 sbc #7 bra .8 .80 inc adjust range 1..7 ldy #S.Time.WDAY sta (ZPPtr2),y clc rts *-------------------------------------- * K.CTime2Time * In : * PULLW = Src CTIME DWORD * PULLW = Dst PTR To S.TIME *-------------------------------------- K.CTime2Time jsr PullPtr1Ptr2 ldy #3 .1 lda (ZPPtr1),y sta K.CTime.DWORD,y dey bpl .1 stz K.CTime.DivDay stz K.CTime.DivDay+1 .2 lda K.CTime.DWORD sta K.CTime.ModDay sec sbc #SECSDAY pha lda K.CTime.DWORD+1 sta K.CTime.ModDay+1 sbc /SECSDAY pha lda K.CTime.DWORD+2 sta K.CTime.ModDay+2 sbc #0 pha lda K.CTime.DWORD+3 sbc #0 bcc .3 end of DIV/MOD ? sta K.CTime.DWORD+3 pla sta K.CTime.DWORD+2 pla sta K.CTime.DWORD+1 pla sta K.CTime.DWORD inc K.CTime.DivDay bne .2 inc K.CTime.DivDay+1 bne .2 .3 pla pla pla stz K.CTime.Div60 stz K.CTime.Div60+1 .4 lda K.CTime.ModDay sta K.CTime.Mod sec sbc #60 pha lda K.CTime.ModDay+1 sbc #0 pha lda K.CTime.ModDay+2 sbc #0 bcc .5 sta K.CTime.ModDay+2 pla sta K.CTime.ModDay+1 pla sta K.CTime.ModDay inc K.CTime.Div60 bne .4 inc K.CTime.Div60+1 bne .4 .5 pla pla lda K.CTime.Mod ldy #S.Time.SECOND sta (ZPPtr2),y stz K.CTime.Div3600 .6 lda K.CTime.Div60 sta K.CTime.Mod sec sbc #60 pha lda K.CTime.Div60+1 sbc #0 pha bcc .7 sta K.CTime.Div60+1 pla sta K.CTime.Div60 inc K.CTime.Div3600 bne .6 .7 pla lda K.CTime.Mod dey ldy #S.Time.MINUTE sta (ZPPtr2),y lda K.CTime.Div3600 dey ldy #S.Time.HOUR sta (ZPPtr2),y lda K.CTime.DivDay WDAY computation : (DivDay + DAY0) mod 7 clc adc #DAY0 pha lda K.CTime.DivDay+1 adc /DAY0 eor #$ff tax pla .8 sta K.CTime.Mod sec sbc #7 bcs .8 inx bne .8 lda K.CTime.Mod ldy #S.Time.WDAY sta (ZPPtr2),y lda #CENTURY0 sta K.CTime.Century lda #YEAR0 sta K.CTime.Year K.CTime2Time.Year .1 ldy K.CTime.Century lda K.CTime.Year jsr TIME.IsLeapYearYA if Leap year CC lda K.CTime.DivDay sbc #365 pha lda K.CTime.DivDay+1 sbc /365 bcc .2 sta K.CTime.DivDay+1 pla sta K.CTime.DivDay inc K.CTime.Year lda K.CTime.Year cmp #100 bne .1 stz K.CTime.Year inc K.CTime.Century bne .1 .2 pla lda K.CTime.Century * ldy #S.Time.CENTURY sta (ZPPtr2) ldy #S.Time.YEAR lda K.CTime.Year sta (ZPPtr2),y clc rts *-------------------------------------- * In : * Y = Century * A = Year (0..99) * if (year mod 400 = 0) * or * if not (year mod 100 = 0) and (year mod 4 = 0) * Out : * CC = Leap * CS = Not Leap *-------------------------------------- TIME.IsLeapYearYA cmp #0 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 *-------------------------------------- K.StrFTime.MDAY .DA #3,#0,#3,#2,#3,#2,#3,#3,#2,#3,#2,#3 K.CTime.DWORD .BS 4 K.CTime.DivDay .BS 2 K.CTime.ModDay .BS 3 K.CTime.Div60 .BS 2 K.CTime.Div3600 .BS 1 K.CTime.Mod .BS 1 K.CTime.Century .BS 1 K.CTime.Year .BS 1 MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.Time LOAD /A2OSX.SRC/SYS/KERNEL.S ASM