; B5C-LB36.INS          Wayne Masters
;  05/05/86             Potpourri, 408-378-7474
;
;  This is an insert, not an overlay, for BYE5 and the Ampro Little-Board
;  running a v3.6, or later, BIOS, which uses a spare CTC channel to main-
;  tain a memory resident date/time clock.
;
;  This routine expects the clock to be initialized to the correct date/time
;  before executing the BYE5 program.
;
;  Set the following equates in BYE5:
;
; CLOCK   EQU   YES     (Same for KMD)
; TIMEON  EQU   YES     (Same for KMD)
; BIN2BCD EQU   YES
;
;  Delete the existing TIME routine in BYE5 and replace it with this insert.
;
;
CENTURY EQU     19H             ; Change this every 100 years
LDIR    EQU     0B0EDH          ; Z80 ldir
;
;
TIME:   LDA     CPYFLG
       ORA     A               ; See if we have already copied the JMP table
       JNZ     TIME1           ; Yes, skip this
;
       LXI     D,WBOOT         ; Build BIOS entry table
       LHLD    1               ; Get BIOS start
       LXI     B,51            ; Bytes to move
       DW      LDIR            ; Move it
;
       CALL    GETTBL          ; Get address of next JMP table
       LXI     D,NXTTBL        ; (HL) has BIOS nxttbl address
       LXI     B,15            ;
       DW      LDIR            ; Move the table
       MVI     A,0FFH
       STA     CPYFLG          ; Set the flag so we only do this once
;
TIME1:  CALL    TOD             ; Get clock base address
;
; (HL) now has address of clock data
;
       DI                      ; Disable interrupts while we do this
       LXI     D,SEC           ; Move time/date
       LXI     B,6
       DW      LDIR            ; Save time/date
       EI                      ; Enable interrupts now
;
; Everthing needed has been moved into this program area.
;
       CALL    J2MD            ; Convert Julian date to month/day
;
; Now convert and store date/time from binary to bcd and put into BYE5
;
       MVI     A,CENTURY
       STA     RTCBUF+3        ; Century
       LDA     CYEAR
       CALL    BINBCD
       STA     RTCBUF+4        ; Year
       LDA     TMONTH
       CALL    BINBCD
       STA     RTCBUF+5        ; Month
       LDA     TDAY
       CALL    BINBCD
       STA     RTCBUF+6        ; Day
       LDA     HOUR
       STA     CCHOUR          ; Binary form for cchour
       CALL    BINBCD
       STA     RTCBUF          ; BCD form for buffer hours
       LDA     MIN
       STA     CCMIN           ; Binary minutes
       CALL    BINBCD
       STA     RTCBUF+1        ; BCD minutes
       LDA     SEC
       CALL    BINBCD
       STA     RTCBUF+2        ; Seconds
;
       RET                     ; All done
;
;
;  Convert Julian to month/day
;
J2MD:   LXI     D,MTHS          ; Intialize month pointer
       LHLD    JDAY            ; Julian day in (HL)
       INX     H               ; Adjust for ordinal 0
       XRA     A
       MOV     B,A             ; Initialize high byte of sub with 0
       INR     A
       STA     TMONTH          ; Initialize month to 1

J2MD1:  LDAX    D
       ORA     A               ; Clear carry
       MOV     C,A
       MOV     A,L             ; May be day
       DW      42EDH           ; SBC HL,BC
       JC      J2MD2
       JZ      J2MD2
       LDA     TMONTH
       INR     A               ; Update month
       STA     TMONTH
       INX     D
       JMP     J2MD1

J2MD2:  STA     TDAY            ; Set day
       RET
;
       DB      0
MTHS:   DB      31,29,31,30,31,30,31,31,30,31,30,31
CPYFLG: DB      0               ; Flag for JMP table copied?
;
; BIOS JMP table, moved from the BIOS on first call to TIME
;
WBOOT:  DB      0,0,0           ; Warm start
       DB      0,0,0           ; Console status
       DB      0,0,0           ; Console character in
       DB      0,0,0           ; Console character out
       DB      0,0,0           ; List character out
       DB      0,0,0           ; Punch character out
       DB      0,0,0           ; Reader character in
       DB      0,0,0           ; Seek to home position
       DB      0,0,0           ; Select disk
       DB      0,0,0           ; Set track number
       DB      0,0,0           ; Set sector number
       DB      0,0,0           ; Set DMA address
       DB      0,0,0           ; Read disk
       DB      0,0,0           ; Write disk
       DB      0,0,0           ; Return list status
       DB      0,0,0           ; Sector translate
;
GETTBL: DB      0,0,0           ; Point to more jumps, =>v3.6 BIOS only
;
NXTTBL:
       DB      0,0,0           ; JMP swap
       DB      0,0,0           ; Get hd table info
       DB      0,0,0           ; Get/set phytab access
       DB      0,0,0           ; Get phytab entry address
TOD:    DB      0,0,0           ; Get base address of clock tick

; Time/Date counters from BIOS

SEC:    DB      0
MIN:    DB      0
HOUR:   DB      0
JDAY:   DB      0,0             ; Julian day 0-366 for leap year
CYEAR:  DB      0

TMONTH: DB      0               ; Temp storage for month
TDAY:   DB      0               ; Temp storage for day
;
; End of B5C-LB36
;