home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / bye3 / b3c-kpro.ins < prev    next >
Text File  |  1994-07-13  |  5KB  |  202 lines

  1.  
  2. ;**********************************************************************
  3. ;
  4. ; B3C-KPRO.INS    A TIME insert for BYE335 and up
  5. ;  07/15/85    Note:  This is an insert--not an overlay
  6. ;
  7. ; Adapted from:
  8. ; MBC-KPRO.ASM -- Version 1.0 -- 03/01/84 -- by Kim Levitt
  9. ;
  10. ;    TIME routine for BYE3 running on Kaypro 2 with Pro-Clock
  11. ;    (adapted from Kaypro Pro-Clock driver written by Greg Haerr)
  12. ;
  13. ;    This overlay is designed to work on a Kaypro II running BYE3
  14. ;    and equipped with a Business Computer Systems Pro-Clock RTC.
  15. ;    (Use the DATE program to initialize the clock outside of BYE.)
  16. ;    (BCS address: 5350 South 3600 West; Salt Lake City, UT 84118)
  17. ;
  18. ;    When called this routine will check the RTCBUF. If a '99H'
  19. ;    is in the first byte, the clock is initialized. Next the
  20. ;    seconds are checked, and if changed since last update of
  21. ;    RTC buffer, the clock is stopped, data copied to RTCBUF and
  22. ;    the clock is restarted. (If no change in seconds, the
  23. ;    routine returns immediately.)
  24. ;
  25. ;**********************************************************************
  26. ;
  27.      IF    RTC
  28. TIME:    LDA    RTCBUF        ; Get first BCD byte
  29.     CPI    099H        ; 99 ?
  30.     CZ    CLKINIT        ; If so, init clock...
  31.     CALL    HOLDON        ; Put clock on hold
  32.     MVI    C,0        ; Check low seconds
  33.     CALL    RDPIO        ; To see if change...
  34.     LXI    H,RTCBUF+2    ; Compared to old secs
  35.     XRA    M        ; Value stored in
  36.     ANI    0FH        ; RTC buffer (low nibble)
  37.     JZ    CLKEXIT        ; If no change, skip update
  38.     MVI    C,5        ; Start with hi hours
  39.     LXI    H,RTCBUF    ; And copy to RTCBUF
  40.     CALL    GETCLK        ; (get time)
  41.     MVI    C,12        ; Start with hi year
  42.     LXI    H,RTCBUF+4    ; And copy to RTCBUF
  43.     CALL    GETCLK        ; (and date)
  44.     LDA    RTCBUF        ; Get hours
  45.     ANI    03FH        ; Mask out PM/24 hour bits
  46.     STA    RTCBUF
  47.     LDA    RTCBUF+6    ; Get day
  48.     ANI    03FH        ; Mask out leap year bit
  49.     STA    RTCBUF+6
  50. CLKEXIT:
  51.     MVI    C,13        ; Set clock addr. to
  52.     CALL    WRADDR        ; Junk location so no data cleared
  53.     CALL    HOLDOFF        ; When we take clock off hold..
  54.     LDA    RTCBUF        ; Get BCD HH
  55.     CALL    BCDBIN        ; Convert to binary
  56.     STA    CCHOUR        ; For BYE3
  57.     LDA    RTCBUF+1    ; Get BCD MM
  58.     CALL    BCDBIN        ; Convert to binary
  59.     STA    CCMIN        ; For BYE3
  60.     RET            ; And return (for now..)
  61. ;
  62. GETCLK:
  63.     MVI    B,3        ; Repeat 3 times for 3 BCD bytes
  64. CLKLP:
  65.     CALL    RDPIO        ; Get data at address C
  66.     RLC ! RLC ! RLC    ! RLC    ; Move to high nibble for BCD
  67.     MOV    M,A        ; Save at location temporarily
  68.     DCR    C        ; Decrement clock addr
  69.     CALL    RDPIO        ; Get data at next address
  70.     ORA    M        ; OR with previously saved data
  71.     MOV    M,A        ; And save it
  72.     DCR    C        ; Decrement clock addr
  73.     INX    H        ; Increment to next BCD byte
  74.     DCR    B        ; Decrement BCD counter
  75.     JNZ    CLKLP        ; If 3rd BCD byte, done..
  76.     RET            ; Return
  77. ;
  78. ; PIO STUFF
  79. ;
  80. MODE3    EQU    0CFH        ; Bit control mode
  81. ;
  82. DATA    EQU    0AH        ; Port B data
  83. CMD    EQU    0BH        ; Port B cmd
  84. ;
  85. ; mask values for clock chip
  86. ;
  87. LATCH    EQU    80H        ; Set address latch (active high)
  88. WR    EQU    40H        ; Write (active high)
  89. RD    EQU    20H        ; Read (active high)
  90. HOLD    EQU    10H        ; Time hold (active high)
  91. ;
  92. CLKINIT:
  93.     MVI    A,7        ; Disable interrupts
  94.     OUT    CMD
  95. ;
  96. ; fall into set output
  97. ;
  98. ; set output mode
  99. ;
  100. SETOUT:
  101.     LDA    FLAG        ; Get current state
  102.     OUT    DATA        ; Preset data register
  103.     MVI    A,MODE3        ; Set bit control mode
  104.     OUT    CMD
  105.     XRA    A        ; Set all outputs mask
  106.     OUT    CMD
  107.     LDA    FLAG
  108.     OUT    DATA
  109.     RET
  110. ;
  111. ; set input mode
  112. ;
  113. SETIN:
  114.     LDA    FLAG        ; Get current state
  115.     ORI    RD        ; Set read line
  116.     OUT    DATA
  117.     MVI    A,MODE3
  118.     OUT    CMD
  119.     MVI    A,0FH        ; D7-d4 are still output, mask em'
  120.     OUT    CMD
  121.     LDA    FLAG
  122.     ORI    RD
  123.     OUT    DATA
  124.     XCHG ! XCHG        ; Delay for 6 uS min.
  125.     RET
  126. ;
  127. ; send data in A to address in C
  128. ;
  129. WRPIO:
  130.     MOV    B,A        ; Save data in B
  131.     CALL    WRADDR        ; Set address
  132.     MOV    A,B        ; Fall into write data
  133. ;
  134. ; write data in A
  135. ;
  136. WRDATA:
  137.     MOV    C,A        ; Save in C
  138.     LDA    FLAG        ; Get current flag
  139.     ORA    C        ; Or in data
  140.     OUT    DATA
  141.     ORI    WR        ; And write it
  142.     OUT    DATA
  143.     NOP            ; Delay for 1 uS min
  144.     NOP
  145.     ANI    (NOT WR) AND 0FFH ; Reset write
  146.     OUT    DATA
  147.     RET
  148. ;
  149. ; read data into A from address in C
  150. ;
  151. RDPIO:
  152.     PUSH    B
  153.     CALL    WRADDR        ; Set address
  154. ;
  155. ; fall into read data
  156. ;
  157. ; read data into A
  158. ;
  159. RDDATA:
  160.     CALL    SETIN        ; Set input mode
  161.     IN    DATA        ; Input data
  162.     ANI    0FH        ; Just in case
  163.     MOV    C,A        ; Save in C
  164.     CALL    SETOUT        ; Set to output mode
  165.     MOV    A,C        ; Get saved data
  166.     POP    B        ; Restore BC
  167.     RET
  168. ;
  169. ; latch address in C
  170. ;
  171. WRADDR:
  172.     LDA    FLAG        ; Get current flag
  173.     ORA    C        ; Or in address
  174.     OUT    DATA        ; Send address
  175.     ORI    LATCH        ; Set latch
  176.     OUT    DATA        ; And latch it
  177.     ANI    (NOT LATCH) AND    0FFH
  178.     OUT    DATA
  179.     RET
  180. ;
  181. HOLDON:
  182.     MVI    A,HOLD        ; Set hold flag
  183.     STA    FLAG
  184.     CALL    WRDATA
  185. HOLD0:
  186.     MVI    B,20        ; Wait 150 uS
  187. HOLD1:
  188.     XCHG ! XCHG
  189.     DCR    B
  190.     JNZ    HOLD1
  191.     RET
  192. ;
  193. HOLDOFF:
  194.     XRA    A        ; Reset hold flag
  195.     STA    FLAG
  196.     JMP    WRDATA
  197. ;
  198. FLAG:    DB    0        ; Current hold/nohold status flag
  199.      ENDIF    ;RTC
  200. ;
  201. ;**********************************************************************
  202.