home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol096
/
clock.a86
< prev
next >
Wrap
Text File
|
1984-04-29
|
11KB
|
432 lines
M EQU Byte Ptr 0[BX]
;********************************************************
;* *
;* TEST ROUTINES FOR THE COMPPRO SYSTEM *
;* SUPPORT 1 BOARD REAL TIME CLOCK *
;* *
;********************************************************
;
; Verion 1.0 From System Support manual
; 8/1/82 Keyed in by Bill Bolton.
;
; Version 1.10 Modified for Australian date
; 8/1/82 format by Bill Bolton.
;
; Version 1.11 Placed version number in signon
; 11/1/82 and added version number equates
; Bill Bolton
;
; Version 1.12 XLT86 translation to CP/M-86
; Bill Bolton
;
BASE EQU 50H ;BASE PORT ADDRESS
CLKCMD EQU BASE+10 ;CLOCK COMMAND PORT
CLKDATA EQU BASE+11 ;CLOCK DATA PORT
WBOOT EQU 0 ;BIOS WBOOT ENTRY
BDOS EQU 00005H ;BDOS ENTRY POINT
READ EQU 10H ;READ BIT PATTERN
WRITE EQU 20H ;WRITE BIT PATTERN
HOLD EQU 40H ;HOLD BIT PATTERN
ALF EQU 0AH ;ASCII LINE FEED
ACR EQU 0DH ;ASCII CARRIAGE RETURN
;
VERS EQU 1 ;MAJOR VERSION NUMBER
REV EQU 12 ;MINOR REVISION NUMBER
;
ORG 100H
;
;********************************************************
;* THIS IS THE MAIN LOOP THAT PRINTS THE *
;* SIGNON MESSAGE, DECIDES WHAT COMMAND *
;* HAS BEEN ENTERED AND EXECUTES THAT ROUTINE *
;********************************************************
START:
MOV DX,(Offset SIGNON) ;INITIAL SIGNON MESSAGE
CALL PMSG ;DISPLAY IT
CALL GETCHAR ;GET COMMAND CHARACTER
CMP AL,'X' ;EXIT TO CP/M ?
JNZ L_1
MOV CL,0 ;YES
MOV DL,0
INT 224
L_1:
CMP AL,'S' ;SET TIME ?
JZ SETTIME ;YES
CMP AL,'D' ;DISPLAY TIME ?
JNZ L_2
JMP PTIME ;YES
L_2:
CMP AL,'C' ;CONTIUOUS DISPLAY ?
JNZ L_3
JMP FOREVER ;YES
L_3:
MOV DX,(Offset ERROR) ;CANT RECOGNIZE COMMAND
CALL PMSG ;SO COMPLAIN ABOUT IT
JMPS START ;TRY AGAIN
;
;********************************************************
;* THIS ROUTINE SETS UP HL TO POINT TO A TABLE *
;* TO RECEIVE THE DIGITS TO BE WRITTEN TO THE CLOCK*
;* DE CONTAINS THE POINTER TO THE TABLE OF ADDRESS *
;* VALUES THAT CORRESPOND TO THE DESIRED DIGIT. *
;* THE TABLE IS ORGANISED IN THE PROPER ORDER FOR *
;* READING AND WRITING. THE ROUTINE GETS THE *
;* DIGITS FROM THE CONSOLE AND PUTS THEM INTO *
;* MEMORY AND THEN WRITES THEM TO THE CLOCK. *
;********************************************************
SETTIME:
CALL GETTIME ;GET THE DATE AND TIME DATA
MOV BX,(Offset DTABLE) ;HL <---- DIGIT TABLE ADDRESS
MOV DX,(Offset ATABLE) ;DE <---- ADDRESS TABLE
MOV CH,13 ;NUMBER OF DIGITS TO WRITE +1
MOV AL,HOLD ;SET HOLD BIT
OUT CLKCMD,AL ;SEND COMMAND
SET1:
DEC CH ;DONE LAST DIGIT ?
JNZ HERE ;NO
MOV AL,0 ;YES, CLEAR HOLD BIT
OUT CLKCMD,AL ;SEND COMMAND
MOV DX,(Offset TIMEIS) ;"TIME IS" MESSAGE
CALL PMSG
CALL CLKPRNT ;DISPLAY THE TIME
JMPS START ;NEXT COMMAND
;
HERE:
MOV AL,M ;A <---- DIGIT
MOV CL,AL ;C <---- DIGIT
MOV SI,DX ;A <---- COMMAND
MOV AL,[SI]
CALL WRTDGT ;WRITE THE DIGIT
LAHF ;BUMP POINTERS
INC BX
SAHF
LAHF
INC DX
SAHF
JMPS SET1 ;NEXT DIGIT
;********************************************************
;* THIS ROUTINE GETS THE DIGITS FROM THE CONSOLE *
;* AND STORES THEM INTO MEMORY AT THE ADDRESS *
;* POINTED TO BY HL. *
;********************************************************
GETTIME:
MOV DX,(Offset ASKTIME) ;PROMPT FOR TIME INPUT
CALL PMSG
MOV BX,(Offset DTABLE) ;HL <---- ADDRESS TO PUT DIGITS
GET1:
CALL GETNUMB ;GET A DIGIT
CMP AL,ACR ;FINISHED TIME ?
JZ GETDATE ;YES
AND AL,0FH ;NO, CONVERT TO BCD FORMAT
MOV M,AL ;PUT DIGIT INTO MEMORY
INC BX ;POINT TO NEXT TABLE ADDRESS
JMPS GET1
;
GETDATE:
MOV DX,(Offset ASKDATE) ;PROMPT FOR TIME INPUT
CALL PMSG
GET2:
CALL GETNUMB ;GET A DIGIT
CMP AL,ACR ;FINISHED DATE ?
JNZ L_4
RET ;YES
L_4:
AND AL,0FH ;NO, CONVERT TO BCD
MOV M,AL ;PUT DIGIT INTO MEMORY
INC BX ;POINT TO NEXT TABLE ADDRESS
JMPS GET2
;********************************************************
;* THIS ROUTINE GETS A CHARACTER FROM THE CONSOLE *
;* AND CHECKS THE INPUT FOR EITHER A CARRIAGE *
;* RETURN OR A VALID DIGIT BETWEEN 0-9 WILL NOT *
;* RETURN UNTIL A CR OR VALID DIGIT IS TYPED *
;********************************************************
GETNUMB:
CALL GETCHAR
CMP AL,ACR ;CARRIAGE RETURN ?
JNZ L_5
RET ;YES
L_5:
CMP AL,'0'
JB GETNUMB
CMP AL,'9'+1
JNB GETNUMB
RET
;********************************************************
;* THIS ROUTINE WRITES THE DIGIT TO THE CLOCK *
;* AND CHECKS TO SEE IF THE HOURS OR DAYS 10 *
;* DIGIT AND SETS THE 24 HOUR AND LEAP YEAR BITS *
;* ACCORDINGLY. THIS ROUTINE IS CALEED WITH DIGIT *
;* ADDRESS IN A AND THE DIGIT TO BE WRITTEN IN C. *
;********************************************************
WRTDGT:
LAHF ;SAVE THE COMMAND
XCHG AL,AH
PUSH AX
XCHG AL,AH
ADD AL,HOLD ;ADD IN THE HOLD BIT
OUT CLKCMD,AL ;SEND COMMAND
CMP AL,HOLD+5 ;HOURS TEN DIGIT ?
JNZ WRT1 ;NO
MOV AL,CL ;YES, GET DIGIT
ADD AL,08H ;SET 24 HOUR MODE
JMPS WRT3
;
WRT1:
CMP AL,8+HOLD ;DAYS 10 DIGIT ?
JNZ WRT2 ;NO
MOV AL,CL ;YES, GET THE DIGIT
AND AL,03H ;SET NON-LEAP YEAR MODE
JMPS WRT3
;
WRT2:
MOV AL,CL ;A <---- DIGIT
WRT3:
OUT CLKDATA,AL ;SEND DIGIT
POP AX ;GET COMMAND BACK
XCHG AL,AH
ADD AL,WRITE+HOLD ;ADD THE WRITE + HOLD BITS
OUT CLKCMD,AL ;SEND COMMAND
SUB AL,WRITE ;CLEAR THE WRITE BIT
OUT CLKCMD,AL ;SEND COMMAND
RET
;********************************************************
;* THIS ROUTINE READS A DIGIT FROM THE CLOCK AND *
;* MASKS THE LEAP YEAR AND AND AM/PM/24 HOUR MODE *
;* BITS. THIS ROUTINE IS CALLED WITH THE DIGIT *
;* ADDRESS IN A AND RTURNS WITH THE DIGIT VALUE *
;* IN A. *
;********************************************************
RDDGT:
ADD AL,READ ;ADD IN THE READ BIT
OUT CLKCMD,AL ;SEND COMMAND
CMP AL,5+READ ;TENS HOURS DIGIT ?
IN AL,CLKDATA ;GET THE DIGIT
JZ L_6
RET ;NO, FINISHED
L_6:
SUB AL,08H ;YES, TURN OFF 24 HOUR BIT
RET
;********************************************************
;* THIS ROUTINE PRINTS THE CURRENT TIME AND DATE *
;* ONCE , COMPLETE WITH COLONS AND SLASHES *
;********************************************************
CLKPRNT:
MOV BX,(Offset ATABLE) ;HL <---- TABLE ADDRESS
CALL PRINTWO ;DISPLAY THE FIRST TWO DIGITS
MOV AL,':'
CALL PCHAR ;DISPLAY THE SEPERATOR
CALL PRINTWO ;DISPLAY THE NEXT TWO DIGITS
MOV AL,':'
CALL PCHAR ;DISPLAY THE SEPERATOR
CALL PRINTWO ;DISPLAY THE NEXT TWO DIGITS
MOV AL,' '
CALL PCHAR
MOV AL,' ' ;TWO SPACES
CALL PCHAR
CALL PRINTWO ;TWO MORE DIGITS
MOV AL,'/' ;DISPLAY A SLASH
CALL PCHAR
CALL PRINTWO
MOV AL,'/'
CALL PCHAR
CALL PRINTWO ;PRINT LAST TWO DIGITS
RET
;********************************************************
;* THIS ROUTINE PRINTS TWO DIGITS FROM THE CLOCK. *
;* IT IS CALLED WITH THE DIGIT ADDRESS OF THE *
;* DIGIT IN HL. EXITS WITH HL POINTING TO THE *
;* ADDRESS OF THE NEXT TWO DIGITS. *
;********************************************************
PRINTWO:
MOV AL,M ;A <---- ADDRESS (FROM TABLE)
CALL RDDGT ;READ THE DIGIT
ADD AL,30H ;CONVERT TO ASCII
CALL PCHAR ;DISPLAY IT
INC BX ;ADJUST POINTER
MOV AL,M ;A <---- ADDRESS
CALL RDDGT
ADD AL,30H
CALL PCHAR
LAHF
INC BX
SAHF
RET
;********************************************************
;* THIS ROUTINE DISPLAYS THE TIME ONCE AND JUMPS *
;* BACK TO THE MAIN LOOP *
;********************************************************
PTIME:
MOV DX,(Offset TIMEIS)
CALL PMSG
CALL CLKPRNT
JMP START
;********************************************************
;* THIS ROUTINE DISPLAYS THE TIME CONTINUOUSLY *
;* UNTIL A CONTROL C IS TYPED. IT CONTINUALLY *
;* READS THE SECONDS 1 DIGIT AND WAITS FOR IT TO *
;* CHANGE BEFORE DISPLAYING THE TIME. *
;********************************************************
FOREVER:
MOV AL,ALF ;LINE FEED
CALL PCHAR
FOR1:
MOV AL,ACR ;CR
CALL PCHAR
CALL CLKPRNT ;DISPLAY THE TIME
MOV AL,0 ;ADDRESS OF SECONDS DIGIT
CALL RDDGT ;READ DIGIT
MOV CH,AL ;B <---- DIGIT
FOR2:
MOV AL,0
CALL RDDGT ;READ IT AGAIN
CMP AL,CH ;CHANGED ?
JZ FOR2 ;NO
JMPS FOREVER ;YES
;********************************************************
;* CP/M CALLS AND UTILITY ROUTINES *
;* *
;* THIS ROUTINE GETS A CHARACTER FORM THE CONSOLE *
;* AND CONVERTS IT TO UPPERCASE, STRIPS OF PARITY *
;* AND CHECKS FOR CONTROL C. *
;********************************************************
GETCHAR:
PUSH BX
MOV CL,1 ;BDOS CONSOLE IN
INT 224
POP BX
CMP AL,'a' ;RANGE CHECK FOR UPPER CASE
JB SKIP
CMP AL,'z'+1 ;DITTO
JNB SKIP
AND AL,5FH ;CONVERT TO UPPER CASE
SKIP:
AND AL,7FH ;STRIP PARITY BIT
CMP AL,03H ;CONTROL C ?
JNZ L_7
MOV CL,0 ;YES, EXIT TO CP/M
MOV DL,0
INT 224
L_7:
RET ;NO
;********************************************************
;* THIS ROUTINE PRINTS A CHARACTER ON THE CONSOLE *
;* AND CHECKS TO SEE IF ANY WERE ENTERED WHILE *
;* PRINTING. *
;********************************************************
PCHAR:
PUSH DX
MOV DL,AL ;E <---- CHARCATER
MOV CL,2 ;BDOS CONSOLE OUT
PUSH BX
INT 224
MOV CL,0BH ;BDOS CONSOLE STATUS CHECK
INT 224
POP BX
POP DX
OR AL,AL ;CHARACTER READY ?
JZ L_8
CALL GETCHAR ;YES, GET IT
L_8:
RET ;NO
;********************************************************
;* THIS ROUTINE DISPLAYS THE STRING POINTED TO *
;* BY DE UNTIL $ IS FOUND. *
;********************************************************
PMSG:
PUSH BX
MOV CL,9 ;BDOS DISPLAY STRING
INT 224
POP BX
RET
L_9 EQU $
;
DSEG
;
ORG Offset L_9
;********************************************************
;* MESSAGES *
;********************************************************
SIGNON RS 0
DB ACR,ALF,ACR,ALF
DB 'Time and Date Test Routines for System Support 1'
DB ACR,ALF
DB 'Version ',VERS + '0','.',REV/10 + '0',REV mod 10 +'0'
DB ACR,ALF,ACR,ALF
DB 'Please type one of the following Commands:'
DB ACR,ALF
DB 'S - Set the Time and Date',ACR,ALF
DB 'D - Display the Time and Date Once',ACR,ALF
DB 'C - Continuously Display the Time and Date'
DB ACR,ALF
DB 'X - Exit to Operating System'
DB ACR,ALF,ACR,ALF
DB 'Command: $'
;
ERROR RS 0
DB ACR,ALF
DB 'That was not one of the above commands'
DB ACR,ALF
DB 'Please try again.$'
;
ASKTIME RS 0
DB ACR,ALF
DB 'What is the time? (24 hour format - HH:MM:SS) $'
;
ASKDATE RS 0
DB ACR,ALF
DB 'What is the date? (DD/MM/YY) $'
;
TIMEIS RS 0
DB ACR,ALF
DB 'The Time and Date are: $'
;********************************************************
;* TABLES *
;* *
;* THIS TABLE CONTAINS THE 'ADDRESS' VALUES *
;* THAT ARE SENT IN THE COMMAND BYTE IN THE *
;* FOLLOWING ORDER - HOURS 10, HOURS 1, MIN 10 *
;* MIN 1, SEC 10, SEC 1, DAYS 10, DAYS 1 *
;* MONTHS 10, MONTHS 1, YEARS 10, YEARS 1. *
;********************************************************
ATABLE RS 0
DB 5,4,3,2,1,0,8,7,0AH,9,0CH,0BH
;********************************************************
;* THIS IS THE AREA WHICH GETS THE DIGITS AS THEY *
;* ARE ENTERED FROM THE CONSOLE. *
;********************************************************
DTABLE RS 0
DB 0,0,0,0,0,0,0,0,0,0,0,0
;
END