.title VAX$CRC - VAX CRC instruction emulation .ident "X01.01" ;+ ; Description: ; ; This code in this module is largely a modified version of that found ; in the VMS CRC emulation code, [V54.EMULAT.LIS]VAXSTRING.LIS. The code ; has been modified for in-line use and optimised to speed it up. For ; small buffers, improvements in the order of 50% and more can be gained. ; ; VAX$CRC is the standard entry point and provides the same functionality ; as LIB$CRC. VAX$CRC will automatically vall VAX$FAST_CRC if your ; original polymonial was one of A001 (CRC16), EDB88320 (AUTODIN-II) or ; E905 (FAL) and your buffer size is grater than or equal to 4 bytes. ; ; To further increase the speed, ensure your buffers are longword aligned, ; and a multiple of 4 bytes long (if possible). ; ; Two new functions are provided: ; ; VAX$FAST_CRC uses the optimised CRC generation method. If you specify ; a buffer size of less than 4 bytes, SS$_BADPARAM will be signalled. ; You can generate your own optimised drive tables for VAX$FAST_CRC by ; calling... ; ; VAX$FAST_CRC_TABLE generates 256 entry shift tables for use by ; VAX$FAST_CRC. ; ; Edit Edit date By Why ; X01.01 05-Dec-91 NMdS Faster CRC generation for any CRC ; Most of the tricky stuff is from the ; VMS sources. ;- $ssdef .subtitle VAX$CRC - Calculate Cyclic Redundancy Check ;+ ; Functional Description: ; ; The CRC of the data stream is calculated. ; The initial CRC is given by INITIAL and is normally 0 or -1 ; unless the CRC is calculated in several steps. The result is left in ; R0. If the polynomial is less than order-32, the result must be ; extracted from R0. The CRC polynomial is expressed by the ; contents of the 16-longword table (from LIB$CRC_TABLE). ; ; Input Parameters: ; ; 4(ap) => Input CRC table ; 8(ap) = Initial CRC value ; 12(ap)<0:15> = Stream length ; 16(ap) => Stream data ; ; VAX$CRC Direct replacement for LIB$CRC, except that its a lot ; faster. CRC table parameter is 16 longwords generated ; by LIB$CRC_TABLE(). ; ; VAX$FAST_CRC Entry point to the "go-faster" CRC calculations. Same ; parameters as VAX$CRC, except that the CRC table ; parameter is 256 longwords generated by ; VAX$FAST_CRC_TABLE. If the stream length is less than ; 4 bytes, VAX$FAST_CRC will generate a BADPARAM signal. ; ; Intermediate State: ; ; 31 23 15 07 00 ; +----------------+----------------+----------------+----------------+ ; | inicrc | : R0 ; +----------------+----------------+----------------+----------------+ ; | tbl | : R1 ; +----------------+----------------+----------------+----------------+ ; | unused | strlen | : R2 ; +----------------+----------------+----------------+----------------+ ; | stream | : R3 ; +----------------+----------------+----------------+----------------+ ; ; Output Parameters: ; ; R0 = Final CRC value ; R1 = undefined ; ; Notes: ; ; The VAX architecture describes the CRC instruction in terms of ; a 16 longword polynomial table, which is a required input parameter. ; The CRC can be calculated faster by processing the input stream ; a byte at a time. However, this requires a 256 longword lookup ; table which cannot be passed as a parameter to this routine. ; Instead, if the CRC polynomial used to generate the table is one of ; three commonly used types, a hardcoded 256 longword table and the ; optimized processing routine are used transparently to the user. ;- POLY = 32 ; CRC polynomial = 8th entry in table ; POLY_AUTODIN = ^xEDB88320 ; Set of CRC polynomials POLY_FAL = ^x0000E905 ; ...which receive POLY_CRC16 = ^x0000A001 ; ...special case processing ; Offsets from AP for input paramaters TABLE = 4 ; Input CRC table INITIAL = 8 ; Initial CRC value LENGTH = 12 ; Stream length STREAM = 16 ; Stream descriptor .enable local_block .psect $CODE PIC, REL, SHR, EXE, RD, NOWRT .entry VAX$CRC, ^m movl INITIAL(ap), r0 ; R0 = Initial CRC value movl TABLE(ap), r1 ; R1 => CRC table movzwl LENGTH(ap), r2 ; R2 = stream length beql 20$ ; All done if zero movl STREAM(ap), r3 ; R3 => stream of data cmpl r2, #4 ; Is string greater than 4 bytes blss 7$ ; If not, don't bother to special case movl POLY(r1), r4 ; Get CRC polynomial from table ; note: Table[8] = CRC polynomial cmpl r4, #POLY_CRC16 ; Is it CRC-16 polynomial? bneq 5$ ; If neq, no, continue moval TABLE_CRC16, r1 ; Else, set up table brb FAST_CRC ; and go for fast processing 5$: cmpl r4, #POLY_AUTODIN ; Is it Autodin-II bneq 6$ ; If neq, no, continue moval TABLE_AUTODINII, r1 ; Else, set up table brb FAST_CRC ; and go for fast processing 6$: cmpl r4, #POLY_FAL ; Is it FAL/DAP custom polynomial? bneq 7$ ; If neq, no, continue moval TABLE_FAL, r1 ; Else, set up table brb FAST_CRC ; and go for fast processing 7$: clrl r4 ; Clear it out (we only use R4<7:0>) ; This is the main loop that operates on each byte in the input stream 10$: xorb2 (r3)+, r0 ; Include next byte ; The next three instructions are really the body of a loop that executes ; twice on each pass through the outer loop. Rather than incur additional ; overhead, this inner loop is expanded in line. bicb3 #^xF0, r0, r4 ; Get right 4 bits extzv #4, #28, r0, r0 ; Shift result right 4 xorl2 (r1)[r4], r0 ; Include table entry bicb3 #^xF0, r0, r4 ; Get right 4 bits extzv #4, #28, r0, r0 ; Shift result right 4 xorl2 (r1)[r4], r0 ; Include table entry sobgtr r2, 10$ ; Count down loop 20$: ret ; Return to caller .disable local_block .subtitle VAX$FAST_CRC - Calculate Fast Cyclic Redundancy Check ;+ ; Functional Description: ; ; The CRC of the data stream is calculated. ; The initial CRC is given by INITIAL and is normally 0 or -1 ; unless the CRC is calculated in several steps. The result is left in ; R0. If the polynomial is less than order-32, the result must be ; extracted from R0. The CRC polynomial is expressed by the ; contents of the 256-longword table (from VAX$FAST_CRC_TABLE). ; ; Input Parameters: ; ; 4(ap) => Input 256 entry CRC table ; 8(ap) = Initial CRC value ; 12(ap)<0:15> = Stream length ; 16(ap) => Stream data ; .enable local_block .entry VAX$FAST_CRC, ^m movl INITIAL(ap), r0 ; R0 = Initial CRC value movzwl LENGTH(ap), r2 ; R2 = stream length cmpl r2, #4 ; Is string greater than 4 bytes bgequ 5$ ; ...yes, so no problem pushl #SS$_BADPARAM ; Say length parameter is bad calls #1, g^LIB$SIGNAL ; Warn the user ret ; Return to caller 5$: movl TABLE(ap), r1 ; R1 => CRC table movl STREAM(ap), r3 ; R3 => stream of data FAST_CRC: ; ; Register Usage: ; ; R0 = CRC accumulator ; R1 = Address of CRC table ; R2 = Size of data string, counter for longword loop ; R3 = Address of data string (current) ; R4 = Index into CRC table ; R5 = Loop counter for short byte by byte start and finish loops ; ; Calculate adjusted longword loopcount R2 and bytes remaining R5 first. ; bicl3 #^c3, r3, r5 ; Calculate remainder for finishing off data beql 22$ ; If eql, already longword aligned, skip ahead subl3 r5, #4, r5 ; Else, calculate bytes to process up front subl3 r5, r2, r2 ; and subtract from original length 22$: bicl3 #^c3, r2, r5 ; Get byte remainder for processing at end divl3 #4, r2, r2 ; Calculate loop count for processing by ; longwords ; ; Attempt to align data for main loop on longword boundary by processing ; up to three bytes, a byte at a time, up front. Rather than using a loop ; counter, the string address is check for longword alignment each pass ; through the loop. ; 25$: bitl #3, r3 ; Is string longword aligned beql 30$ ; If so, no more pre-processing xorb2 (r3)+, r0 ; Move the next byte of data into R0 movzbl r0, r4 ; Get CRC table index for byte of data rotl #24, r0, r0 ; Rotate accumulator right 8 bits xorl2 (r1)[r4], r0 ; Include CRC table entry brb 25$ ; Branch to beginning of loop 30$: tstl r2 ; Do we need to enter loop? beql 42$ ; If eq, no 40$: xorl2 (r3)+, r0 ; Include next longword of data ; ; This calculation is repeated 4 times to process each byte in a longword. ; movzbl r0, r4 ; Get CRC table index for byte of data rotl #24, r0, r0 ; Rotate accumulator right 8 bits xorl2 (r1)[r4], r0 ; Include CRC table entry movzbl r0, r4 ; Get CRC table index for byte of data rotl #24, r0, r0 ; Rotate accumulator right 8 bits xorl2 (r1)[r4], r0 ; Include CRC table entry movzbl r0, r4 ; Get CRC table index for byte of data rotl #24, r0, r0 ; Rotate accumulator right 8 bits xorl2 (r1)[r4], r0 ; Include CRC table entry movzbl r0, r4 ; Get CRC table index for byte of data rotl #24, r0, r0 ; Rotate accumulator right 8 bits xorl2 (r1)[r4], r0 ; Include CRC table entry sobgtr r2, 40$ ; Loop over all longwords of data ; Process any remaining bytes of data. 42$: tstl r5 ; Any remaining bytes of data? beql 50$ ; If not, then done 45$: xorb2 (r3)+, r0 ; Move the next byte of data into R0 movzbl r0, r4 ; Get CRC table index for byte of data rotl #24, r0, r0 ; Rotate accumulator right 8 bits xorl2 (r1)[r4], r0 ; Include CRC table entry sobgtr r5, 45$ ; Loop over all remaining bytes of data 50$: ret ; Return to the calling program .disable local_block .subtitle VAX$FAST_CRC_TABLE - Generate 256 entry CRC shift tables ;+ ; Functional Description: ; ; This routine generates 256 entry tables for use by VAX$FAST_CRC. These ; 8-bit shift table are considerably faster than using the 4-bit tables ; from LIB$CRC, by 300% and more in some cases. ; ; The table index is XORed into the high byte of each table entry because ; VAX$FAST_CRC uses ROTL instead of ASHL instructions for speed. ; ; Input Parameters: ; ; 4(ap) => Initial polynomial ; 8(ap) => 256 entry table to be filled in ; for later use by VAX$FAST_CRC() ; ; Output Parameters: ; ; R0 = SS$_NORMAL ; R1 = undefined ; ;+ .enable local_block ; Offsets from AP for input paramaters INITIAL = 4 ; Initial polynomial value TABLE = 8 ; Output CRC table ENTRIES = 256 ; Size of table to generate .entry VAX$FAST_CRC_TABLE, ^m clrl r5 ; R5 = Index into CRC table movl TABLE(ap), r6 ; R6 => 256 entry CRC table 10$: movl r5, r2 ; R2 = Current table entry clrl r3 ; R3 = Bit counter (0..7) 20$: bicl3 #-2, r2, r4 ; R4 = R2<0> extzv #1, #31, r2, r2 ; R2 = R2<31:1> (right shift 1) tstl r4 ; If low bit was clear... beql 30$ ; ...don't add in the initial polymonial xorl2 @INITIAL(ap), r2 ; ...else add it in. 30$: incl r3 ; Any more bits in this entry? cmpl r3, #7 ; Branch if yes blequ 20$ ashl #24, r5, r1 ; R1<31:28> = index value xorl3 r2, r1, (r6)[r5] ; Add it, and the CRC to the table incl r5 ; Any more entries? cmpl r5, #ENTRIES ; Go round if yes. blssu 10$ movzwl #SS$_NORMAL, r0 ; Set return value ret .disable local_block .subtitle FAST_CRC_TABLE - 256 entry CRC shift tables .psect CRC_TABLES PAGE, CON, NOEXE, LCL, PIC, SHR, RD, NOWRT .align PAGE ; ; Modified CRC Table for CRC-16 polynomial: 0000A001 ; TABLE_CRC16: .long ^x00000000, ^x0100C0C1, ^x0200C181, ^x03000140 .long ^x0400C301, ^x050003C0, ^x06000280, ^x0700C241 .long ^x0800C601, ^x090006C0, ^x0A000780, ^x0B00C741 .long ^x0C000500, ^x0D00C5C1, ^x0E00C481, ^x0F000440 .long ^x1000CC01, ^x11000CC0, ^x12000D80, ^x1300CD41 .long ^x14000F00, ^x1500CFC1, ^x1600CE81, ^x17000E40 .long ^x18000A00, ^x1900CAC1, ^x1A00CB81, ^x1B000B40 .long ^x1C00C901, ^x1D0009C0, ^x1E000880, ^x1F00C841 .long ^x2000D801, ^x210018C0, ^x22001980, ^x2300D941 .long ^x24001B00, ^x2500DBC1, ^x2600DA81, ^x27001A40 .long ^x28001E00, ^x2900DEC1, ^x2A00DF81, ^x2B001F40 .long ^x2C00DD01, ^x2D001DC0, ^x2E001C80, ^x2F00DC41 .long ^x30001400, ^x3100D4C1, ^x3200D581, ^x33001540 .long ^x3400D701, ^x350017C0, ^x36001680, ^x3700D641 .long ^x3800D201, ^x390012C0, ^x3A001380, ^x3B00D341 .long ^x3C001100, ^x3D00D1C1, ^x3E00D081, ^x3F001040 .long ^x4000F001, ^x410030C0, ^x42003180, ^x4300F141 .long ^x44003300, ^x4500F3C1, ^x4600F281, ^x47003240 .long ^x48003600, ^x4900F6C1, ^x4A00F781, ^x4B003740 .long ^x4C00F501, ^x4D0035C0, ^x4E003480, ^x4F00F441 .long ^x50003C00, ^x5100FCC1, ^x5200FD81, ^x53003D40 .long ^x5400FF01, ^x55003FC0, ^x56003E80, ^x5700FE41 .long ^x5800FA01, ^x59003AC0, ^x5A003B80, ^x5B00FB41 .long ^x5C003900, ^x5D00F9C1, ^x5E00F881, ^x5F003840 .long ^x60002800, ^x6100E8C1, ^x6200E981, ^x63002940 .long ^x6400EB01, ^x65002BC0, ^x66002A80, ^x6700EA41 .long ^x6800EE01, ^x69002EC0, ^x6A002F80, ^x6B00EF41 .long ^x6C002D00, ^x6D00EDC1, ^x6E00EC81, ^x6F002C40 .long ^x7000E401, ^x710024C0, ^x72002580, ^x7300E541 .long ^x74002700, ^x7500E7C1, ^x7600E681, ^x77002640 .long ^x78002200, ^x7900E2C1, ^x7A00E381, ^x7B002340 .long ^x7C00E101, ^x7D0021C0, ^x7E002080, ^x7F00E041 .long ^x8000A001, ^x810060C0, ^x82006180, ^x8300A141 .long ^x84006300, ^x8500A3C1, ^x8600A281, ^x87006240 .long ^x88006600, ^x8900A6C1, ^x8A00A781, ^x8B006740 .long ^x8C00A501, ^x8D0065C0, ^x8E006480, ^x8F00A441 .long ^x90006C00, ^x9100ACC1, ^x9200AD81, ^x93006D40 .long ^x9400AF01, ^x95006FC0, ^x96006E80, ^x9700AE41 .long ^x9800AA01, ^x99006AC0, ^x9A006B80, ^x9B00AB41 .long ^x9C006900, ^x9D00A9C1, ^x9E00A881, ^x9F006840 .long ^xA0007800, ^xA100B8C1, ^xA200B981, ^xA3007940 .long ^xA400BB01, ^xA5007BC0, ^xA6007A80, ^xA700BA41 .long ^xA800BE01, ^xA9007EC0, ^xAA007F80, ^xAB00BF41 .long ^xAC007D00, ^xAD00BDC1, ^xAE00BC81, ^xAF007C40 .long ^xB000B401, ^xB10074C0, ^xB2007580, ^xB300B541 .long ^xB4007700, ^xB500B7C1, ^xB600B681, ^xB7007640 .long ^xB8007200, ^xB900B2C1, ^xBA00B381, ^xBB007340 .long ^xBC00B101, ^xBD0071C0, ^xBE007080, ^xBF00B041 .long ^xC0005000, ^xC10090C1, ^xC2009181, ^xC3005140 .long ^xC4009301, ^xC50053C0, ^xC6005280, ^xC7009241 .long ^xC8009601, ^xC90056C0, ^xCA005780, ^xCB009741 .long ^xCC005500, ^xCD0095C1, ^xCE009481, ^xCF005440 .long ^xD0009C01, ^xD1005CC0, ^xD2005D80, ^xD3009D41 .long ^xD4005F00, ^xD5009FC1, ^xD6009E81, ^xD7005E40 .long ^xD8005A00, ^xD9009AC1, ^xDA009B81, ^xDB005B40 .long ^xDC009901, ^xDD0059C0, ^xDE005880, ^xDF009841 .long ^xE0008801, ^xE10048C0, ^xE2004980, ^xE3008941 .long ^xE4004B00, ^xE5008BC1, ^xE6008A81, ^xE7004A40 .long ^xE8004E00, ^xE9008EC1, ^xEA008F81, ^xEB004F40 .long ^xEC008D01, ^xED004DC0, ^xEE004C80, ^xEF008C41 .long ^xF0004400, ^xF10084C1, ^xF2008581, ^xF3004540 .long ^xF4008701, ^xF50047C0, ^xF6004680, ^xF7008641 .long ^xF8008201, ^xF90042C0, ^xFA004380, ^xFB008341 .long ^xFC004100, ^xFD0081C1, ^xFE008081, ^xFF004040 ; ; Modified CRC Table for AUTODIN-II polynomial: EDB88320 ; TABLE_AUTODINII: .long ^x00000000, ^x76073096, ^xEC0E612C, ^x9A0951BA .long ^x036DC419, ^x756AF48F, ^xEF63A535, ^x996495A3 .long ^x06DB8832, ^x70DCB8A4, ^xEAD5E91E, ^x9CD2D988 .long ^x05B64C2B, ^x73B17CBD, ^xE9B82D07, ^x9FBF1D91 .long ^x0DB71064, ^x7BB020F2, ^xE1B97148, ^x97BE41DE .long ^x0EDAD47D, ^x78DDE4EB, ^xE2D4B551, ^x94D385C7 .long ^x0B6C9856, ^x7D6BA8C0, ^xE762F97A, ^x9165C9EC .long ^x08015C4F, ^x7E066CD9, ^xE40F3D63, ^x92080DF5 .long ^x1B6E20C8, ^x6D69105E, ^xF76041E4, ^x81677172 .long ^x1803E4D1, ^x6E04D447, ^xF40D85FD, ^x820AB56B .long ^x1DB5A8FA, ^x6BB2986C, ^xF1BBC9D6, ^x87BCF940 .long ^x1ED86CE3, ^x68DF5C75, ^xF2D60DCF, ^x84D13D59 .long ^x16D930AC, ^x60DE003A, ^xFAD75180, ^x8CD06116 .long ^x15B4F4B5, ^x63B3C423, ^xF9BA9599, ^x8FBDA50F .long ^x1002B89E, ^x66058808, ^xFC0CD9B2, ^x8A0BE924 .long ^x136F7C87, ^x65684C11, ^xFF611DAB, ^x89662D3D .long ^x36DC4190, ^x40DB7106, ^xDAD220BC, ^xACD5102A .long ^x35B18589, ^x43B6B51F, ^xD9BFE4A5, ^xAFB8D433 .long ^x3007C9A2, ^x4600F934, ^xDC09A88E, ^xAA0E9818 .long ^x336A0DBB, ^x456D3D2D, ^xDF646C97, ^xA9635C01 .long ^x3B6B51F4, ^x4D6C6162, ^xD76530D8, ^xA162004E .long ^x380695ED, ^x4E01A57B, ^xD408F4C1, ^xA20FC457 .long ^x3DB0D9C6, ^x4BB7E950, ^xD1BEB8EA, ^xA7B9887C .long ^x3EDD1DDF, ^x48DA2D49, ^xD2D37CF3, ^xA4D44C65 .long ^x2DB26158, ^x5BB551CE, ^xC1BC0074, ^xB7BB30E2 .long ^x2EDFA541, ^x58D895D7, ^xC2D1C46D, ^xB4D6F4FB .long ^x2B69E96A, ^x5D6ED9FC, ^xC7678846, ^xB160B8D0 .long ^x28042D73, ^x5E031DE5, ^xC40A4C5F, ^xB20D7CC9 .long ^x2005713C, ^x560241AA, ^xCC0B1010, ^xBA0C2086 .long ^x2368B525, ^x556F85B3, ^xCF66D409, ^xB961E49F .long ^x26DEF90E, ^x50D9C998, ^xCAD09822, ^xBCD7A8B4 .long ^x25B33D17, ^x53B40D81, ^xC9BD5C3B, ^xBFBA6CAD .long ^x6DB88320, ^x1BBFB3B6, ^x81B6E20C, ^xF7B1D29A .long ^x6ED54739, ^x18D277AF, ^x82DB2615, ^xF4DC1683 .long ^x6B630B12, ^x1D643B84, ^x876D6A3E, ^xF16A5AA8 .long ^x680ECF0B, ^x1E09FF9D, ^x8400AE27, ^xF2079EB1 .long ^x600F9344, ^x1608A3D2, ^x8C01F268, ^xFA06C2FE .long ^x6362575D, ^x156567CB, ^x8F6C3671, ^xF96B06E7 .long ^x66D41B76, ^x10D32BE0, ^x8ADA7A5A, ^xFCDD4ACC .long ^x65B9DF6F, ^x13BEEFF9, ^x89B7BE43, ^xFFB08ED5 .long ^x76D6A3E8, ^x00D1937E, ^x9AD8C2C4, ^xECDFF252 .long ^x75BB67F1, ^x03BC5767, ^x99B506DD, ^xEFB2364B .long ^x700D2BDA, ^x060A1B4C, ^x9C034AF6, ^xEA047A60 .long ^x7360EFC3, ^x0567DF55, ^x9F6E8EEF, ^xE969BE79 .long ^x7B61B38C, ^x0D66831A, ^x976FD2A0, ^xE168E236 .long ^x780C7795, ^x0E0B4703, ^x940216B9, ^xE205262F .long ^x7DBA3BBE, ^x0BBD0B28, ^x91B45A92, ^xE7B36A04 .long ^x7ED7FFA7, ^x08D0CF31, ^x92D99E8B, ^xE4DEAE1D .long ^x5B64C2B0, ^x2D63F226, ^xB76AA39C, ^xC16D930A .long ^x580906A9, ^x2E0E363F, ^xB4076785, ^xC2005713 .long ^x5DBF4A82, ^x2BB87A14, ^xB1B12BAE, ^xC7B61B38 .long ^x5ED28E9B, ^x28D5BE0D, ^xB2DCEFB7, ^xC4DBDF21 .long ^x56D3D2D4, ^x20D4E242, ^xBADDB3F8, ^xCCDA836E .long ^x55BE16CD, ^x23B9265B, ^xB9B077E1, ^xCFB74777 .long ^x50085AE6, ^x260F6A70, ^xBC063BCA, ^xCA010B5C .long ^x53659EFF, ^x2562AE69, ^xBF6BFFD3, ^xC96CCF45 .long ^x400AE278, ^x360DD2EE, ^xAC048354, ^xDA03B3C2 .long ^x43672661, ^x356016F7, ^xAF69474D, ^xD96E77DB .long ^x46D16A4A, ^x30D65ADC, ^xAADF0B66, ^xDCD83BF0 .long ^x45BCAE53, ^x33BB9EC5, ^xA9B2CF7F, ^xDFB5FFE9 .long ^x4DBDF21C, ^x3BBAC28A, ^xA1B39330, ^xD7B4A3A6 .long ^x4ED03605, ^x38D70693, ^xA2DE5729, ^xD4D967BF .long ^x4B667A2E, ^x3D614AB8, ^xA7681B02, ^xD16F2B94 .long ^x480BBE37, ^x3E0C8EA1, ^xA405DF1B, ^xD202EF8D ; ; Modified CRC Table for FAL polynomial: 0000E905 ; TABLE_FAL: .long ^x00000000, ^x0100F11B, ^x0200303D, ^x0300C126 .long ^x0400607A, ^x05009161, ^x06005047, ^x0700A15C .long ^x0800C0F4, ^x090031EF, ^x0A00F0C9, ^x0B0001D2 .long ^x0C00A08E, ^x0D005195, ^x0E0090B3, ^x0F0061A8 .long ^x100053E3, ^x1100A2F8, ^x120063DE, ^x130092C5 .long ^x14003399, ^x1500C282, ^x160003A4, ^x1700F2BF .long ^x18009317, ^x1900620C, ^x1A00A32A, ^x1B005231 .long ^x1C00F36D, ^x1D000276, ^x1E00C350, ^x1F00324B .long ^x2000A7C6, ^x210056DD, ^x220097FB, ^x230066E0 .long ^x2400C7BC, ^x250036A7, ^x2600F781, ^x2700069A .long ^x28006732, ^x29009629, ^x2A00570F, ^x2B00A614 .long ^x2C000748, ^x2D00F653, ^x2E003775, ^x2F00C66E .long ^x3000F425, ^x3100053E, ^x3200C418, ^x33003503 .long ^x3400945F, ^x35006544, ^x3600A462, ^x37005579 .long ^x380034D1, ^x3900C5CA, ^x3A0004EC, ^x3B00F5F7 .long ^x3C0054AB, ^x3D00A5B0, ^x3E006496, ^x3F00958D .long ^x40009D87, ^x41006C9C, ^x4200ADBA, ^x43005CA1 .long ^x4400FDFD, ^x45000CE6, ^x4600CDC0, ^x47003CDB .long ^x48005D73, ^x4900AC68, ^x4A006D4E, ^x4B009C55 .long ^x4C003D09, ^x4D00CC12, ^x4E000D34, ^x4F00FC2F .long ^x5000CE64, ^x51003F7F, ^x5200FE59, ^x53000F42 .long ^x5400AE1E, ^x55005F05, ^x56009E23, ^x57006F38 .long ^x58000E90, ^x5900FF8B, ^x5A003EAD, ^x5B00CFB6 .long ^x5C006EEA, ^x5D009FF1, ^x5E005ED7, ^x5F00AFCC .long ^x60003A41, ^x6100CB5A, ^x62000A7C, ^x6300FB67 .long ^x64005A3B, ^x6500AB20, ^x66006A06, ^x67009B1D .long ^x6800FAB5, ^x69000BAE, ^x6A00CA88, ^x6B003B93 .long ^x6C009ACF, ^x6D006BD4, ^x6E00AAF2, ^x6F005BE9 .long ^x700069A2, ^x710098B9, ^x7200599F, ^x7300A884 .long ^x740009D8, ^x7500F8C3, ^x760039E5, ^x7700C8FE .long ^x7800A956, ^x7900584D, ^x7A00996B, ^x7B006870 .long ^x7C00C92C, ^x7D003837, ^x7E00F911, ^x7F00080A .long ^x8000E905, ^x8100181E, ^x8200D938, ^x83002823 .long ^x8400897F, ^x85007864, ^x8600B942, ^x87004859 .long ^x880029F1, ^x8900D8EA, ^x8A0019CC, ^x8B00E8D7 .long ^x8C00498B, ^x8D00B890, ^x8E0079B6, ^x8F0088AD .long ^x9000BAE6, ^x91004BFD, ^x92008ADB, ^x93007BC0 .long ^x9400DA9C, ^x95002B87, ^x9600EAA1, ^x97001BBA .long ^x98007A12, ^x99008B09, ^x9A004A2F, ^x9B00BB34 .long ^x9C001A68, ^x9D00EB73, ^x9E002A55, ^x9F00DB4E .long ^xA0004EC3, ^xA100BFD8, ^xA2007EFE, ^xA3008FE5 .long ^xA4002EB9, ^xA500DFA2, ^xA6001E84, ^xA700EF9F .long ^xA8008E37, ^xA9007F2C, ^xAA00BE0A, ^xAB004F11 .long ^xAC00EE4D, ^xAD001F56, ^xAE00DE70, ^xAF002F6B .long ^xB0001D20, ^xB100EC3B, ^xB2002D1D, ^xB300DC06 .long ^xB4007D5A, ^xB5008C41, ^xB6004D67, ^xB700BC7C .long ^xB800DDD4, ^xB9002CCF, ^xBA00EDE9, ^xBB001CF2 .long ^xBC00BDAE, ^xBD004CB5, ^xBE008D93, ^xBF007C88 .long ^xC0007482, ^xC1008599, ^xC20044BF, ^xC300B5A4 .long ^xC40014F8, ^xC500E5E3, ^xC60024C5, ^xC700D5DE .long ^xC800B476, ^xC900456D, ^xCA00844B, ^xCB007550 .long ^xCC00D40C, ^xCD002517, ^xCE00E431, ^xCF00152A .long ^xD0002761, ^xD100D67A, ^xD200175C, ^xD300E647 .long ^xD400471B, ^xD500B600, ^xD6007726, ^xD700863D .long ^xD800E795, ^xD900168E, ^xDA00D7A8, ^xDB0026B3 .long ^xDC0087EF, ^xDD0076F4, ^xDE00B7D2, ^xDF0046C9 .long ^xE000D344, ^xE100225F, ^xE200E379, ^xE3001262 .long ^xE400B33E, ^xE5004225, ^xE6008303, ^xE7007218 .long ^xE80013B0, ^xE900E2AB, ^xEA00238D, ^xEB00D296 .long ^xEC0073CA, ^xED0082D1, ^xEE0043F7, ^xEF00B2EC .long ^xF00080A7, ^xF10071BC, ^xF200B09A, ^xF3004181 .long ^xF400E0DD, ^xF50011C6, ^xF600D0E0, ^xF70021FB .long ^xF8004053, ^xF900B148, ^xFA00706E, ^xFB008175 .long ^xFC002029, ^xFD00D132, ^xFE001014, ^xFF00E10F .end