;
; REAL TIME CLOCK DRIVER INSERT FOR THE DALLAS SEMICONDUCTOR
; "SMARTWATCH", DS1213, WHICH SITS UNDER AN EPROM OR RAM
; CHIP AT A MEMORY ADDRESS WHICH YOU MUST SPECIFY AT LABEL "SWBASE"
;
; THIS CODE IS Z-80 CODE, ASSEMBLED WITH 'DB' PSEUDO-OPCODES
; SO 'MAC' WON'T BARF. FOR 8080/85, THE DJNZ, JR, JRNZ, JRZ AND BIT
; TEST INSTRUCTIONS WILL HAVE TO BE RE-WRITTEN USING INTEL LOGICAL
; OPERATORS LEST THE 8080/85 BARF
;
; THIS INSERT WAS WRITTEN FOR USE WITH BYE510 AND PBBS 4.0
; YOU MUST SET BCDBIN=YES IN BYE510 FOR THIS INSERT TO
; ASSEMBLE WITH BYE CORRECTLY.
;
; AUTHOR: MICHAEL R. MCCARREY
;         SOFTWARE ENGINEER
;         ISC SYSTEMS CORP.
;         SPOKANE, WA
;         (509) 927-5105 (BUS)
;         (509) 489-9562 (RES)
;
TIME:   CALL    SWSEL           ; GET SMARTWATCH ONLINE
       LXI     H,BCDDATA       ; SET POINTER TO BCD DATA STOW
       CALL    READCLK         ; READ THE SMARTWATCH
       CALL    EXTRACT         ; EXTRACT AND CONVERT BCD VALUES
       RET                     ; RETURN TO CALLER

;
; THIS IS THE ROUTINE WHICH EXTRACTS AND CONVERTS
; RETURNED BCD DATA FROM THE SMARTWATCH INTO SOMETHING
; THAT CAN BE USED BY THE CALLING PROGRAM
;

EXTRACT EQU     $
;
;========  EXTRACT AND SAVE SECONDS
       LDA     SWSEC           ; LOAD AND
       STA     RTCBUF+2        ;  SAVE SECONDS
;
;========  EXTRECT AND CONVERT MINUTES
       LDA     SWMIN           ; LOAD AND
       STA     RTCBUF+1        ;  SAVE MINUTES
       CALL    BCDBIN          ; CONVERT BCD MINUTES
       STA     CCMIN           ; UPDATE CURRENT MINUTE
;
;========  EXTRACT AND CONVERT HOURS
       LDA     SWHOUR          ; LOAD AND
       STA     RTCBUF+0        ;  SAVE HOURS
       CALL    BCDBIN          ; CONVERT HOURS TO BINARY
       STA     CCHOUR          ; UPDATE CURRENT HOUR
;
;========  EXTRACT AND SAVE DATE
       LDA     SWDATE          ; GET DATE
       STA     RTCBUF+6        ;  SAVE DATE
;
;========  EXTRACT AND SAVE MONTH
       LDA     SWMONTH         ; LOAD AND
       STA     RTCBUF+5        ;  SAVE MONTH
;
;======== EXTRACT AND SAVE YEAR
       LDA     SWYEAR          ; LOAD AND
       STA     RTCBUF+4        ;  SAVE YEAR
;
;======== SET THE CORRECT CENTURY
       MVI     A,19H           ; AS IN 19XX
       STA     RTCBUF+3        ;  SAVE CENTURY

       RET                     ; BACK TO CALLER

;
; THIS IS THE SMARTWATCH SELECT ROUTINE
;
; REGISTERS ON ENTRY:
; N/A
;
; REGISTERS ON EXIT:
; HL --> DTKEY+8
;
; REGISTERS DESTROYED: AF, HL
;
SWSEL:  LDA     SWBASE+4        ; RESET SMARTWATCH COMPARE REG
       LXI     H,DTKEY         ; STRING TO WAKE-UP THE SMARTWATCH
       CALL    WRITCLK         ; OK SUCKER, TIME GET UP
       RET                     ; BACK TO CALLER
;
; THIS IS THE WRITE CLOCK ROUTINE.
;
; REGISTERS ON ENRTY:
; HL --> BCDDATA STOW
;
; REGISTERS ON EXIT:
; HL --> BCDDATA+8
;
; REGISTERS DESTROYED: AF, BC
;
WRITCLK:MVI     B,8             ; REGISTER COUNT
T040:   PUSH    B               ; SAVE COUNT
       MOV     C,M             ; GRAB SOME DATA
       MVI     B,8             ; BITS/BYTE
