mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-26 13:49:18 +00:00
380 lines
6.9 KiB
Plaintext
380 lines
6.9 KiB
Plaintext
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
|