; NUC-KP4.INS - KayPro 4-84 & KayPro 10 - 04/21/86
;
; This insert is for the Kaypro standard internal clock.
;
; Note: This is an insert, not an overlay.
;
; ========
; 04/21/86  Modified for NUBYE
; 07/15/86  First version based upon code found in TIMEx.ASM - Wayne Masters
; ========
;
; Use the program TIMEx.ASM to initialize your clock with correct date/time
; prior to running NUBYE.
;
;
CENTURY EQU     19H             ; 19h = 19 bcd, reset this every 100 years
CYEAR   EQU     85H             ; 85h = 85 bcd, reset this every year
RTCA    EQU     20H             ; Clock address select reg
RTCD    EQU     24H             ; Clock data register
RTCS    EQU     22H             ; Clock status register
REGEND  EQU     8               ; Ending register count for time loop
;
TIME:   MVI     A,0CFH          ; Initial status setup byte
       OUT     RTCS            ; Set pio for mode 3 in/output
       MVI     A,0E0H          ; Low 5 bits output, top 3 input
       OUT     RTCS            ; Set pio in/out bits
       MVI     A,3             ; Disable interrupts
       OUT     RTCS            ; Do it
       MVI     A,14H           ; Status reg addr
       OUT     RTCA            ; Select it
       IN      RTCD            ; Reset status bit
;
DOREAD: LXI     H,LOCBUF        ; Point to time save area
       MVI     B,2             ; Start with seconds
;
BURST:  MOV     A,B             ; A is register we want to read
       CPI     REGEND          ; Gotten all we want?
       JNC     ROLLCK          ; Yes, done getting time
       OUT     RTCA            ; Select that register of clock
       IN      RTCD            ; Read the clock data
       MOV     M,A             ; Save in core
       INX     H               ; Next memory location
       INR     B               ; Next reg addr
       JMP     BURST           ; Go get more data
;
; See if the clock rolled over during the reads.
;
ROLLCK: MVI     A,14H           ; Status reg addr
       OUT     RTCA            ; Select it
       IN      RTCD            ; Get status
       ORA     A               ; Was clock roll?
       JNZ     DOREAD          ; Yes, go read again
;
; Format the date and time for bye's realtime clock buffer
;
       LDA     LOCBUF          ; BCD seconds
       STA     RTCBUF+2
       LDA     LOCBUF+1        ; BCD minutes
       STA     RTCBUF+1
       CALL    BCDBIN          ; Convert to binary
       STA     CCMIN           ; For NUBYE
       LDA     LOCBUF+2        ; BCD hours
       STA     RTCBUF
       CALL    BCDBIN          ; Convert to binary
       STA     CCHOUR          ; For NUBYE
       LDA     LOCBUF+4        ; BCD day of month
       STA     RTCBUF+6
       LDA     LOCBUF+5        ; BCD month
       STA     RTCBUF+5
       MVI     A,CENTURY
       STA     RTCBUF+3
       MVI     A,CYEAR
       STA     RTCBUF+4
       RET                     ; All done
;
LOCBUF: DB      0,0,0,0,0,0     ; Seconds, Minutes, Hours,
                               ; Day of weekk, Day of month, Month of year
;
; end of insert
; -------------