|
|
1.1 ! root 1: ! 2: /* ADDW2 (add word 2) test */ ! 3: /* */ ! 4: /*Test name = addw2 */ ! 5: /*Description = */ ! 6: /* This test checks 'addw2' instruction as follows: */ ! 7: /*add sum result N Z V C (flags) */ ! 8: /*___ ___ ______ _______________ */ ! 9: /*0x11107fff 0x11107fff 0x1110fffe 0 0 1 0 */ ! 10: /*0x11108000 0x11108000 0x11100000 0 1 1 1 */ ! 11: /*0x8000 0xffff 0x7fff 0 0 1 1 */ ! 12: /*0x8001 0x7fff 0x0000 0 1 0 1 */ ! 13: /*0x8000 0x7fff 0xffff 1 0 0 0 */ ! 14: /*0xc000 0xc000 0x8000 1 0 0 1 */ ! 15: /* */ ! 16: /* */ ! 17: /* */ ! 18: /* constants definition for 'addx' tests. */ ! 19: /* */ ! 20: ! 21: .set A1B1,0x1111107f/*+127, highest +ve number, byte */ ! 22: .set A1W1,0x11107fff ! 23: .set A1L1,0x7fffffff ! 24: .set A2B1,0x1111107f/* +127 */ ! 25: .set A2W1,0x11107fff ! 26: .set A2L1,A1L1 ! 27: .set RB1,0x111110fe ! 28: .set RW1,0x1110fffe ! 29: .set RL1,0xfffffffe ! 30: .set A1B2,0x11111080/* -128 */ ! 31: .set A1W2,0x11108000 ! 32: .set A1L2,0x80000000 ! 33: .set A2B2,0x11111080/* -128 */ ! 34: .set A2W2,0x11108000 ! 35: .set A2L2,0X80000000 ! 36: .set RB2,0x11111000/* 0 */ ! 37: .set RW2,0x11100000 ! 38: .set RL2,0x00000000 ! 39: .set A1B3,0X80 /* -128 */ ! 40: .set A1W3,0x8000 ! 41: .set A1L3,0x80000000 ! 42: .set A2B3,0xff /* -1 */ ! 43: .set A2W3,0xffff ! 44: .set A2L3,0xffffffff ! 45: .set RB3,0x0000007f ! 46: .set RW3,0X00007fff ! 47: .set RL3,0X7fffffff ! 48: .set A1B4,0x81 /* -127 */ ! 49: .set A1W4,0x8001 ! 50: .set A1L4,0x80000001 ! 51: .set A2B4,0x7f /* 127 */ ! 52: .set A2W4,0x7fff ! 53: .set A2L4,0x7fffffff ! 54: .set RB4,0 /* 0 */ ! 55: .set RW4,RB4 ! 56: .set RL4,RB4 ! 57: .set A1B5,A1B3 /* -128 */ ! 58: .set A1W5,A1W3 ! 59: .set A1L5,A1L3 ! 60: .set A2B5,A2B4 /* 127 */ ! 61: .set A2W5,A2W4 ! 62: .set A2L5,A2L4 ! 63: .set RB5,0xff /* -1 */ ! 64: .set RW5,0xffff ! 65: .set RL5,0xffffffff ! 66: .set A1B6,0xc0 /* -64 */ ! 67: .set A1W6,0xc000 ! 68: .set A1L6,0xc0000000 ! 69: .set A2B6,A1B6 /* -64 */ ! 70: .set A2W6,A1W6 ! 71: .set A2L6,A1L6 ! 72: .set RB6,0x00000080 /* -128 */ ! 73: .set RW6,0x00008000 ! 74: .set RL6,0X80000000 ! 75: .set WMSK,0xffff /* mask for word compares */ ! 76: ! 77: .set INITB,0x11111055/* initialization values for 3 operand */ ! 78: .set INITW,0x11105555 ! 79: .set INITL,0X55555555 ! 80: ! 81: /* */ ! 82: /* Syst.s - Constants */ ! 83: /* */ ! 84: .set IPL,8 ! 85: .set HIGH,31 ! 86: .set ZERO,0 ! 87: .set ONES,0xffffffff ! 88: .set N,8 ! 89: .set Z,4 ! 90: .set V,2 ! 91: .set C,1 ! 92: .set T,16 ! 93: .set IV,32 ! 94: .set FU,64 ! 95: .set DV,128 ! 96: .set PSWMASK,0x003f ! 97: ! 98: # R2 = error code ! 99: # 1 : error in flags ! 100: # 2 : result is not as expected ! 101: # ! 102: .globl _addw2 ! 103: _addw2: ! 104: callf $4,_setjmp /* save context for error return */ ! 105: movab _addw2,_stpc /* save subtst number */ ! 106: movl $1,_subtst /* subtest number */ ! 107: movl $2,_no_opr /* number of operands in use */ ! 108: movl $A1W1,_opr /* first operand */ ! 109: movl $A2W1,_opr + 4 /* second operand */ ! 110: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 111: movl $A1W1,add /*first operand */ ! 112: movl $A2W1,sum /*second operand */ ! 113: bispsw $(N|Z|C) /* these flags ON */ ! 114: addw2 add+2,sum+2 /* try 'add' instruction mem to mem */ ! 115: jlss e1 /*error if N = 1 */ ! 116: jeql e1 /*error if Z = 1 */ ! 117: jvc e1 /*error if V = 0 */ ! 118: jcs e1 /*error if C = 1 */ ! 119: bicpsw $Z ! 120: movl $RW1,r4 ! 121: cmpl $RW1,sum /*sum = expected ? */ ! 122: jeql ad1r /*if correct continue */ ! 123: movl $1,_ercode /* error code data miscompare */ ! 124: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 125: movl sum,_actual /* actual ddata */ ! 126: movl $RW1,_expected /* expected data */ ! 127: jmp *badrtn ! 128: e1: movpsl _actual /* actual = psl */ ! 129: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 130: movl $2,_ercode /* error code flag failure */ ! 131: jmp *badrtn ! 132: ! 133: /* reverse operands */ ! 134: ! 135: ad1r: ! 136: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 137: aad1r: callf $4,_setjmp /* save context for error return */ ! 138: movab aad1r,_stpc /* save subtst number */ ! 139: movl $2,_subtst /* subtest number */ ! 140: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 141: movl $A1W1,sum /*second operand */ ! 142: bispsw $(N|Z|C) /* these flags ON */ ! 143: addw2 $0x7fff,sum+2 /* try 'add' instruction data to mem */ ! 144: jlss e2 /*error if N = 1 */ ! 145: jeql e2 /*error if Z = 1 */ ! 146: jvc e2 /*error if V = 0 */ ! 147: jcs e2 /*error if C = 1 */ ! 148: bicpsw $Z ! 149: movl $RW1,r4 ! 150: cmpl $RW1,sum /*sum = expected ? */ ! 151: jeql ad2 /*if correct continue */ ! 152: movl $1,_ercode /* error code data miscompare */ ! 153: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 154: movl sum,_actual /* actual ddata */ ! 155: movl $RW1,_expected /* expected data */ ! 156: jmp *badrtn ! 157: e2: movpsl _actual /* actual = psl */ ! 158: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 159: movl $2,_ercode /* error code flag failure */ ! 160: jmp *badrtn ! 161: ! 162: ad2: ! 163: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 164: aad2: callf $4,_setjmp /* save context for error return */ ! 165: movab aad2,_stpc /* save subtst number */ ! 166: movl $3,_subtst /* subtest number */ ! 167: movl $2,_no_opr /* number of operands in use */ ! 168: movl $A1W2,_opr /* first operand */ ! 169: movl $A2W2,_opr + 4 /* second operand */ ! 170: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 171: movl $A1W2,tmp /*first operand */ ! 172: movw tmp+2,r5 /*first operand */ ! 173: movl $A2W2,sum /*second operand */ ! 174: bispsw $N /* these flags ON */ ! 175: addw2 r5,sum+2 /* try 'add' instruction reg to mem */ ! 176: jgeq e3 /*error if N = 0 */ ! 177: jeql e3 /*error if Z = 1 */ ! 178: jvc e3 /*error if V = 0 */ ! 179: jcc e3 /*error if C = 0 */ ! 180: bicpsw $Z ! 181: movl $RW2,r4 ! 182: cmpl $RW2,sum /*sum = expected ? */ ! 183: jneq e2 /*if not, error */ ! 184: jeql ad2r /*if correct continue */ ! 185: movl $1,_ercode /* error code data miscompare */ ! 186: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 187: movl sum,_actual /* actual ddata */ ! 188: movl $RW2,_expected /* expected data */ ! 189: jmp *badrtn ! 190: e3: movpsl _actual /* actual = psl */ ! 191: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 192: movl $2,_ercode /* error code flag failure */ ! 193: jmp *badrtn ! 194: ! 195: ! 196: /* reverse operands */ ! 197: ! 198: ad2r: ! 199: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 200: aad2r: callf $4,_setjmp /* save context for error return */ ! 201: movab aad2r,_stpc /* save subtst number */ ! 202: movl $4,_subtst /* subtest number */ ! 203: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 204: movl $A2W2,add /*first operand */ ! 205: movl $A1W2,tmp /*first operand */ ! 206: movw tmp+2,r5 /*first operand */ ! 207: bispsw $N /* these flags ON */ ! 208: addw2 add+2,r5 /* try 'add' instruction mem to reg */ ! 209: jgeq e4 /*error if N = 0 */ ! 210: jeql e4 /*error if Z = 1 */ ! 211: jvc e4 /*error if V = 0 */ ! 212: jcc e4 /*error if C = 0 */ ! 213: bicpsw $Z ! 214: movl $RW2,r4 ! 215: andl2 $WMSK,r4 ! 216: andl2 $WMSK,r5 ! 217: cmpw r4,r5 /*sum = expected ? */ ! 218: jeql ad3 /*if correct continue */ ! 219: movl $1,_ercode /* error code data miscompare */ ! 220: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 221: movl r5,_actual /* actual ddata */ ! 222: movl $RW2,_expected /* expected data */ ! 223: jmp *badrtn ! 224: e4: movpsl _actual /* actual = psl */ ! 225: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 226: movl $2,_ercode /* error code flag failure */ ! 227: jmp *badrtn ! 228: ! 229: ! 230: ! 231: ad3: ! 232: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 233: aad3: callf $4,_setjmp /* save context for error return */ ! 234: movab aad3,_stpc /* save subtst number */ ! 235: movl $5,_subtst /* subtest number */ ! 236: movl $2,_no_opr /* number of operands in use */ ! 237: movl $-0x8000,_opr /* first operand */ ! 238: movl $A2W3,_opr + 4 /* second operand */ ! 239: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 240: movl $A2W3,tmp /*first operand */ ! 241: movw tmp+2,r5 /*first operand */ ! 242: bispsw $(N|Z) /* these flags ON */ ! 243: addw2 $-0x8000,r5 /* try 'add' instruction data to reg */ ! 244: jgeq e5 /*error if N = 0 */ ! 245: jeql e5 /*error if Z = 1 */ ! 246: jvc e5 /*error if V = 0 */ ! 247: jcc e5 /*error if C = 0 */ ! 248: bicpsw $Z ! 249: movl $RW3,r4 ! 250: andl2 $WMSK,r4 ! 251: andl2 $WMSK,r5 ! 252: cmpl r4,r5 /*sum = expected ? */ ! 253: jeql ad3r /*if correct continue */ ! 254: movl $1,_ercode /* error code data miscompare */ ! 255: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 256: movl r5,_actual /* actual ddata */ ! 257: movl $RW3,_expected /* expected data */ ! 258: jmp *badrtn ! 259: e5: movpsl _actual /* actual = psl */ ! 260: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 261: movl $2,_ercode /* error code flag failure */ ! 262: jmp *badrtn ! 263: ! 264: /* reverse operands */ ! 265: ! 266: ad3r: ! 267: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 268: aad3r: callf $4,_setjmp /* save context for error return */ ! 269: movab aad3r,_stpc /* save subtst number */ ! 270: movl $6,_subtst /* subtest number */ ! 271: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 272: movl $A2W3,tmp /*first operand */ ! 273: movw tmp+2,r5 /*first operand */ ! 274: movl $A1W3,tmp2 /* second operand */ ! 275: movw tmp2+2,r6 /* second operand */ ! 276: bispsw $(N|Z) /* these flags ON */ ! 277: addw2 r5,r6 /* try 'add' instruction reg to reg */ ! 278: jgeq e6 /*error if N = 0 */ ! 279: jeql e6 /*error if Z = 1 */ ! 280: jvc e6 /*error if V = 0 */ ! 281: jcc e6 /*error if C = 0 */ ! 282: bicpsw $Z ! 283: movl $RW3,r4 ! 284: andl2 $WMSK,r4 ! 285: andl2 $WMSK,r6 ! 286: cmpl r4,r6 /*sum = expected ? */ ! 287: jeql ad4 /*if correct continue */ ! 288: movl $1,_ercode /* error code data miscompare */ ! 289: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 290: movl r6,_actual /* actual ddata */ ! 291: movl $RW3,_expected /* expected data */ ! 292: jmp *badrtn ! 293: e6: movpsl _actual /* actual = psl */ ! 294: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 295: movl $2,_ercode /* error code flag failure */ ! 296: jmp *badrtn ! 297: ! 298: ad4: ! 299: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 300: aad4: callf $4,_setjmp /* save context for error return */ ! 301: movab aad4,_stpc /* save subtst number */ ! 302: movl $7,_subtst /* subtest number */ ! 303: movl $2,_no_opr /* number of operands in use */ ! 304: movl $A1W4,_opr /* first operand */ ! 305: movl $A2W4,_opr + 4 /* second operand */ ! 306: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 307: movl $A1W4,add /*first operand */ ! 308: movl $A2W4,sum /*second operand */ ! 309: bispsw $(N|V) /* these flags ON */ ! 310: addw2 add+2,sum+2 /* try 'add' instruction */ ! 311: jlss e7 /*error if N = 1 */ ! 312: jneq e7 /*error if Z = 0 */ ! 313: jvs e7 /*error if V = 1 */ ! 314: jcc e7 /*error if C = 0 */ ! 315: bicpsw $Z ! 316: movl $RW4,r4 ! 317: cmpl $RW4,sum /*sum = expected ? */ ! 318: jeql ad4r /*if correct continue */ ! 319: movl $1,_ercode /* error code data miscompare */ ! 320: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 321: movl sum,_actual /* actual ddata */ ! 322: movl $RW4,_expected /* expected data */ ! 323: jmp *badrtn ! 324: e7: movpsl _actual /* actual = psl */ ! 325: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 326: movl $2,_ercode /* error code flag failure */ ! 327: jmp *badrtn ! 328: ! 329: /* reverse operands */ ! 330: ! 331: ad4r: ! 332: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 333: aad4r: callf $4,_setjmp /* save context for error return */ ! 334: movab aad4r,_stpc /* save subtst number */ ! 335: movl $8,_subtst /* subtest number */ ! 336: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 337: movl $A2W4,add /*first operand */ ! 338: movl $A1W4,sum /*second operand */ ! 339: bispsw $(N|V) /* these flags ON */ ! 340: addw2 add+2,sum+2 /* try 'add' instruction */ ! 341: jlss e8 /*error if N = 1 */ ! 342: jneq e8 /*error if Z = 0 */ ! 343: jvs e8 /*error if V = 1 */ ! 344: jcc e8 /*error if C = 0 */ ! 345: bicpsw $Z ! 346: movl $0,r4 ! 347: cmpl r4,sum /*sum = expected ? */ ! 348: jeql ad5 /*if correct continue */ ! 349: movl $1,_ercode /* error code data miscompare */ ! 350: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 351: movl sum,_actual /* actual ddata */ ! 352: movl $0,_expected /* expected data */ ! 353: jmp *badrtn ! 354: e8: movpsl _actual /* actual = psl */ ! 355: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 356: movl $2,_ercode /* error code flag failure */ ! 357: jmp *badrtn ! 358: ! 359: ! 360: ! 361: ad5: ! 362: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 363: aad5: callf $4,_setjmp /* save context for error return */ ! 364: movab aad5,_stpc /* save subtst number */ ! 365: movl $9,_subtst /* subtest number */ ! 366: movl $2,_no_opr /* number of operands in use */ ! 367: movl $A1W5,_opr /* first operand */ ! 368: movl $A2W5,_opr + 4 /* second operand */ ! 369: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 370: movl $A1W5,add /*first operand */ ! 371: movl $A2W5,sum /*second operand */ ! 372: bispsw $(V|Z|C) /* these flags ON */ ! 373: addw2 add+2,sum+2 /* try 'add' instruction */ ! 374: jgeq e9 /*error if N = 0 */ ! 375: jeql e9 /*error if Z = 1 */ ! 376: jvs e9 /*error if V = 1 */ ! 377: jcs e9 /*error if C = 1 */ ! 378: bicpsw $Z ! 379: movl $RW5,r4 ! 380: cmpl $RW5,sum /*sum = expected ? */ ! 381: jeql ad5r /*if correct continue */ ! 382: movl $1,_ercode /* error code data miscompare */ ! 383: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 384: movl sum,_actual /* actual ddata */ ! 385: movl $RW5,_expected /* expected data */ ! 386: jmp *badrtn ! 387: e9: movpsl _actual /* actual = psl */ ! 388: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 389: movl $2,_ercode /* error code flag failure */ ! 390: jmp *badrtn ! 391: ! 392: ! 393: /* reverse operands */ ! 394: ! 395: ad5r: ! 396: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 397: aad5r: callf $4,_setjmp /* save context for error return */ ! 398: movab aad5r,_stpc /* save subtst number */ ! 399: movl $0xa,_subtst /* subtest number */ ! 400: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 401: movl $A2W5,add /*first operand */ ! 402: movl $A1W5,sum /*second operand */ ! 403: bispsw $(V|Z|C) /* these flags ON */ ! 404: addw2 add+2,sum+2 /* try 'add' instruction */ ! 405: jgeq e10 /*error if N = 0 */ ! 406: jeql e10 /*error if Z = 1 */ ! 407: jvs e10 /*error if V = 1 */ ! 408: jcs e10 /*error if C = 1 */ ! 409: bicpsw $Z ! 410: movl $RW5,r4 ! 411: cmpl r4,sum /*sum = expected ? */ ! 412: jeql ad6 /*if correct continue */ ! 413: movl $1,_ercode /* error code data miscompare */ ! 414: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 415: movl sum,_actual /* actual ddata */ ! 416: movl $RW5,_expected /* expected data */ ! 417: jmp *badrtn ! 418: e10: movpsl _actual /* actual = psl */ ! 419: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 420: movl $2,_ercode /* error code flag failure */ ! 421: jmp *badrtn ! 422: ! 423: ad6: ! 424: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 425: aad6: callf $4,_setjmp /* save context for error return */ ! 426: movab aad6,_stpc /* save subtst number */ ! 427: movl $0xb,_subtst /* subtest number */ ! 428: movl $2,_no_opr /* number of operands in use */ ! 429: movl $A1W6,_opr /* first operand */ ! 430: movl $A2W6,_opr + 4 /* second operand */ ! 431: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 432: movl $A1W6,add /*first operand */ ! 433: movl $A2W6,sum /*second operand */ ! 434: bispsw $(Z|V) /* these flags ON */ ! 435: addw2 add+2,sum+2 /* try 'add' instruction */ ! 436: jgeq e11 /*error if N = 0 */ ! 437: jeql e11 /*error if Z = 1 */ ! 438: jvs e11 /*error if V = 1 */ ! 439: jcc e11 /*error if C = 0 */ ! 440: bicpsw $Z ! 441: movl $RW6,r4 ! 442: cmpl $RW6,sum /*sum = expected ? */ ! 443: jeql ad6r /*if correct continue */ ! 444: movl $1,_ercode /* error code data miscompare */ ! 445: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 446: movl sum,_actual /* actual ddata */ ! 447: movl $RW6,_expected /* expected data */ ! 448: jmp *badrtn ! 449: e11: movpsl _actual /* actual = psl */ ! 450: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 451: movl $2,_ercode /* error code flag failure */ ! 452: jmp *badrtn ! 453: ! 454: ! 455: /* reverse operands */ ! 456: ! 457: ad6r: ! 458: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 459: aad6r: callf $4,_setjmp /* save context for error return */ ! 460: movab aad6r,_stpc /* save subtst number */ ! 461: movl $0xc,_subtst /* subtest number */ ! 462: 0: bicpsw $PSWMASK /*PSW = 0 */ ! 463: movl $A2W6,add /*first operand */ ! 464: movl $A1W6,sum /*second operand */ ! 465: bispsw $(Z|V) /* these flags ON */ ! 466: addw2 add+2,sum+2 /* try 'add' instruction */ ! 467: jgeq e12 /*error if N = 0 */ ! 468: jeql e12 /*error if Z = 1 */ ! 469: jvs e12 /*error if V = 1 */ ! 470: jcc e12 /*error if C = 0 */ ! 471: bicpsw $Z ! 472: movl $RW6,r4 ! 473: cmpl $RW6,sum /*sum = expected ? */ ! 474: jeql aldn /*f correct all done*/ ! 475: movl $1,_ercode /* error code data miscompare */ ! 476: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 477: movl sum,_actual /* actual ddata */ ! 478: movl $RW6,_expected /* expected data */ ! 479: jmp *badrtn ! 480: e12: movpsl _actual /* actual = psl */ ! 481: bbs $0,_scoplp,0b /* if set scope loop on error */ ! 482: movl $2,_ercode /* error code flag failure */ ! 483: jmp *badrtn ! 484: aldn: bbs $0,_force_lp,0b /* if set loop on last subtest */ ! 485: jmp *return ! 486: ! 487: /* */ ! 488: /* Variables */ ! 489: /* */ ! 490: .align 2 ! 491: add1: .space 4 ! 492: add2: .space 4 ! 493: sum: .space 4 ! 494: add: .space 4 ! 495: tmp: .space 4 ! 496: tmp2: .space 4 ! 497: ! 498: /* End of file */ ! 499: ! 500:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.