

NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/nscutil
*--------------------------------------
				.INB inc/macros.i
				.INB inc/io.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.USAGE		.DA MSG.USAGE
L.MSG.CRLF		.DA MSG.CRLF
				.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

				>PUSHW L.MSG.READ.KO
				>PUSHBI 0
				>SYSCALL PrintF
				lda #MLI.E.NODEV
				sec
				rts

.8				jsr NSC.Dump

				>PUSHW L.MSG.USAGE
				>PUSHBI 0
				>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
				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+2

				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 RDCXROM
				php
				
				sta SETCXROM

				ldx #8

.1				ldy #8

.2				lda $C304
				lsr
				ror DS1216E.DETECT-1,x
				dey
				bne .2

				dex
				bne .1

				plp
				bmi .8

				sta CLRCXROM

.8				plp
				rts
*--------------------------------------
NSC.Read		php
				sei

				lda RDCXROM
				php
				
				sta SETCXROM

				jsr NSC.Select

				ldx #8					Read 8 bytes...

.1				ldy #8

.2				lda $C304
				lsr
				ror DS1216E.DATA-1,x
				dey
				bne .2

				dex
				bne .1

				plp
				bmi .8

				sta CLRCXROM

.8				plp
				rts
*--------------------------------------
NSC.Write		php
				sei

				lda RDCXROM
				php
				
				sta SETCXROM

				jsr NSC.Select

				ldx #8					Write 8 bytes...

.3				lda DS1216E.DATA-1,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
				bne .3

				plp
				bmi .8

				sta CLRCXROM

.8				plp
				rts
*--------------------------------------
NSC.Select		sta $C300
                lda $C00B               Workaround for Ultrawarp bug

				lda $C304				Reset DS1216E comparison register with READ A2=1

				ldx #8					Read 8 bytes...

.3				lda DS1216E.PATTERN-1,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
				bne .3

				rts
*--------------------------------------
NSC.Dump		>PUSHW L.MSG.READ.OK1
				ldx #1
				ldy #1
				lda DS1216E.DATA+3
				bit #%00010000
				beq .1

				dex
.1				bit #%00100000

				beq .2
				dey

.2				tya
				>PUSHA
				txa
				>PUSHA

				>PUSHBI 2
				>SYSCALL PrintF

				>LDYA L.MSG.READ.OK2.24
				bit DS1216E.DATA+4
				bpl .3

				>LDYA L.MSG.READ.OK2.12

.3				>SYSCALL PutS

				>PUSHW L.MSG.READ.OK3
				>PUSHBI 0
				>SYSCALL PrintF

				lda DS1216E.DATA
				jsr PrintBCD

				lda #'/'
				>SYSCALL PutChar

				lda DS1216E.DATA+1
				jsr PrintBCD

				lda #'/'
				>SYSCALL PutChar

				lda DS1216E.DATA+2
				jsr PrintBCD

				lda #','
				>SYSCALL PutChar

				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

				>PUSHW L.MSG.CRLF
				>PUSHBI 0
				>SYSCALL PrintF
				rts
*--------------------------------------
PrintBCD		pha
				lsr
				lsr
				lsr
				lsr
				ora #$30
				>SYSCALL PutChar

				pla
				and #$0f
				ora #$30
				>SYSCALL PutChar
				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\nCurrent Date/Time : "
MSG.USAGE		.AS "\r\nTo Reset the chip and set clock, type:\r\nNSCUTIL YY/MM/DD,hh:mm:ss"
MSG.CRLF		.AZ "\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
