PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF /A2OSX.BOOT/SYS/KM.NSC
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/IO.I
				.INB INC/MONITOR.I
				.INB INC/PRODOS.I
*--------------------------------------
TmpPtr1			.EQ	$0
TmpPtr2			.EQ	$2
DS1216E.DATA	.EQ $200
*--------------------------------------
NSC.Init		>LDAXI NSC.MSG0
				jsr NSC.Print
				lda MACHID
				and #MACHID.CLK			Clock already installed ?
				beq .1
	
				>LDAXI NSC.MSG1
				jsr NSC.Print
				rts
				
.1				jsr NSC.Detect
				bcc .2

				>LDAXI NSC.MSG2
				jsr NSC.Print
				rts

.2				jsr NSC.Install
				
				lda MACHID
				ora #MACHID.CLK
				sta MACHID

				>LDAXI NSC.MSG3
				jsr NSC.Print
				rts
*--------------------------------------
NSC.Detect		php
				sei
				lda $CFFF
				pha
				
				sta $C300

				ldx #7
				
.1				ldy #8
.2				lda $C304
				
				lsr
				ror DS1216E.DATA1,x
				
				dey
				bne .2
				
				dex
				bpl .1
				
				lda $C304				Reset DS1216E comparison register with READ A2=1
				
				ldx #7					Read 8 bytes...
				
.3				lda DS1216E.PATTERN,x
				phx
				ldx #8					....of 8 bits
				
.4				ldy #0
				lsr
				bcc .5
				iny
.5				pha
				lda $C300,y				Write Pattern bit in A0, with A2=0
				pla
				dex
				bne .4
				
				plx
				dex
				bpl .3
				
				ldx #7
				
.6				ldy #8
.7				lda $C304
				
				lsr
				ror DS1216E.DATA2,x
				
				dey
				bne .7
				
				dex
				bpl .6
				
				pla
				bmi .8
				sta $CFFF
.8				plp

				ldx #7
.81				lda DS1216E.DATA1,x
				cmp DS1216E.DATA2,x
				bne .9
				dex
				bpl .81
				
				sec
				rts
				
.9				clc
				rts
*--------------------------------------
DS1216E.DATA1	.BS 8				
DS1216E.DATA2	.BS 8				
*--------------------------------------
NSC.Install		lda DATETIME+1
				sta TmpPtr1
				sec
				sbc #NSCDRV.B.START
				sta NSCDRV.OFFSET
				
				lda DATETIME+2
				sta TmpPtr1+1
				sbc /NSCDRV.B.START
				sta NSCDRV.OFFSET+1
				
				ldy #1
				
				ldx #0

.1				lda NSCDRV.RELOC,x
				beq .2
				sta TmpPtr2
				inx
				lda NSCDRV.RELOC,x
				sta TmpPtr2+1
				
				lda (TmpPtr2)
				clc
				adc NSCDRV.OFFSET
				sta (TmpPtr2)
				
				lda (TmpPtr2),y
				adc NSCDRV.OFFSET+1
				sta (TmpPtr2),y
				
				inx
				bne .1
				
.2				lda RRAMWRAMBNK1
				lda RRAMWRAMBNK1
				
.3				ldy #0
.7				lda NSCDRV.B.START,y
				sta (TmpPtr1),y
				iny
				cpy #NSCDRV.SIZE
				bne .7 
				 
				lda RROMBNK1
				
				lda #$4C
				sta DATETIME
				rts
*--------------------------------------
NSCDRV.OFFSET	.BS 2
NSCDRV.RELOC	.DA NSCDRV.R1+1
				.DA 0
				.DA NSCDRV.R2+1
				.DA NSCDRV.R3+1
				.DA NSCDRV.R4+1
				.DA NSCDRV.R5+1
				.DA NSCDRV.R6+1
				.DA NSCDRV.R7+1
				.DA NSCDRV.R8+1
				.DA NSCDRV.R9+1
				.DA 0
*--------------------------------------
NSC.Print		>STAX TmpPtr1
				ldy #0
				
.1				lda (TmpPtr1),y
				beq .9
				ora #$80
				jsr COUT
				iny
				bne .1
.9				jmp CROUT
*--------------------------------------
NSC.MSG0		>CSTRING "NSC ('No-Slot-Clock'/DS1216E) Driver For A2osX"
NSC.MSG1		>CSTRING "A Clock Driver Is Already Installed."
NSC.MSG2		>CSTRING "DS1216E Chip Not Detected."
NSC.MSG3		>CSTRING "DS1216E Driver Successfully Installed."
*--------------------------------------
* Driver For DS1216E
*--------------------------------------
NSCDRV.B.START	.EQ *
NSCDRV			php
				sei
				lda $CFFF				Make cards release $C8xx space
				pha
				
				sta $C300
				
				lda $C304				Reset DS1216E comparison register with READ A2=1
				
				ldy #7					Read 8 bytes...
				
NSCDRV.1		
NSCDRV.R1		lda DS1216E.PATTERN,y
				phy
				ldy #8					....of 8 bits
				
NSCDRV.2		ldx #0
				lsr
				bcc NSCDRV.21
				inx
				
NSCDRV.21		bit $C300,x				Write Pattern bit in A0, with A2=0
				dey
				bne NSCDRV.2
				
				ply
				dey
				bpl NSCDRV.1
				
				ldx #7
				
NSCDRV.4		ldy #8
NSCDRV.5		lda $C304				Read Byte...
				
				lsr
NSCDRV.R2		ror DS1216E.DATA,x
				
				dey
				bne NSCDRV.5
				
NSCDRV.R3		lda DS1216E.DATA,x
				pha
				lsr
				lsr
				lsr
				lsr
				tay
				pla
				and #$0F

				clc

				.HS	2C					Bit Absolute to skip adc #$0A

NSCDRV.6		adc #$0A
				dey
				bpl NSCDRV.6			

NSCDRV.R4		sta DS1216E.DATA,x
				
				dex
				bpl NSCDRV.4
				
NSCDRV.R5		lda	DS1216E.DATA+4		Get HH
				sta	TIMELO+1
				
NSCDRV.R6		lda	DS1216E.DATA+5		Get mm
				sta	TIMELO
				
NSCDRV.R7		lda	DS1216E.DATA+1		Get MM
				asl
				asl	
				asl
				asl
				asl
NSCDRV.R8		ora	DS1216E.DATA+2		Get DD
				sta	DATELO
NSCDRV.R9		lda	DS1216E.DATA		Get YY
				rol	
				sta	DATELO+1			
				
				pla
				bmi .99
				sta $CFFF
.99				plp
				rts
*--------------------------------------
DS1216E.PATTERN	.HS	5CA33AC55CA33AC5	Reverted 7->0
*DS1216E.DATA	.BS 8					Reverted YY MM DD Day HH mm SS CS
*--------------------------------------
NSCDRV.B.END	.EQ *
NSCDRV.SIZE		.EQ NSCDRV.B.END-NSCDRV.B.START
*--------------------------------------
* CONTROL SECTION :
*--------------------------------------
				.DO NSCDRV.SIZE>125
				ERROR:NSCDRV.SIZE too big
				.FIN
*--------------------------------------
MAN
SAVE SYS/KM.NSC.S
ASM