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 ldy #8 Read 8 bytes... .3 lda DS1216E.PATTERN-1,y phy ldy #8 ....of 8 bits .4 ldx #0 lsr bcc .5 inx .5 bit $C300,x Write Pattern bit in A0, with A2=0 dey bne .4 ply dey 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