T050:   DB      0CBH            ; IS THE 1ST
       DB      041H            ;  A ZERO?
       DB      28H             ; ZERO, SO
       DB      05H             ;  GO AROUND
       LDA     SWBASE+1        ; MAKE A0=0
       DB      18H             ; GO
       DB      03H             ;  AROUND
T070:   LDA     SWBASE+0        ; MAKE A0=1
TCONT:  DB      0CBH            ; SHIFT RIGHT
       DB      039H            ; 1 BIT
       DB      10H             ;  UNTIL A COMPLETE
       DB      0F0H            ;   BYTE IS ASSEMBLED
       INX     H               ; ADJUST POINTER
       POP     B               ; RECOVER REGISTER COUNT
       DB      10H             ; DO IT TO ALL
       DB      0E8H            ;  SMARTWATCH REGISTERS
       RET                     ; BACK TO CALLER
;
; THIS IS THE READ CLOCK ROUTINE.
;
; REGISTERS ON ENRTY:
; HL --> BCDDATA STOW
;
; REGISTERS ON EXIT:
; HL --> BCDDATA+8
;
; REGISTERS DESTROYED: AF, BC
;
READCLK:MVI     B,8             ; REGISTER COUNT IN SMARTWATCH
T020:   PUSH    B               ; SAVE REG COUNT
       MVI     C,0
       MVI     B,8             ; BITS/BYTE COUNT
T030:   LDA     SWBASE+4        ; RAISE A2 (READ)
       ANI     1
       ORA     C               ; CLEAR CARRY
       MOV     C,A
       DB      0CBH            ; SHIFT IN
       DB      09H             ;  A BIT
       DB      10H             ;   UNTIL A BYTE IS ASSEMBLED IN 'C'
       DB      0F5H            ;    USING THE Z-80 'DJNZ' INST.
       MOV     M,C             ; STOW THE BYTE
       INX     H               ; ADJUST POINTER
       POP     B               ; RECOVER REGISTER COUNT
       DB      10H             ; DO ALL 8 REGISTERS
       DB      0EBH            ;  USING THAT 'DJNZ' AGAIN
       RET                     ; BACK TO CALLER

;
; THIS IS THE CODE THAT IS WRITTEN TO THE MEMORY ADDRESS
; THE SMARTWATCH OCCUPIES. THE SMARTWATCH DETECTS THIS
; PATTERN, DE-SELECTS WHATEVER IS PLUGGED INTO IT, PROM,
; RAM OR WHATEVER, AND THE NEXT 64 ACCESSES TO IT WILL
; BE READS OR WRITES TO OR FROM THE REGISTERS. IT IS OKAY
; TO DO OTHER THINGS, ANYWHERE ELSE IN THE ADDRESS AREA
; AS LONG AS THEY DON'T INVOLVE THE AREA OF THE SMARTWATCH.
;
DTKEY:  DB      0C5H,03AH,0A3H,05CH,0C5H,03AH,0A3H,05CH

;
; THIS IS THE BEGINNING MEMORY ADDRESS FOR THE
; SMARTWATCH. YOU MUST CUSTOMIZE IT TO FIT YOUR
; OWN MEMORY MAP.
;
SWBASE  EQU     0D000H          ; BASE ADDRESS FOR ADDRESSING

;
; THIS IS THE STOW FOR BCD DATA FROM OR TO THE
; SMARTWATCH. THE DATA MUST BE READ IN ASCENDING
; ADDRESSES ONLY AS THIS IS THE WAY IT IS PRESENTED
; BY THE SMARTWATCH. IT GOES WITHOUT SAYING THAT
; WRITING TO THE SMARTWATCH MUST ALSO BE DONE IN THE
; SAME MANNER AS READING.
;
BCDDATA:DB      0               ; 1/10 SECOND
SWSEC:  DB      0               ; SECONDS
SWMIN:  DB      0               ; MINUTES
SWHOUR: DB      0               ; HOURS
SWDOW:  DB      0               ; DAY OF WEEK
SWDATE: DB      0               ; DATE
SWMONTH:DB      0               ; MONTH
SWYEAR: DB      0               ; YEAR

       ENDIF                   ; CLOCK OR RSPEED
;
;                    end of clock routine