;******************************************************** ;* * ;* 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 ; M EQU Byte Ptr 0[BX] 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: JMP PTIME ;YES MOV CL,0 ;YES MOV DL,0 INT 224 ;******************************************************** ;* 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 MOV CL,0 MOV DL,0 INT 224 ;******************************************************** ;* 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