PL/M-86 COMPILER SDIR - DISPLAY TIME STAMPS PAGE 1 ISIS-II PL/M-86 V2.0 COMPILATION OF MODULE TIMESTAMP OBJECT MODULE PLACED IN TIMEST COMPILER INVOKED BY: :F0: TIMEST.PLM DEBUG OBJECT(TIMEST) OPTIMIZE(3) XREF $title('SDIR - Display Time Stamps') 1 timestamp: do; /* Display time stamp module for extended directory */ /* Time & Date ASCII Conversion Code */ /* From MP/M 1.1 TOD program */ $include(comlit.lit) = 2 1 = declare = lit literally 'literally', = dcl lit 'declare', = true lit '0ffh', = false lit '0', = boolean lit 'byte', = forever lit 'while true', = cr lit '13', = lf lit '10', = tab lit '9', = ctrlc lit '3', = ff lit '12', = page$len$offset lit '1ch', = nopage$mode$offset lit '2Ch', = sectorlen lit '128'; 3 1 print$char: procedure (char) external; 4 2 declare char byte; 5 2 end print$char; 6 1 terminate: procedure external; 7 2 end terminate; 8 1 declare tod$adr address; 9 1 declare tod based tod$adr structure ( opcode byte, date address, hrs byte, min byte, sec byte, ASCII (21) byte ); 10 1 declare string$adr address; 11 1 declare string based string$adr (1) byte; 12 1 declare index byte; 13 1 emitchar: procedure(c); 14 2 declare c byte; 15 2 string(index := index + 1) = c; 16 2 end emitchar; 17 1 emitn: procedure(a); PL/M-86 COMPILER SDIR - DISPLAY TIME STAMPS PAGE 2 18 2 declare a address; 19 2 declare c based a byte; 20 2 do while c <> '$'; 21 3 string(index := index + 1) = c; 22 3 a = a + 1; 23 3 end; 24 2 end emitn; 25 1 emit$bcd: procedure(b); 26 2 declare b byte; 27 2 call emitchar('0'+b); 28 2 end emit$bcd; 29 1 emit$bcd$pair: procedure(b); 30 2 declare b byte; 31 2 call emit$bcd(shr(b,4)); 32 2 call emit$bcd(b and 0fh); 33 2 end emit$bcd$pair; 34 1 emit$colon: procedure(b); 35 2 declare b byte; 36 2 call emit$bcd$pair(b); 37 2 call emitchar(':'); 38 2 end emit$colon; 39 1 emit$bin$pair: procedure(b); 40 2 declare b byte; 41 2 call emit$bcd(b/10); /* makes garbage if not < 10 */ 42 2 call emit$bcd(b mod 10); 43 2 end emit$bin$pair; 44 1 emit$slant: procedure(b); 45 2 declare b byte; 46 2 call emit$bin$pair(b); 47 2 call emitchar('/'); 48 2 end emit$slant; 49 1 declare base$year lit '78', /* base year for computations */ base$day lit '0', /* starting day for base$year 0..6 */ month$days (*) address data /* jan feb mar apr may jun jul aug sep oct nov dec */ ( 000,031,059,090,120,151,181,212,243,273,304,334); 50 1 leap$days: procedure(y,m) byte; 51 2 declare (y,m) byte; /* compute days accumulated by leap years */ 52 2 declare yp byte; 53 2 yp = shr(y,2); /* yp = y/4 */ 54 2 if (y and 11b) = 0 and month$days(m) < 59 then /* y not 00, y mod 4 = 0, before march, so not leap yr */ 55 2 return yp - 1; /* otherwise, yp is the number of accumulated leap days */ 56 2 return yp; 57 2 end leap$days; 58 1 declare word$value address; PL/M-86 COMPILER SDIR - DISPLAY TIME STAMPS PAGE 3 59 1 get$next$digit: procedure byte; /* get next lsd from word$value */ 60 2 declare lsd byte; 61 2 lsd = word$value mod 10; 62 2 word$value = word$value / 10; 63 2 return lsd; 64 2 end get$next$digit; 65 1 bcd: procedure (val) byte; 66 2 declare val byte; 67 2 return shl((val/10),4) + val mod 10; 68 2 end bcd; 69 1 declare (month, day, year, hrs, min, sec) byte; 70 1 bcd$pair: procedure(a,b) byte; 71 2 declare (a,b) byte; 72 2 return shl(a,4) or b; 73 2 end bcd$pair; 74 1 compute$year: procedure; /* compute year from number of days in word$value */ 75 2 declare year$length address; 76 2 year = base$year; 77 2 do while true; 78 3 year$length = 365; 79 3 if (year and 11b) = 0 then /* leap year */ 80 3 year$length = 366; 81 3 if word$value <= year$length then 82 3 return; 83 3 word$value = word$value - year$length; 84 3 year = year + 1; 85 3 end; 86 2 end compute$year; 87 1 declare week$day byte, /* day of week 0 ... 6 */ day$list (*) byte data ('Sun$Mon$Tue$Wed$Thu$Fri$Sat$'), leap$bias byte; /* bias for feb 29 */ 88 1 compute$month: procedure; 89 2 month = 12; 90 2 do while month > 0; 91 3 if (month := month - 1) < 2 then /* jan or feb */ 92 3 leapbias = 0; 93 3 if month$days(month) + leap$bias < word$value then return; 95 3 end; 96 2 end compute$month; 97 1 declare date$test byte, /* true if testing date */ test$value address; /* sequential date value under test */ PL/M-86 COMPILER SDIR - DISPLAY TIME STAMPS PAGE 4 98 1 get$date$time: procedure; /* get date and time */ 99 2 hrs = tod.hrs; 100 2 min = tod.min; 101 2 sec = tod.sec; 102 2 word$value = tod.date; /* word$value contains total number of days */ 103 2 week$day = (word$value + base$day - 1) mod 7; 104 2 call compute$year; /* year has been set, word$value is remainder */ 105 2 leap$bias = 0; 106 2 if (year and 11b) = 0 and word$value > 59 then 107 2 /* after feb 29 on leap year */ leap$bias = 1; 108 2 call compute$month; 109 2 day = word$value - (month$days(month) + leap$bias); 110 2 month = month + 1; 111 2 end get$date$time; 112 1 emit$date$time: procedure; 113 2 if tod.opcode = 0 then 114 2 do; 115 3 call emitn(.day$list(shl(week$day,2))); 116 3 call emitchar(' '); 117 3 end; 118 2 call emit$slant(month); 119 2 call emit$slant(day); 120 2 call emit$bin$pair(year); 121 2 call emitchar(' '); 122 2 call emit$colon(hrs); 123 2 call emit$colon(min); 124 2 if tod.opcode = 0 then 125 2 call emit$bcd$pair(sec); 126 2 end emit$date$time; 127 1 tod$ASCII: procedure (parameter); 128 2 declare parameter address; 129 2 declare ret address; 130 2 ret = 0; 131 2 tod$adr = parameter; 132 2 string$adr = .tod.ASCII; 133 2 if (tod.opcode = 0) or (tod.opcode = 3) then 134 2 do; 135 3 call get$date$time; 136 3 index = -1; 137 3 call emit$date$time; 138 3 end; else 139 2 call terminate; /* error */ 140 2 end tod$ASCII; 141 1 declare lcltod structure ( opcode byte, date address, hrs byte, min byte, PL/M-86 COMPILER SDIR - DISPLAY TIME STAMPS PAGE 5 sec byte, ASCII (21) byte ); 142 1 display$time$stamp: procedure (tsadr) public; 143 2 dcl tsadr address, i byte; 144 2 lcltod.opcode = 3; /* display time and date stamp, no seconds */ 145 2 call move (4,tsadr,.lcltod.date); /* don't copy seconds */ 146 2 call tod$ASCII (.lcltod); 147 2 do i = 0 to 13; 148 3 call printchar (lcltod.ASCII(i)); 149 3 end; 150 2 end display$time$stamp; 151 1 dcl last$data$byte byte initial(0); 152 1 end timestamp; PL/M-86 COMPILER SDIR - DISPLAY TIME STAMPS PAGE 6 CROSS-REFERENCE LISTING ----------------------- DEFN ADDR SIZE NAME, ATTRIBUTES, AND REFERENCES ----- ------ ----- -------------------------------- 17 0004H 2 A. . . . . . . . . WORD PARAMETER AUTOMATIC 18 19 20 21 22 70 0006H 1 A. . . . . . . . . BYTE PARAMETER AUTOMATIC 71 72 141 0006H 21 ASCII. . . . . . . BYTE ARRAY(21) MEMBER(LCLTOD) 148 9 0006H 21 ASCII. . . . . . . BYTE ARRAY(21) MEMBER(TOD) 132 34 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 35 36 70 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 71 72 29 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 30 31 32 44 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 45 46 39 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 40 41 42 25 0004H 1 B. . . . . . . . . BYTE PARAMETER AUTOMATIC 26 27 49 BASEDAY. . . . . . LITERALLY 103 49 BASEYEAR . . . . . LITERALLY 76 65 0108H 39 BCD. . . . . . . . PROCEDURE BYTE STACK=0006H 70 012FH 17 BCDPAIR. . . . . . PROCEDURE BYTE STACK=0006H 2 BOOLEAN. . . . . . LITERALLY 13 0004H 1 C. . . . . . . . . BYTE PARAMETER AUTOMATIC 14 15 19 0000H 1 C. . . . . . . . . BYTE BASED(A) 20 21 3 0000H 1 CHAR . . . . . . . BYTE PARAMETER 4 88 0175H 59 COMPUTEMONTH . . . PROCEDURE STACK=0002H 108 74 0140H 53 COMPUTEYEAR. . . . PROCEDURE STACK=0002H 104 2 CR . . . . . . . . LITERALLY 2 CTRLC. . . . . . . LITERALLY 141 0001H 2 DATE . . . . . . . WORD MEMBER(LCLTOD) 145 9 0001H 2 DATE . . . . . . . WORD MEMBER(TOD) 102 97 0017H 1 DATETEST . . . . . BYTE 69 0010H 1 DAY. . . . . . . . BYTE 109 119 87 0018H 28 DAYLIST. . . . . . BYTE ARRAY(28) DATA 115 2 DCL. . . . . . . . LITERALLY 142 02AFH 64 DISPLAYTIMESTAMP . PROCEDURE PUBLIC STACK=0026H 25 0044H 16 EMITBCD. . . . . . PROCEDURE STACK=000AH 31 32 41 42 29 0054H 27 EMITBCDPAIR. . . . PROCEDURE STACK=0010H 36 125 39 0082H 39 EMITBINPAIR. . . . PROCEDURE STACK=0010H 46 120 13 0000H 28 EMITCHAR . . . . . PROCEDURE STACK=0004H 27 37 47 116 121 34 006FH 19 EMITCOLON. . . . . PROCEDURE STACK=0016H 122 123 112 021AH 95 EMITDATETIME . . . PROCEDURE STACK=001AH 137 17 001CH 40 EMITN. . . . . . . PROCEDURE STACK=0004H 115 44 00A9H 19 EMITSLANT. . . . . PROCEDURE STACK=0016H 118 119 2 FALSE. . . . . . . LITERALLY 2 FF . . . . . . . . LITERALLY 2 FOREVER. . . . . . LITERALLY 98 01B0H 106 GETDATETIME. . . . PROCEDURE STACK=0006H 135 59 00E8H 32 GETNEXTDIGIT . . . PROCEDURE BYTE STACK=0002H 141 0003H 1 HRS. . . . . . . . BYTE MEMBER(LCLTOD) 69 0012H 1 HRS. . . . . . . . BYTE 99 122 9 0003H 1 HRS. . . . . . . . BYTE MEMBER(TOD) 99 143 0033H 1 I. . . . . . . . . BYTE 147 148 12 000CH 1 INDEX. . . . . . . BYTE 15 21 136 151 0034H 1 LASTDATABYTE . . . BYTE INITIAL 141 0018H 27 LCLTOD . . . . . . STRUCTURE 144 145 146 148 PL/M-86 COMPILER SDIR - DISPLAY TIME STAMPS PAGE 7 87 0016H 1 LEAPBIAS . . . . . BYTE 92 93 105 107 109 50 00BCH 44 LEAPDAYS . . . . . PROCEDURE BYTE STACK=0006H 2 LF . . . . . . . . LITERALLY 2 LIT. . . . . . . . LITERALLY 2 49 60 000EH 1 LSD. . . . . . . . BYTE 61 63 50 0004H 1 M. . . . . . . . . BYTE PARAMETER AUTOMATIC 51 54 69 0013H 1 MIN. . . . . . . . BYTE 100 123 9 0004H 1 MIN. . . . . . . . BYTE MEMBER(TOD) 100 141 0004H 1 MIN. . . . . . . . BYTE MEMBER(LCLTOD) 69 000FH 1 MONTH. . . . . . . BYTE 89 90 91 93 109 110 118 49 0000H 24 MONTHDAYS. . . . . WORD ARRAY(12) DATA 54 93 109 MOVE . . . . . . . BUILTIN 145 2 NOPAGEMODEOFFSET . LITERALLY 9 0000H 1 OPCODE . . . . . . BYTE MEMBER(TOD) 113 124 133 141 0000H 1 OPCODE . . . . . . BYTE MEMBER(LCLTOD) 144 2 PAGELENOFFSET. . . LITERALLY 127 0004H 2 PARAMETER. . . . . WORD PARAMETER AUTOMATIC 128 131 3 0000H PRINTCHAR. . . . . PROCEDURE EXTERNAL(0) STACK=0000H 148 129 000AH 2 RET. . . . . . . . WORD 130 69 0014H 1 SEC. . . . . . . . BYTE 101 125 9 0005H 1 SEC. . . . . . . . BYTE MEMBER(TOD) 101 141 0005H 1 SEC. . . . . . . . BYTE MEMBER(LCLTOD) 2 SECTORLEN. . . . . LITERALLY SHL. . . . . . . . BUILTIN 67 72 115 SHR. . . . . . . . BUILTIN 31 53 11 0000H 1 STRING . . . . . . BYTE BASED(STRINGADR) ARRAY(1) 15 21 10 0002H 2 STRINGADR. . . . . WORD 11 15 21 132 2 TAB. . . . . . . . LITERALLY 6 0000H TERMINATE. . . . . PROCEDURE EXTERNAL(1) STACK=0000H 139 97 0008H 2 TESTVALUE. . . . . WORD 1 0000H TIMESTAMP. . . . . PROCEDURE STACK=0000H 9 0000H 27 TOD. . . . . . . . STRUCTURE BASED(TODADR) 99 100 101 102 113 124 132 133 8 0000H 2 TODADR . . . . . . WORD 9 99 100 101 102 113 124 131 132 133 127 0279H 54 TODASCII . . . . . PROCEDURE STACK=0020H 146 2 TRUE . . . . . . . LITERALLY 77 142 0004H 2 TSADR. . . . . . . WORD PARAMETER AUTOMATIC 143 145 65 0004H 1 VAL. . . . . . . . BYTE PARAMETER AUTOMATIC 66 67 87 0015H 1 WEEKDAY. . . . . . BYTE 103 115 58 0004H 2 WORDVALUE. . . . . WORD 61 62 81 83 93 102 103 106 109 50 0006H 1 Y. . . . . . . . . BYTE PARAMETER AUTOMATIC 51 53 54 69 0011H 1 YEAR . . . . . . . BYTE 76 79 84 106 120 75 0006H 2 YEARLENGTH . . . . WORD 78 80 81 83 52 000DH 1 YP . . . . . . . . BYTE 53 55 56 MODULE INFORMATION: CODE AREA SIZE = 02EFH 751D CONSTANT AREA SIZE = 0034H 52D VARIABLE AREA SIZE = 0035H 53D MAXIMUM STACK SIZE = 0026H 38D 241 LINES READ 0 PROGRAM ERROR(S) END OF PL/M-86 COMPILATION