Feb 02,1983 17:17:33 #001 STATTIME as of october 20, 1980 TITLE 'STATTIME as of october 20, 1980' ; ; ; THIS PROGRAM IS A UNIVERSAL PATCH FOR ANY PROGRAM WHICH RUNS ; UNDER CP/M VERSION 2.2 ONLY. IT WILL GIVE A REAL-TIME DISPLAY ; OF THE TIME AND DATE EACH TIME THE PATCHED PROGRAM IS RUN. ; PATCH IT IN AS FOLLOWS: ; ; A>DDT FNAME.COM ; NEXT PC ; NNNN 0100 ; -ITIMEPROG.HEX ; -R ; NEXT PC ; NNNN 0000 ; -^C ; A>SAVE NNH FNAME.COM ; ; NOW YOU HAVE A NEW "FNAME" COMMAND FILE CALLED FNAME.COM, ; AND IT WILL DISPLAY THE "REAL TIME" ON EVERY EXECUTION... ; ; BEST REGARDS, ; ; KELLY SMITH, MP/M-NET (TM) SYSOP ; (805) 527-9321 (MODEM, 300 BAUD) ; ; ; ; TIMEPROG.ASM (REVISED 12/29/82) BY W6BSK ; ; REVISED FROM THE MAY 1980, INTERFACE AGE MAGAZINE ; ; FOR COMPU-TIME T-102 TIME/DATE BOARD (WITH MM 5375 AC) ; ; OR, ; ; QT COMPUTER SYSTEMS INC. "CLOCK/CALENDAR +" BOARD ; ; 0005 = BDOS EQU 5 0009 = PBUF EQU 9 U0000 = FNAME EQU NNNNH ;THIS ADDRESS IS THE ENTRY POINT FOR THE ;PROGRAM FNAME.COM. IT MUST BE ADJUSTED! 000D = CR EQU 0DH ; ASCII CARRIAGE RETURN 000A = LF EQU 0AH ; ASCII LINE FEED FFFF = TRUE EQU -1 ; DEFINE TRUE 0000 = FALSE EQU NOT TRUE; DEFINE FALSE FFFF = QT EQU TRUE ; DEFINE QT COMPUTER SYSTEMS CLOCK/CALENDAR + BOARD 0000 = CT EQU FALSE ; COMPU-TIME TIME/DATE BOARD IF QT Feb 02,1983 17:17:33 #002 STATTIME as of october 20, 1980 0080 = CLOCK EQU 080H ; REAL TIME CLOCK BASE PORT ADDRESS ENDIF IF CT CLOCK EQU 024H ; REAL TIME CLOCK BASE PORT ADDRESS ENDIF 0100 ORG 0100H 0100 C30020 JMP DATE 2000 ORG 2000H ; NNNNH IS THE END OF THE FNAME.COM ;ADDRESS+1 -IE, TIMEPROG IS LOCATED IMM- ;EDIATELY AFTER THE FNAME.COM PROGRAM. 2000 F5C5D5E5 DATE: PUSH PSW ! PUSH B ! PUSH D ! PUSH H 2004 212B21 LXI H,MONTH ; POINT TO MONTH 2007 1608 MVI D,8 ; SELECT MONTH TENS DIGIT 2009 CDF420 CALL DIGIT ; READ AND STORE HIGH DIGIT 200C 07070707 RLC ! RLC ! RLC ! RLC ; SHIFT TO HIGH ORDER HEX DIGIT 2010 47 MOV B,A ; SAVE IN B REG. 2011 CDF420 CALL DIGIT ; READ AND STORE MONTH UNITS DIGIT 2014 B0 ORA B ; OR-IN THE UNITS AND TENS DIGIT 2015 47 MOV B,A ; SAVE THE MONTH IN B REG. 2016 CDF420 CALL DIGIT ; READ AND STORE THE DAY TENS DIGIT 2019 07070707 RLC ! RLC ! RLC ! RLC ; SHIFT TO HIGH ORDER HEX DIGIT 201D 4F MOV C,A ; SAVE IN C REG. 201E CDF420 CALL DIGIT ; READ AND STORE DAY UNITS DIGIT 2021 B1 ORA C ; OR-IN THE UNITS AND TENS DIGIT 2022 4F MOV C,A ; SAVE THE DAY IN C REG. ; ; TEST THE DATE, AND CONVERT IT TO FOUR YEAR CALENDAR FORMAT ; 2023 FE31 CPI 031H ; 31ST DAY? 2025 78 MOV A,B ; GET THE MONTH, FOR NEXT TEST 2026 C24220 JNZ M2 ; IF NOT THE 31ST, TEST FOR FEBRUARY 2029 FE02 CPI 2 ; TEST FOR MONTHS < 31 DAYS 202B CA5220 JZ FIX ; ...AND FIX IF NEEDED 202E FE04 CPI 4 2030 CA5220 JZ FIX 2033 FE06 CPI 6 2035 CA5220 JZ FIX 2038 FE09 CPI 9 203A CA5220 JZ FIX 203D FE11 CPI 011H 203F CA5220 JZ FIX 2042 FE02 M2: CPI 2 ; TEST FOR FEBRUARY 2044 C25E20 JNZ TIME ; IF NOT FEBRUARY, THEN READ TIME 2047 79 MOV A,C ; GET DAY FOR TEST 2048 FE29 CPI 029H ; IS THIS THE 29TH DAY? Feb 02,1983 17:17:33 #003 STATTIME as of october 20, 1980 ; ; INSERT TWO NOP'S OVER PREVIOUS INSTRUCTION, IF THIS IS A LEAP YEAR ; 204A CA5220 JZ FIX ; FIX DATE... 204D FE30 CPI 030H ; 30TH DAY? 204F C25E20 JNZ TIME ; IF NOT THE 29TH OR 30TH, GO READ TIME 2052 3E29 FIX: MVI A,41 ; SELECT MONTH UNITS AND FAST SET 2054 CD1321 CALL RDIGIT ; READ THE MONTH UNITS DIGIT 2057 47 MOV B,A ; SAVE IN B REG. 2058 DB80 FLOOP: IN CLOCK ; READ THE MONTHS UNIT DIGIT 205A B8 CMP B ; TEST FOR DIGIT CHANGED 205B CA5820 JZ FLOOP ; WAIT UNTIL MONTH IS BUMPED (STABLE DATA) 205E 213D21 TIME: LXI H,HOUR ; POINT TO HOUR 2061 1600 MVI D,0 ; SELECT HOUR TENS DIGIT 2063 CDF120 CALL DDIGIT ; READ HOUR TENS AND UNITS 2066 23 INX H ; STEP OVER ":" 2067 CDF120 CALL DDIGIT ; READ MINUTES TENS AND UNITS 206A 23 INX H ; STEP OVER ":" 206B CDF120 CALL DDIGIT ; READ SECOND TENS AND UNITS 206E 112221 LXI D,PDATE ; POINT TO DATE AND TIME MESSAGE 2071 0E09 MVI C,PBUF ; PRINT BUFFER FUNCTION 2073 CD0500 CALL BDOS ; LET CP/M DO THE WORK... 2076 3A2B21 LDA MONTH ; GET HIGH BYTE OF THE MONTH 2079 FE20 CPI ' ' ; IN THE RANGE OF JANUARY TO SEPTEMBER? 207B CA9720 JZ JANSEPT 207E 3A2C21 LDA MONTH+1 ; MUST BE OCTOBER TO DECEMBER... 2081 FE30 CPI '0' ; OCTOBER? 2083 11B321 LXI D,OCT 2086 CADD20 JZ PMONTH ; PRINT, IF SO 2089 FE31 CPI '1' ; NOVEMBER? 208B 11BC21 LXI D,NOV 208E CADD20 JZ PMONTH ; PRINT, IF SO 2091 11C621 LXI D,DEC ; DECEMBER. 2094 C3DD20 JMP PMONTH ; PRINT IT... 2097 3A2C21 JANSEPT:LDA MONTH+1 ; IT'S JANUARY TO SEPTEMBER 209A FE31 CPI '1' ; JANUARY? 209C 116E21 LXI D,JAN 209F CADD20 JZ PMONTH ; PRINT, IF SO 20A2 FE32 CPI '2' ; FEBRUARY? 20A4 117721 LXI D,FEB 20A7 CADD20 JZ PMONTH ; PRINT, IF SO 20AA FE33 CPI '3' ; MARCH? 20AC 118121 LXI D,MAR 20AF CADD20 JZ PMONTH ; PRINT, IF SO 20B2 FE34 CPI '4' ; APRIL? 20B4 118821 LXI D,APR 20B7 CADD20 JZ PMONTH ; PRINT, IF SO 20BA FE35 CPI '5' ; MAY? 20BC 118F21 LXI D,MAY 20BF CADD20 JZ PMONTH ; PRINT, IF SO 20C2 FE36 CPI '6' ; JUNE? 20C4 119421 LXI D,JUN 20C7 CADD20 JZ PMONTH ; PRINT MONTH 20CA FE37 CPI '7' ; JULY? 20CC 119A21 LXI D,JUL Feb 02,1983 17:17:33 #004 STATTIME as of october 20, 1980 20CF CADD20 JZ PMONTH ; PRINT, IF SO 20D2 FE38 CPI '8' ; AUGUST? 20D4 11A021 LXI D,AUG 20D7 CADD20 JZ PMONTH ; PRINT, IF SO 20DA 11A821 LXI D,SEP ; IT'S SEPTEMBER 20DD 0E09 PMONTH: MVI C,PBUF ; PRINT BUFFER FUNCTION 20DF CD0500 CALL BDOS ; LET CP/M DO THE WORK... 20E2 112D21 DONE: LXI D,DAY ; GET THE DAY 20E5 0E09 MVI C,PBUF ; PRINT BUFFER FUNCTION 20E7 CD0500 CALL BDOS ; LET CP/M DO THE WORK... 20EA E1D1C1F1 POP H ! POP D ! POP B ! POP PSW 20EE C30000 JMP FNAME ;NOW JUMP INTO THE PROGRAM WHICH HAS BEEN ;PATCHED. 20F1 CDF420 DDIGIT: CALL DIGIT ; READ AND STORE TWO DIGITS 20F4 7A DIGIT: MOV A,D ; MOVE DIGIT SELECT CODE TO A REG. 20F5 CD1321 CALL RDIGIT ; READ A CLOCK DIGIT 20F8 FEFF CPI 0FFH ; TEST FOR BOARD PRESENT 20FA CA0C21 JZ NOBRD ; GO PRINT ERROR MESSAGE 20FD F630 ORI 030H ; CONVERT DIGIT TO ASCII 20FF FE3F CPI 03FH ; TEST FOR BLANKED LEADING ZERO 2101 C20621 JNZ STORE ; GO STORE DIGIT, IF NOT BLANKED 2104 3E20 MVI A,020H ; CONVERT TO A BLANK 2106 77 STORE: MOV M,A ; STORE THE DIGIT IN MESSAGE BUFFER 2107 23 INX H ; BUMP MESSAGE POINTER BUFFER LOCATION 2108 14 INR D ; STEP TO NEXT DIGIT 2109 E60F ANI 00FH ; MASK OFF HIGH ASCII NIBBLE 210B C9 RET ; RETURN WITH DIGIT IN A REG. 210C E1 NOBRD: POP H ; ADJUST THE STACK 210D 114821 LXI D,ERRMSG; POINT TO THE ERROR MESSAGE 2110 C3E220 JMP DONE ; PRINT ERROR MESSAGE, AND EXIT TO CP/M 2113 D380 RDIGIT: OUT CLOCK ; SELECT DIGIT 2115 3E00 MVI A,0 ; ...SOME DELAY TIME FOR SETTLING 2117 3D DCR A 2118 C21721 JNZ $-1 211B 3D DCR A 211C C21B21 JNZ $-1 211F DB80 IN CLOCK ; READ A DIGIT 2121 C9 RET ; RETURN WITH DIGIT IN A REG. ; ; MESSAGE BUFFERS ; 2122 0D0A446174PDATE: DB CR,LF,'Date: $' 212B MONTH: DS 2 ; THE MONTH 212D 78782C20 DAY: DB 'xx, ' ; THE DAY... 2131 31393833 DB '1983' ; THE YEAR... 2135 202054696D DB ' Time: ' 213D 78783A HOUR: DB 'xx:' ; THE HOUR... 2140 78783A DB 'xx:' ; THE MINUTE... 2143 7878 DB 'xx' ; THE SECOND... 2145 0D0A24 DB CR,LF,'$' ; STRING DELIMETER Feb 02,1983 17:17:33 #005 STATTIME as of october 20, 1980 2148 0D0A546865ERRMSG: DB CR,LF,'The Clock Board is NOT INSTALLED!',CR,LF,'$' 216E 4A616E7561JAN: DB 'January $' 2177 4665627275FEB: DB 'February $' 2181 4D61726368MAR: DB 'March $' 2188 417072696CAPR: DB 'April $' 218F 4D61792024MAY: DB 'May $' 2194 4A756E6520JUN: DB 'June $' 219A 4A756C7920JUL: DB 'July $' 21A0 4175677573AUG: DB 'August $' 21A8 5365707465SEP: DB 'September $' 21B3 4F63746F62OCT: DB 'October $' 21BC 4E6F76656DNOV: DB 'November $' 21C6 446563656DDEC: DB 'December $' 21D0 END