NEW
PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF BIN/NSCUTIL
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/MLI.E.I
*--------------------------------------
ZPPtr1			.EQ ZPBIN
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA #0
				.DA #0
				.DA CS.END-CS.START		CS
				.DA DS.END-DS.START		DS
				.DA #16					SS
				.DA #2					ZP
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.MSG.READ.KO	.DA MSG.READ.KO
L.MSG.READ.OK1	.DA MSG.READ.OK1
L.MSG.READ.OK2.12	.DA MSG.READ.OK2.12
L.MSG.READ.OK2.24	.DA MSG.READ.OK2.24
L.MSG.READ.OK3	.DA MSG.READ.OK3
L.MSG.READ.OK4	.DA MSG.READ.OK4
L.MSG.USAGE		.DA MSG.USAGE
				.DA 0
*--------------------------------------
CS.INIT			clc
				rts
*--------------------------------------
CS.RUN			ldy #S.PS.ARGC
				lda (pPs),y
				cmp #1
				bcs CS.RUN.SET
			
CS.RUN.READ		jsr NSC.Init
				jsr NSC.Read
				
				ldx #7
		
.1				lda DS1216E.DETECT,x
				eor DS1216E.DATA,x				
				bne .8
				dex
				bpl .1

				>PUSHBI 0
				>LDYA L.MSG.READ.KO
				>SYSCALL printf
				
				lda #MLI.E.NODEV
				sec
				rts
				
.8				jsr NSC.Dump

				>PUSHBI 0
				>LDYA L.MSG.USAGE
				>SYSCALL printf
				
				lda #0					tell TSKMGR that all done ok, but 
				sec						we do not want to stay in memory
				rts

CS.RUN.SET		lda #1
				>SYSCALL ArgV
				>STYA ZPPtr1
				
				>SYSCALL strlen
				cpy #17
				bne .9
				
				ldy #0
				
				stz DS1216E.DATA+7
				
				jsr GetBCD
				bcs .9
				sta DS1216E.DATA+2
				
				lda (ZPPtr1),y
				cmp #'/'
				bne .9
				iny

				jsr GetBCD
				bcs .9
				sta DS1216E.DATA+1

				lda (ZPPtr1),y
				cmp #'/'
				bne .9
				iny

				jsr GetBCD
				bcs .9
				sta DS1216E.DATA

				lda (ZPPtr1),y
				cmp #','
				bne .9
				iny
	
				jsr GetBCD
				bcs .9
				sta DS1216E.DATA+4

				lda (ZPPtr1),y
				cmp #':'
				bne .9
				iny

				jsr GetBCD
				bcs .9
				sta DS1216E.DATA+5

				lda (ZPPtr1),y
				cmp #':'
				bne .9
				iny

				jsr GetBCD
				bcs .9
				sta DS1216E.DATA+6
				stz DS1216E.DATA+7
				
				jsr NSC.Write
				
				lda #0					tell TSKMGR that all done ok, but 
				sec						we do not want to stay in memory
				rts
				
.9				lda #E.SYN
				sec
				rts				
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.QUIT			clc
				rts
*--------------------------------------
NSC.Init		php
				sei
				lda $CFFF
				pha
				
				ldx #7
				
.1				ldy #8
.2				lda $C304
				
				lsr
				ror DS1216E.DETECT,x
				
				dey
				bne .2
				
				dex
				bpl .1
				pla
				bmi .99
				sta $CFFF
.99				plp
				rts
*--------------------------------------
NSC.Select		sta $C300

				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
				rts
*--------------------------------------
NSC.Read		php
				sei
				lda $CFFF
				pha
				
				jsr NSC.Select

				ldx #7
				
.1				ldy #8
.2				lda $C304
				
				lsr
				ror DS1216E.DATA,x
				
				dey
				bne .2
				
				dex
				bpl .1
				pla
				bmi .99
				sta $CFFF
.99				plp
				rts
*--------------------------------------
NSC.Write		php
				sei
				lda $CFFF
				pha
				
				jsr NSC.Select

				ldx #7
				
.3				lda DS1216E.DATA,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
				pla
				bmi .99
				sta $CFFF
.99				plp
				rts
*--------------------------------------
NSC.Dump		ldx #1
				ldy #1
				
				lda DS1216E.DATA+3
				bit #%00010000
				beq .1
				dex
				
.1				bit #%00100000
				beq .2
				dey
				
.2				txa
				>PUSHA
				tya
				>PUSHA
				
				>PUSHBI 2
				>LDYA L.MSG.READ.OK1
				>SYSCALL printf
				
				>PUSHBI 2
				>LDYA L.MSG.READ.OK2.24
				bit DS1216E.DATA+4
				bpl .3
				>LDYA L.MSG.READ.OK2.12
.3				>SYSCALL printf
				
				>PUSHBI 0
				>LDYA L.MSG.READ.OK3
				>SYSCALL printf

				lda DS1216E.DATA+2
				jsr PrintBCD
				lda #'/'
				>SYSCALL PutChar
				lda DS1216E.DATA+1
				jsr PrintBCD
				lda #'/'
				>SYSCALL PutChar
				lda DS1216E.DATA
				jsr PrintBCD
				
				>PUSHBI 0
				>LDYA L.MSG.READ.OK4
				>SYSCALL printf
				
				lda DS1216E.DATA+4
				bpl .4
				and #$1F
.4				and #$3F
				jsr PrintBCD
				lda #':'
				>SYSCALL PutChar
				lda DS1216E.DATA+5
				jsr PrintBCD
				lda #':'
				>SYSCALL PutChar
				lda DS1216E.DATA+6
				jsr PrintBCD
				lda #'.'
				>SYSCALL PutChar
				lda DS1216E.DATA+7
				jsr PrintBCD
				rts
*--------------------------------------
PrintBCD		pha
				lsr
				lsr
				lsr
				lsr
				ora #$30
				>SYSCALL PutChar
				bcs .9
				pla
				and #$0f
				ora #$30
				>SYSCALL PutChar
.9				rts
*--------------------------------------
GetBCD			lda (ZPPtr1),y		
				iny
				jsr IsDigit
				bcs .9
				asl
				asl
				asl
				asl
				sta TmpByte
				lda (ZPPtr1),y		
				iny
				jsr IsDigit
				bcs .9
				and #$0f
				ora TmpByte
.9				rts				
*--------------------------------------
IsDigit			cmp #'0'
				bcc .9
				cmp #'9'+1
				and #$0f
				rts						cc if ok, cs if not
					
.9				sec
				rts
*--------------------------------------
CS.END
MSG.READ.KO		.AZ "DS1216E Not Detected.\r\n"
MSG.READ.OK1	.AZ "DS1216E Detected:/OSC=%d,/RST=%d,mode="
MSG.READ.OK2.12 .AZ "am/pm"
MSG.READ.OK2.24	.AZ "24h"
MSG.READ.OK3	.AZ "\r\nDate:"
MSG.READ.OK4	.AZ "\r\nTime:"
MSG.USAGE		.AZ "\r\n\r\nTo Reset the chip and set clock, type:\r\nNSCUTIL DD/MM/YY,hh:mm:ss\r\n"
DS1216E.PATTERN	.HS	5CA33AC55CA33AC5	Reverted 7->0
DS1216E.DETECT	.BS 8
DS1216E.DATA	.BS 8					Reverted YY MM DD Day HH mm SS CS
TmpByte			.BS 1
*--------------------------------------
DS.START
DS.END
*--------------------------------------
MAN
SAVE USR/SRC/BIN/NSCUTIL.S
ASM
