<< Previous Message Main Index Next Message >>
<< Previous Message in Thread This Month Next Message in Thread >>
Date   : Mon, 11 Feb 1991 04:40:35 GMT
From   : NISC.SRI.COM!bjork@ucbvax.Berkeley.EDU
Subject: Compu-time clock driver, 8080 RMAC code

Here's a clock utility that I've used with the Compu-time S100
clock board. It has the OKI MSM5832 chip.

--Steven


; 22 jun 84 rev 1 computime clock stuff atomic penguin
; 5 feb 91 rev 2  RMAC version

clk    equ     0ech    ; clock board address
cld    equ     clk+1   ; data port address
cla    equ     clk+2   ; address port address
wval   equ     50      ; 150 microseconds/3 for 4 mhz

       public  start
       cseg

start: lda     80h     ; get user string
       cpi     0       ; anything there?
       jz      ptim    ; nope, just read the clock.
       lda     82h     ; see what user typed.
       cpi     'D'     ; Set the day?
       jz      sday    ; go set day
       cpi     'T'     ; set the time?
       jz      stim    ; go set time
       cpi     'F'     ; forever mode?
       jnz     qwak    ; invalid, bark at human
       xra     a       ; usual zero
       sta     frevrf  ; set the forever flag
       jmp     ptim    ; print time
qwak:  lxi     d,xmsg  ; point at bark string
       mvi     c,9
       jmp     5       ; returns to cmd level

       dseg

frevrf:        db 1    ; zero if forever mode

xmsg:  db '** Invalid option **',0dh,0ah
       db 0dh,0ah
       db 'Type DAY D dd/mm/yy to set date.',0dh,0ah
       db 0dh,0ah
       db 'Type DAY T hh:mm:ss to set time.',0dh,0ah,'$'

mo1:   db ' January $'
mo2:   db ' February $'
mo3:   db ' March $'
mo4:   db ' April $'
mo5:   db ' May $'
mo6:   db ' June $'
mo7:   db ' July $'
mo8:   db ' August $'
mo9:   db ' September $'
mo10:  db ' October $'
mo11:  db ' November $'
mo12:  db ' December $'

       cseg

ptim:  mvi     a,08h   ; address MSM5832 internal reg
       call    rnib    ; get day of month msb
       ani     3       ; mask gibberish
       adi     30h     ; add ascii offset
       mov     e,a
       mvi     c,2
       call    5
       mvi     a,7
       call    pnib    ; print day of month lsb
       mvi     a,0ah   ; MSM5832 register
       call    rnib    ; get month msb
       cpi     1
       jnz     month   ; jump if less than august.
       mvi     a,9
       call    rnib    ; get month lsb
       lxi     d,mo10
       cpi     0
       jz      pmo
       lxi     d,mo11
       cpi     1
       jz      pmo
       lxi     d,mo12  ; must be december
       jmp     pmo
month: mvi     a,9     ; get month lsb
       call    rnib
       lxi     d,mo1
       cpi     1
       jz      pmo
       lxi     d,mo2
       cpi     2
       jz      pmo
       lxi     d,mo3
       cpi     3
       jz      pmo
       lxi     d,mo4
       cpi     4
       jz      pmo
       lxi     d,mo5
       cpi     5
       jz      pmo
       lxi     d,mo6
       cpi     6
       jz      pmo
       lxi     d,mo7
       cpi     7
       jz      pmo
       lxi     d,mo8
       cpi     8
       jz      pmo
       lxi     d,mo9
pmo:   mvi     c,9
       call    5       ; print name of month
       mvi     a,0ch   ; MSM5832 register
       call    pnib    ; print year msb
       mvi     a,0bh   ; MSM5832 register
       call    pnib    ; print year lsb
       mvi     e,' '
       mvi     c,2
       call    5       ; pretty print
       mvi     a,5
       call    rnib    ; get hours msb
       ani     3       ; mask gibberish
       adi     30h     ; add ascii offset
       mov     e,a
       mvi     c,2
       call    5
       mvi     a,4
       call    pnib
       mvi     e,':'
       mvi     c,2
       call    5
       mvi     a,3
       call    pnib    ; print minutes msb
       mvi     a,2
       call    pnib    ; print minutes lsb
       mvi     e,':'
       mvi     c,2
       call    5
       mvi     a,1
       call    pnib    ; print seconds msb
       xra     a       ; usual zero
       call    pnib
       mvi     e,0dh
       mvi     c,2
       call    5
       lda     frevrf  ; get the forever flag
       ora     a       ; set CPU flags
       jz      ptim    ; do it forever if zero
       ret

pnib:  call    rnib
       adi     30h     ; add ascii offset
       mov     e,a
       mvi     c,2
       jmp     5       ; os does a return

rnib:  mov     c,a     ; save address
       mvi     a,10h   ; value for hold bit
       out     cld     ; set hold bit
       call    w150    ; wait 150 microseconds !
       mov     a,c
       ori     20h     ; "set 5,a"
       out     cla
       call    w6      ; wait 6 microseconds
       in      cld
       mov     b,a
       xra     a       ; usual zero
       out     cla     ; clear read bit
       out     cld     ; clear hold bit
       mov     a,b
       ani     0fh     ; mask gibberish
w6:    ret
w150:  mvi     b,wval  ; relate this to cpu clock
wl:    dcr     b       ; "djnz wl"
       jnz     wl
       ret

stim:  lxi     h,84h   ; point to cmd line gunk
       mov     a,m
       ori     8h      ; set 24 hour bit
       mvi     b,5     ; point to hours reg
       call    wnib    ; write the nibble
       inx     h
       mov     a,m
       mvi     b,4
       call    wnib    ; write hours lsb
       inx     h
       inx     h       ; skip slash & get minutes msb
       mov     a,m
       mvi     b,3
       call    wnib    ; write minutes msb
       inx     h
       mov     a,m
       mvi     b,2
       call    wnib    ; write minutes lsb
       inx     h
       inx     h
       mov     a,m
       mvi     b,1
       call    wnib
       inx     h
       mov     a,m
       mvi     b,0
       jmp     wnib    ; returns to cmd level

sday:  lxi     h,84h   ; point to cmd line gunk
       mov     a,m
       mvi     b,8
       call    wnib    ; write day msb
       inx     h
       mov     a,m
       mvi     b,7
       call    wnib    ; write day lsb
       inx     h
       inx     h
       mov     a,m
       mvi     b,10
       call    wnib    ; write month msb
       inx     h
       mov     a,m
       mvi     b,9
       call    wnib    ; write month lsb
       inx     h
       inx     h
       mov     a,m
       mvi     b,12
       call    wnib    ; write year msb
       inx     h
       mov     a,m
       mvi     b,11

wnib:  ani     0fh     ; strip gibberish
       ori     10h     ; "set 4,a"
       out     cld
       mov     c,b     ; save address
       call    w150    ; loiter
       mov     a,c     ; get address of register
       ori     10h     ; "set 4,a" 
       out     cla
       ani     0efh    ; "res 4,a"
       out     cla
       xra     a
       out     cla
       out     cld
       ret

       end

<< Previous Message Main Index Next Message >>
<< Previous Message in Thread This Month Next Message in Thread >>