BYTEFIDD.LST 8.8 KB

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