NEW
  AUTO 3,1
*--------------------------------------
* Thunderclock driver
* hard coded for slot 1
*--------------------------------------
clkmode			.EQ	$0538				clock mode
rdtcp			.EQ	$C108				Thunderclock read entry
wttcp			.EQ	$C10B				Thunderclock write entry
*--------------------------------------
TCLK.START		ldx TCLK.Cx2+2			clock slot = $C1.

				lda clkmode,x			save current mode
				pha
				lda #$A3				send numeric mode byte to Thunderclock

TCLK.Cx1		jsr	wttcp

TCLK.Cx2		jsr	rdtcp				read month, day of week, day of month

				clc						and time into input buffer.
				ldx #$04				index for 5 values.
				ldy	#$0C				read minutes 1st, month last.

.1				lda	inbuf,y				convert values to binary.
				and	#$07				no value > 5 decimal.
				sta	pcl					'tens' place value
				asl	 					multiply by 10
				asl
				adc pcl
				asl 
				adc inbuf+1,y			add to ascii 'ones' place
				sec						and subtract out the ascii
				sbc #$B0
				sta	pcl,x				save converted value.
				dey						index to next lowest value
				dey
				dey
				dex						are there more values?
				bpl .1					if yes.

				tay						contains month
				lsr
				ror
				ror
				ror						high bit of month held in carry
				ora A1L
				sta p8date				save low value of date.
				php						save high bit of month.
				and #$1F				isolate day.
				adc	tdays-1,y			(y = month)
				bcc	.2					branch if not Sept 13 thru 30th

				adc	#$03				adj for mod 7 when day > 256

.2				sec

.3				sbc	#$07
				bcs	.3					loop until < 0.

				adc	#$07				make it in the range of 0-6.
				sbc pch					the delta provides years offset.
				bcs .4					branch if positive

				adc #$07				else make it positive again.

.4				tay		
				lda yradj,y				look up year
				plp						and combine it with hi bit of month
				rol
				sta p8date+1			P8 date

				lda A1L+1				hour
				sta p8time+1			P8 time
				lda A2L					minute
				sta p8time

				pla						restore previous mode.
				ldx TCLK.Cx2+2			clock slot = $C1
				sta clkmode,x
				rts

* this table contains entries for the cumulative # of days in a year,
* one entry for each month. the values are modulo 256.

tdays			.DA #$00				January
				.DA #$1F				February
				.DA #$3B				March
				.DA #$5A				April
				.DA #$78				May
				.DA #$97				June
				.DA #$B5				July
				.DA #$D3				August
				.DA #$F2				September
				.DA #$14				October (MOD 256)
				.DA #$33				November
				.DA #$51				December

* the following table is used to look up the current year, based on
* the current month, day and day of week. The 1st entry corresponds
* to the year in which January 1st falls on a Monday. The 2nd entry
* is the year which January 1st is Sunday, and so on backwards thru
* the days of the week.

yradj			.DA #$12				Monday
				.DA #$17				Sunday
				.DA #$16				Saturday
				.DA #$15				Friday
				.DA #$14				Thursday
				.DA #$14				Wednesday
				.DA #$13				Tuesday

TCLK.LEN		.EQ *-TCLK.START
*--------------------------------------
MAN
SAVE USR/SRC/PRODOS.FX/PRODOS.S.TCLK
LOAD USR/SRC/PRODOS.FX/PRODOS.S
ASM
