home *** CD-ROM | disk | FTP | other *** search
- ;-----------------------------------------------------------------
- ; MXC-KC10.ASM
- ; clock overlay for mex and the Kenmore Computer Technologies (KCT)
- ; Ztime-I real-time clock.
-
- rev equ 12 ;V 1.2
-
- ; V1.2 30 Aug 86 - Fixed Year storage to chip - Rea Williams
- ; V1.1 26 Apr 85 - Added CSET routine - Joe Griffith
- ; V1.0 24 Apr 85 - Original, TM-KCT11.ASM - Joe Griffith
-
- ;--------------------------------------------------------------------
- ; This overlay provides the current date and time to MEX+ or higher
- ; versions of MEX. It is configured for the Kenmore Computer
- ; Technologies (KCT) Ztime-I real-time calendar/clock although it
- ; will probably work with any clock using the MM58167A clock chip.
-
- no equ 0
- yes equ 0ffh
- i8080 equ yes ;for xlat- do not change
- i8086 equ no
- cpm equ yes
- pcdos equ no
- cr equ 13
- lf equ 10
-
- mex equ 0D00h ;address of the service processor
- ilp equ 240 ;inline print
- sblank equ 244 ;scan input stream to next non-blank (cy=end)
- evala equ 243 ;evaluate number from input to HL
- gnc equ 241 ;get next character
- decout equ 239 ;decimal output from HL
-
- bport equ 0E0h ;base port address for KCT clock
- ;this address should be changed to
- ;reflect wherever your MM58167A is.
- centry equ 1900 ;hard code since it is not available
- ;from the clock chip
-
- ;--------------------------------------------------------------------
-
- org 100h ;processor type flag is here
-
- if i8080
- db 0c3h ;show which processor we are for
- endif
- if i8086
- db 0E9h
- endif
-
- ;-----------------------------------------------------------------
- ; JMP table for clock overlay
-
- org 0e00h ;start of clock overlay
-
- jmp gettim ;get time
- jmp getdat ;get date
- jmp setclk ;cset processor
- ret ;clock overlay init
- nop
- nop
- ret ;clock overlay de-init
- thisyr: db 0 ;this is actually the space reserved
- ;for the address portion of the jmp
- ;but no de-init is needed so the year
- ;is stored here. Note that the system
- ;must be cloned after the clock is set
- ;to permanently store the year here.
- hlpflg: db 0 ;likewise the help flag is stored here
-
- ;--------------------------------------------------------------------
- ; subroutine GETTIM returns the time as follows:
- ;
- ; B - Hours (0-23)
- ; C - Minutes (0-59)
- ; D - Seconds (0-59)
- ; E - Hundreths of seconds (0-99)
-
- gettim: in bport+2 ;get seconds
- push psw ;save for future reference
-
- call makbin ;make it a binary number
- mov d,a ;store it
- in bport+3 ;get minutes
- call makbin
- mov c,a
- in bport+4 ;get hours
- call makbin
- mov b,a
-
- in bport+2
- mov l,a ;store it
- pop psw ;get original seconds back
- cmp l ;compare the two
- jnz gettim ;not the same so do it over else
- mvi e,0 ;clear hundreds of seconds
- ret
-
- ;------------------------------------------------------------------------
- ; subroutine GETDAT returns the date as follows:
- ;
- ; BC - Year (1985-2099)
- ; D - Month (1=January, 2=February, etc.)
- ; E - Day of month (1-31)
-
- getdat: in bport+2 ;get seconds
- push psw ;save it for future reference
-
- in bport+7 ;get month
- call makbin
- mov d,a
- in bport+6 ;get day of month
- call makbin
- mov e,a
-
- in bport+2 ;get seconds again
- mov l,a ;store temporarily
- pop psw ;get original seconds
- cmp l ;compare the two
- jnz getdat ;if not the same do it over
- in bport+9 ;get year
- call makbin
- mov c,a ;put in it's proper place
- mvi b,0
- lxi h,centry ;load the century
- dad b ;add it to the stored value
- mov c,l ;move hl to bc
- mov b,h
- ret
-
- ;-----------------------------------------------------------------
- ; This routine takes the two BCD values in each nibble of the
- ; accumulator and converts it to a single binary value.
-
- makbin: push d ;save the current value
- push psw ;save the original value
- rrc ;put the 10s value in the lower bits
- rrc
- rrc
- rrc
- ani 0Fh ;mask off whatever is in the high nibble
- add a ;multiply this register by 10
- mov e,a
- add a
- add a
- add e
- mov e,a ;save in e
- pop psw ;get the original value
- ani 0Fh ;allow only low bits
- add e ;get total to a
- pop d ;restore de
- ret ;all done
-
- ;----------------------------------------------------------------------
- ; CSET processor. This routine allows the user to set the clock from
- ; command level by typing CSET yy/mm/dd hh:mm:ss.
-
- setclk: call ilprt
- db 'KCT Clock OVR V'
- db rev/10+'0','.'
- db rev mod 10+'0'
- db cr,lf,lf,0
-
- xra a ;get a zero
- sta hlpflg ;store it as a flag
- call twobcd ;get the first two numbers
- rc
- out bport+9 ;put in the year
- call twobcd ;get the month
- rc
- out bport+7 ;put in the months counter
- call twobcd ;get the day of the month
- rc
- out bport+6 ;put in the day counter
- call twobcd ;get the hour
- rc
- out bport+4 ;put in the hour counter
- call twobcd ;get the minutes
- rc
- out bport+3 ;put in the minutes counter
- call twobcd ;get the seconds
- rc
- out bport+2 ;put in the seconds counter
- ret
-
- ;------------------------------------------------------------------
- ; this routine looks at the CSET parameter and returns with a BCD
- ; pair in the two nibbles of the accumulator. Blanks and separators
- ; are skiped. The carry flag is set when the end of the line is
- ; reached.
-
- twobcd: call getnum ;get the 10's digit
- jc chlp ;no numbers there
- rrc ;put it in the high nibble
- rrc
- rrc
- rrc
- push psw ;save it
- call getnum ;get the 1's
- mov b,a ;temporary storage
- pop psw ;get the 10s back
- ora b ;merge the two
- ret
-
- getnum: mvi c,gnc ;get the next character
- call mex
- rc ;carry means there is no more input
- cpi '0'
- jc getnum ;char is smaller than ascii zero
- cpi ':'
- jnc getnum ;char is not an ascii digit
- cmc ;reset carry flag
- sta hlpflg
- sbi '0' ;make it a binary value
- ret
-
- chlp: lda hlpflg ;get the help flag
- cpi 0 ;is it null
- stc ;flag the end
- rnz ;if not then don't print
- call ilprt
- db 'CSET YY/MM/DD HH:MM:SS'
- db cr,lf,lf,0
- stc ;flag the system
- ret
-
- ;----------------------------------------------------------------------
- ; inline print routine
-
- ilprt: mvi c,ilp
- jmp mex
-
- end