tparray6.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. {$mode macpas}
  2. {$r-}
  3. procedure error(l: longint);
  4. begin
  5. writeln('error near ',l);
  6. halt(1);
  7. end;
  8. procedure test8bit;
  9. type
  10. ta = 0..1;
  11. tb = packed array[0..999] of ta;
  12. tc = array[0..124] of byte;
  13. const
  14. {$ifdef ENDIAN_BIG}
  15. results: array[0..9] of ta = (1,0,1,0,1,0,1,0,1,0);
  16. {$else}
  17. results: array[0..9] of ta = (0,1,0,1,0,1,0,1,0,1);
  18. {$endif}
  19. var
  20. a: ta;
  21. b: tb;
  22. i: longint;
  23. begin
  24. b[0] := results[0];
  25. b[1] := results[1];
  26. b[2] := results[2];
  27. b[3] := results[3];
  28. b[4] := results[4];
  29. b[5] := results[5];
  30. b[6] := results[6];
  31. b[7] := results[7];
  32. b[8] := results[8];
  33. b[9] := results[9];
  34. if (b[0] <> results[0]) then
  35. error(1);
  36. if (b[1] <> results[1]) then
  37. error(2);
  38. if (b[2] <> results[2]) then
  39. error(3);
  40. if (b[3] <> results[3]) then
  41. error(4);
  42. if (b[4] <> results[4]) then
  43. error(5);
  44. // if (b[600] <> 1) then
  45. // error(6);
  46. for i := low(results) to high(results) do
  47. if b[i] <> results[i] then
  48. error(7);
  49. // i := 500;
  50. // if (b[i] <> 1) then
  51. // error(8);
  52. end;
  53. procedure test8to16bit;
  54. type
  55. ta = 0..7;
  56. tb = packed array[0..1000] of ta;
  57. const
  58. {$ifdef ENDIAN_BIG}
  59. { 010 110 100 101 101 001 011 010 010 11010010110100101101001011010 }
  60. results: array[0..5] of ta = (2,6,4,5,5,1);
  61. {$else}
  62. { (memory layout is different but equivalent with starting at end }
  63. { 01011010010110100101101001011 010 010 110 100 101 101 001 011 010 }
  64. results: array[0..5] of ta = (2,3,1,5,5,4);
  65. {$endif}
  66. var
  67. a: ta;
  68. b: tb;
  69. i: longint;
  70. begin
  71. b[0] := results[0];
  72. b[1] := results[1];
  73. b[2] := results[2];
  74. b[3] := results[3];
  75. b[4] := results[4];
  76. b[5] := results[5];
  77. if (b[0] <> results[0]) then
  78. error(11);
  79. if (b[1] <> results[1]) then
  80. error(12);
  81. if (b[2] <> results[2]) then
  82. error(13);
  83. if (b[3] <> results[3]) then
  84. error(14);
  85. if (b[4] <> results[4]) then
  86. error(15);
  87. if (b[5] <> results[5]) then
  88. error(155);
  89. // if (b[600] <> 2) then
  90. // error(16);
  91. for i := low(results) to high(results) do
  92. if b[i] <> results[i] then
  93. error(17);
  94. // i := 500;
  95. // if (b[i] <> 5) then
  96. // error(18);
  97. end;
  98. procedure test16bit;
  99. type
  100. ta = 0..511;
  101. tb = packed array[0..799] of ta;
  102. tc = array[0..899] of byte;
  103. const
  104. {$ifdef ENDIAN_BIG}
  105. { 010110100 111011001 011010011 101100101 101001110 110010110 100111011 001011010 0111011001011010011101100101101001110110 }
  106. results: array[0..4] of ta = ($5A*2,$76 * 4 + 1,$69 * 2 + 1,$B2 * 2 + 1,$A7 * 2);
  107. {$else}
  108. { algorithm: cut bit string in 16 bit chunks, byteswap, take 9 bits from right to left per chunck, continuing at the right of the next chunck if the previous one is used up }
  109. { 001011010 100111011 110010110 101001110 101100101 011 0101101001110110010110100111011001011010011101100101101001110110 }
  110. results: array[0..4] of ta = ($2D*2,$9D*2+1,$CB*2,$A7*2,$B2*2+1);
  111. {$endif}
  112. var
  113. a: ta;
  114. b: tb;
  115. i: longint;
  116. begin
  117. b[0] := results[0];
  118. b[1] := results[1];
  119. b[2] := results[2];
  120. b[3] := results[3];
  121. b[4] := results[4];
  122. if (b[0] <> results[0]) then
  123. error(21);
  124. if (b[1] <> results[1]) then
  125. error(22);
  126. if (b[2] <> results[2]) then
  127. error(23);
  128. if (b[3] <> results[3]) then
  129. error(24);
  130. if (b[4] <> results[4]) then
  131. error(25);
  132. // if (b[600] <> $76 * 2) then
  133. // error(26);
  134. for i := low(results) to high(results) do
  135. if b[i] <> results[i] then
  136. error(27);
  137. // i := 500;
  138. // if (b[i] <> $A7 * 2) then
  139. // error(28);
  140. end;
  141. procedure test16to24bit;
  142. type
  143. ta = 0..2047;
  144. tb = packed array[0..799] of ta;
  145. tc = array[0..1099] of byte;
  146. const
  147. {$ifdef ENDIAN_BIG}
  148. results: array[0..4] of ta = ($5A * 8 + 3,$B2 * 8 + 6,$9D * 8 + 4,$B4 * 8 + 7,$65 * 8 + 5);
  149. {$else}
  150. { %11001011010 01101001110 00111011001 01100101101 10110100111 011101100 0111011001011010 0111011001011010 0111011001011010 }
  151. results: array[0..4] of ta = ($0000065A,$0000034E,$000001D9,$0000032D,$000005A7);
  152. {$endif}
  153. var
  154. a: ta;
  155. b: tb;
  156. i: longint;
  157. begin
  158. b[0] := results[0];
  159. b[1] := results[1];
  160. b[2] := results[2];
  161. b[3] := results[3];
  162. b[4] := results[4];
  163. if (b[0] <> results[0]) then
  164. error(31);
  165. if (b[1] <> results[1]) then
  166. error(32);
  167. if (b[2] <> results[2]) then
  168. error(33);
  169. if (b[3] <> results[3]) then
  170. error(34);
  171. if (b[4] <> results[4]) then
  172. error(35);
  173. // if (b[600] <> $76 * 8 + 2) then
  174. // error(36);
  175. for i := low(results) to high(results) do
  176. if b[i] <> results[i] then
  177. error(37);
  178. // i := 500;
  179. // if (b[i] <> $65 * 8 + 5) then
  180. // error(38);
  181. end;
  182. procedure test32bit;
  183. type
  184. ta = 0..(1 shl 19) - 1;
  185. tb = packed array[0..799] of ta;
  186. tc = array[0..1899] of byte;
  187. const
  188. {$ifdef ENDIAN_BIG}
  189. results: array[0..4] of ta = ($5A76*8+2, $D3B2*8+6,$9D96*8+4,$ECB4*8+7,$65A7*8+3);
  190. {$else}
  191. { 0100111011001011010 0110100111011001011 0010110100111011001 0110010110100111011 1110110010110100111 0 01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010 01110110010110100111011001011010}
  192. results: array[0..4] of ta = ($0002765A,$00034ECB,$000169D9,$00032D3B,$000765A7);
  193. {$endif}
  194. var
  195. a: ta;
  196. b: tb;
  197. i: longint;
  198. begin
  199. b[0] := results[0];
  200. b[1] := results[1];
  201. b[2] := results[2];
  202. b[3] := results[3];
  203. b[4] := results[4];
  204. if (b[0] <> results[0]) then
  205. error(41);
  206. if (b[1] <> results[1]) then
  207. error(42);
  208. if (b[2] <> results[2]) then
  209. error(43);
  210. if (b[3] <> results[3]) then
  211. error(44);
  212. if (b[4] <> results[4]) then
  213. error(45);
  214. // if (b[600] <> $765A*8+3) then
  215. // error(46);
  216. for i := low(results) to high(results) do
  217. if b[i] <> results[i] then
  218. error(47);
  219. // i := 500;
  220. // if (b[i] <> $65a7*8+3) then
  221. // error(48);
  222. end;
  223. {
  224. write(hexstr(%1110110010110100111011001011010 ,8),',$');
  225. write(hexstr(%1101100101101001110110010110100 ,8),',$');
  226. write(hexstr(%1011001011010011101100101101001 ,8),',$');
  227. write(hexstr(%0110010110100111011001011010011 ,8),',$');
  228. writeln(hexstr(%1100101101001110110010110100111 ,8));
  229. }
  230. procedure test32to40bit;
  231. type
  232. ta = 0..$7fffffff;
  233. tb = packed array[0..799] of ta;
  234. tc = array[0..3099] of byte;
  235. const
  236. {$ifdef ENDIAN_BIG}
  237. results: array[0..4] of ta = ($5A765A7*8+3,$2D3B2D3*8+5,$969D969*8+6,$CB4ECB4*8+7,$65A765A*8+3);
  238. {$else}
  239. {
  240. 1110110010110100111011001011010 1101100101101001110110010110100 1011001011010011101100101101001 0110010110100111011001011010011 1100101101001110110010110100111 1001011010011101100101101001110 011101
  241. }
  242. results: array[0..4] of ta = ($765A765A,$6CB4ECB4,$5969D969,$32D3B2D3,$65A765A7);
  243. {$endif}
  244. var
  245. a: ta;
  246. b: tb;
  247. i: longint;
  248. begin
  249. b[0] := results[0];
  250. b[1] := results[1];
  251. b[2] := results[2];
  252. b[3] := results[3];
  253. b[4] := results[4];
  254. if (b[0] <> results[0]) then
  255. error(51);
  256. if (b[1] <> results[1]) then
  257. error(52);
  258. if (b[2] <> results[2]) then
  259. error(53);
  260. if (b[3] <> results[3]) then
  261. error(54);
  262. if (b[4] <> results[4]) then
  263. error(55);
  264. for i := low(results) to high(results) do
  265. if b[i] <> results[i] then
  266. error(57);
  267. // i := 500;
  268. // if (b[i] <> $65A765A*8+3) then
  269. // error(58);
  270. end;
  271. begin
  272. test8bit;
  273. test8to16bit;
  274. test16bit;
  275. test16to24bit;
  276. test32bit;
  277. test32to40bit;
  278. end.