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
*--------------------------------------
* K.TimeYA  get System Time
*  In :
*   Y,A = PTR to S.TIME
*  Out :
*   S.TIME filled with System date/time
*--------------------------------------
K.TimeYA		>STYA ZPQuickPtr2
				>MLICALL MLIGETTIME
				>LDYAI DATELO
				>STYA ZPQuickPtr1
				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 (ZPQuickPtr1),y		Get Year
				lsr						C is high bit of month
				ldy #S.Time.YEAR
				sta (ZPQuickPtr2),y		set year
				sta K.CTime.Year		for conputing Century/WDAY later
				
				lda (ZPQuickPtr1)		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
				
				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
				sta K.CTime.Century		for conputing WDAY later

				ldy #2
				lda (ZPQuickPtr1),y		Get Min
				tax
				iny
				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)

* 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 (ZPQuickPtr2),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 (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				
				ldy #S.Time.WDAY
				sta (ZPQuickPtr2),y
				
				clc
				rts
*--------------------------------------
* K.CTime2Time
* In : 
*  PULLW = Src CTIME DWORD
*  PULLW = Dst PTR To S.TIME
*--------------------------------------
K.CTime2Time	jsr PullPtr1Ptr2
				
				ldy #3
				
.1				lda (ZPQuickPtr1),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 (ZPQuickPtr2),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 (ZPQuickPtr2),y
				
				lda K.CTime.Div3600
				dey						ldy #S.Time.HOUR
				sta (ZPQuickPtr2),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 (ZPQuickPtr2),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 (ZPQuickPtr2)
				ldy #S.Time.YEAR
				lda K.CTime.Year
				sta (ZPQuickPtr2),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 SYS/KERNEL.S.Time
LOAD SYS/KERNEL.S
ASM
