A2osX/SYS/KERNEL.S.TIME.txt

625 lines
12 KiB
Plaintext
Raw Normal View History

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
2016-08-31 15:38:48 +00:00
* https://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/lib/ansi/gmtime.c
*--------------------------------------
2016-08-31 15:38:48 +00:00
SECSDAY .EQ 86400 60*60*24
CENTURY0 .EQ 19
YEAR0 .EQ 70
DAY0 .EQ 4 day 0 was a thursday
*--------------------------------------
2016-09-21 15:20:37 +00:00
* K.TimeYA get System Time
* In :
2016-09-21 15:20:37 +00:00
* Y,A = PTR to K.Time
* Out :
2016-09-21 15:20:37 +00:00
* K.Time filled with ProDOS MLI date/time
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.TimeYA >STYA ZPQuickPtr2
>MLICALL MLIGETTIME
>LDYAI DATELO
>STYA ZPQuickPtr1
2016-09-21 15:20:37 +00:00
bra K.PTime2Time.1
*--------------------------------------
* In :
* PULLW = Src PDATE/TIME (DWORD)
2016-09-21 15:20:37 +00:00
* PULLW = Dst PTR To K.Time
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.PTime2Time >PULLW ZPQuickPtr1
>PULLW ZPQuickPtr2
2016-09-21 15:20:37 +00:00
K.PTime2Time.1 ldy #1
lda (ZPQuickPtr1),y Get Year
lsr C is high bit of month
2016-09-21 15:20:37 +00:00
ldy #S.Time.YEAR
sta (ZPQuickPtr2),y set year
2016-09-21 15:20:37 +00:00
sta K.CTime.Year for conputing Century/WDAY later
lda (ZPQuickPtr1) Get Month/day
pha save Day
ror
lsr
lsr
lsr
lsr
2016-09-21 15:20:37 +00:00
ldy #S.Time.MONTH
sta (ZPQuickPtr2),y set month
pla get back day
and #$1F
iny
sta (ZPQuickPtr2),y set day
2016-09-21 15:20:37 +00:00
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 (ZPQuickPtr2) set Century
2016-09-21 15:20:37 +00:00
sta K.CTime.Century for conputing WDAY later
ldy #2
lda (ZPQuickPtr1),y Get Min
tax
iny
lda (ZPQuickPtr1),y Get Hour
2016-09-21 15:20:37 +00:00
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)
* 1/1/1970 was Thursday...if not leap, add one, if leap add 2
2016-09-21 15:20:37 +00:00
K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7)
pha
lda #19
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD
lda #70
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD+1
2016-09-21 15:20:37 +00:00
.1 ldy K.CTime.DWORD
lda K.CTime.DWORD+1
2016-09-21 15:20:37 +00:00
cpy K.CTime.Century
bne .2
2016-09-21 15:20:37 +00:00
cmp K.CTime.Year
beq .4
2016-09-21 15:20:37 +00:00
.2 jsr K.IsLeapYearYA CC = Leap
lda #0
rol
eor #1
lsr
pla
adc #1
cmp #7
bcc .3
sbc #7 MOD 7
.3 pha
2016-09-21 15:20:37 +00:00
inc K.CTime.DWORD+1
lda K.CTime.DWORD+1
cmp #100
bne .1
lda #0
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD+1
inc K.CTime.DWORD
bra .1
2016-09-21 15:20:37 +00:00
.4 ldy #S.Time.MONTH
lda (ZPQuickPtr2),y get month
tax
2016-09-21 15:20:37 +00:00
.5 lda K.StrFTime.MDAY-1,x get day count in this month
bne .6 february ?
2016-09-21 15:20:37 +00:00
ldy K.CTime.Century
lda K.CTime.Year
jsr K.IsLeapYearYA CC = Leap
lda #0
rol
eor #1
lsr
.6 pla
2016-09-21 15:20:37 +00:00
adc K.StrFTime.MDAY-1,x
cmp #7
bcc .7
sbc #7
.7 pha
dex
bne .5
pla
2016-09-21 15:20:37 +00:00
ldy #S.Time.DAY
adc (ZPQuickPtr2),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
2016-09-21 15:20:37 +00:00
ldy #S.Time.WDAY
sta (ZPQuickPtr2),y
clc
rts
*--------------------------------------
2016-09-21 15:20:37 +00:00
* K.CTime2Time
* In :
* PULLW = Src CTIME DWORD
2016-09-21 15:20:37 +00:00
* PULLW = Dst PTR To K.Time
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.CTime2Time >PULLW ZPQuickPtr1
2016-08-31 15:38:48 +00:00
>PULLW ZPQuickPtr2
ldy #3
.1 lda (ZPQuickPtr1),y
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD,y
2016-08-31 15:38:48 +00:00
dey
bpl .1
2016-09-21 15:20:37 +00:00
stz K.CTime.DivDay
stz K.CTime.DivDay+1
2016-08-31 15:38:48 +00:00
2016-09-21 15:20:37 +00:00
.2 lda K.CTime.DWORD
sta K.CTime.ModDay
2016-08-31 15:38:48 +00:00
sec
sbc #SECSDAY
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.DWORD+1
sta K.CTime.ModDay+1
2016-08-31 15:38:48 +00:00
sbc /SECSDAY
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.DWORD+2
sta K.CTime.ModDay+2
2016-08-31 15:38:48 +00:00
sbc #0
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.DWORD+3
2016-08-31 15:38:48 +00:00
sbc #0
bcc .3 end of DIV/MOD ?
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD+3
2016-08-31 15:38:48 +00:00
pla
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD+2
2016-08-31 15:38:48 +00:00
pla
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD+1
2016-08-31 15:38:48 +00:00
pla
2016-09-21 15:20:37 +00:00
sta K.CTime.DWORD
2016-08-31 15:38:48 +00:00
2016-09-21 15:20:37 +00:00
inc K.CTime.DivDay
2016-08-31 15:38:48 +00:00
bne .2
2016-09-21 15:20:37 +00:00
inc K.CTime.DivDay+1
2016-08-31 15:38:48 +00:00
bne .2
.3 pla
pla
pla
2016-09-21 15:20:37 +00:00
stz K.CTime.Div60
stz K.CTime.Div60+1
2016-08-31 15:38:48 +00:00
2016-09-21 15:20:37 +00:00
.4 lda K.CTime.ModDay
sta K.CTime.Mod
2016-08-31 15:38:48 +00:00
sec
sbc #60
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.ModDay+1
2016-08-31 15:38:48 +00:00
sbc #0
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.ModDay+2
2016-08-31 15:38:48 +00:00
sbc #0
bcc .5
2016-09-21 15:20:37 +00:00
sta K.CTime.ModDay+2
2016-08-31 15:38:48 +00:00
pla
2016-09-21 15:20:37 +00:00
sta K.CTime.ModDay+1
2016-08-31 15:38:48 +00:00
pla
2016-09-21 15:20:37 +00:00
sta K.CTime.ModDay
2016-08-31 15:38:48 +00:00
2016-09-21 15:20:37 +00:00
inc K.CTime.Div60
2016-08-31 15:38:48 +00:00
bne .4
2016-09-21 15:20:37 +00:00
inc K.CTime.Div60+1
2016-08-31 15:38:48 +00:00
bne .4
.5 pla
pla
2016-09-21 15:20:37 +00:00
lda K.CTime.Mod
ldy #S.Time.SECOND
2016-08-31 15:38:48 +00:00
sta (ZPQuickPtr2),y
2016-09-21 15:20:37 +00:00
stz K.CTime.Div3600
2016-08-31 15:38:48 +00:00
2016-09-21 15:20:37 +00:00
.6 lda K.CTime.Div60
sta K.CTime.Mod
2016-08-31 15:38:48 +00:00
sec
sbc #60
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.Div60+1
2016-08-31 15:38:48 +00:00
sbc #0
pha
bcc .7
2016-09-21 15:20:37 +00:00
sta K.CTime.Div60+1
2016-08-31 15:38:48 +00:00
pla
2016-09-21 15:20:37 +00:00
sta K.CTime.Div60
2016-08-31 15:38:48 +00:00
2016-09-21 15:20:37 +00:00
inc K.CTime.Div3600
2016-08-31 15:38:48 +00:00
bne .6
.7 pla
2016-09-21 15:20:37 +00:00
lda K.CTime.Mod
dey ldy #S.Time.MINUTE
2016-08-31 15:38:48 +00:00
sta (ZPQuickPtr2),y
2016-09-21 15:20:37 +00:00
lda K.CTime.Div3600
dey ldy #S.Time.HOUR
2016-08-31 15:38:48 +00:00
sta (ZPQuickPtr2),y
2016-09-21 15:20:37 +00:00
lda K.CTime.DivDay WDAY computation : (DivDay + DAY0) mod 7
clc
2016-08-31 15:38:48 +00:00
adc #DAY0
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.DivDay+1
2016-08-31 15:38:48 +00:00
adc /DAY0
eor #$ff
tax
pla
2016-09-21 15:20:37 +00:00
.8 sta K.CTime.Mod
2016-08-31 15:38:48 +00:00
sec
sbc #7
bcs .8
inx
bne .8
2016-09-21 15:20:37 +00:00
lda K.CTime.Mod
ldy #S.Time.WDAY
2016-08-31 15:38:48 +00:00
sta (ZPQuickPtr2),y
lda #CENTURY0
2016-09-21 15:20:37 +00:00
sta K.CTime.Century
2016-08-31 15:38:48 +00:00
lda #YEAR0
2016-09-21 15:20:37 +00:00
sta K.CTime.Year
2016-09-02 06:09:44 +00:00
2016-09-21 15:20:37 +00:00
K.CTime2Time.Year
.1 ldy K.CTime.Century
lda K.CTime.Year
jsr K.IsLeapYearYA if Leap year CC
lda K.CTime.DivDay
2016-09-01 05:42:28 +00:00
sbc #365
pha
2016-09-21 15:20:37 +00:00
lda K.CTime.DivDay+1
2016-09-01 05:42:28 +00:00
sbc /365
2016-09-02 06:09:44 +00:00
bcc .2
2016-08-31 15:38:48 +00:00
2016-09-21 15:20:37 +00:00
sta K.CTime.DivDay+1
2016-09-01 05:42:28 +00:00
pla
2016-09-21 15:20:37 +00:00
sta K.CTime.DivDay
2016-09-01 05:42:28 +00:00
2016-09-21 15:20:37 +00:00
inc K.CTime.Year
lda K.CTime.Year
2016-09-01 05:42:28 +00:00
cmp #100
2016-09-02 06:09:44 +00:00
bne .1
2016-09-21 15:20:37 +00:00
stz K.CTime.Year
inc K.CTime.Century
2016-09-02 06:09:44 +00:00
bne .1
2016-09-01 05:42:28 +00:00
2016-09-02 06:09:44 +00:00
.2 pla
2016-09-21 15:20:37 +00:00
lda K.CTime.Century
* ldy #S.Time.CENTURY
2016-09-01 05:42:28 +00:00
sta (ZPQuickPtr2)
2016-09-21 15:20:37 +00:00
ldy #S.Time.YEAR
lda K.CTime.Year
2016-09-01 05:42:28 +00:00
sta (ZPQuickPtr2),y
2016-09-02 06:09:44 +00:00
clc
rts
2016-09-01 05:42:28 +00:00
*--------------------------------------
2016-09-21 15:20:37 +00:00
* K.StrFTime
* In :
2016-09-21 15:20:37 +00:00
* PULLW = Src PTR To K.Time
* PULLW = Src PTR To Format String
2016-09-05 06:10:04 +00:00
* 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
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime >PULLW ZPQuickPtr1
2016-09-05 06:10:04 +00:00
>PULLW ZPQuickPtr2
>PULLW ZPQuickPtr3
2016-09-05 06:10:04 +00:00
lda #0
sta (ZPQuickPtr3) Reset target PSTR length
tay
2016-09-05 06:10:04 +00:00
.1 iny
lda (ZPQuickPtr2),y
cmp #'%'
beq .2
phy
2016-09-21 15:20:37 +00:00
jsr K.StrFTime.addChar
ply
2016-09-05 06:10:04 +00:00
.10 tya
cmp (ZPQuickPtr2)
bne .1
rts
2016-09-05 06:10:04 +00:00
.2 tya
cmp (ZPQuickPtr2)
beq .8
iny
2016-09-21 15:20:37 +00:00
ldx #K.StrFTime.JMPL-K.StrFTime.Tbl-1
2016-09-05 06:10:04 +00:00
.3 lda (ZPQuickPtr2),y
2016-09-21 15:20:37 +00:00
cmp K.StrFTime.Tbl,x
2016-09-05 06:10:04 +00:00
beq .4
dex
bpl .3
2016-09-05 06:10:04 +00:00
beq .10
2016-09-21 15:20:37 +00:00
.4 lda K.StrFTime.JMPL,x
2016-09-05 06:10:04 +00:00
sta .5+1
2016-09-21 15:20:37 +00:00
lda K.StrFTime.JMPH,x
2016-09-05 06:10:04 +00:00
sta .5+2
phy
.5 jsr $ffff
ply
bra .10
.8 rts
2016-09-05 06:10:04 +00:00
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.A ldx #3 Max Len
.HS 2C Bit abs
2016-09-21 15:20:37 +00:00
K.StrFTime.AA ldx #15
>LDYAI K.StrFTime.DAY
>STYA ZPQuickPtr4
2016-09-21 15:20:37 +00:00
ldy #S.Time.WDAY
bra K.StrFTime.STR
2016-09-21 15:20:37 +00:00
K.StrFTime.B ldx #3
.HS 2C Bit abs
2016-09-21 15:20:37 +00:00
K.StrFTime.BB ldx #15
>LDYAI K.StrFTime.MON
>STYA ZPQuickPtr4
2016-09-21 15:20:37 +00:00
ldy #S.Time.MONTH
2016-09-21 15:20:37 +00:00
K.StrFTime.STR lda (ZPQuickPtr1),y get required S.Time field value
tay
beq .8 Illegal value
.1 dey range 0..x
beq .2
lda (ZPQuickPtr4)
sec
adc ZPQuickPtr4
sta ZPQuickPtr4
bcc .1
inc ZPQuickPtr4+1
bra .1
.2 ldy #0
.3 iny
lda (ZPQuickPtr4),y
phy
2016-09-21 15:20:37 +00:00
jsr K.StrFTime.addChar
pla
cmp (ZPQuickPtr4)
beq .8
tay
dex
bne .3
.8 rts
2016-09-21 15:20:37 +00:00
K.StrFTime.D ldy #S.Time.DAY
bra K.StrFTime.addDecPtr1Y
K.StrFTime.HH ldy #S.Time.HOUR
bra K.StrFTime.addDecPtr1Y
K.StrFTime.II ldy #S.Time.HOUR
lda (ZPQuickPtr1),y
cmp #12
bcc .1
sbc #12
2016-09-21 15:20:37 +00:00
.1 bra K.StrFTime.addDecA
K.StrFTime.M ldy #S.Time.MONTH
bra K.StrFTime.addDecPtr1Y
K.StrFTime.MM ldy #S.Time.MINUTE
bra K.StrFTime.addDecPtr1Y
K.StrFTime.P ldy #S.Time.HOUR
lda (ZPQuickPtr1),y
cmp #12
bcc .1
lda #'p'
.HS 2C bit abs
.1 lda #'a'
2016-09-21 15:20:37 +00:00
jsr K.StrFTime.addChar
lda #'m'
2016-09-21 15:20:37 +00:00
bra K.StrFTime.addChar
K.StrFTime.SS ldy #S.Time.SECOND
bra K.StrFTime.addDecPtr1Y
K.StrFTime.W ldy #S.Time.WDAY
bra K.StrFTime.addDecPtr1Y
K.StrFTime.YY ldy #S.Time.CENTURY
jsr K.StrFTime.addDecPtr1Y
K.StrFTime.Y ldy #S.Time.YEAR
2016-09-05 06:10:04 +00:00
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.addDecPtr1Y
2016-09-05 06:10:04 +00:00
lda (ZPQuickPtr1),y
2016-09-21 15:20:37 +00:00
K.StrFTime.addDecA
sta K.StrFTime.BIN
stz K.StrFTime.DEC
sed
ldx #8
2016-09-21 15:20:37 +00:00
.1 asl K.StrFTime.BIN
2016-09-21 15:20:37 +00:00
lda K.StrFTime.DEC
adc K.StrFTime.DEC
sta K.StrFTime.DEC
dex
bne .1
cld
2016-09-21 15:20:37 +00:00
* lda K.StrFTime.DEC already in A
2016-09-05 06:10:04 +00:00
lsr
lsr
lsr
lsr
ora #$30
2016-09-21 15:20:37 +00:00
jsr K.StrFTime.addChar
lda K.StrFTime.DEC
2016-09-05 06:10:04 +00:00
and #$0f
ora #$30
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.addChar
pha
lda (ZPQuickPtr3)
inc
sta (ZPQuickPtr3)
tay
pla
sta (ZPQuickPtr3),y
rts
2016-09-05 06:10:04 +00:00
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.TBL .AS "aAbBdHImMpSwyY"
K.StrFTime.JMPL .DA #K.StrFTime.A
.DA #K.StrFTime.AA
.DA #K.StrFTime.B
.DA #K.StrFTime.BB
.DA #K.StrFTime.D
.DA #K.StrFTime.HH
.DA #K.StrFTime.II
.DA #K.StrFTime.M
.DA #K.StrFTime.MM
.DA #K.StrFTime.P
.DA #K.StrFTime.SS
.DA #K.StrFTime.W
.DA #K.StrFTime.Y
.DA #K.StrFTime.YY
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.JMPH .DA /K.StrFTime.A
.DA /K.StrFTime.AA
.DA /K.StrFTime.B
.DA /K.StrFTime.BB
.DA /K.StrFTime.D
.DA /K.StrFTime.HH
.DA /K.StrFTime.II
.DA /K.StrFTime.M
.DA /K.StrFTime.MM
.DA /K.StrFTime.P
.DA /K.StrFTime.SS
.DA /K.StrFTime.W
.DA /K.StrFTime.Y
.DA /K.StrFTime.YY
2016-09-05 06:10:04 +00:00
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.DAY >PSTRING "Monday"
2016-09-05 06:10:04 +00:00
>PSTRING "Tuesday"
>PSTRING "Wednesday"
>PSTRING "Thursday"
>PSTRING "Friday"
>PSTRING "Saturday"
>PSTRING "Sunday"
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.MON >PSTRING "January"
2016-09-05 06:10:04 +00:00
>PSTRING "February"
>PSTRING "March"
>PSTRING "April"
>PSTRING "May"
>PSTRING "June"
>PSTRING "July"
>PSTRING "August"
>PSTRING "September"
>PSTRING "October"
>PSTRING "November"
>PSTRING "December"
*--------------------------------------
* In :
* Y = Century
* A = Year (0..99)
2016-09-01 05:42:28 +00:00
* if (year mod 400 = 0)
* or
* if not (year mod 100 = 0) and (year mod 4 = 0)
* Out :
* CC = Leap
* CS = Not Leap
2016-08-31 15:38:48 +00:00
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.IsLeapYearYA cmp #0 Year = 00 ?
2016-09-01 05:42:28 +00: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
2016-08-31 15:38:48 +00:00
2016-09-01 05:42:28 +00:00
.1 and #$3 mod 4 = 0 ?
bne .8
.9 clc Leap
2016-08-31 15:38:48 +00:00
rts
*--------------------------------------
2016-09-21 15:20:37 +00:00
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
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.BIN .BS 1
K.StrFTime.DEC .BS 1 always < 100
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.StrFTime.MDAY .DA #3,#0,#3,#2,#3,#2,#3,#3,#2,#3,#2,#3
MAN
2016-09-21 15:20:37 +00:00
SAVE SYS/KERNEL.S.Time
LOAD SYS/KERNEL.S
ASM