A2osX/SYS/KERNEL.S.TIME.txt
Rémy GIBERT 6fea4ec153 Time API : Work In Progress,used in SHELL For Testing
Kernel : Dual Bank implemented
2016-09-05 18:00:11 +02:00

500 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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