NEW
PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF SYS/KM.NSC
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/IO.I
				.INB INC/MONITOR.I
				.INB INC/MLI.I
*--------------------------------------
TmpPtr1			.EQ	$0
TmpPtr2			.EQ	$2
offset			.EQ $4
*--------------------------------------
NSC.Init		>LDYAI NSC.MSG0
				jsr NSC.Print
				
				lda MACHID
				and #MACHID.CLK			Clock already installed ?
				beq .1
	
				>LDYAI NSC.MSG1
				jmp NSC.Print
				
.1				jsr NSC.Detect
				bcc .2

				>LDYAI NSC.MSG2
				jmp NSC.Print

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

				>LDYAI NSC.MSG3
				jmp NSC.Print
*--------------------------------------
DS1216E.DATA1	.EQ $10				
DS1216E.DATA2	.EQ $18				
*--------------------------------------
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
*--------------------------------------
NSC.Install		lda DATETIME+1
				sta TmpPtr1
				sec
				sbc #NSCDRV.B.START
				sta offset
				
				lda DATETIME+2
				sta TmpPtr1+1
				sbc /NSCDRV.B.START
				sta 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 offset
				sta (TmpPtr2)
				
				lda (TmpPtr2),y
				adc offset+1
				sta (TmpPtr2),y
				
				inx
				bne .1
				
.2				lda RRAMWRAMBNK1
				lda RRAMWRAMBNK1
				
.3				ldy #NSCDRV.SIZE-1		always < 128

.7				lda NSCDRV.B.START,y
				sta (TmpPtr1),y
				dey
				bpl .7 
				 
				lda RROMBNK1
				
				lda #$4C
				sta DATETIME
				rts
*--------------------------------------
NSCDRV.RELOC	.DA NSCDRV.R1+1
				.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		sty TmpPtr1
				sta TmpPtr1+1
				
				ldy #0
				
.1				lda (TmpPtr1),y
				beq .8

				jsr COUT
				iny
				bne .1

.8				jmp CROUT
*--------------------------------------
NSC.MSG0		.AZ -"NSC 'No-Slot-Clock'/DS1216E Driver For A2osX"
NSC.MSG1		.AZ -"Clock Already Present!"
NSC.MSG2		.AZ -"No DS1216E Detected!"
NSC.MSG3		.AZ -"DS1216E Driver Successfully Installed."
*--------------------------------------
* Driver For DS1216E
*--------------------------------------
NSCDRV.B.START	.EQ *
NSCDRV			php
				sei
				sta $CFFF				Make cards release $C8xx space
				
				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			

				plp
				rts
*--------------------------------------
DS1216E.PATTERN	.HS	5CA33AC55CA33AC5	Reverted 7->0
DS1216E.DATA	.BS 8					Reverted YY MM DD Day HH mm SS CS
*--------------------------------------
				.LIST ON
NSCDRV.SIZE		.EQ *-NSCDRV.B.START
				.LIST OFF
*--------------------------------------
* CONTROL SECTION :
*--------------------------------------
				.DO NSCDRV.SIZE>125
*				ERROR:NSCDRV.SIZE too big
				.FIN
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KM.NSC.S
ASM
