CP/M ASM86 1.1 SOURCE: CLKTEST2.A86 PAGE 1 ;******************************************************** ;* * ;* 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 ; 0000 M EQU Byte Ptr 0[BX] 0050 BASE EQU 50H ;BASE PORT ADDRESS 005A CLKCMD EQU BASE+10 ;CLOCK COMMAND PORT 005B CLKDATA EQU BASE+11 ;CLOCK DATA PORT 0000 WBOOT EQU 0 ;BIOS WBOOT ENTRY 0005 BDOS EQU 00005H ;BDOS ENTRY POINT 0010 READ EQU 10H ;READ BIT PATTERN 0020 WRITE EQU 20H ;WRITE BIT PATTERN 0040 HOLD EQU 40H ;HOLD BIT PATTERN 000A ALF EQU 0AH ;ASCII LINE FEED 000D ACR EQU 0DH ;ASCII CARRIAGE RETURN ; 0001 VERS EQU 1 ;MAJOR VERSION NUMBER 000C 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: 0100 E96100 0164 JMP PTIME ;YES 0103 B100 MOV CL,0 ;YES 0105 B200 MOV DL,0 0107 CDE0 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 * CP/M ASM86 1.1 SOURCE: CLKTEST2.A86 PAGE 2 ;* ADDRESS IN A AND RTURNS WITH THE DIGIT VALUE * ;* IN A. * ;******************************************************** RDDGT: 0109 0410 ADD AL,READ ;ADD IN THE READ BIT 010B E65A OUT CLKCMD,AL ;SEND COMMAND 010D 3C15 CMP AL,5+READ ;TENS HOURS DIGIT ? 010F E45B IN AL,CLKDATA ;GET THE DIGIT 0111 7401 0114 JZ L_6 0113 C3 RET ;NO, FINISHED L_6: 0114 2C08 SUB AL,08H ;YES, TURN OFF 24 HOUR BIT 0116 C3 RET ;******************************************************** ;* THIS ROUTINE PRINTS THE CURRENT TIME AND DATE * ;* ONCE , COMPLETE WITH COLONS AND SLASHES * ;******************************************************** CLKPRNT: 0117 BB5B03 MOV BX,(Offset ATABLE) ;HL <---- TABLE ADDRESS 011A E82E00 014B CALL PRINTWO ;DISPLAY THE FIRST TWO DIGITS 011D B03A MOV AL,':' 011F E86E00 0190 CALL PCHAR ;DISPLAY THE SEPERATOR 0122 E82600 014B CALL PRINTWO ;DISPLAY THE NEXT TWO DIGITS 0125 B03A MOV AL,':' 0127 E86600 0190 CALL PCHAR ;DISPLAY THE SEPERATOR 012A E81E00 014B CALL PRINTWO ;DISPLAY THE NEXT TWO DIGITS 012D B020 MOV AL,' ' 012F E85E00 0190 CALL PCHAR 0132 B020 MOV AL,' ' ;TWO SPACES 0134 E85900 0190 CALL PCHAR 0137 E81100 014B CALL PRINTWO ;TWO MORE DIGITS 013A B02F MOV AL,'/' ;DISPLAY A SLASH 013C E85100 0190 CALL PCHAR 013F E80900 014B CALL PRINTWO 0142 B02F MOV AL,'/' 0144 E84900 0190 CALL PCHAR 0147 E80100 014B CALL PRINTWO ;PRINT LAST TWO DIGITS 014A C3 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: 014B 8A07 MOV AL,M ;A <---- ADDRESS (FROM TABLE) 014D E8B9FF 0109 CALL RDDGT ;READ THE DIGIT CP/M ASM86 1.1 SOURCE: CLKTEST2.A86 PAGE 3 0150 0430 ADD AL,30H ;CONVERT TO ASCII 0152 E83B00 0190 CALL PCHAR ;DISPLAY IT 0155 43 INC BX ;ADJUST POINTER 0156 8A07 MOV AL,M ;A <---- ADDRESS 0158 E8AEFF 0109 CALL RDDGT 015B 0430 ADD AL,30H 015D E83000 0190 CALL PCHAR 0160 9F LAHF 0161 43 INC BX 0162 9E SAHF 0163 C3 RET ;******************************************************** ;* THIS ROUTINE DISPLAYS THE TIME ONCE AND JUMPS * ;* BACK TO THE MAIN LOOP * ;******************************************************** PTIME: 0164 BA4103 MOV DX,(Offset TIMEIS) 0167 E83C00 01A6 CALL PMSG 016A E8AAFF 0117 CALL CLKPRNT 016D B100 MOV CL,0 016F B200 MOV DL,0 0171 CDE0 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: 0173 53 PUSH BX 0174 B101 MOV CL,1 ;BDOS CONSOLE IN 0176 CDE0 INT 224 0178 5B POP BX 0179 3C61 CMP AL,'a' ;RANGE CHECK FOR UPPER CASE 017B 7206 0183 JB SKIP 017D 3C7B CMP AL,'z'+1 ;DITTO 017F 7302 0183 JNB SKIP 0181 245F AND AL,5FH ;CONVERT TO UPPER CASE SKIP: 0183 247F AND AL,7FH ;STRIP PARITY BIT 0185 3C03 CMP AL,03H ;CONTROL C ? 0187 7506 018F JNZ L_7 0189 B100 MOV CL,0 ;YES, EXIT TO CP/M 018B B200 MOV DL,0 018D CDE0 INT 224 L_7: 018F C3 RET ;NO CP/M ASM86 1.1 SOURCE: CLKTEST2.A86 PAGE 4 ;******************************************************** ;* THIS ROUTINE PRINTS A CHARACTER ON THE CONSOLE * ;* AND CHECKS TO SEE IF ANY WERE ENTERED WHILE * ;* PRINTING. * ;******************************************************** PCHAR: 0190 52 PUSH DX 0191 8AD0 MOV DL,AL ;E <---- CHARCATER 0193 B102 MOV CL,2 ;BDOS CONSOLE OUT 0195 53 PUSH BX 0196 CDE0 INT 224 0198 B10B MOV CL,0BH ;BDOS CONSOLE STATUS CHECK 019A CDE0 INT 224 019C 5B POP BX 019D 5A POP DX 019E 0AC0 OR AL,AL ;CHARACTER READY ? 01A0 7403 01A5 JZ L_8 01A2 E8CEFF 0173 CALL GETCHAR ;YES, GET IT L_8: 01A5 C3 RET ;NO ;******************************************************** ;* THIS ROUTINE DISPLAYS THE STRING POINTED TO * ;* BY DE UNTIL $ IS FOUND. * ;******************************************************** PMSG: 01A6 53 PUSH BX 01A7 B109 MOV CL,9 ;BDOS DISPLAY STRING 01A9 CDE0 INT 224 01AB 5B POP BX 01AC C3 RET 01AD L_9 EQU $ ; DSEG ; ORG Offset L_9 ;******************************************************** ;* MESSAGES * ;******************************************************** 01AD SIGNON RS 0 01AD 0D0A0D0A DB ACR,ALF,ACR,ALF 01B1 54696D652061 DB 'Time and Date Test Routines for System Support 1' 6E6420446174 652054657374 20526F757469 6E657320666F 722053797374 CP/M ASM86 1.1 SOURCE: CLKTEST2.A86 PAGE 5 656D20537570 706F72742031 01E1 0D0A DB ACR,ALF 01E3 56657273696F DB 'Version ',VERS + '0','.',REV/10 + '0',REV mod 10 +'0' 6E20312E3132 01EF 0D0A0D0A DB ACR,ALF,ACR,ALF 01F3 506C65617365 DB 'Please type one of the following Commands:' 207479706520 6F6E65206F66 207468652066 6F6C6C6F7769 6E6720436F6D 6D616E64733A 021D 0D0A DB ACR,ALF 021F 53202D205365 DB 'S - Set the Time and Date',ACR,ALF 742074686520 54696D652061 6E6420446174 650D0A 023A 44202D204469 DB 'D - Display the Time and Date Once',ACR,ALF 73706C617920 746865205469 6D6520616E64 204461746520 4F6E63650D0A 025E 43202D20436F DB 'C - Continuously Display the Time and Date' 6E74696E756F 75736C792044 6973706C6179 207468652054 696D6520616E 642044617465 0288 0D0A DB ACR,ALF 028A 58202D204578 DB 'X - Exit to Operating System' 697420746F20 4F7065726174 696E67205379 7374656D 02A6 0D0A0D0A DB ACR,ALF,ACR,ALF 02AA 436F6D6D616E DB 'Command: $' 643A2024 ; 02B4 ERROR RS 0 02B4 0D0A DB ACR,ALF 02B6 546861742077 DB 'That was not one of the above commands' 6173206E6F74 206F6E65206F 662074686520 61626F766520 636F6D6D616E 6473 02DC 0D0A DB ACR,ALF CP/M ASM86 1.1 SOURCE: CLKTEST2.A86 PAGE 6 02DE 506C65617365 DB 'Please try again.$' 207472792061 6761696E2E24 ; 02F0 ASKTIME RS 0 02F0 0D0A DB ACR,ALF 02F2 576861742069 DB 'What is the time? (24 hour format - HH:MM:SS) $' 732074686520 74696D653F20 28323420686F 757220666F72 6D6174202D20 48483A4D4D3A 5353292024 ; 0321 ASKDATE RS 0 0321 0D0A DB ACR,ALF 0323 576861742069 DB 'What is the date? (DD/MM/YY) $' 732074686520 646174653F20 2844442F4D4D 2F5959292024 ; 0341 TIMEIS RS 0 0341 0D0A DB ACR,ALF 0343 546865205469 DB 'The Time and Date are: $' 6D6520616E64 204461746520 6172653A2024 ;******************************************************** ;* 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. * ;******************************************************** 035B ATABLE RS 0 035B 050403020100 DB 5,4,3,2,1,0,8,7,0AH,9,0CH,0BH 08070A090C0B ;******************************************************** ;* THIS IS THE AREA WHICH GETS THE DIGITS AS THEY * ;* ARE ENTERED FROM THE CONSOLE. * ;******************************************************** 0367 DTABLE RS 0 0367 000000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0 000000000000 CP/M ASM86 1.1 SOURCE: CLKTEST2.A86 PAGE 7 ; END END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 1% ENTERED FROM THE CONSOLE.