home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / CLOCKK / MDCLCK13.LBR / CLOCKOUT.AZM / CLOCKOUT.ASM
Assembly Source File  |  2000-06-30  |  8KB  |  358 lines

  1. ;  -=[ CLOCKOUT - Displays Date & Time from Real-Time Clock/Calendar ]=-
  2. ;
  3. ; Hardware specific for Oki MSM5832 real-time clock/calendar accessed via
  4. ; port B of Z80 PIO (port 79h = data, port 7Bh = control) or via 8255
  5. ; parallel interface (port 30h = clock data, port 31h = clock address,
  6. ; port 32h = clock control, port 33h = 8255 control)
  7. ;
  8. ; Written in 8080 mnemonics for assembly with ASM (or equivalent) by John
  9. ; D. Osnes, 1084 6th Street #41, Albany, CA (9/30/86).  The author grate-
  10. ; fully acknowledges Mike Allen for his contribution of a clock design for
  11. ; Morrow Designs Rev.2 computers accessed via an 8255 parallel interface 
  12. ; and for the corresponding READTIME routine which the 8255 option herein
  13. ; is based on.
  14. ;
  15. ; USER BE AWARE:  the author has a Legacy clock accessed via a Z80 PIO, so
  16. ; the 8255 option in CLOCKOUT is UNTESTED.  What should work may not and no
  17. ; fault should be attributed to Mike Allen's fine work.  For that matter,
  18. ; the author specifically disclaims any warranties, implied or otherwise,
  19. ; as to the performance and suitability of CLOCKOUT.
  20. ;
  21. ; FURTHER NOTES BY MIKE ALLEN:  The 8255 option has been verified on my
  22. ; homebrew clock using the 8255 option installed in my MD3 and it works as
  23. ; advertised.  I thank John for some very good work.
  24. ;                             Mike Allen  11/16/86
  25. ;
  26. ;
  27. FALSE    EQU    0
  28. TRUE    EQU    NOT FALSE
  29.  
  30. ; ************************ ASSEMBLY-TIME OPTIONS **************************
  31.  
  32. DATE    EQU    TRUE        ; If true, date will be displayed
  33.  
  34. TIME    EQU    TRUE        ; If true, time will be displayed
  35.  
  36. DSPSEC    EQU    TRUE        ; If true, seconds will be displayed in
  37.                 ; time
  38.  
  39. DOFW    EQU    TRUE        ; If true, day of week will be displayed
  40.                 ; with date
  41.  
  42. NUMNTH    EQU    TRUE        ; If true, date will be displayed in
  43.                 ; mn/dy/yr format (month dy, 19yr format
  44.                 ; otherwise)
  45.  
  46. LEAPYR    EQU    TRUE        ; If true, leap year msg will be displayed
  47.                 ; with date when leap year flag in clock
  48.                 ; is set (used primarily as a diagnostic)
  49.  
  50. SPEED    EQU    40        ; 10 times speed of CPU in MHz (40=4 MHz)
  51.  
  52. Z80PIO    EQU    FALSE        ; If true, clock accessed via Z80 PIO
  53.                 ; If false, clock accessed via 8255
  54.  
  55.      IF    Z80PIO        ; Z80 PIO ports (defaults based on Legacy clock)
  56. CLKDAT    EQU    79H        ; Data port for clock (Z80 PIO port B)
  57. CLKCTL    EQU    7BH        ; Control port for clock (Z80 PIO port B)
  58.      ENDIF    ; Z80PIO
  59.  
  60.      IF    NOT Z80PIO    ; 8255 ports (defaults based on Mike Allen's
  61.                 ; design for Morrow Designs Rev.2 clock)
  62. CLKDAT    EQU    30H        ; Data port for clock (8255 port A)
  63. CLKADR    EQU    31H        ; Address port for clock (8255 port B)
  64. CLKCTL    EQU    32H        ; Control port for clock (8255 port C)
  65. PRTCTL    EQU    33H        ; 8255 control port
  66.      ENDIF    ; NOT Z80PIO (8255)
  67.  
  68. ; *************************** END OF OPTIONS ******************************
  69.  
  70. BDOS    EQU    0005H        ; BDOS entry point
  71. CONOUT    EQU    02H        ; BDOS "Console Output" function
  72. PSTRNG    EQU    09H        ; BDOS "Print String" function
  73.  
  74. LF    EQU    0AH        ; Linefeed
  75. CR    EQU    0DH        ; Carriage return
  76.  
  77.     ORG    0100H
  78.  
  79.     MVI    A,13        ; Sweep through 13 addresses of clock
  80.     MVI    E,0
  81.     LXI    H,SECS        ; And store contents in memory
  82. SWCLOK:    PUSH    PSW
  83.     CALL    RDCLOK
  84.     MOV    M,A
  85.     INR    E
  86.     INX    H
  87.     POP    PSW
  88.     DCR    A
  89.     JNZ    SWCLOK
  90.  
  91.      IF    TIME
  92.     LXI    H,HRS+1        ; Display hr:mn
  93.     MOV    A,M
  94.     ANI    3
  95.     MOV    B,A
  96.     MOV    A,M
  97.     ANI    8
  98.     PUSH    PSW
  99.     JNZ    HOUR
  100.     MOV    A,B
  101.     ORA    A
  102.     JZ    HOUR2
  103. HOUR:    MOV    A,B
  104.     CALL    PDIG2
  105. HOUR2:    DCX    H
  106.     CALL    PDIGIT
  107.     MVI    A,':'
  108.     CALL    PCHAR
  109.     CALL    PDIGIT
  110.     CALL    PDIGIT
  111.      ENDIF
  112.  
  113.      IF    TIME AND DSPSEC
  114.     MVI    A,':'        ; Display :sc
  115.     CALL    PCHAR
  116.     CALL    PDIGIT
  117.     CALL    PDIGIT
  118.      ENDIF
  119.  
  120.      IF    TIME
  121.     POP    PSW        ; Display a.m./p.m. if 12-hour clock
  122.     LXI    D,BLANKS    ; Display a blanks if 24-hour clock
  123.     JNZ    DISPLA
  124.     LXI    D,AMPMSG+1
  125.     LDA    HRS+1
  126.     ANI    4
  127.     JZ    AMPM
  128.     MVI    A,'p'
  129.     STAX    D
  130. AMPM:    DCX    D
  131. DISPLA:    MVI    C,PSTRNG
  132.     CALL    BDOS
  133.      ENDIF
  134.  
  135.      IF    DATE AND DOFW
  136.     LDA    DOW        ; Display day-of-week
  137.     ADD    A
  138.     MVI    D,0
  139.     MOV    E,A
  140.     LXI    H,DAYS
  141.     DAD    D
  142.     MOV    E,M
  143.     INX    H
  144.     MOV    D,M
  145.     MVI    C,PSTRNG
  146.     CALL    BDOS
  147.      ENDIF
  148.  
  149.      IF    DATE AND NUMNTH    ; Display mm/dy/yr
  150.     LXI    H,MNTH+1
  151.     CALL    PDIGIT
  152.     CALL    PDIGIT
  153.     MVI    A,'/'
  154.     CALL    PCHAR
  155.     MOV    A,M
  156.     ANI    3
  157.     CALL    PDIG2
  158.     DCX    H
  159.     CALL    PDIGIT
  160.     MVI    A,'/'
  161.     CALL    PCHAR
  162.      ENDIF
  163.  
  164.      IF    DATE AND NOT NUMNTH ; Display month dy, 19yr
  165.     LXI    H,MNTH+1
  166.     MOV    A,M
  167.     ADD    A
  168.     MOV    B,A
  169.     ADD    A
  170.     ADD    A
  171.     ADD    B
  172.     DCX    H
  173.     ADD    M
  174.     PUSH    H
  175.     LXI    H,MONTHS
  176.     DCR    A
  177.     ADD    A
  178.     MVI    D,0
  179.     MOV    E,A
  180.     DAD    D
  181.     MOV    E,M
  182.     INX    H
  183.     MOV    D,M
  184.     MVI    C,PSTRNG
  185.     CALL    BDOS
  186.     POP    H
  187.     DCX    H
  188.     MOV    A,M
  189.     ANI    3
  190.     CNZ    PDIG2
  191.     DCX    H
  192.     CALL    PDIGIT
  193.     MVI    C,PSTRNG
  194.     LXI    D,CENTRY
  195.     CALL    BDOS
  196.      ENDIF
  197.  
  198.      IF    DATE
  199.     LXI    H,YEAR+1
  200.     CALL    PDIGIT
  201.     CALL    PDIGIT
  202.      ENDIF
  203.  
  204.      IF    DATE AND LEAPYR
  205.     LDA    DAY+1        ; Display leap year flag
  206.     ANI    4
  207.     JZ    EXIT
  208.     MVI    C,PSTRNG
  209.     LXI    D,LEAPMS
  210.     CALL    BDOS
  211.      ENDIF
  212.  
  213. EXIT:    MVI    C,PSTRNG    ; Terminate display with carriage
  214.     LXI    D,CRLF        ; Return & linefeed
  215.     JMP    BDOS        ; Return to CCP via BDOS
  216.  
  217. PDIGIT:    MOV    A,M        ; Display BCD digit pointed to by HL
  218.     DCX    H        ; And decrement pointer
  219. PDIG2:    ADI    '0'        ; Display BCD digit in A
  220.                 ; Fall thru PCHAR
  221. PCHAR:    MOV    E,A        ; Display char in A
  222.     MVI    C,CONOUT
  223.     PUSH    H
  224.     CALL    BDOS
  225.     POP    H
  226.     RET
  227.  
  228.      IF    Z80PIO
  229. ; *************************************************************************
  230. ; *    Routine reads E=addr from clock interfaced by Z80 PIO and returns *
  231. ; *    1 BCD digit in A                          *
  232. ; *************************************************************************
  233.  
  234. HOLD    EQU    10H        ; Mask to halt clock
  235. READ    EQU    20H        ; Mask to read clock
  236. WRITE    EQU    40H        ; Mask to set clock
  237. ADDRIN    EQU    80H        ; Mask to enter addr
  238. MODE3    EQU    0CFH        ; Byte to set clock port (Z80 PIO) to mode 3
  239.  
  240. RDCLOK:    MVI    A,MODE3        ; Set clock port to mode 3
  241.     OUT    CLKCTL        ; With all bits for output
  242.     XRA    A
  243.     OUT    CLKCTL
  244.     MVI    A,ADDRIN    ; Send addr to clock
  245.     ORA    E
  246.     OUT    CLKDAT
  247.     MOV    A,E        ; Latch addr
  248.     OUT    CLKDAT
  249.     MVI    A,MODE3        ; Set lower 4 bits of clock port
  250.     OUT    CLKCTL        ; To input
  251.     MVI    A,0FH
  252.     OUT    CLKCTL
  253.     MVI    A,HOLD        ; Halt clock
  254.     OUT    CLKDAT
  255. RDCLK1    EQU    (150*SPEED)/170
  256.     MVI    A,RDCLK1    ; Wait 150 microseconds
  257. RDCLK2:    SUI    1
  258.     JNC    RDCLK2
  259.     MVI    A,READ+HOLD    ; Send read request
  260.     OUT    CLKDAT
  261. RDCLK3    EQU    (6*SPEED)/170
  262.     MVI    A,RDCLK3    ; Wait 6 microseconds
  263. RDCLK4:    SUI    1
  264.     JNC    RDCLK4
  265.     IN    CLKDAT        ; Get BCD digit (in lower 4 bits)
  266.     ANI    0FH        ; Strip 4 high bits
  267.     MOV    B,A        ; Save digit
  268.     XRA    A        ; Clear read request & restart clock
  269.     OUT    CLKDAT
  270.     MOV    A,B        ; Return BCD digit in A
  271.     RET
  272.      ENDIF    ; Z80PIO
  273.  
  274.      IF    NOT Z80PIO    ; (8255)
  275. ; *************************************************************************
  276. ; *    Routine reads E=addr from clock interfaced by 8255 and returns      *
  277. ; *    1 BCD digit in A (based on Mike Allen's READTIME in MDCLCK11.LBR) *
  278. ; *************************************************************************
  279.  
  280. RDCLOK:    MVI    A,90H        ; Set up 8255
  281.     OUT    PRTCTL
  282.     MVI    A,20H        ; Send read request to clock
  283.     OUT    CLKCTL
  284.     MOV    A,E        ; Send address to clock
  285.     OUT    CLKADR
  286. RDCLK1    EQU    (6*SPEED)/170
  287.     MVI    A,RDCLK1    ; Wait 6 microseconds
  288. RDCLK2:    SUI    1
  289.     JNC    RDCLK2
  290.     IN    CLKDAT        ; Get BCD digit (in lower 4 bits)
  291.     ANI    0FH        ; Strip 4 high bits
  292.     MOV    B,A        ; Save digit
  293.     XRA    A        ; Clear read request
  294.     OUT    CLKCTL
  295.     MOV    A,B        ; Return BCD digit in A
  296.     RET
  297.      ENDIF    ; NOT Z80PIO (8255)
  298.  
  299. ; ***************************** DATA AREAS ********************************
  300.  
  301.      IF    TIME
  302. AMPMSG:    DB    ' a.m.'
  303. BLANKS:    DB    '  $'
  304.      ENDIF
  305.  
  306.      IF    DATE AND DOFW
  307. DAYS:    DW    SUN,MON,TUE,WED,THU,FRI,SAT
  308.  
  309. SUN:    DB    'Sunday  $'
  310. MON:    DB    'Monday  $'
  311. TUE:    DB    'Tuesday  $'
  312. WED:    DB    'Wednesday  $'
  313. THU:    DB    'Thursday  $'
  314. FRI:    DB    'Friday  $'
  315. SAT:    DB    'Saturday  $'
  316.      ENDIF
  317.  
  318.      IF    DATE AND NOT NUMNTH
  319. MONTHS:    DW    JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
  320.  
  321. JAN:    DB    'January $'
  322. FEB:    DB    'February $'
  323. MAR:    DB    'March $'
  324. APR:    DB    'April $'
  325. MAY:    DB    'May $'
  326. JUN:    DB    'June $'
  327. JUL:    DB    'July $'
  328. AUG:    DB    'August $'
  329. SEP:    DB    'September $'
  330. OCT:    DB    'October $'
  331. NOV:    DB    'November $'
  332. DEC:    DB    'December $'
  333.  
  334. CENTRY:    DB    ', 19$'
  335.      ENDIF
  336.  
  337.      IF    DATE AND LEAPYR
  338. LEAPMS:    DB    '  (Leap Year)$'
  339.      ENDIF
  340.  
  341. CRLF:    DB    CR,LF,'$'
  342.  
  343. SECS    EQU    $
  344. MINS    EQU    SECS+2
  345. HRS    EQU    MINS+2
  346. DOW    EQU    HRS+2
  347. DAY    EQU    DOW+1
  348. MNTH    EQU    DAY+2
  349. YEAR    EQU    MNTH+2
  350.  
  351.     END
  352. ,LF,'$'
  353.  
  354. SECS    EQU    $
  355. MINS    EQU    SECS+2
  356. HRS    EQU    MINS+2
  357. DOW    EQU    HRS+2
  358. DAY    EQU    DOW+1