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

  1. ;
  2. ; B3C-SS1.INS - Clock routine for the System Support 1    07/24/85
  3. ;                        -- by pst
  4. ;    This clock routine needs:
  5. ;        BCD2BIN    - no
  6. ;        BIN2BCD - no
  7. ;
  8. ; 6/28/85 - Added hold support and also pokes RTCBUF with time.
  9. ;                        -- pst
  10. ;
  11. ;----------------------------------------------------------------
  12. ;
  13. ;    Note- This is an insert--not an overlay
  14. ;
  15.      IF    RTC
  16. SS1BASE    EQU    050H        ; Base port for SS1
  17. CLKCMD    EQU    SS1BASE+10    ; Clock command port
  18. CLKDATA    EQU    SS1BASE+11    ; Clock data port
  19. CLKREAD    EQU    16        ; Read command bit
  20. CLKHOLD    EQU    64        ; Hold command bit
  21. ;
  22. TIME:    LXI    H,RTCBUF    ; Point to RTC buffer
  23.     MVI    C,5        ; Set counter for hour tens
  24.     CALL    RDIGIT        ; Get hour tens
  25.     CALL    SHFT4        ; Save in buffer
  26.     CALL    MULT10        ; Multiply by 10
  27.     MOV    B,A        ; Save in B reg
  28.     CALL    RDIGIT        ; Get hour units in A reg
  29.     CALL    ADDLOW        ; Set BCD digit
  30.     ADD    B        ; Add tens digit from B
  31.     STA    CCHOUR        ; Store for later use
  32. ;
  33. ;    Minutes
  34. ;
  35.     CALL    RDIGIT        ; Get minute tens in A reg
  36.     CALL    SHFT4        ; Save in buffer
  37.     CALL    MULT10        ; Multiply by 10
  38.     MOV    B,A        ; Save in B reg
  39.     CALL    RDIGIT        ; Get minute units in A reg
  40.     CALL    ADDLOW        ; Set BCD digit
  41.     ADD    B        ; Add in minutes tens from B
  42.     STA    CCMIN        ; Store for later use
  43. ;
  44. ;    Seconds
  45. ;
  46.     CALL    RDIGIT        ; Second tens
  47.     CALL    SHFT4
  48.     CALL    RDIGIT        ; Second units
  49.     CALL    ADDLOW
  50. ;
  51. ;    Year
  52. ;
  53.     INX    H        ; Skip over "19"
  54.     MVI    C,12        ; Start with years tens
  55.     CALL    RDIGIT
  56.     CALL    SHFT4
  57.     CALL    RDIGIT        ; Years units
  58.     CALL    ADDLOW
  59. ;
  60.     CALL    RDIGIT        ; Month tens
  61.     CALL    SHFT4
  62.     CALL    RDIGIT        ; Month units
  63.     CALL    ADDLOW
  64. ;
  65.     CALL    RDIGIT        ; Day tens
  66.     CALL    SHFT4
  67.     CALL    RDIGIT        ; Day units
  68.     CALL    ADDLOW
  69. ;
  70.     XRA    A
  71.     OUT    CLKCMD        ; Turn off hold bit
  72.     RET
  73. ;
  74. ;    Read a digit
  75. ;        Command in C
  76. ;        Digit returned in A
  77. ;        C is decremented
  78. ;        Hold bit is set
  79. ;
  80. RDIGIT:    MOV    A,C        ; Get command byte
  81.     DCR    C        ; Bump it for next operation
  82.     ORI    CLKREAD+CLKHOLD    ; Add in read & hold bits
  83.     OUT    CLKCMD        ; Output it
  84.     ANI    15        ; Strip off any commands
  85.     CPI    5        ; Was it hour tens digit?
  86.     IN    CLKDATA        ; Get data
  87.     RNZ            ; No, return
  88.     ANI    3        ; Yes, so kill 24 hour bit
  89.     RET
  90. ;
  91. ;    Multiply register A by 10
  92. ;    Destroys 'D'
  93. ;
  94. MULT10:    ADD    A        ; 2x
  95.     MOV    D,A
  96.     ADD    A        ; 4x
  97.     ADD    A        ; 8x
  98.     ADD    D        ; 10x
  99.     RET
  100. ;
  101. ;    Shift A to high nibble
  102. ;        Stores shifted value in 'M'
  103. ;        Destroys 'E'
  104. ;        A is left unchanged
  105. ;
  106. SHFT4:    MOV    E,A
  107.     ANI    15        ; Only handle lower 4 bits
  108.     RLC            ; Shift A over 4 bits
  109.     RLC
  110.     RLC
  111.     RLC            
  112.     MOV    M,A        ; Save it while we're at it
  113.     MOV    A,E
  114.     RET
  115. ;
  116. ;    Add in low BCD nibble
  117. ;        Gets high nibble from M
  118. ;        Stores new BCD byte in M
  119. ;        Increments HL
  120. ;        Destroyes 'E'
  121. ;
  122. ADDLOW:    MOV    E,A
  123.     ANI    15        ; Deal with low nibble only
  124.     ORA    M        ; Add in high nibble from tens digit
  125.     MOV    M,A        ; Save new BCD byte in buffer
  126.     INX    H        ; Move on to next location
  127.     MOV    A,E
  128.     RET
  129.      ENDIF            ; RTC
  130.