home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / kaypro / kpltime.asm < prev    next >
Assembly Source File  |  1994-07-13  |  13KB  |  584 lines

  1. ;------------------------- KPLTIME.ASM --------------------------------
  2. ;  TIME program for the LEGACY Computer Systems Real Time Clock (RTC)
  3. ;  Modified for Kaypro, prints time/date string on screen or in reverse
  4. ;  video or on the 25th status line on a Kaypro video capable machines.
  5. ;  This program will run on either the Kaypro 2/4 or Kaypro 10 depending
  6. ;  on the on selected equates, in the optional configuration section below.
  7. ;
  8. ;  Use:    A0>time        print time/date
  9. ;    A0>time set    set the clock mode, can also be
  10. ;    A0>time s
  11. ;----------------------------------------------------------------------
  12. ; 07/11/86  This version contains equates so this program will work for
  13. ;   V 3.0   Kaypro 2,4,or 10 depending on the equates set.  Other NEW
  14. ;        equates allow you to either or do reverse video, so this
  15. ;        program can also be used on 83 machines.
  16. ;        Ernest-Hintz KAY+FUN-RCP/M-SYSTEM (415)572-8219
  17. ;----------------------------------------------------------------------
  18. ; modified from K10TIME.ASM
  19. ; Modified for Kaypro 10, prints time/date string on the
  20. ; 25th status line in inverse video.  - Steve Sanders
  21. ;----------------------------------------------------------------------
  22. VER1    EQU    03        ; Main program version number
  23. VER2    EQU    00        ; Program version number
  24. ;MINE    EQU    00        ; Your own version number for own changes
  25. ;
  26. NO    EQU    0
  27. YES    EQU    NOT NO        ; For conditional assembly
  28. ;======================================================================
  29. ;  OPTIONAL CONFIGURATION SECTION
  30. ;======================================================================
  31. ;
  32. NOTK10    EQU    YES        ; YES, if Kaypro 2 or 4
  33. KPRO10    EQU    NO        ; YES if Kaypro 10
  34.                 ; The above has written intentionally
  35.                 ; to protect the novice if he messes up.
  36. ;
  37. VIDEO    EQU    NO        ; YES, if using Kaypro video
  38.                 ; NO, for no reverse video 
  39. LINE25    EQU    NO        ; YES, if using the 25th status line
  40.                 ; this will not work on 83 kaypro's
  41. ;======================================================================
  42. ;  Pio addresses with the standard Ports for
  43. ;
  44. ;         KAYPRO 2 or 4
  45.      IF  NOTK10  AND  (NOT KPRO10)
  46. BDATA    EQU    0AH        ; port B data
  47. BCMND    EQU    0BH        ; port B command
  48.      ENDIF
  49. ;
  50. ;          KAYPRO 10
  51.      IF  KPRO10  AND (NOT NOTK10)
  52. BDATA    EQU    079H        ; port B data
  53. BCMND    EQU    07AH        ; port B command
  54.      ENDIF
  55. ;
  56. HOLD    EQU    16        ; Hold 5832 to set up read/write
  57. WR    EQU    64        ; Read 5832
  58. RD    EQU    32        ; Write 5832
  59. MODE0    EQU    0FH        ; Pio output mode
  60. MODE3    EQU    0CFH        ; Pio control mode
  61. ;
  62. ;----------------------------------------------------------------------
  63. ;  Bdos equates
  64. ;
  65. BDOS    EQU    5        ; CP/M entry point
  66. CONO    EQU    2        ; Console output function
  67. CPRT    EQU    9        ; Print string to console function
  68. RCONS    EQU    10        ; Read console buffer function
  69. FCB    EQU    5CH        ; Default file control block
  70. CBUF    EQU    80H        ; console buffer
  71. TPA    EQU    100H        ; Transient Program Area
  72. ;
  73. ;  ASCII equates
  74. ;
  75. CR    EQU    13        ; Carriage return code
  76. LF    EQU    10        ; Line feed code
  77. ;
  78. ;----------------------------------------------------------------------
  79. ;  Program begins
  80. ;
  81.     ORG    TPA        ; Transient Program Area
  82. ;
  83. START:    LXI    H,0        ; clear it
  84.     DAD    SP        ; put stack ptr in it
  85.     SHLD    STACK        ; save it for exit
  86.     LXI    SP,STACK    ; set local stack
  87. ;
  88. ;  Set port to output mode
  89. ;
  90. BEGIN:    MVI    A,MODE0        ; output mode
  91.     OUT    BCMND        ; command port
  92.     MVI    A,3        ; disable interrupts
  93.     OUT    BCMND        ; command port
  94. ;
  95. ;----------------------------------------------------------------------
  96. ;  Main program
  97. ;
  98.     LXI    H,TIME        ; clock buffer
  99.     MVI    C,13        ; read 13 bytes
  100.     MVI    A,1
  101. CL1:    MOV    M,A        ; move em to buffer
  102.     INX    H
  103.     DCR    C        ; dec register
  104.     JNZ    CL1        ; if not zero, loop
  105. ;
  106.     LDA    FCB+1        ; check the fcb for set option
  107.     ANI    5FH        ; force upper case
  108.     CPI    'S'        ; is it 's' or 'S'
  109.     JNZ    TIM        ; if not, tell time and exit
  110.     CALL    SETTIM        ; or do the set clock routines
  111. ;
  112. ;----------------------------------------------------------------------
  113. ;  Screen display time/date either plain, video, or 25th status line.
  114. ;
  115. TIM:    CALL     ILPRT        ; print to Kaypro CRT
  116. ;
  117. ;  For video kaypro's only
  118.      IF    LINE25
  119.     DB    1BH,'C7'    ; disable 25th line
  120.     DB    1AH        ; clear screen/25th line
  121.     DB    1BH,'B7'    ; enable 25th line
  122.     DB    1BH,'=8 '    ; load cursor to 25,0
  123.      ENDIF
  124. ;
  125.      IF    VIDEO
  126.     DB    1BH,'B0'    ; inverse video ON
  127.     DB    1BH,'B1'    ; dim video on
  128.      ENDIF
  129. ;
  130.     DB    ' Time ',0    ; print time/date line
  131.     CALL    TELTIM        ; tell the time
  132.     JMP    EXIT        ; and exit
  133. ;
  134. ; Read the clock digits from the buffer
  135. ;
  136. TELTIM:
  137.     CALL    RDMOD        ; set chb to read mode
  138.     LXI    H,TIME        ; clock buffer
  139.     MVI    C,13        ; # bytes to read
  140. TTLP:    MOV    A,L
  141.     ANI    0FH        ; mask off high nybble
  142.     CALL    RDCLK
  143.     MOV    M,A        ; store it in clock buffer
  144.     INX    H        ; bump buffer ptr
  145.     DCR    C        ; finished?
  146.     JNZ    TTLP        ; guess not
  147. ;
  148. ; Output clock buffer to screen
  149. ;    hh:mm:ss  format
  150. ;
  151.     LHLD    HOUR        ; hours
  152.     MOV    A,H        ; 10's digit
  153.     ANI    3        ; mask hi bits
  154.     CALL    ASCII        ; to screen
  155.     MOV    A,L        ; 1's digit
  156.     CALL    ASCII        ; to screen
  157.     MVI    A,':'        ; separator
  158.     CALL    TYPE        ; to screen
  159.     LHLD    MIN        ; minutes
  160.     MOV    A,H        ; 10's digit
  161.     CALL    ASCII        ; to screen
  162.     MOV    A,L        ; 1's digit
  163.     CALL    ASCII        ; to screen
  164.     MVI    A,':'        ; separator
  165.     CALL    TYPE        ; to screen
  166.     LHLD    SEC        ; seconds
  167.     MOV    A,H        ; 10's digit
  168.     CALL    ASCII        ; to screen
  169.     MOV    A,L        ; 1's digit
  170.     CALL    ASCII        ; to screen
  171.     MVI    A,' '        ; space
  172.     CALL    TYPE        ; to screen
  173.     MVI     A,' '        ; turn up a 
  174.     CALL    TYPE        ; blank space
  175.     MVI    A,' '        ; ditto
  176.     CALL    TYPE
  177. ;
  178. ; Day of the week
  179.     LDA    DAY        ; varies from 0 - 6
  180.     ANI    7        ; mask hi bits
  181.     MOV    L,A        ; preset hl
  182.     MVI    H,0
  183.     DAD    H        ; day * 2 for table offset
  184.     LXI    D,DAYS        ; point to days table
  185.     DAD    D        ; point to day of week
  186.     MOV    E,M        ; move pointer to de
  187.     INX    H
  188.     MOV    D,M
  189.     MVI    C,CPRT        ; print string
  190.     CALL    BDOS        ; print day of week
  191.     MVI    A,' '        ; print a
  192.     CALL     TYPE        ; blank space
  193. ;
  194. ; Month of the year (varies from 1 to 12)
  195.     LDA    MONTH+1        ; 10's digit
  196.     ANI    1        ; is it October or later?
  197.     JZ    MONT        ; guess not
  198.     MVI    A,10
  199. MONT:    MOV    L,A        ; A = 0 or 10
  200.     MVI    H,0
  201.     LDA    MONTH        ; 1's digit
  202.     ANI    0FH        ; mask hi bits
  203.     ADD    L
  204.     MOV    L,A        ; month in hl
  205.     DCX    H        ; rel zero for months table
  206.     DAD    H        ; times 2 for offset
  207.     LXI    D,MONTHS    ; point to table
  208.     DAD    D        ; point to month
  209.     MOV    E,M        ; move pointer to de
  210.     INX    H
  211.     MOV    D,M
  212.     MVI    C,CPRT
  213.     CALL    BDOS        ; month to console
  214. ; Date of the month
  215.     LHLD    DATE        ; date of month
  216.     MOV    A,H        ; 10's digit
  217.     ORA    A        ; is it zero?
  218.     JZ    DATL        ; if so
  219.     CALL    ASCII        ; to screen if not
  220. DATL:    MOV    A,L        ; 1's digit
  221.     CALL    ASCII        ; to screen
  222.     MVI    A,','        ; space
  223.     CALL    TYPE        ; to screen
  224.     mvi    a,' '        ; print a
  225.     call    type        ; blank space
  226. ; Print year to console
  227.     CALL    ILPRT
  228.     DB    '19',0        ; print century
  229.     LDA    YEAR+1        ; 10's digit
  230.     CALL    ASCII        ; to screen
  231.     LDA    YEAR        ; 1's digit
  232.     CALL    ASCII        ; to screen
  233.     CALL    ILPRT        ; print
  234. ;
  235. ;   For video kaypro
  236.      IF    VIDEO
  237.     DB    ' ',1BH,'C0'    ; inverse video OFF
  238.     DB    1BH,'C1'    ; dim video off
  239.      ENDIF
  240.      IF    LINE25
  241.     DB    1AH        ; home cursor/clear screen
  242.      ENDIF
  243.     DB    0
  244.     RET            ; to exit
  245.  
  246. SETTIM:
  247. ;
  248. ; Ask 'What time is it?'
  249. ;
  250.     MVI    A,80H        ; max console buffer length
  251.     STA    CBUF        ; init buffer length
  252.     CALL    ILPRT        ; print setting message
  253.     DB    1AH            ; clr screen
  254. ;
  255. ;   For video kaypro
  256.      IF     VIDEO
  257.     DB    1BH,'B0',1BH,'B1'    ; clr screen/inverse video on
  258.     DB    '      Set Kaypro Legacy Clock.   '
  259.     DB    'Ver ',VER1+'0','.',VER2+'0'
  260.     DB    1BH,'B2','       CTRL-C to Exit  '
  261.     DB    1BH,'C0',1BH,'C1',1BH,'C2'    ; inverse video & blinking off
  262.     DB    CR,LF,LF
  263.      ENDIF
  264. ;
  265. ;  For regular kaypro
  266.      IF    (NOT VIDEO)
  267.     DB    '      Set Kaypro Legacy Clock.   '
  268.     DB    'Ver ',VER1+'0','.',VER2+'0'
  269.     DB    '      CTRL-C to Exit  '
  270.     DB    CR,LF,LF
  271.      ENDIF
  272. ;
  273. ;  For video kaypro
  274.      IF     VIDEO
  275.     DB    1BH,'B3'    ; dim mode on
  276.     DB    'Enter the year? (e.g. 86)                      '
  277.     DB    1BH,'C3',' : ',0    ; dim mode off
  278.      ENDIF
  279. ;
  280. ;  For non-video kaypro
  281.      IF    (NOT VIDEO)
  282.     DB    'Enter the year? (e.g. 86)                      : ',0
  283.      ENDIF    
  284. ;
  285.     LXI    D,CBUF        ; console buffer
  286.     MVI    C,RCONS        ; read console buffer
  287.     CALL    BDOS
  288.     LDA    CBUF+1        ; length
  289.     ORA    A        ; no entry?
  290.     JZ    SMONTH        ; next
  291.     LXI    H,CBUF+2    ; first digit
  292.     MOV    A,M
  293.     ANI    0FH        ; strip ascii
  294.     STA    YEAR+1        ; store it
  295.     INX    H        ; next digit
  296.     MOV    A,M
  297.     ANI    0FH        ; strip ascii
  298.     STA    YEAR        ; store it
  299. ;
  300. SMONTH:
  301.     CALL    ILPRT
  302.     DB    CR,LF,CR,LF
  303. ;
  304. ;  For video kaypro
  305.      IF VIDEO
  306.     DB    1BH,'B3'    ; dim mode on
  307.     DB    'Enter month? (Jan = 01, Feb = 02, etc.)        '
  308.     DB    1BH,'C3',' : ',0    ; dim mode off
  309.      ENDIF
  310. ;
  311. ;  For non-video kaypro
  312.      IF    (NOT VIDEO)
  313.     DB    'Enter month? (Jan = 01, Feb = 02, etc.)        : ',0
  314.      ENDIF    
  315. ;
  316.     LXI    D,CBUF
  317.     MVI    C,RCONS
  318.     CALL    BDOS
  319.     LDA    CBUF+1
  320.     ORA    A
  321.     JZ    SDATE        ; no month specified
  322.  
  323.     LDA    CBUF+2
  324.     ANI    0FH
  325.     STA    MONTH+1
  326.     LDA    CBUF+3
  327.     ANI    0FH
  328.     STA    MONTH
  329. ;
  330. SDATE:    CALL    ILPRT        ; in-line print
  331.     DB    CR,LF,CR,LF
  332. ;
  333. ;
  334. ;  For video kaypro
  335.      IF     VIDEO
  336.     DB    1BH,'B3'    ; dim mode on
  337.     DB    'Enter today''s date? (i.e. 01 to 31)            '
  338.     DB    1BH,'C3',' : ',0    ; dim mode off
  339.      ENDIF
  340. ;
  341. ;  For non-video kaypro
  342.      IF    (NOT VIDEO)
  343.     DB    'Enter today''s date? (i.e. 01 to 31)            : ',0
  344.      ENDIF    
  345. ;
  346.     LXI    D,CBUF        ; console buffer
  347.     MVI    C,RCONS
  348.     CALL    BDOS
  349.     LDA    CBUF+1
  350.     ORA    A
  351.     JZ    SDAY
  352. ;
  353.     LDA    CBUF+2        ; 10's digit
  354.     ANI    0FH        ; mask hi nybble
  355.     STA    DATE+1
  356.     LDA    CBUF+3
  357.     ANI    0FH
  358.     STA    DATE
  359. ;
  360. SDAY:    CALL    ILPRT
  361.     DB    CR,LF,CR,LF
  362. ;
  363. ;  For video kaypro
  364.      IF     VIDEO
  365.     DB    1BH,'B3'    ; dim mode on
  366.     DB    'Enter the day (Sun = 1, Mon = 2, etc.)         '
  367.     DB    1BH,'C3',' : ',0    ; dim mode off
  368.      ENDIF
  369. ;
  370. ;  For non-video kaypro
  371.      IF    (NOT VIDEO)
  372.     DB    'Enter the day (Sun = 1, Mon = 2, etc.)         : ',0
  373.      ENDIF    
  374. ;
  375.     LXI    D,CBUF
  376.     MVI    C,RCONS
  377.     CALL    BDOS
  378.     LDA    CBUF+1
  379.     ORA    A
  380.     JZ    STIME        ; no day specified
  381.     LDA    CBUF+2
  382.     ANI    0FH
  383.     DCR    A        ; rel 0
  384.     STA    DAY
  385. ;
  386. STIME:    CALL    ILPRT
  387.     DB    CR,LF,CR,LF
  388. ;
  389. ;  For video kaypro
  390.      IF  VIDEO
  391.     DB    1BH,'B3'    ; dim mode on
  392.     DB    'Enter current time (24-hour mode 1545 = 3:45p) '
  393.     DB    1BH,'C3',' : ',0    ; dim mode off
  394.      ENDIF
  395. ;
  396. ;  For non-video kaypro
  397.      IF    (NOT VIDEO)
  398.     DB    'Enter current time (24-hour mode 1545 = 3:45p) : ',0
  399.      ENDIF    
  400. ;
  401.     LXI    D,CBUF
  402.     MVI    C,RCONS
  403.     CALL    BDOS
  404.     LDA    CBUF+1
  405.     ORA    A
  406.     JZ    SETCLK        ; no time specified
  407.     LDA    CBUF+2
  408.     ANI    0FH
  409.     ORI    8        ; 24 hour format
  410.     STA    HOUR+1
  411.     LDA    CBUF+3
  412.     ANI    0FH
  413.     STA    HOUR
  414.     LDA    CBUF+4
  415.     ANI    0FH
  416.     STA    MIN+1
  417.     LDA    CBUF+5
  418.     ANI    0FH
  419.     STA    MIN
  420.     CALL    ILPRT        ;LINE FEED THEN PRINT
  421.     DB    CR,LF,CR,LF,LF,0
  422. ;
  423. ;  Write the time buffer to the clock
  424. ;
  425. SETCLK: CALL    WRMOD
  426.     LXI    H,TIME
  427.     MVI    C,13
  428. STCLK1:    MOV    E,M
  429.     MOV    A,L
  430.     ANI    0FH
  431.     CALL    WRCLK
  432.     INX    H
  433.     DCR    C
  434.     JNZ    STCLK1
  435.     RET
  436. ;
  437. ILPRT:    POP    H        ; hl points to string
  438. ILP1:    MOV    A,M        ; get the character
  439.     INX    H        ; point to next character
  440.     ORA    A        ; is this the zero terminator?
  441.     JZ    ILEX        ; yep. we'RE DONE
  442.     CALL    TYPE        ; to screen
  443.     JMP    ILP1        ; do it again
  444. ILEX:    PCHL            ; jump to instruction following string
  445. ;
  446. ASCII:    ADI    30H        ; binary to ascii
  447. TYPE:    PUSH    PSW        ; out to screen, saving all registers
  448.     PUSH    H
  449.     PUSH    D
  450.     PUSH    B
  451.     MOV    E,A
  452.     MVI    C,CONO        ; console output
  453.     CALL    BDOS
  454.     POP    B
  455.     POP    D
  456.     POP    H
  457.     POP    PSW
  458.     RET
  459. ;
  460. RDCLK:        ; FOR KCLOCK
  461.     push    psw        ; save address
  462.     call    wrmod        ; setup pio
  463.     pop    psw
  464.     ori    hold+80h    ; add hold and address gate bit
  465.     out    bdata        ; set address and gate
  466.     ani    7fh        ; reset gate bit
  467.     out    bdata        ; address is now latched
  468.     call    wait        ; 150 usec to establish hold
  469.     call    rdmod        ; setup to read lo nybble
  470.     mvi    a,hold+rd    ; add read command to hold
  471.     out    bdata
  472.     call    wait1        ; wait 6 usec
  473.     in    bdata        ; read clock
  474.     ani    0fh        ; mask hi nybble
  475.     push    psw        ; save it
  476.     xra    a        ; clear a
  477.     out    bdata        ; release hold
  478.     pop    psw        ; restore clock data
  479.     ret
  480. ;
  481. wrclk:        ; for KClock
  482.     push    psw        ; save address
  483.     call    wrmod
  484.     pop    psw
  485.     ori    hold+80h    ; hold plus address gate bit
  486.     out    bdata
  487.     ANI    7FH        ; reset gate bit
  488.     out    bdata
  489.     call    wait        ; wait 150 usec to establish hold
  490.     mvi    a,hold+wr    ; add write command to hold
  491.     ORA    e        ; data to write
  492.     out    bdata
  493.     PUSH    PSW
  494.     call    wait1        ; wait 6 usec
  495.     POP    PSW
  496.     XRI    WR        ; turn off write command
  497.     OUT    BDATA
  498.     xra    a        ; clear a
  499.     out    bdata        ; release hold
  500.     ret
  501. ;
  502. ; set port b to write the clock
  503. WRMOD:    MVI    A,MODE3        ; control mode
  504.     OUT    BCMND
  505.     MVI    A,0        ; write to clock
  506.     OUT    BCMND
  507.     RET
  508. ;
  509. ; set port b to read the clock
  510. RDMOD:    MVI    A,MODE3        ; control mode
  511.     OUT    BCMND
  512.     MVI    A,0FH        ; to read clock
  513.     OUT    BCMND
  514.     RET
  515. ;
  516. wait:        ; 150 usec timing loop
  517.     mvi    a,54        ; loop control
  518. w0:    dcr    a
  519.     jnz    w0
  520.     ret
  521. ;
  522. wait1:        ; 6 usec timing loop
  523.     mvi    a,3
  524.     jmp    w0
  525. ;
  526. EXIT:    LHLD    STACK
  527.     SPHL
  528.     RET
  529. ;
  530. TIME:    EQU    $+15 AND 0FFF0H    ; 16-byte boundary
  531.     ORG    TIME
  532. SEC:    DS    2        ; seconds
  533. MIN:    DS    2        ; minutes
  534. HOUR:    DS    2
  535. DAY:    DS    1        ; day of week
  536. DATE:    DS    2
  537. MONTH:    DS    2
  538. YEAR:    DS    2
  539. ;
  540. DAYS:    DW    SUN
  541.     DW    MON
  542.     DW    TUE
  543.     DW    WED
  544.     DW    THU
  545.     DW    FRI
  546.     DW    SAT
  547. ;
  548. SUN    DB    'Sunday $'
  549. MON    DB    'Monday $'
  550. TUE    DB    'Tuesday $'
  551. WED    DB    'Wednesday $'
  552. THU    DB    'Thursday $'
  553. FRI    DB    'Friday $'
  554. SAT    DB    'Saturday $'
  555. ;
  556. MONTHS:    DW    JAN
  557.     DW    FEB
  558.     DW    MAR
  559.     DW    APR
  560.     DW    MAY
  561.     DW    JUN
  562.     DW    JUL
  563.     DW    AUG
  564.     DW    SEP
  565.     DW    OCT
  566.     DW    NOV
  567.     DW    DEC
  568. ;
  569. JAN    DB    'January $'
  570. FEB    DB    'February $'
  571. MAR    DB    'March $'
  572. APR    DB    'April $'
  573. MAY    DB    'May $'
  574. JUN    DB    'June $'
  575. JUL    DB    'July $'
  576. AUG    DB    'August $'
  577. SEP    DB    'September $'
  578. OCT    DB    'October $'
  579. NOV    DB    'November $'
  580. DEC    DB    'December $'
  581. ;
  582.     DS    32
  583. STACK:    END    START
  584.