home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / bye5 / b5-clock.lbr / B5C-ZCLK.IQS / B5C-ZCLK.INS
Encoding:
Text File  |  1986-03-09  |  5.0 KB  |  211 lines

  1. ;****************************************************************
  2. ;                                *
  3. ;            B5C-ZCLK.INS                *
  4. ;                                *
  5. ;    Clock insert for BYE5xx with the following hardware    *
  6. ;    configuration:                        *
  7. ;                                *
  8. ;        Heath/Zenith Z-100 series computer        *
  9. ;        ZCLK clock card from FBE Research        *
  10. ;                                *
  11. ;        Hampton Childress                *
  12. ;        Sysop, BHEC RCPM/RBBS    10/27/85        *
  13. ;        (301) 661-2175                    *
  14. ;                                *
  15. ;    Be sure to set the BCDBIN equate to TRUE        *
  16. ;                                *
  17. ;                                *
  18. ;****************************************************************
  19.  
  20. ;  Access to the ZCLK is via the 6821 Parallel Printer PIA
  21. ;  (U114) as follows:
  22. ;
  23. ;      PIA Bit    Name    Function
  24. ;     ------------------------------------------------
  25. ;    PB1    /ERROR    Enable access to ZCLK *
  26. ;
  27. ;    PA0    PD1    RD Strobe
  28. ;    PA1    PD2    WR Strobe
  29. ;
  30. ;    PB2    PD3    Address Counter Clock
  31. ;
  32. ;    PB4    PD5    Data Bus Bit D0 (LSB)
  33. ;    PB5    PD6    Data Bus Bit D1
  34. ;    PB6    PD7    Data Bus Bit D2
  35. ;    PB7    PD8    Data Bus Bit D3
  36. ;
  37. ;  * Installing the ZCLK disconnects PB1 from the /ERROR
  38. ;    signal from the printer.  PB1 is programmed as an input
  39. ;    by CP/M-86 but is used here as an output.
  40. ;
  41. ;************************************************************
  42. ; MSM5832 REGISTER DEFINITIONS
  43. ;************************************************************
  44. ;
  45. ;           Data Bus
  46. ;  ADDR  NAME  D3 D2 D1 D0  RANGE  NOTES
  47. ; ----------------------------------------------------------
  48. ;    0     S1    *  *  *  *   0-9   S1 and S10 are reset to
  49. ;    1     S10       *  *  *   0-5   zero on write to address
  50. ;
  51. ;    2     MI1    *  *  *  *   0-9
  52. ;    3     MI10       *  *  *   0-5
  53. ;
  54. ;    4     H1    *  *  *  *   0-9
  55. ;    5     H10    A  B  *  *   0-2   A=1 for 24 hour format
  56. ;                   A=0 for 12 hour format
  57. ;                   B=1 for PM  B=0 for AM
  58. ;    6     W      *  *    *   0-6
  59. ;
  60. ;    7     D1    *  *  *    *   0-9
  61. ;    8     D10      C  *    *   0-3    C=0 for 28 day February
  62. ;                   C=1 for 29 day February
  63. ;    9     MO1   *  *  *    *   0-9
  64. ;   10     MO10        *   0-1
  65. ;
  66. ;   11     Y1    *  *  *    *   0-9
  67. ;   12     Y10   *  *  *    *
  68. ;
  69. ; All registers are read/write.  * means data valid as "1"
  70. ; or "0" bit.  Blank means bit does not exist ("0" during
  71. ; read and ignored on write).
  72. ;
  73. ;************************************************************
  74. ;
  75.  
  76. ZPIA    EQU    0E0H            ; PIA base port
  77. ADATA    EQU    ZPIA+0
  78. ACTL    EQU    ZPIA+1
  79. BDATA    EQU    ZPIA+2
  80. BCTL    EQU    ZPIA+3
  81. CENTURY    EQU    019H
  82.  
  83. ;
  84. ;
  85. TIME:    DI                ; No interrupts
  86.     CALL    ACCESS            ; Enable the ZCLK
  87.     CALL    SPBDIR            ; Select direction register
  88.     MVI    A,00001110B        ; Make DB4-DB7 inputs
  89.     OUT    BDATA
  90.     CALL    SPBDAT            ; Select data register
  91.     IN    ADATA            ; Set RD low
  92.     ANI    11111110B
  93.     OUT    ADATA
  94.     LXI    D,BUFFER
  95.     MVI    B,13
  96. INLOOP:    CALL    RDZCLK            ; Read ZCLK byte
  97.     STAX    D            ; Byte to buffer
  98.     INX    D            ; Advance pointer
  99.     CALL    CLKADR            ; Advance address counter
  100.     DCR    B            ; Done all?
  101.     JNZ    INLOOP            ; Loop if not
  102.     IN    ADATA            ; Set RD high
  103.     ORI    00000001B
  104.     OUT    ADATA
  105.  
  106. ;
  107. ;
  108.     CALL    SPBDIR            ; Select direction register
  109.     MVI    A,11111100B        ; Make PB1 an input
  110.     OUT    BDATA
  111.     CALL    SPBDAT            ; Select data register
  112.     EI                ; Interrupts ok now
  113. ;
  114.     LDA    BUFFER+5        ; Still there seem to remain some
  115.     ANI    03H            ; annoying bits which must be
  116.     STA    BUFFER+5        ; removed
  117.     LDA    BUFFER+6
  118.     ANI    07H
  119.     STA    BUFFER+6
  120.     LDA    BUFFER+8
  121.     ANI    03H
  122.     STA    BUFFER+8
  123. ;
  124. ;
  125.     LXI    D,RTCBUF        ; Point to start of RTC buffer (hours)
  126.     LXI    H,BUFFER+5        ; Point to our buffer (hours)
  127.     CALL    GTSTOR
  128.     CALL    BCDBIN
  129.     STA    CCHOUR
  130.     LXI    H,BUFFER+3        ; Minutes
  131.     CALL    GTSTOR
  132.     CALL    BCDBIN
  133.     STA    CCMIN
  134.     LXI    H,BUFFER+1        ; Seconds
  135.     CALL    GTSTOR
  136.     MVI    A,CENTURY        ; Century equate
  137.     STAX    D            ; Century
  138.     INX    D
  139.     MVI    B,3            ; Set counter
  140.     LXI    H,BUFFER+12
  141. DTLOOP:    CALL    GTSTOR            ; Simple date moving loop
  142.     DCX    H            ; Point to next byte
  143.     DCR    B            ; Test counter to see if we're done
  144.     JNZ    DTLOOP            ; Day, month, year
  145.  
  146.     RET                ; To BYE
  147.  
  148. GTSTOR:    MOV    A,M            ; Get a character from the buffer
  149.     RLC ! RLC ! RLC    ! RLC        ; Position data in high nibble
  150.     ANI    0F0H            ; Just for good measure
  151.     DCX    H
  152.     ADD    M            ; Add the low nibble to form bcd
  153.     STAX    D            ; Store it
  154.     INX    D            ; Increment RTCBUF pointer
  155.     RET
  156.  
  157. ;
  158. ;
  159. RDZCLK:
  160.     PUSH    B            ; Wait for access (6 usec)
  161.     MVI    B,6
  162.     CALL    WAITSOME
  163.     POP    B
  164.     IN    BDATA            ; Read ZCLK
  165.     RRC ! RRC ! RRC    ! RRC        ; Position the data
  166.     ANI    00001111B        ; Mask off unwanted bits
  167.     RET
  168. ;
  169. ;
  170. CLKADR:    IN    BDATA
  171.     ORI    00000100B        ; Set counter clock high
  172.     OUT    BDATA
  173.     ANI    11111011B        ; Set counter clock low
  174.     OUT    BDATA
  175.     RET
  176. ;
  177. ;
  178. SPBDIR:    IN    BCTL            ; Select B port direction reg
  179.     ANI    11111011B
  180.     OUT    BCTL
  181.     RET
  182. ;
  183. ;
  184. SPBDAT:    IN    BCTL            ; Select B port data register
  185.     ORI    00000100B
  186.     OUT    BCTL
  187.     RET
  188. ;
  189. ;
  190. ACCESS:    IN    ADATA            ; Set RD and WR high
  191.     ORI    00000011B
  192.     OUT    ADATA
  193.     CALL    SPBDIR            ; Select direction register
  194.     MVI    A,11111110B        ; Make PB1 and output
  195.     OUT    BDATA
  196.     CALL    SPBDAT            ; Select data register
  197.     XRA    A            ; Make PB1 low to enable ZCLK
  198.     OUT    BDATA
  199. ;
  200.     MVI    B,150            ; Wait for access (150 usec)
  201. WAITSOME:
  202.     NOP ! NOP ! NOP    ! NOP !    NOP    ; Waste 1 usec. at 5 mhz
  203.     DCR    B
  204.     JNZ    WAITSOME
  205.     RET
  206. ;
  207. BUFFER    DB    'xxxxxxxxxxxxx'        ; 13 byte buffer for the ZCLK
  208. ;
  209. ; *** End of ZCLK clock card routine for the Z-100 ***
  210. ;
  211.