Veckonummer från UNIX-time? LÖST

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Nu är frågan med veckonumren löst och tycks fungera fint. Har provat ett antal "svåra" datum för att validera algoritmen och den har hållit.
Alla synpunkter och förslag på förbättringar, förenkligar och effektiviseringar
tas givetvis tacksamt emot.
Koden kanske är lite svårläst p.g.a. min speciella assembler, men med
kommentarerna så bör det gå att följa utan problem vad som görs.

Givetvetvis med reservation för buggar.

Kod: Markera allt

.

.WEEK	*			WEEK#
	JSR .SPLIT		GET AND SPLIT UNIX-TIME
	JSR .DATE		EXTRACT YMD + DAY#
	JSR .SPLIT		GET UNIX-DATE AGAIN
	LOD A,TIMBUF.DAYNUM	GET CURRENT DAY#
	SUB ACC.QUOT,A		CALC UNIX-DATE FOR 1/1
	LOD A,TIMBUF.DAYNUM+1
	SFS CY
	DEC ACC.QUOT+1
	SUB ACC.QUOT+1,A
	LOD A,#3+(4-1)		ADJUST FOR EVEN MOD7 ON MONDAYS AND GET 4/1
	ADD ACC.QUOT,A
	SFC CY
	INC ACC.QUOT+1
	STZ ACC.DIVIS+1 	GET 7
	LOD A,#7
	LOD ACC.DIVIS,A
	JSR DIVIDE.16		CALC WHAT DAY THAT IS
	LOD A,ACC.REMIND	GET IT
	LOD PAD0,A		SAVE IT
	*			CALC DAY COUNT SINCE START OF WEEK1
	ADD A,#4		ADJ. UPWARDS TO AVOID DAY# TURNING NEGATIVE
	ADD A,TIMBUF.DAYNUM	GET DAY# AND ADJUST IT
	LOD ACC.QUOT,A
	LOD A,TIMBUF.DAYNUM+1
	SFC CY
	INC A=TIMBUF.DAYNUM+1
	LOD ACC.QUOT+1,A
	JSR DIVIDE.16		CALC WEEK#, ALSO GIVES WEEKDAY
	LOD A,ACC.REMIND	PUT WEEKDAY
	LOD TIMBUF.DAY,A
	LOD A,ACC.QUOT		PUT WEEK#
	LOD TIMBUF.WEEK,A
	*			DONE...NOT YET. WE ALSO HAVE 29/12..3/1
	SFC Z			HAS WEEK# BECOME 0 = WEEK52/53 TURNOVER ?
	JMP .WEEK0		YES-CORRECT IT
	SUR A,#53		AT WEEK# 53?
	SFS Z
	RTS			NO-DONE
	*			TEST IF WEEK# 53 IS TO KEEP
	LOD A,#3		ARE WE AT LEAP YEAR?
	AND A,TIMBUF.YEAR
	SFC Z
	INC PAD0		YES-COMPENSATE FOR 29/2
	LOD A,PAD0		GET LEAP-ADJUSTED "DAYCODE" FOR 4/1
	ADD A,#255-5		BEYOND SATURDAY?
	SFS CY
	SUR A,#255-3		NO-TEST IF REACHED THURSDAY?
	LOD A,#1		GET 1
	SFS CY
	LOD TIMBUF.WEEK,A	YES-WE ARE AT WEEK# 1, CORRECT IT
	RTS			DONE
.WEEK0	*			WEEK# 0 MEANS HIGH WEEK# EXTENDS INTO NEW YEAR
	LOD A,#52		ASSUME WEEK# 52, CORRECT IT TO THAT
	LOD TIMBUF.WEEK,A
	DEC PAD0		IS 4/1 A MONDAY = TURNS NEGATIVE HERE?
	LOD A,TIMBUF.YEAR	ARE WE AT YEAR AFTER A LEAP YEAR?
	AND A,#3
	EOR A,#1
	SFC Z
	DEC PAD0		YES-ALLOW TUEASDAYS TOO TO..
	SBR PAD0,7
	INC TIMBUF.WEEK 	..INDICATE WE ARE AT WEEK# 53
	RTS			DONE

[/size]
Skriv svar