* 68000 assembly language 16 bit integer FFT routine. * * Written by Timothy J. Martin * Argonne National Laboratory * Argonne, IL 60439 * (708)-972-8708 * CIS: 71541,3611 Delphi: TJMARTIN BITNET: MARTIN@ANLER * * This routine has been made callable from OS-9 "C". * Arguement passing convention is expained for possible application * to other environments. * * This routine has been made reentrant. * * Note that once the stack parameter space is allocated * (suba.l #stkspc,sp) the body of the program refers to * parameters on the stack. Thus the stack pointer should not * be disturbed in the body of the program without care in properly * referencing program parameters on the stack. * * the function call from "C" looks as follows: * isclf=ffti2(npt,inv,rary,iary) * npt is long int size of transform (length of rary, length of iary) * inv is long int 0 for forward transform, inv<>0 for inverse transform * rary is start address of short int real array * iary is start address of short int imag array * isclf is returned as long int, number of times data divided by two * * >>>>> if isclf is returned -1, npt is in error * >>>>> npt must be >= 8 and <= maxn and a power of two. * * For correct absolute magnitude, the output values must be scaled. * For forward transform results, each bin must be multiplied by: * (2 * (2**isclf))/n * For inverse transform results, each bin must be multiplied by: * (2**sclf)/2 * * It is possible to characterize the speed of a FFT by the following: * t = k * npt * (base2log(npt)) * e.g. for 1024 point transform, npt = 1024, base2log(npt) = 10 * On Mizar 7120 system (12.5 Mhz 68020, 0 wait state RAM) the 1024 * point transform executes in about 160 milliseconds. The k (speed * factor) for this implementation is thus about .000016 seconds. * Using k and the equation above, one can estimate the speed of other * size transforms as well. e.g 64 point transform in about 6 milliseconds * The k factor for this transform (.000016 sec) can be used for speed * comparisons with other FFT implementations. * * The frequency space (e.g after forward transform) is organized in * the following way in each of the resultant arrays. For a 16 point * transform, in relative frequency units: * 0 -1 -2 -3 -4 -5 -6 -7 A +7 +6 +5 +4 +3 +2 +1 * where 0 is the 'DC' bin and A is the 'aliasing frequency' bin. * Frequency space for other sized transforms are similarly arranged. * * nam fft ttl integer fft routine * maxn equ 2048 hmxn equ maxn/2 * psect ffti2,0,0,0,0,0 * * We will define MACRO's that create sin/cos lookup tables of the * needed resolution for the maxn selected. The table is available * at maximum resolution (maxn=8192) at label trgtbl. The size * of maxn at assembly time effects final module size. * IFEQ maxn-1024 tbl MACRO dc.w \1 ENDM ENDC IFEQ maxn-2048 tbl MACRO dc.w \1,\5 ENDM ENDC IFEQ maxn-4096 tbl MACRO dc.w \1,\3,\5,\7 ENDM ENDC IFEQ maxn-8192 tbl MACRO dc.w \1,\2,\3,\4,\5,\6,\7,\8 ENDM ENDC * * we are gonna use stack space for reentrant code. * set up parameter offsets as follows: lor equ 0 (log n) -2 tinc equ lor+4 trig table increment scol equ tinc+4 # of subgroups within column psg equ scol+4 pointer to next subgroup cnr equ psg+4 count loop (log n)-2 times sgorg equ cnr+4 origin of each subgroup psgt equ sgorg+4 pointer to top half subgroup psgb equ psgt+4 pointer to bottom half subgroup nsg equ psgb+4 # of subgroups per column prw equ nsg+4 power of w adi equ prw+4 address index, step by two's ndiv2 equ adi+4 scale factor (# of div by twos) npt equ ndiv2+4 npt saved here inv equ npt+4 inv saved here pnrep equ inv+4 real array address saved here pnimp equ pnrep+4 imag array address saved here stkspc equ pnimp+4 compute size of stack space needed * * with the arguement order specified, upon entry: * npt should be in d0 * inv should be in d1 * function return address is first 4 bytes on stack * rary address is second 4 bytes on stack 4(sp) * iary address is third 4 bytes on stack 8(sp) * >>>>note that this routine must return with sp at same value * as when entered (i.e. do not remove iary, rary addresses) * * in addition, in routine, a6 will contain overflow return address. * a0 and a1 will be destroyed. * ffti2: movem.l d1-d7/a0-a6,-(sp) save all but d0 (for func return) * we just saved 14 registers on stack. this is 14*4=56 bytes. Upon entry * to ffti2 0(sp) contained return address, 4(sp) contained real array * address, and 8(sp) contained imag array address. But now with stack * pushed more, we will offset stack references appropriately: movea.l 56+4(sp),a0 get real array address movea.l 56+8(sp),a1 get imag array address tst.l d0 npt too small? ble oopsr cmpi.l #maxn,d0 npt too big? bge oopsr move.l d0,d3 calc power of two clr.l d4 move #0,ccr clear flags calpw roxr.l #1,d3 bcs.s chkpw addq.l #1,d4 bra.s calpw chkpw bne oopsr error if npt not power of two subq.l #2,d4 adjust "r" for main loop ble oopsr error if npt < 8 * parameters look ok, set aside stack space now according to stkspc suba.l #stkspc,sp move.l a0,pnrep(sp) save real address move.l a1,pnimp(sp) save imag address move.l d0,npt(sp) save npt move.l d1,inv(sp) save inv move.l d4,lor(sp) put lor unto stack * now calculate increment for trig table clr.l d2 move.l #hmxn,d3 calin asr.l #1,d3 addq.l #1,d2 cmp.l d2,d4 bgt.s calin move.l d3,tinc(sp) clr.l ndiv2(sp) lpmain move.l #1,scol(sp) 1 subgroup in first column asl.l #1,d0 d0 contains npt, addresses go by 2's move.l d0,psg(sp) lea oflor1(pc),a6 set overflow return address move.l lor(sp),cnr(sp) lpnxtc move.l psg(sp),sgorg(sp) move.l psg(sp),d0 asr.l #1,d0 move.l d0,psg(sp) clr.l psgt(sp) move.l psg(sp),psgb(sp) move.l scol(sp),nsg(sp) lpnxts clr.l prw(sp) clr.l adi(sp) movea.l psgt(sp),a2 setup suggp half addresses movea.l a2,a4 adda.l pnrep(sp),a2 a2 points to first half real adda.l pnimp(sp),a4 a4 points to first half imag movea.l psgb(sp),a3 movea.l a3,a5 adda.l pnrep(sp),a3 a3 points to second half real adda.l pnimp(sp),a5 a5 points to second half imag lpsbgp oflor1 move.w (a2),d0 get first half real move.w (a4),d1 get first half imag move.w d0,d2 work in tmp registers because move.w d1,d3 don't alter data if ovflo add.w (a3),d2 bvs oflor add.w (a5),d3 bvs oflor sub.w (a3),d0 form sr-tr bvs oflor sub.w (a5),d1 form si-ti bvs oflor lea trgtbl(pc),a0 address of trig table into a0 movea.l a0,a1 cmpi.l #hmxn,prw(sp) look up sin and cos ble.s hpfha (2bytes = 1 word) suba.l prw(sp),a0 h > 512 move.w maxn(a0),d5 sine adda.l prw(sp),a1 move.w -hmxn(a1),d4 cosine neg.w d4 negate cosine bra.s hpfhb hpfha adda.l prw(sp),a0 h <= 512 move.w (a0),d5 sine suba.l prw(sp),a1 move.w hmxn(a1),d4 cosine hpfhb tst.l inv(sp) inverse transform? beq.s hpfhc neg.w d5 yes, negate sine hpfhc move.w d4,d6 muls.w d0,d6 asl.l #1,d6 move.w d5,d7 muls.w d1,d7 asl.l #1,d7 add.l d7,d6 bvs oflor move.w d4,d7 muls.w d1,d7 asl.l #1,d7 muls.w d0,d5 asl.l #1,d5 sub.l d5,d7 bvs oflor move.w d3,(a4)+ move.w d2,(a2)+ swap d6 actually want upper 16 bits move.w d6,(a3)+ swap d7 actually want upper 16 bits move.w d7,(a5)+ move.l prw(sp),d0 add.l tinc(sp),d0 move.l d0,prw(sp) addq.l #2,adi(sp) move.l adi(sp),d0 cmp.l psg(sp),d0 bmi lpsbgp move.l psgt(sp),d0 add.l sgorg(sp),d0 init for next subgroup move.l d0,psgt(sp) move.l psgb(sp),d0 add.l sgorg(sp),d0 move.l d0,psgb(sp) subq.l #1,nsg(sp) bgt lpnxts move.l scol(sp),d0 asl.l #1,d0 subgroups is double for next column move.l d0,scol(sp) move.l tinc(sp),d0 asl.l #1,d0 loc in trig table is double too move.l d0,tinc(sp) subq.l #1,cnr(sp) bgt lpnxtc * done with (log n)-2 columns, now do two special loops * first special loop move.l npt(sp),d6 move.l d6,d7 asr.l #1,d7 d7 = n/2 asr.l #2,d6 d6 = n/4 movea.l pnrep(sp),a2 movea.l pnimp(sp),a3 lpspl1 lea oflor2(pc),a6 oflor2 move.w (a2),d0 move.w (a3),d1 move.w d0,d4 move.w d1,d5 add.w 4(a2),d0 real part of first half bvs oflor add.w 4(a3),d1 imag part of first half bvs oflor sub.w 4(a2),d4 1st point in 2nd half of sbgp bvs oflor sub.w 4(a3),d5 bvs oflor move.w d0,(a2)+ store the points move.w d1,(a3)+ move.w d4,2(a2) move.w d5,2(a3) lea oflor4(pc),a6 oflor4 move.w (a2),d0 do 2nd points in subgroup move.w (a3),d1 move.w d0,d4 move.w d1,d5 add.w 4(a2),d0 bvs oflor add.w 4(a3),d1 bvs oflor sub.w 4(a3),d5 bvs oflor neg.w d4 add.w 4(a2),d4 bvs oflor tst.l inv(sp) beq.s fwdsk1 neg.w d5 neg.w d4 fwdsk1 move.w d0,(a2)+ store the points move.w d1,(a3)+ cmpm.w (a2)+,(a3)+ increment pointers move.w d5,(a2)+ move.w d4,(a3)+ subq.l #1,d6 bgt.s lpspl1 movea.l pnrep(sp),a2 movea.l pnimp(sp),a3 lea oflor3(pc),a6 set overflow return address lpspl2 oflor3 move.w (a2),d0 move.w (a3),d1 move.w d0,d4 move.w d1,d5 add.w 2(a2),d0 bvs.s oflor add.w 2(a3),d1 bvs.s oflor sub.w 2(a2),d4 bvs.s oflor sub.w 2(a3),d5 bvs.s oflor move.w d0,(a2)+ move.w d1,(a3)+ move.w d4,(a2)+ move.w d5,(a3)+ subq.l #1,d7 bne.s lpspl2 * end of second special loop * now do bit reversal (array reshuffle) moveq.l #1,d2 move.l npt(sp),d5 movea.l pnrep(sp),a0 movea.l pnimp(sp),a1 birevs move.l d2,d4 add.l d5,d4 this will clear x flag for below too clr.l d3 asr.l #1,d4 birev1 roxl.l #1,d3 asr.l #1,d4 bne.s birev1 cmp.l d2,d3 ble.s revnot asl.l #1,d2 asl.l #1,d3 move.w (a0,d2),d4 swap real values move.w (a0,d3),(a0,d2) move.w d4,(a0,d3) move.w (a1,d2),d4 swap imag values move.w (a1,d3),(a1,d2) move.w d4,(a1,d3) asr.l #1,d2 revnot addq.l #1,d2 cmp.l d2,d5 bgt.s birevs * set up to return to caller move.l ndiv2(sp),d0 set function return isclf adda.l #stkspc,sp remove parameter stack space fftret movem.l (sp)+,d1-d7/a0-a6 restore registers rts * function error return if npt is undesireable size oopsr moveq.l #-1,d0 bra.s fftret * * overflow routine, will divide data by two and return to address * pointed by a6 * As currently written, the registers a0,a1,d0,d1 can be used in oflor * i.e. they are restored properly before use after branch to oflor * The need for these registers exists because oflor refers to parameters * on the stack, so the stack pointer should not be disturbed in oflor * oflor move.l npt(sp),d0 asr.l #2,d0 do 4 complex points at a time movea.l pnrep(sp),a0 movea.l pnimp(sp),a1 oflorp REPT 4 4 at a time reduces loop overhead asr (a0)+ asr (a1)+ ENDR subq.l #1,d0 bne.s oflorp addq.l #1,ndiv2(sp) jmp (a6) jmp to address specified by a6 * * trgtbl tbl 0,25,50,75,101,126,151,176 tbl 201,226,251,276,302,327,352,377 tbl 402,427,452,478,503,528,553,578 tbl 603,628,653,679,704,729,754,779 tbl 804,829,854,880,905,930,955,980 tbl 1005,1030,1055,1081,1106,1131,1156,1181 tbl 1206,1231,1256,1281,1307,1332,1357,1382 tbl 1407,1432,1457,1482,1507,1533,1558,1583 tbl 1608,1633,1658,1683,1708,1733,1758,1784 tbl 1809,1834,1859,1884,1909,1934,1959,1984 tbl 2009,2034,2060,2085,2110,2135,2160,2185 tbl 2210,2235,2260,2285,2310,2335,2360,2385 tbl 2411,2436,2461,2486,2511,2536,2561,2586 tbl 2611,2636,2661,2686,2711,2736,2761,2786 tbl 2811,2836,2861,2887,2912,2937,2962,2987 tbl 3012,3037,3062,3087,3112,3137,3162,3187 tbl 3212,3237,3262,3287,3312,3337,3362,3387 tbl 3412,3437,3462,3487,3512,3537,3562,3587 tbl 3612,3637,3662,3687,3712,3737,3762,3787 tbl 3812,3836,3861,3886,3911,3936,3961,3986 tbl 4011,4036,4061,4086,4111,4136,4161,4186 tbl 4211,4236,4260,4285,4310,4335,4360,4385 tbl 4410,4435,4460,4485,4510,4534,4559,4584 tbl 4609,4634,4659,4684,4709,4733,4758,4783 tbl 4808,4833,4858,4883,4907,4932,4957,4982 tbl 5007,5032,5057,5081,5106,5131,5156,5181 tbl 5205,5230,5255,5280,5305,5329,5354,5379 tbl 5404,5429,5453,5478,5503,5528,5553,5577 tbl 5602,5627,5652,5676,5701,5726,5751,5775 tbl 5800,5825,5850,5874,5899,5924,5948,5973 tbl 5998,6023,6047,6072,6097,6121,6146,6171 tbl 6195,6220,6245,6269,6294,6319,6343,6368 tbl 6393,6417,6442,6467,6491,6516,6541,6565 tbl 6590,6614,6639,6664,6688,6713,6737,6762 tbl 6787,6811,6836,6860,6885,6910,6934,6959 tbl 6983,7008,7032,7057,7081,7106,7130,7155 tbl 7180,7204,7229,7253,7278,7302,7327,7351 tbl 7376,7400,7425,7449,7473,7498,7522,7547 tbl 7571,7596,7620,7645,7669,7694,7718,7742 tbl 7767,7791,7816,7840,7864,7889,7913,7938 tbl 7962,7986,8011,8035,8059,8084,8108,8133 tbl 8157,8181,8206,8230,8254,8279,8303,8327 tbl 8351,8376,8400,8424,8449,8473,8497,8521 tbl 8546,8570,8594,8618,8643,8667,8691,8715 tbl 8740,8764,8788,8812,8836,8861,8885,8909 tbl 8933,8957,8982,9006,9030,9054,9078,9102 tbl 9127,9151,9175,9199,9223,9247,9271,9295 tbl 9319,9344,9368,9392,9416,9440,9464,9488 tbl 9512,9536,9560,9584,9608,9632,9656,9680 tbl 9704,9728,9752,9776,9800,9824,9848,9872 tbl 9896,9920,9944,9968,9992,10016,10040,10064 tbl 10088,10112,10135,10159,10183,10207,10231,10255 tbl 10279,10303,10326,10350,10374,10398,10422,10446 tbl 10469,10493,10517,10541,10565,10588,10612,10636 tbl 10660,10684,10707,10731,10755,10779,10802,10826 tbl 10850,10873,10897,10921,10945,10968,10992,11016 tbl 11039,11063,11087,11110,11134,11157,11181,11205 tbl 11228,11252,11276,11299,11323,11346,11370,11393 tbl 11417,11441,11464,11488,11511,11535,11558,11582 tbl 11605,11629,11652,11676,11699,11723,11746,11770 tbl 11793,11816,11840,11863,11887,11910,11934,11957 tbl 11980,12004,12027,12051,12074,12097,12121,12144 tbl 12167,12191,12214,12237,12261,12284,12307,12330 tbl 12354,12377,12400,12424,12447,12470,12493,12517 tbl 12540,12563,12586,12609,12633,12656,12679,12702 tbl 12725,12748,12772,12795,12818,12841,12864,12887 tbl 12910,12933,12957,12980,13003,13026,13049,13072 tbl 13095,13118,13141,13164,13187,13210,13233,13256 tbl 13279,13302,13325,13348,13371,13394,13417,13440 tbl 13463,13485,13508,13531,13554,13577,13600,13623 tbl 13646,13668,13691,13714,13737,13760,13783,13805 tbl 13828,13851,13874,13896,13919,13942,13965,13987 tbl 14010,14033,14056,14078,14101,14124,14146,14169 tbl 14192,14214,14237,14260,14282,14305,14327,14350 tbl 14373,14395,14418,14440,14463,14485,14508,14530 tbl 14553,14576,14598,14621,14643,14665,14688,14710 tbl 14733,14755,14778,14800,14823,14845,14867,14890 tbl 14912,14935,14957,14979,15002,15024,15046,15069 tbl 15091,15113,15136,15158,15180,15202,15225,15247 tbl 15269,15291,15314,15336,15358,15380,15402,15425 tbl 15447,15469,15491,15513,15535,15557,15580,15602 tbl 15624,15646,15668,15690,15712,15734,15756,15778 tbl 15800,15822,15844,15866,15888,15910,15932,15954 tbl 15976,15998,16020,16042,16064,16086,16108,16129 tbl 16151,16173,16195,16217,16239,16261,16282,16304 tbl 16326,16348,16369,16391,16413,16435,16456,16478 tbl 16500,16522,16543,16565,16587,16608,16630,16652 tbl 16673,16695,16717,16738,16760,16781,16803,16825 tbl 16846,16868,16889,16911,16932,16954,16975,16997 tbl 17018,17040,17061,17083,17104,17126,17147,17168 tbl 17190,17211,17233,17254,17275,17297,17318,17339 tbl 17361,17382,17403,17425,17446,17467,17488,17510 tbl 17531,17552,17573,17594,17616,17637,17658,17679 tbl 17700,17721,17743,17764,17785,17806,17827,17848 tbl 17869,17890,17911,17932,17953,17974,17995,18016 tbl 18037,18058,18079,18100,18121,18142,18163,18184 tbl 18205,18226,18247,18268,18288,18309,18330,18351 tbl 18372,18393,18413,18434,18455,18476,18496,18517 tbl 18538,18559,18579,18600,18621,18641,18662,18683 tbl 18703,18724,18745,18765,18786,18806,18827,18848 tbl 18868,18889,18909,18930,18950,18971,18991,19012 tbl 19032,19053,19073,19093,19114,19134,19155,19175 tbl 19195,19216,19236,19256,19277,19297,19317,19338 tbl 19358,19378,19399,19419,19439,19459,19479,19500 tbl 19520,19540,19560,19580,19601,19621,19641,19661 tbl 19681,19701,19721,19741,19761,19781,19801,19821 tbl 19841,19861,19881,19901,19921,19941,19961,19981 tbl 20001,20021,20041,20061,20081,20100,20120,20140 tbl 20160,20180,20200,20219,20239,20259,20279,20298 tbl 20318,20338,20357,20377,20397,20416,20436,20456 tbl 20475,20495,20515,20534,20554,20573,20593,20612 tbl 20632,20652,20671,20691,20710,20729,20749,20768 tbl 20788,20807,20827,20846,20865,20885,20904,20923 tbl 20943,20962,20981,21001,21020,21039,21059,21078 tbl 21097,21116,21136,21155,21174,21193,21212,21231 tbl 21251,21270,21289,21308,21327,21346,21365,21384 tbl 21403,21422,21441,21460,21479,21498,21517,21536 tbl 21555,21574,21593,21612,21631,21649,21668,21687 tbl 21706,21725,21744,21762,21781,21800,21819,21838 tbl 21856,21875,21894,21912,21931,21950,21968,21987 tbl 22006,22024,22043,22061,22080,22099,22117,22136 tbl 22154,22173,22191,22210,22228,22247,22265,22284 tbl 22302,22320,22339,22357,22375,22394,22412,22431 tbl 22449,22467,22485,22504,22522,22540,22558,22577 tbl 22595,22613,22631,22649,22668,22686,22704,22722 tbl 22740,22758,22776,22794,22812,22830,22848,22866 tbl 22884,22902,22920,22938,22956,22974,22992,23010 tbl 23028,23046,23064,23081,23099,23117,23135,23153 tbl 23170,23188,23206,23224,23241,23259,23277,23295 tbl 23312,23330,23348,23365,23383,23400,23418,23436 tbl 23453,23471,23488,23506,23523,23541,23558,23576 tbl 23593,23610,23628,23645,23663,23680,23697,23715 tbl 23732,23749,23767,23784,23801,23819,23836,23853 tbl 23870,23888,23905,23922,23939,23956,23973,23991 tbl 24008,24025,24042,24059,24076,24093,24110,24127 tbl 24144,24161,24178,24195,24212,24229,24246,24263 tbl 24279,24296,24313,24330,24347,24364,24380,24397 tbl 24414,24431,24448,24464,24481,24498,24514,24531 tbl 24548,24564,24581,24598,24614,24631,24647,24664 tbl 24680,24697,24713,24730,24746,24763,24779,24796 tbl 24812,24829,24845,24861,24878,24894,24910,24927 tbl 24943,24959,24976,24992,25008,25024,25041,25057 tbl 25073,25089,25105,25121,25138,25154,25170,25186 tbl 25202,25218,25234,25250,25266,25282,25298,25314 tbl 25330,25346,25362,25378,25394,25410,25425,25441 tbl 25457,25473,25489,25504,25520,25536,25552,25567 tbl 25583,25599,25615,25630,25646,25662,25677,25693 tbl 25708,25724,25739,25755,25771,25786,25802,25817 tbl 25833,25848,25863,25879,25894,25910,25925,25940 tbl 25956,25971,25986,26002,26017,26032,26048,26063 tbl 26078,26093,26108,26124,26139,26154,26169,26184 tbl 26199,26214,26229,26244,26259,26275,26290,26305 tbl 26320,26334,26349,26364,26379,26394,26409,26424 tbl 26439,26454,26468,26483,26498,26513,26528,26542 tbl 26557,26572,26586,26601,26616,26630,26645,26660 tbl 26674,26689,26704,26718,26733,26747,26762,26776 tbl 26791,26805,26820,26834,26848,26863,26877,26892 tbl 26906,26920,26935,26949,26963,26977,26992,27006 tbl 27020,27034,27049,27063,27077,27091,27105,27119 tbl 27133,27147,27162,27176,27190,27204,27218,27232 tbl 27246,27260,27273,27287,27301,27315,27329,27343 tbl 27357,27371,27384,27398,27412,27426,27440,27453 tbl 27467,27481,27494,27508,27522,27535,27549,27562 tbl 27576,27590,27603,27617,27630,27644,27657,27671 tbl 27684,27698,27711,27724,27738,27751,27765,27778 tbl 27791,27805,27818,27831,27844,27858,27871,27884 tbl 27897,27910,27924,27937,27950,27963,27976,27989 tbl 28002,28015,28028,28041,28054,28067,28080,28093 tbl 28106,28119,28132,28145,28158,28170,28183,28196 tbl 28209,28222,28234,28247,28260,28273,28285,28298 tbl 28311,28323,28336,28349,28361,28374,28386,28399 tbl 28411,28424,28436,28449,28461,28474,28486,28499 tbl 28511,28523,28536,28548,28560,28573,28585,28597 tbl 28610,28622,28634,28646,28658,28671,28683,28695 tbl 28707,28719,28731,28743,28755,28767,28779,28791 tbl 28803,28815,28827,28839,28851,28863,28875,28887 tbl 28899,28911,28922,28934,28946,28958,28970,28981 tbl 28993,29005,29016,29028,29040,29051,29063,29075 tbl 29086,29098,29109,29121,29132,29144,29155,29167 tbl 29178,29190,29201,29212,29224,29235,29247,29258 tbl 29269,29280,29292,29303,29314,29325,29337,29348 tbl 29359,29370,29381,29392,29404,29415,29426,29437 tbl 29448,29459,29470,29481,29492,29503,29514,29525 tbl 29535,29546,29557,29568,29579,29590,29600,29611 tbl 29622,29633,29643,29654,29665,29675,29686,29697 tbl 29707,29718,29729,29739,29750,29760,29771,29781 tbl 29792,29802,29813,29823,29833,29844,29854,29864 tbl 29875,29885,29895,29906,29916,29926,29936,29947 tbl 29957,29967,29977,29987,29997,30008,30018,30028 tbl 30038,30048,30058,30068,30078,30088,30098,30108 tbl 30118,30127,30137,30147,30157,30167,30177,30186 tbl 30196,30206,30216,30225,30235,30245,30254,30264 tbl 30274,30283,30293,30302,30312,30322,30331,30341 tbl 30350,30360,30369,30378,30388,30397,30407,30416 tbl 30425,30435,30444,30453,30462,30472,30481,30490 tbl 30499,30509,30518,30527,30536,30545,30554,30563 tbl 30572,30581,30590,30599,30608,30617,30626,30635 tbl 30644,30653,30662,30671,30680,30688,30697,30706 tbl 30715,30723,30732,30741,30750,30758,30767,30776 tbl 30784,30793,30801,30810,30819,30827,30836,30844 tbl 30853,30861,30869,30878,30886,30895,30903,30911 tbl 30920,30928,30936,30945,30953,30961,30969,30977 tbl 30986,30994,31002,31010,31018,31026,31034,31042 tbl 31050,31059,31067,31074,31082,31090,31098,31106 tbl 31114,31122,31130,31138,31146,31153,31161,31169 tbl 31177,31184,31192,31200,31207,31215,31223,31230 tbl 31238,31246,31253,31261,31268,31276,31283,31291 tbl 31298,31305,31313,31320,31328,31335,31342,31350 tbl 31357,31364,31372,31379,31386,31393,31400,31408 tbl 31415,31422,31429,31436,31443,31450,31457,31464 tbl 31471,31478,31485,31492,31499,31506,31513,31520 tbl 31527,31534,31540,31547,31554,31561,31568,31574 tbl 31581,31588,31594,31601,31608,31614,31621,31627 tbl 31634,31641,31647,31654,31660,31667,31673,31679 tbl 31686,31692,31699,31705,31711,31718,31724,31730 tbl 31737,31743,31749,31755,31761,31768,31774,31780 tbl 31786,31792,31798,31804,31810,31816,31822,31828 tbl 31834,31840,31846,31852,31858,31864,31870,31875 tbl 31881,31887,31893,31899,31904,31910,31916,31921 tbl 31927,31933,31938,31944,31950,31955,31961,31966 tbl 31972,31977,31983,31988,31994,31999,32005,32010 tbl 32015,32021,32026,32031,32037,32042,32047,32052 tbl 32058,32063,32068,32073,32078,32083,32088,32093 tbl 32099,32104,32109,32114,32119,32124,32129,32133 tbl 32138,32143,32148,32153,32158,32163,32167,32172 tbl 32177,32182,32186,32191,32196,32201,32205,32210 tbl 32214,32219,32224,32228,32233,32237,32242,32246 tbl 32251,32255,32259,32264,32268,32273,32277,32281 tbl 32286,32290,32294,32298,32303,32307,32311,32315 tbl 32319,32323,32328,32332,32336,32340,32344,32348 tbl 32352,32356,32360,32364,32368,32372,32376,32379 tbl 32383,32387,32391,32395,32398,32402,32406,32410 tbl 32413,32417,32421,32424,32428,32432,32435,32439 tbl 32442,32446,32449,32453,32456,32460,32463,32467 tbl 32470,32473,32477,32480,32483,32487,32490,32493 tbl 32496,32500,32503,32506,32509,32512,32515,32518 tbl 32522,32525,32528,32531,32534,32537,32540,32543 tbl 32546,32548,32551,32554,32557,32560,32563,32566 tbl 32568,32571,32574,32577,32579,32582,32585,32587 tbl 32590,32592,32595,32598,32600,32603,32605,32608 tbl 32610,32613,32615,32618,32620,32622,32625,32627 tbl 32629,32632,32634,32636,32638,32641,32643,32645 tbl 32647,32649,32651,32654,32656,32658,32660,32662 tbl 32664,32666,32668,32670,32672,32674,32675,32677 tbl 32679,32681,32683,32685,32686,32688,32690,32692 tbl 32693,32695,32697,32698,32700,32702,32703,32705 tbl 32706,32708,32709,32711,32712,32714,32715,32717 tbl 32718,32719,32721,32722,32723,32725,32726,32727 tbl 32729,32730,32731,32732,32733,32734,32736,32737 tbl 32738,32739,32740,32741,32742,32743,32744,32745 tbl 32746,32747,32748,32748,32749,32750,32751,32752 tbl 32753,32753,32754,32755,32756,32756,32757,32758 tbl 32758,32759,32759,32760,32760,32761,32761,32762 tbl 32762,32763,32763,32764,32764,32765,32765,32765 tbl 32766,32766,32766,32766,32767,32767,32767,32767 tbl 32767,32767,32767,32767,32767,32767,32767,32767 dc.w 32767 * ends (68020) Super: