[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: PRODOS file date query



Thunderclock driver:


TCLOCK_P1	PROC	ORG $D742

;	This EdAsm/Asm816 source code file was converted to AsmIIGS
;	by EdAsmCVTIIGS version 1.0D3 on 1/24/89 at 10:39:28 AM

* Converted and reformatted by Monte Benaresh -- February 1989

		MACHINE	M6502
		longa	off
		longi	off

***********************************************************
*                                                         *
*          PRODOS 8 CLOCK DRIVER INTERFACE ROUTINE        *
*                                                         *
*           COPYRIGHT APPLE COMPUTER, INC., 1983-86       *
*                                                         *
*                    ALL RIGHTS RESERVED                  *
*                                                         *
***********************************************************

PRODOS		EQU	0
EDNET		EQU	1
OS		EQU	PRODOS

***************************************
*    CLOCK - PRODOS INTERFACE ROUTINE
*          BY JAMES R. HUSTON
*     WARNING: HARD CODED FOR SLOT 1
***************************************

TENS		EQU	$3A	 	;NO CONFLICT SINCE MONTH IS LAST PROCESSED.
MONTH		EQU	$3A
WKDAY		EQU	$3B
DAY		EQU	$3C
HOUR		EQU	$3D
MINUTE		EQU	$3E

WTTCP		EQU	$C10B
RDTCP		EQU	$C108	 	;CLOCK READ ENTRY POINTS.
CLKMODE		EQU	$538	 	;(+$CN=$5F8+N)
DATE		EQU	$BF90	 	;PRODOS DATE
TIME		EQU	$BF92	 	;PRODOS TIME.

INBUF		EQU	$200	 	;INPUT BUFFER.

READCLK		LDX	CLKSLT		 ;PRESERVE CURRENT MODE FOR THUNDERCLOCK
		LDA	CLKMODE,X
		PHA
		LDA	#$A3		 ;SEND NUMERIC MODE BYTE TO THUNDERCLOCK
		JSR	WTTCP
CLKSLT		EQU	*+2
		JSR	RDTCP		;READ MONTH, DAY OF WEEK, DAY OF MONTH, AND TIME
		CLC			;INTO INPUT BUFFER.
		LDX	#4		;INDEX FOR 5 VALUES
		LDY	#$C		;READ MINUTES FIRST, MONTH LAST.
CONVRT		LDA	INBUF,Y		;CONVERT VALUES TO BINARY.
		AND	#$7		;NO VALUE > 5 DECIMAL.
		STA	TENS		;MULTIPLY 'TENS' PLACE VALUE.
		ASL	A
		ASL	A
		ADC	TENS		;NOW IT'S TIMES 5.
		ASL	A		;NOW IT IS TIMES 10!
		ADC	INBUF+1,Y	;ADD TO ASCII 'ONES' PLACE
		SEC			;AND SUBTRACT OUT THE ASCII...
		SBC	#$B0

CNVRT2		STA	MONTH,X		;SAVE CONVERTED VALUE.
		DEY			;INDEX TO NEXT LOWER VALUE.
		DEY
		DEY
		DEX			;ARE THERE MORE VALUES?
		BPL	CONVRT		;BRANCH IF THERE ARE.
		TAY			;ACC STILL CONTAINS MONTH, SAVE IN Y FOR NOW.
		LSR	A
		ROR	A
		ROR	A
		ROR	A	 	;(HI BIT OF MONTH HELD IN CARRY)
		ORA	DAY
		STA	DATE	 	;SAVE LOW VALUE OF DATE.

		PHP			;SAVE HI BIT OF MONTH FOR NOW.
		AND	#$1F		;ISOLATE DAY AGAIN.
					;(WHEN MONTH >7 CARRY SET ACCOUNTED FOR IN FOLLOWING ADD)
		ADC	TDAYS-1,Y	;REMEMBER THAT Y=MONTH.
		BCC	CNVRT3		;BRANCH NOT SEPT 13 THRU 30.
		ADC	#3		;ADJUST FOR MOD 7 WHEN DAY > 256.
CNVRT3		SEC
CNVRT4		SBC	#7
		BCS	CNVRT4		;LOOP UNTIL LESS THAN 0.
		ADC	#7		;NOW MAKE IT IN THE RANGE OF 0-6.
		SBC	WKDAY		;THE DELTA PROVIDES YEARS OFFSET.
		BCS	CNVRT5		;BRANCH IF POSITIVE.
		ADC	#7		;ELSE MAKE IT POSITIVE AGAIN.
CNVRT5		TAY			;LOOK UP YEAR!
		LDA	YRADJ,Y
		PLP			;LASTLY, COMBINE WITH HI BIT OF MONTH.
		ROL	A
		STA	DATE+1		;AND SAVE IT.
		LDA	HOUR
		STA	TIME+1		;MOVE HOUR AND MINUTE TO PRODOS GLOBALS.
		LDA	MINUTE
		STA	TIME
		PLA
		LDX	CLKSLT		;RESTORE PREVIOUS MODE.
		STA	CLKMODE,X
		RTS			;ALL DONE...

; This table contains entries for the cumulative number of days in a
year,
; one entry for each month.  The values are modulo 256.
;
; For example, at the beginning of January, 0 days of the year have
elapsed.
; On July 1st, 181 days have elapsed.

TDAYS		DC.B	0		;January
		dc.b	31		;February
		dc.b	59		;March
		dc.b	90		;April
		DC.B	120		;May
		dc.b	151		;June
		dc.b	181		;July
		dc.b	211		;August
		DC.B	242		;September
		dc.b	20		;October (remember, MOD 256)
		dc.b	51		;November
		dc.b	81		;December

; The following table is used to look up the current year, based on
the current
; month, day, and day of week.  The first entry in the table
corresponds to the
; year in which January 1st falls on a Monday.  The second entry is
the year which
; has January 1st on a Sunday, and so on backwards through the days of
the week.
;
; To refresh the table (because time goes on...), start with the
current year, look
; at your calendar and found out what day January 1st was on.  Fill in
the appropriate
; entry in the table, then continue on for the next five years.
;
; While filling in new entries for the table, there should be one
blank entry right
; next to a leap year entry.  In this case, copy the leap year entry
into the blank
; entry.  (Keep in mind that the year 2000 is NOT a leap year!)
;

YRADJ		DC.B	96		;Monday
		dc.b	95		;Sunday
		dc.b	94		;Saturday
		dc.b	93		;Friday
		DC.B	98		;Thursday
		dc.b	97		;Wednesday
		dc.b	96		;Tuesday

		END