home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxc-kc10.asm < prev    next >
Assembly Source File  |  1994-07-13  |  6KB  |  234 lines

  1. ;-----------------------------------------------------------------
  2. ; MXC-KC10.ASM
  3. ; clock overlay for mex and the Kenmore Computer Technologies (KCT)
  4. ; Ztime-I real-time clock.
  5.  
  6. rev    equ    12    ;V 1.2
  7.  
  8. ; V1.2  30 Aug 86 - Fixed Year storage to chip          - Rea Williams
  9. ; V1.1  26 Apr 85 - Added CSET routine            - Joe Griffith
  10. ; V1.0  24 Apr 85 - Original, TM-KCT11.ASM        - Joe Griffith
  11.  
  12. ;--------------------------------------------------------------------
  13. ;     This overlay provides the current date and time to MEX+ or higher
  14. ; versions of MEX.  It is configured for the Kenmore Computer
  15. ; Technologies (KCT) Ztime-I real-time calendar/clock although it
  16. ; will probably work with any clock using the MM58167A clock chip.
  17.  
  18. no    equ    0    
  19. yes    equ    0ffh
  20. i8080    equ    yes        ;for xlat- do not change
  21. i8086    equ    no
  22. cpm    equ    yes
  23. pcdos    equ    no
  24. cr    equ    13
  25. lf    equ    10
  26.  
  27. mex    equ    0D00h        ;address of the service processor
  28. ilp    equ    240        ;inline print
  29. sblank    equ    244        ;scan input stream to next non-blank (cy=end)
  30. evala    equ    243        ;evaluate number from input to HL
  31. gnc    equ    241        ;get next character
  32. decout    equ    239        ;decimal output from HL
  33.  
  34. bport    equ    0E0h        ;base port address for KCT clock
  35.                 ;this address should be changed to
  36.                 ;reflect wherever your MM58167A is.
  37. centry    equ    1900        ;hard code since it is not available
  38.                 ;from the clock chip
  39.  
  40. ;--------------------------------------------------------------------
  41.     
  42.     org    100h        ;processor type flag is here
  43.  
  44. if i8080
  45.     db    0c3h        ;show which processor we are for
  46. endif
  47. if i8086
  48.     db    0E9h
  49. endif
  50.  
  51. ;-----------------------------------------------------------------
  52. ;   JMP table for clock overlay
  53.  
  54.     org    0e00h        ;start of clock overlay 
  55.  
  56.     jmp    gettim        ;get time
  57.     jmp    getdat        ;get date
  58.     jmp    setclk        ;cset processor
  59.     ret            ;clock overlay init
  60.     nop
  61.     nop
  62.     ret            ;clock overlay de-init
  63. thisyr:    db    0        ;this is actually the space reserved
  64.                 ;for the address portion of the jmp
  65.                 ;but no de-init is needed so the year
  66.                 ;is stored here.  Note that the system
  67.                 ;must be cloned after the clock is set
  68.                 ;to permanently store the year here.
  69. hlpflg:    db    0        ;likewise the help flag is stored here
  70.  
  71. ;--------------------------------------------------------------------
  72. ; subroutine GETTIM returns the time as follows:
  73. ;
  74. ; B - Hours (0-23)
  75. ; C - Minutes (0-59)
  76. ; D - Seconds (0-59)
  77. ; E - Hundreths of seconds (0-99) 
  78.  
  79. gettim:    in    bport+2        ;get seconds
  80.     push    psw        ;save for future reference
  81.     
  82.     call    makbin        ;make it a binary number
  83.     mov    d,a        ;store it
  84.     in    bport+3        ;get minutes
  85.     call    makbin
  86.     mov    c,a
  87.     in    bport+4        ;get hours
  88.     call    makbin
  89.     mov    b,a
  90.  
  91.     in    bport+2
  92.     mov    l,a        ;store it
  93.     pop    psw        ;get original seconds back
  94.     cmp    l        ;compare the two
  95.     jnz    gettim        ;not the same so do it over else
  96.     mvi    e,0        ;clear hundreds of seconds
  97.     ret
  98.  
  99. ;------------------------------------------------------------------------
  100. ; subroutine GETDAT returns the date as follows:
  101. ; BC - Year (1985-2099)
  102. ; D - Month (1=January, 2=February, etc.)
  103. ; E - Day of month (1-31)
  104.  
  105. getdat:    in    bport+2        ;get seconds
  106.     push    psw        ;save it for future reference
  107.  
  108.     in    bport+7        ;get month
  109.     call    makbin
  110.     mov    d,a
  111.     in    bport+6        ;get day of month
  112.     call    makbin
  113.     mov    e,a
  114.  
  115.     in    bport+2        ;get seconds again
  116.     mov    l,a        ;store temporarily
  117.     pop    psw        ;get original seconds
  118.     cmp    l        ;compare the two
  119.     jnz    getdat        ;if not the same do it over
  120.     in      bport+9         ;get year 
  121.     call    makbin
  122.     mov    c,a        ;put in it's proper place
  123.     mvi    b,0
  124.     lxi    h,centry    ;load the century
  125.     dad    b        ;add it to the stored value
  126.     mov    c,l        ;move hl to bc
  127.     mov    b,h
  128.     ret
  129.  
  130. ;-----------------------------------------------------------------
  131. ;  This routine takes the two BCD values in each nibble of the
  132. ; accumulator and converts it to a single binary value.
  133.  
  134. makbin:    push    d        ;save the current value
  135.     push    psw        ;save the original value
  136.     rrc            ;put the 10s value in the lower bits
  137.     rrc
  138.     rrc
  139.     rrc
  140.     ani    0Fh        ;mask off whatever is in the high nibble
  141.     add    a        ;multiply this register by 10
  142.     mov    e,a
  143.     add    a
  144.     add    a
  145.     add    e
  146.     mov     e,a        ;save in e
  147.     pop    psw        ;get the original value
  148.     ani    0Fh        ;allow only low bits
  149.     add    e        ;get total to a
  150.     pop    d        ;restore de
  151.     ret            ;all done
  152.  
  153. ;----------------------------------------------------------------------
  154. ;   CSET processor.  This routine allows the user to set the clock from
  155. ; command level by typing CSET yy/mm/dd hh:mm:ss.
  156.  
  157. setclk:    call    ilprt
  158.     db    'KCT Clock OVR V'
  159.     db    rev/10+'0','.'
  160.     db    rev mod 10+'0'
  161.     db    cr,lf,lf,0
  162.  
  163.     xra    a        ;get a zero
  164.     sta    hlpflg        ;store it as a flag
  165.     call    twobcd        ;get the first two numbers
  166.     rc
  167.     out    bport+9        ;put in the year
  168.     call    twobcd        ;get the month
  169.     rc
  170.     out    bport+7        ;put in the months counter
  171.     call    twobcd        ;get the day of the month
  172.     rc
  173.     out    bport+6        ;put in the day counter
  174.     call    twobcd        ;get the hour
  175.     rc
  176.     out    bport+4        ;put in the hour counter
  177.     call    twobcd        ;get the minutes
  178.     rc
  179.     out    bport+3        ;put in the minutes counter
  180.     call    twobcd        ;get the seconds
  181.     rc
  182.     out    bport+2        ;put in the seconds counter
  183.     ret
  184.  
  185. ;------------------------------------------------------------------
  186. ;   this routine looks at the CSET parameter and returns with a BCD
  187. ; pair in the two nibbles of the accumulator.  Blanks and separators
  188. ; are skiped.  The carry flag is set when the end of the line is
  189. ; reached.
  190.  
  191. twobcd:    call    getnum        ;get the 10's digit
  192.     jc    chlp        ;no numbers there
  193.     rrc            ;put it in the high nibble
  194.     rrc
  195.     rrc
  196.     rrc
  197.     push    psw        ;save it
  198.     call    getnum        ;get the 1's
  199.     mov    b,a        ;temporary storage
  200.     pop    psw        ;get the 10s back
  201.     ora    b        ;merge the two
  202.     ret
  203.  
  204. getnum:    mvi    c,gnc        ;get the next character
  205.     call    mex
  206.     rc            ;carry means there is no more input
  207.     cpi    '0'
  208.     jc    getnum        ;char is smaller than ascii zero
  209.     cpi    ':'
  210.     jnc    getnum        ;char is not an ascii digit
  211.     cmc            ;reset carry flag
  212.     sta    hlpflg
  213.     sbi    '0'        ;make it a binary value
  214.     ret
  215.  
  216. chlp:    lda    hlpflg        ;get the help flag
  217.     cpi    0        ;is it null
  218.     stc            ;flag the end
  219.     rnz            ;if not then don't print
  220.     call     ilprt
  221.     db    'CSET YY/MM/DD HH:MM:SS'
  222.     db    cr,lf,lf,0
  223.     stc            ;flag the system
  224.     ret
  225.  
  226. ;----------------------------------------------------------------------
  227. ; inline print routine
  228.  
  229. ilprt:    mvi    c,ilp
  230.     jmp    mex
  231.  
  232.     end    
  233.