| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- Listing:
- 1 IMPLEMENTATION MODULE ByteFiddler;
- 2 (*
- 3 * REPERTOIRE
- 4 * Release 1.6
- 5 * By Charles Bradford and Cole Brecheen
- 6 * (c) Copyright 1985-1992 PMI
- 7 * Green Bay, Wisconsin
- 8 * All rights reserved
- 9 * (414) 468-6040
- 10 *
- 11 * $Header: D:/logfiles/mods/bytefidd.mov 1.5 10 Mar 1991 15:25:24 coleb $
- 12 *
- 13 *)
- 14
- 15
- 16 IMPORT ErrorManager;
- 17 IMPORT LowLevel;
- 18 IMPORT SYSTEM;
- 19
- 20
- 21 VAR
- 22 Initialized : BOOLEAN;
- 23
- 24 PROCEDURE Init();
- 25 BEGIN
- 26 IF Initialized THEN
- 27 RETURN;
- 28 ELSE
- 29 Initialized := TRUE;
- 30 END;
- 31 ErrorManager.Init();
- ***** ^ not supported yet
- ***** ^ not supported yet
- ***** ^ not supported yet
- 32 LowLevel.Init();
- ***** ^ not supported yet
- ***** ^ not supported yet
- ***** ^ not supported yet
- 33 END Init;
- ***** ^ not supported yet
- 34
- 35 TYPE
- 36 BitRange = [0..15];
- 37 WordConverter =
- 38 RECORD
- 39 CASE : BOOLEAN OF
- ***** ^ not supported yet
- ***** ^ 'POINTER' expected
- 40 TRUE :
- 41 x : SYSTEM.WORD;
- 42 | FALSE :
- 43 lo, hi : CHAR;
- 44 END;
- 45 END;
- 46
- 47 LongConverter =
- 48 RECORD
- 49 CASE : BOOLEAN OF
- 50 TRUE: long: LONGINT;
- 51 | FALSE: locard, hicard: CARDINAL;
- 52 END;
- 53 END;
- 54
- 55
- 56 PROCEDURE BitRangeToInt(TheSet : BITSET; LowBit, HighBit : CARDINAL;
- 57 VAR answer : CARDINAL);
- 58 (*BitRangeToInt lets us specify the bits that store the
- 59 value in which we're interested, and it loads that value
- 60 into the last parameter in the list.*)
- 61 BEGIN
- 62 LowLevel.ShiftLeft(TheSet, 15-HighBit);
- 63 (*Assumes bit 15 is most significant.*)
- 64 LowLevel.ShiftRight(TheSet, LowBit+(15-HighBit));
- 65 answer := CARDINAL(TheSet);
- 66 END BitRangeToInt;
- 67
- 68
- 69 PROCEDURE BytesToWord(lobyte, hibyte : CARDINAL) : CARDINAL;
- 70 (*Takes two bytes and stores them in a single word. The
- 71 last byte in the parameter list is most significant.*)
- 72 VAR
- 73 conv : WordConverter;
- 74 BEGIN
- 75 conv.lo := CHR(lobyte);
- 76 conv.hi := CHR(hibyte);
- 77 RETURN (CARDINAL(conv.x));
- 78 END BytesToWord;
- 79
- 80
- 81 PROCEDURE CardinalToDate(TheInt : CARDINAL; VAR month, day, year :
- 82 CARDINAL);
- 83 VAR
- 84 TheSet : BITSET;
- 85 BEGIN
- 86 (*CardinalToDate*)
- 87 TheSet := BITSET(TheInt);
- 88 (*
- 89 Diagnostics.diagB( 'TheDate', TheSet );
- 90 *)
- 91 BitRangeToInt(TheSet, 0, 4, day);
- 92 BitRangeToInt(TheSet, 5, 8, month);
- 93 BitRangeToInt(TheSet, 9, 15, year);
- 94 INC(year, 80);
- 95 END CardinalToDate;
- 96
- 97
- 98 PROCEDURE CardinalToTime(TheCardinal : CARDINAL; VAR hours,
- 99 minutes, seconds : CARDINAL);
- 100 VAR
- 101 TheSet : BITSET;
- 102 BEGIN
- 103 (*CardinalToTime*)
- 104 TheSet := BITSET(TheCardinal);
- 105 (*
- 106 Diagnostics.diagB( 'TheTime', TheSet );
- 107 *)
- 108 BitRangeToInt(TheSet, 11, 15, hours);
- 109 BitRangeToInt(TheSet, 5, 10, minutes);
- 110 BitRangeToInt(TheSet, 0, 4, seconds);
- 111 seconds := seconds*2;
- 112 (*We double seconds because the operating system stores
- 113 this value in two-second increments.*)
- 114 END CardinalToTime;
- 115
- 116
- 117 PROCEDURE DateToCardinal(month, day, year : CARDINAL) : CARDINAL;
- 118 CONST
- 119 msg = 'Invalid date';
- 120 VAR
- 121 BitSet1, BitSet2 : BITSET;
- 122 buf : BitRange;
- 123 BEGIN
- 124 (*DateToCardinal*)
- 125 IF year>1900 THEN
- 126 year := year-1900;
- 127 END;
- 128 IF ((year>=80) AND (year<=199)) THEN
- 129 year := year-80;
- 130 ELSE
- 131 (*
- 132 Diagnostics.diagC( 'year', year );
- 133 *)
- 134 ErrorManager.WARN(msg);
- 135 END;
- 136 IF ((month<1) OR (month>12)) THEN
- 137 (*
- 138 Diagnostics.diagC( 'month', month );
- 139 *)
- 140 ErrorManager.WARN(msg);
- 141 END;
- 142 IF ((day<1) OR (day>31)) THEN
- 143 (*
- 144 Diagnostics.diagC( 'day', day );
- 145 *)
- 146 ErrorManager.WARN(msg);
- 147 END;
- 148 BitSet2 := BITSET(0);
- 149 BitSet1 := BITSET(day);
- 150 FOR buf := 0 TO 15 DO
- 151 IF buf IN BitSet1 THEN
- 152 INCL(BitSet2, buf);
- 153 END;
- 154 END;
- 155 BitSet1 := BITSET(month);
- 156 FOR buf := 0 TO 15 DO
- 157 IF buf IN BitSet1 THEN
- 158 INCL(BitSet2, buf+5);
- 159 END;
- 160 END;
- 161 BitSet1 := BITSET(year);
- 162 FOR buf := 0 TO 15 DO
- 163 IF buf IN BitSet1 THEN
- 164 INCL(BitSet2, buf+9);
- 165 END;
- 166 END;
- 167 RETURN CARDINAL(BitSet2);
- 168 END DateToCardinal;
- 169
- 170
- 171 PROCEDURE HighByte( TheCard: CARDINAL ): CHAR;
- 172 VAR
- 173 tmp: WordConverter;
- 174 BEGIN
- 175 tmp.x := SYSTEM.WORD(TheCard);
- 176 RETURN tmp.hi;
- 177 END HighByte;
- 178
- 179 PROCEDURE HighCard( TheLong: LONGINT ): CARDINAL;
- 180 VAR
- 181 tmp: LongConverter;
- 182 BEGIN
- 183 tmp.long := TheLong;
- 184 RETURN tmp.hicard;
- 185 END HighCard;
- 186
- 187
- 188 PROCEDURE LowByte( TheCard: CARDINAL ): CHAR;
- 189 VAR
- 190 tmp: WordConverter;
- 191 BEGIN
- 192 tmp.x := SYSTEM.WORD(TheCard);
- 193 RETURN tmp.lo;
- 194 END LowByte;
- 195
- 196 PROCEDURE LowCard( TheLong: LONGINT ): CARDINAL;
- 197 VAR
- 198 tmp: LongConverter;
- 199 BEGIN
- 200 tmp.long := TheLong;
- 201 RETURN tmp.locard;
- 202 END LowCard;
- 203
- 204
- 205 PROCEDURE PeekChar( TheAdr: SYSTEM.ADDRESS ): CHAR;
- 206 VAR
- 207 tmp: LowLevel.Address8086;
- 208 BEGIN
- 209 tmp.a := TheAdr;
- 210 RETURN tmp.b^;
- 211 END PeekChar;
- 212
- 213
- 214 PROCEDURE PokeChar( TheChar: CHAR; TheAdr: SYSTEM.ADDRESS );
- 215 VAR
- 216 tmp: LowLevel.Address8086;
- 217 BEGIN
- 218 tmp.a := TheAdr;
- 219 tmp.b^ := TheChar;
- 220 END PokeChar;
- 221
- 222
- 223 PROCEDURE Size( VAR AnyObject: ARRAY OF SYSTEM.BYTE ): CARDINAL;
- 224 BEGIN
- 225 RETURN HIGH(AnyObject) + 1;
- 226 END Size;
- 227
- 228
- 229 PROCEDURE swap(VAR TheWord : SYSTEM.WORD);
- 230 (*Reverses the order of the high and low bytes in TheWord.*)
- 231 VAR
- 232 conv : WordConverter;
- 233 tmp : CHAR;
- 234 BEGIN
- 235 conv.x := TheWord;
- 236 tmp := conv.hi;
- 237 conv.hi := conv.lo;
- 238 conv.lo := tmp;
- 239 TheWord := conv.x;
- 240 END swap;
- 241
- 242
- 243 PROCEDURE TimeToCardinal(hours, minutes, seconds : CARDINAL) : CARDINAL;
- 244 CONST
- 245 msg = 'Invalid time';
- 246 VAR
- 247 BitSet1, BitSet2 : BITSET;
- 248 buf : BitRange;
- 249 BEGIN
- 250 (*TimeToCardinal*)
- 251 IF (hours>23) THEN
- 252 (*
- 253 Diagnostics.diagC( 'hours', hours );
- 254 *)
- 255 ErrorManager.WARN(msg);
- 256 END;
- 257 IF (minutes>59) THEN
- 258 (*
- 259 Diagnostics.diagC( 'minutes', minutes );
- 260 *)
- 261 ErrorManager.WARN(msg);
- 262 END;
- 263 IF (seconds>59) THEN
- 264 (*
- 265 Diagnostics.diagC( 'seconds', seconds );
- 266 *)
- 267 ErrorManager.WARN(msg);
- 268 END;
- 269 BitSet2 := BITSET(0);
- 270 BitSet1 := BITSET(seconds DIV 2);
- 271 FOR buf := 0 TO 15 DO
- 272 IF buf IN BitSet1 THEN
- 273 INCL(BitSet2, buf);
- 274 END;
- 275 END;
- 276 BitSet1 := BITSET(minutes);
- 277 FOR buf := 0 TO 15 DO
- 278 IF buf IN BitSet1 THEN
- 279 INCL(BitSet2, buf+5);
- 280 END;
- 281 END;
- 282 BitSet1 := BITSET(hours);
- 283 FOR buf := 0 TO 15 DO
- 284 IF buf IN BitSet1 THEN
- 285 INCL(BitSet2, buf+11);
- 286 END;
- 287 END;
- 288 RETURN CARDINAL(BitSet2);
- 289 END TimeToCardinal;
- 290
- 291 BEGIN
- 292 Initialized := FALSE;
- 293 Init();
- 294 END ByteFiddler.
- 9 errors
|