From c663e4263d99d9332d81ac58d5c1892d4d9ec847 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 6 Aug 2008 09:56:06 +0000 Subject: [PATCH] added SID instrument plugin by Attila Herman and Csaba Hruska git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1436 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 59 ++ plugins/CMakeLists.txt | 1 + plugins/sid/3off.png | Bin 0 -> 539 bytes plugins/sid/3offred.png | Bin 0 -> 592 bytes plugins/sid/6581.png | Bin 0 -> 593 bytes plugins/sid/6581red.png | Bin 0 -> 677 bytes plugins/sid/8580.png | Bin 0 -> 609 bytes plugins/sid/8580red.png | Bin 0 -> 683 bytes plugins/sid/CMakeLists.txt | 5 + plugins/sid/artwork.png | Bin 0 -> 88547 bytes plugins/sid/bp.png | Bin 0 -> 354 bytes plugins/sid/bpred.png | Bin 0 -> 381 bytes plugins/sid/envelope.cc | 227 +++++++ plugins/sid/envelope.h | 305 ++++++++++ plugins/sid/extfilt.cc | 79 +++ plugins/sid/extfilt.h | 164 ++++++ plugins/sid/filter.cc | 305 ++++++++++ plugins/sid/filter.h | 531 +++++++++++++++++ plugins/sid/filter.png | Bin 0 -> 367 bytes plugins/sid/filterred.png | Bin 0 -> 407 bytes plugins/sid/hp.png | Bin 0 -> 380 bytes plugins/sid/hpred.png | Bin 0 -> 420 bytes plugins/sid/logo.png | Bin 0 -> 1247 bytes plugins/sid/lp.png | Bin 0 -> 339 bytes plugins/sid/lpred.png | Bin 0 -> 363 bytes plugins/sid/noise.png | Bin 0 -> 450 bytes plugins/sid/noisered.png | Bin 0 -> 475 bytes plugins/sid/pot.cc | 26 + plugins/sid/pot.h | 31 + plugins/sid/pulse.png | Bin 0 -> 457 bytes plugins/sid/pulsered.png | Bin 0 -> 457 bytes plugins/sid/ring.png | Bin 0 -> 450 bytes plugins/sid/ringred.png | Bin 0 -> 436 bytes plugins/sid/saw.png | Bin 0 -> 505 bytes plugins/sid/sawred.png | Bin 0 -> 508 bytes plugins/sid/sid.cc | 1007 ++++++++++++++++++++++++++++++++ plugins/sid/sid.h | 146 +++++ plugins/sid/sid_instrument.cpp | 779 ++++++++++++++++++++++++ plugins/sid/sid_instrument.h | 198 +++++++ plugins/sid/siddefs.h | 69 +++ plugins/sid/spline.h | 272 +++++++++ plugins/sid/sync.png | Bin 0 -> 478 bytes plugins/sid/syncred.png | Bin 0 -> 560 bytes plugins/sid/triangle.png | Bin 0 -> 510 bytes plugins/sid/trianglered.png | Bin 0 -> 510 bytes plugins/sid/version.cc | 21 + plugins/sid/voice.cc | 132 +++++ plugins/sid/voice.h | 77 +++ plugins/sid/wave.cc | 144 +++++ plugins/sid/wave.h | 503 ++++++++++++++++ plugins/sid/wave6581_PST.cc | 536 +++++++++++++++++ plugins/sid/wave6581_PS_.cc | 536 +++++++++++++++++ plugins/sid/wave6581_P_T.cc | 536 +++++++++++++++++ plugins/sid/wave6581__ST.cc | 536 +++++++++++++++++ plugins/sid/wave8580_PST.cc | 536 +++++++++++++++++ plugins/sid/wave8580_PS_.cc | 536 +++++++++++++++++ plugins/sid/wave8580_P_T.cc | 536 +++++++++++++++++ plugins/sid/wave8580__ST.cc | 536 +++++++++++++++++ 58 files changed, 9369 insertions(+) create mode 100644 plugins/sid/3off.png create mode 100644 plugins/sid/3offred.png create mode 100644 plugins/sid/6581.png create mode 100644 plugins/sid/6581red.png create mode 100644 plugins/sid/8580.png create mode 100644 plugins/sid/8580red.png create mode 100644 plugins/sid/CMakeLists.txt create mode 100644 plugins/sid/artwork.png create mode 100644 plugins/sid/bp.png create mode 100644 plugins/sid/bpred.png create mode 100644 plugins/sid/envelope.cc create mode 100644 plugins/sid/envelope.h create mode 100644 plugins/sid/extfilt.cc create mode 100644 plugins/sid/extfilt.h create mode 100644 plugins/sid/filter.cc create mode 100644 plugins/sid/filter.h create mode 100644 plugins/sid/filter.png create mode 100644 plugins/sid/filterred.png create mode 100644 plugins/sid/hp.png create mode 100644 plugins/sid/hpred.png create mode 100644 plugins/sid/logo.png create mode 100644 plugins/sid/lp.png create mode 100644 plugins/sid/lpred.png create mode 100644 plugins/sid/noise.png create mode 100644 plugins/sid/noisered.png create mode 100644 plugins/sid/pot.cc create mode 100644 plugins/sid/pot.h create mode 100644 plugins/sid/pulse.png create mode 100644 plugins/sid/pulsered.png create mode 100644 plugins/sid/ring.png create mode 100644 plugins/sid/ringred.png create mode 100644 plugins/sid/saw.png create mode 100644 plugins/sid/sawred.png create mode 100644 plugins/sid/sid.cc create mode 100644 plugins/sid/sid.h create mode 100644 plugins/sid/sid_instrument.cpp create mode 100644 plugins/sid/sid_instrument.h create mode 100644 plugins/sid/siddefs.h create mode 100644 plugins/sid/spline.h create mode 100644 plugins/sid/sync.png create mode 100644 plugins/sid/syncred.png create mode 100644 plugins/sid/triangle.png create mode 100644 plugins/sid/trianglered.png create mode 100644 plugins/sid/version.cc create mode 100644 plugins/sid/voice.cc create mode 100644 plugins/sid/voice.h create mode 100644 plugins/sid/wave.cc create mode 100644 plugins/sid/wave.h create mode 100644 plugins/sid/wave6581_PST.cc create mode 100644 plugins/sid/wave6581_PS_.cc create mode 100644 plugins/sid/wave6581_P_T.cc create mode 100644 plugins/sid/wave6581__ST.cc create mode 100644 plugins/sid/wave8580_PST.cc create mode 100644 plugins/sid/wave8580_PS_.cc create mode 100644 plugins/sid/wave8580_P_T.cc create mode 100644 plugins/sid/wave8580__ST.cc diff --git a/ChangeLog b/ChangeLog index 86169a008..cb4d19aa5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,64 @@ 2008-08-05 Tobias Doerffel + * plugins/sid/wave8580__ST.cc: + * plugins/sid/spline.h: + * plugins/sid/3off.png: + * plugins/sid/8580red.png: + * plugins/sid/trianglered.png: + * plugins/sid/logo.png: + * plugins/sid/bp.png: + * plugins/sid/6581.png: + * plugins/sid/wave.cc: + * plugins/sid/8580.png: + * plugins/sid/pot.h: + * plugins/sid/syncred.png: + * plugins/sid/hp.png: + * plugins/sid/sid_instrument.h: + * plugins/sid/lp.png: + * plugins/sid/sync.png: + * plugins/sid/noise.png: + * plugins/sid/wave8580_PST.cc: + * plugins/sid/envelope.cc: + * plugins/sid/extfilt.cc: + * plugins/sid/envelope.h: + * plugins/sid/extfilt.h: + * plugins/sid/pulsered.png: + * plugins/sid/siddefs.h: + * plugins/sid/filter.png: + * plugins/sid/sawred.png: + * plugins/sid/wave6581_PS_.cc: + * plugins/sid/3offred.png: + * plugins/sid/pulse.png: + * plugins/sid/artwork.png: + * plugins/sid/saw.png: + * plugins/sid/CMakeLists.txt: + * plugins/sid/wave8580_P_T.cc: + * plugins/sid/wave6581__ST.cc: + * plugins/sid/bpred.png: + * plugins/sid/6581red.png: + * plugins/sid/ring.png: + * plugins/sid/hpred.png: + * plugins/sid/pot.cc: + * plugins/sid/sid_instrument.cpp: + * plugins/sid/triangle.png: + * plugins/sid/wave.h: + * plugins/sid/voice.cc: + * plugins/sid/lpred.png: + * plugins/sid/noisered.png: + * plugins/sid/voice.h: + * plugins/sid/wave6581_PST.cc: + * plugins/sid/sid.cc: + * plugins/sid/filterred.png: + * plugins/sid/sid.h: + * plugins/sid/version.cc: + * plugins/sid/filter.cc: + * plugins/sid/filter.h: + * plugins/sid/wave6581_P_T.cc: + * plugins/sid/wave8580_PS_.cc: + * plugins/sid/ringred.png: + * plugins/CMakeLists.txt: + added SID instrument plugin by Attila Herman and Csaba Hruska + * src/gui/widgets/automatable_button.cpp: show context-menu of button-group if a button is part of it diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 3e7d9f916..0e9d622ed 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -13,6 +13,7 @@ ADD_SUBDIRECTORY(organic) ADD_SUBDIRECTORY(patman) ADD_SUBDIRECTORY(peak_controller_effect) ADD_SUBDIRECTORY(sf2_player) +ADD_SUBDIRECTORY(sid) ADD_SUBDIRECTORY(spectrum_analyzer) ADD_SUBDIRECTORY(stereo_enhancer) ADD_SUBDIRECTORY(stereo_matrix) diff --git a/plugins/sid/3off.png b/plugins/sid/3off.png new file mode 100644 index 0000000000000000000000000000000000000000..da0e284e073e494665d93cf9c720ee00f653b3e7 GIT binary patch literal 539 zcmV+$0_6RPP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1~M@MRxrN+000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004YNkl_v-~cuoJDN3SNw#4{()d6c%@Yk zQizaJ5}d2D=mkZ%I~{niZ}!cbW#6(20OAQy0iaxdf0&_RykW6e-~~^@(~Q;gq+YM1 z+x>uH7}##N7z{qKTrQ!iujuu9XfzrC0LO9A@Anag0RUjL`MPLYsg!T>5g5f}GGQ*4 zqo!$WwOZWo_XI%8vgkMtg%HeUvz*W8v@A>NNbsT7;dCfDmV z0nl|_7K=r>Un-U8y6#=ZKe?;M5e|m~tJNw2FbqQ`5(!zOsw#sZh-o6+;v?hO<5Cm_ zx~`+s>0mmY0suVELq4CEHHAU}p6A7MQQX5{7~8guOeO;WIGs*Nr_%s{*=z>ewjqRo z5CX&DP#)?xkXO@gx4GNxcsw4tTCG^C)#S{_<1u~Tr|Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1~U;LBOx{b000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}00052Nkl0&PM&*D?#X$cEI`Nri~uz?)oBwf zDk{e3^I;%E$e6G(`7qMdK;Kmi<8`OM%-kn7tx z0Kvk7l%dYEKmX+ukVI|&7?S2MWs;X`mho>r66x&{K>QxJ9D3d2P*th6+a>IAi{ImZ z>Wj9!BzaCUpJO(saGItGASoNyPR;;eF`2m4b>dbF0QHe``giu&Jv{}$ySmO&RmGbu zy^6(Nw;CYY?s~N0j^Tr&hag1G3G9cS?gaKj80?>3>;tg+1F!PWgsuJndAVjrJ3E*t zwlfRpib7lYSC)780B}{5qbnbu^}U3D@hPbedWWdA*#OW*$iBG&U{lFwy48t8RdJ{) zQ_e;<{t|vys<)z1)>;}dTwZXkSQtA#0ib(fk>&3Ltku^65Xv&pGr#ceCnf2uM5;6U efoPhRcHw*NbGTa9QNDx#0000&fA00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1~D*Rd{gQG000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}00053Nklf+0|3F74JU@J=0IJoHG z6+|Iiayr->8e{)ZXgv_}?}YPxKfc^+03iNZ0s!*)i+>Azd3lA21Lz>306-y33Ssj2 z_=wNXPn=Gt41$0pDTK*gX}{xK(RE!ar8pc8={Q$0zxE1YGM~Soo}uvJpKhOPcMfz=EZ0-H) fkX;#v*k#@T4q9i0n$P7*00000NkvXXu0mjfqQ?QA literal 0 HcmV?d00001 diff --git a/plugins/sid/6581red.png b/plugins/sid/6581red.png new file mode 100644 index 0000000000000000000000000000000000000000..e6063d00b36cd04091cd39bdd736e46dcbd5d963 GIT binary patch literal 677 zcmV;W0$TlvP)&fA00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1~L!BH!TzZ000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}00062Nkl7-C1cXHzpDJN?uMJ)SYEEBcnB!R5uGmgD$%aDoKc-t^yG+rT-x6 zCK3&zLKcf4q93r(3#Ev;i`gB;E+qb+9v@W&G@^>jO&{P6?;ccOhT5ZCz7WHcM33F(N0)#?Es)+J|XcG`)C)%OD(_(S&K7g`Z2q*YJv!90-V*J?OVk=W9IPk7wVG}{M zBxI%bgU_BbdEz+3JzbdI-HaOF0Wf+)HpuP95Q?F+15!RbLOsuRS zrRM0~l5b@fi;eF3s}xl;m9<^(K%l+07pYdls`CC%l0Qw<D literal 0 HcmV?d00001 diff --git a/plugins/sid/8580.png b/plugins/sid/8580.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa26ae9c33c37d3be68ebc2600aa5c590eac93d GIT binary patch literal 609 zcmV-n0-pVeP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1~4pBW_CX>@2HM@dakSAh-}0005JNkl8+_6ooHl6ii29L6dbzl_(~)SE*@OmvNFe$QCrzynrPto&sLNNEF631z8Ei zpKFj9D!>{zTOcfq6BiV4q^af`oqLb2?j&e0(1pc_h&1i#qNZP8|45=M>1xIYfiVfD z`HJCi2q6SUqY+H=6^uzZ6=PB?ud26j90!}t29D!ERd0hgn)Za_nF3=HIOi~oKS-rg zFbo5W#R5bG00%g9IOiypN)f)$@9D)`C_q1g+hVW>owKub?Wtc@ln6L{08S70KhqiuIr%=v)L?awHjR4 z1rb5l^>6v@b_+?8Kt#B?VGu&ZM?Dw}LQ(ho{Ybp&bQ-?z2mEo=2Yx=EBbUp8h;V7>A}>Q54$k5JaaaN+_00CPUR~mAc(739$?APkGz6sZyzsEX(xy`IlO)R(#YS zAMcnPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1~Cw25_2K|000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}00068NklPsCtyNO%x(SP-bsMy% z{_j63__w+`Nvayb#7mN@#?7wI+EK4KT>zNY>XI+JT&270k%KID@8{#mUfQ;AtI7Ax z&k-LPC7aI^9~s3zKlksbi#R*=nJb$eoNwQSB@|9iPLG)V93N(90Z4uQf?^o89S;WmT$UDr7q97;7DKJgW#nWgL(lCyY@C@!2$iAM z0GF1{3cjUpBINY~5DB(m>3VHp%`mV`s}!B~vwYGPkDI&4kCFHJkD2jdM;reX%wQ4xQnp6@*a#Zne!uR7{Xd1OM&0Pj{0+6--*$~@ RN7DcR002ovPDHLkV1nO^CJg`p literal 0 HcmV?d00001 diff --git a/plugins/sid/CMakeLists.txt b/plugins/sid/CMakeLists.txt new file mode 100644 index 000000000..41c11a0a0 --- /dev/null +++ b/plugins/sid/CMakeLists.txt @@ -0,0 +1,5 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(sid sid_instrument.cpp sid_instrument.h envelope.h extfilt.h filter.h pot.h siddefs.h sid.h spline.h voice.h wave.h envelope.cc extfilt.cc filter.cc pot.cc sid.cc version.cc voice.cc wave6581_PS_.cc wave6581_PST.cc wave6581_P_T.cc wave6581__ST.cc wave8580_PS_.cc wave8580_PST.cc wave8580_P_T.cc wave8580__ST.cc wave.cc MOCFILES sid_instrument.h EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) + + diff --git a/plugins/sid/artwork.png b/plugins/sid/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..23e4dae913d22a82ce878e2c92ba29f3eee73c6f GIT binary patch literal 88547 zcmV)^K!CrAP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP% z13D&nNe!t0000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}001BWNkl z+hC?XpX#MH@x&K)j0<#lTrc&5y*f7sr)-?Cb{yOX1bgpb&xuo z2;O;|b2#TgKyyY_$vLBds^XjwLa<|0i7AqEdEE#5nfHi@y;mVdh%q7}R8>U?fz1z9 z9sYKReQu1jZ3{pM0TEZejU8uCP=y#1AUNkx&D7#)>Kf;q9gs3)MS^3VTawH8-~mU9 ziB#S%;&9F(V&@M^U3;9j^GrF@wk@&i@ZKX%K(T8MIPXwAIoo}(Yw7UbUW+l7Yv_jS zqnfr{11Ew2UDuIQLQ}$tqYi=K1GNU!LGq3)c5hWcoCBb3TU^Wp=SZs5O+!XWDG_4? zz&!#Uae?S1{jc{|tGb!5$W=Ln%foFiwuF3vd=h+Riak>G>f2UWcH zTkelIK@dU}7>~wCsM(lB);Fg3;HW~Noz93c5u8VJCg()$15O+%cVsf)@V)|s)Y*Lv zRUlNJuA4KT&k#{UsL2^}&NwHC2svkR)?p2cfGc*Faw4Wg&KU&is-~(dMC|*7qfeeB z1P@6`DdPL8t0N-FmbeP zS8lR7qqgg4J6p&>0#TKmg`5>36Jr`2g-AjbP`fE2&~*-+eF0S+ZbTJ|ajBA1CZqVI zWD*C-%bIyZt&Dxf_suAbQ^)HT} z{`?}6?0Tz07bDI)3lb8L;;6Ic;Tp!2iXpbN8R}G_K-ZdaI_IdX8couMjJri+PLoRdh@bz@PWc*&HKIS^I4 z^8P-mc&CW?;s6pUDNR!s!z)JZgq+QpA%X+Ecq-=!B2-O7QkZp}Asc6rq6!rOA*V#! zb;aA8r+40$&sDm%rEOd0aY~j{qOcjJYA(l{p=s7)6oN_~B5dXDdgYXDi|t@ zDUnhf&_X+JiK!!m8s9XuS!ri8ocDwfh;3Welp%qtvh&iM$pTV2QZk28`3g}*qalVM z4kzFXD9JH{2-SdqEt-o6*+E1}B1kZ2T8k%_HEA~J1|%&ago`h|095-Rj;2hEtr?Rl zIVWO@XwEoapkeHow{tXRDhZ^nIES23wdhz?HFez#Q7Eg>rbw4sQp$uXnDnsFk8 z$_(8(DGM@#w}t3KD3Q(}Mb4R&(^d$F7Tc8)LCvFUi4rNMEkBUm{Fbj15)BRYO<4gX<#{5PYC*+hMWQO-*ot*=%O;+4}(n0Mx^Ex7T7U zQ7{BT6{xD(P#-cFJZjM~gg{+a_~1xsPD)Bjg5nSt5EsbU^^clJk`S@$Em2DpUjzVE zWjr1uB6MBHd^ST>sa>FUZg2?BIWt^?QHF$^XLZ|>t-sowyE*)l)|5r=M27VwC9R6Z z7@czqWLeTr5r;34zQ4Cg9Bne_O+i(@ME*8*#I`fIUyvjMq4LCJX{A%}B4{!sCc^Eb__#Z(prJo@+vj-8m|MA)%?!mb_5Wg*!y$DVwW zfB(AI6+={{m6AJ2fu!cWoPrCUx~{21MW`xV@OTvU3GaoE^;d==%wx2f+!PSlsXtJ*QDgOrEWY+OUpD(Ll-0KYipcb zTO${z=Di2!>AIG#Yf0H0ym3V(rQF1I_<~r154Pq+=n7Xfa7=1xh_@V&lrl*i(ffih z4JC}4#vp%;Xo_eul&dKrnyFHtaYBf5w4gXAC9P3I4=LH_b!|)1OyxW(f@DQgGE|Wh z>couQ+u91Mc1&@=Qt~59ok1=4GQeqaDD(OU~xKZ~pgVC>cS1= zgx3YhxZo8WIpzUnsHzzPfmjF?0elEl1!fv7Pv*I?JggZvq#P}(+nO{a(k1FqO;a~$ zR%Y#t)J7(wiph9FRaLZY%XB&|M4WwJi*l}Tiiuh327*tJA&SN>mfVyfzpblaQC9`U zB27+)NTiRzT8K&!ltkCfEH4!g;t}UjakhZf3{4yaZw}JAirgkLm=UQGb0U|;F3zB< zFXUG0jAIy&#*9Xd@2F*Rb7yqIk}XLL+J@Q1MduwHWiY$X&M?|AvvR22To73 zGM~?w&F5&=g0cj}(V}!>*Q;$ivMS?IgE(htPfX;Jg~M`I$j-C!Hexx$|nXOc6uvlK#AnayUjoe||#T@iA${He`zQUn!a z!nNd4F-E#*1eW(6@8GZB`$4X_;wk`M@^!z$p?e=$c#aZPwP%fFb3`prP2i5Z9s%Ic zp}UGl^#-q8AJH9xgJ=uPIfJHM+tJ2ok+G`m<3&M?C~P$j=|Z2s<=oS`1_#@=MYB?g z8M`ykf~q5z6hKwLI|zX&*uq1pJ(j~cLFk!rDP)sfv;JCm-=JzY0Tky;`ca~L&!(qj z-o2`W8A@6BiXp1CwKaSQG>vf;8yi#B);DOXz{+I8cwF+?>C_^3RvZhWZdBLQ;}IL} z6fL|2#aX4o>ZU@RN)KP1!z+Zs>M9m-dm>9q*+PdbSc%yTO0o1xF+>uhG0s`Qm8ZdO z!Q)Xejwh!~(qzPL;VKMr7ve8v+Afk+@!lC^b%HPV*?Y%qK4(6UcyHG*76;tJ{r>oz zEDg%4jOv-Ygj;itm=kZmAcNMA$al+vTj{@+D*SwjJe(D}0;iOO5WPtoeeCQ&N zI_0(gF_|oHg4$AYs%)f1Owg(2Tus2Kr%Q?4>VjesNLfj#Lo0_=zOd%~;t*r)U4fEP zBT`#FPNqii2%-kbEdLa{h|Z(lfo7t%q;8HcH=U%k?UWc3DH{>!+~NsB&a)vWwErh7 z7iFaip1SVKRJO2YQ-fSScB$-MjgH_0DJrqe zbSW|!jj4P^Op*CUq>EEJ5{Z0DdD09q^{B&JL|E@4L4_tPN}8z{dM*yZmk8p$whai6K-^>>S$CfmC%f<0u^ffK;a2gEI1JY^Vl)ZiGVrVk$5Wc3wUlg%dT6> z)ZWvCs+2P$0Z(Y0@h9FB0y_*A`+%z)V=^iW&#r3!f9cC!$}j)NUj<c)xL%?BdbL=wWoWV}-NFro`v1Ujul~ZGxMd-R{WF8A* zs;QfS&28Hmh<%=_61%RDgLx<^hN`l1ajvf_vw&Q zSFki$a2!Hecqmbnd1_I|Pz5l4z>r#uaUiKuO2m0fC4n&9XDO*iFlSZR=$UMWI3QXg1Umyh3B=>YSr0NUUuw&n~|VCo&ML{n~PyN~+se zmuQ-Xs;=nTmg#IxT~$<7Fh`Zs0LzCIuBymh=yGBt6!OuWTTk|SZ)9YhE!FWr?fkH$ zMFc64)@>qW`}{SCxtW+VbR9{cs%x6yi72r+0ISei5DF*(p;91a+L-WmS4(<`m1Z%g zn_UU24OB3Yh&d}^$Ii165k{jCqe+AMOw5rSGfF}=^TywP6PF#ljNf|e`}l?b{H~sG zU4#UYtw#LMeGS;TW8YBwHsZtxi5L=fs2SG{f}?Hc%)|&l9~$bW!il%2t(j0yNUFG| zVtHkis;WpavN4^~wJnO`oL@K{RU~$ZCIZebUM?B{F{qk=PSreX&Ir-aytnfWO{OX3 z5-o<4a%L72q(lfc;?jUrLZ}%}WMG$_b4Aco7Dh~@DnqGUh_k4$G+7!Jv*p8D%4Ic9 z9I<@Q-YGOqZBDB&^eHETDxqmmFGFh76O=JVs!A6GXjY_}AW8A!2AzVPug8aKD8D+f z&{!*kFf!CaL`3b0f~Er5jnS^Ffb%s`y^(C13fX1EVb^txMkC{c3N%I(37*s?<0xXp zIZsttnYOPG^*V?Uta{S59Zgf?y&r1oY)Ub6NwcCTt(5QSjmK~*#GFW)3<36)iKGO9 zk@EvO)lKz(SFY^>**J^8mXFvvCl6v5vowsKDCyKJCtT%eLXEZ^aXQ0g9h@|XeV!{w zIVQwv#)c^R?^sIY;n~l7j#+#as47pFTT&{KFhySb-Tx1lUUn(p@Na&DfBe|pefE7u zb=tq=wU@l)O9mhx3+p)K*v@Xgrp#pIrf z)=KFvl$-02{)Vctp^}VXa?W765gpK}5Xp3f$U{to<9br3P!I+!A;-jg-qOYvF9MQK zEv2ZE%!+dZiD<$bBepbI#3!34HU*)HV47xRi>#E-a%T`c0V$izA3v+0)dnnk66*S_>+C7&t;LS3OnMVSWXSd4rNqoT2xlZ)uXOU5}X zCAp$NG`t(gSY5f-5%eUJW~HvHQX-QfQwyh)FXy);DOojw%GI zk|WJ$^TnkY%7=?6oyuhiEJ`CJb3$4iaq24L(-Ck7ePh!oS7=r%DzNFQ^zpAUndCB7Yd++fG zshtm!-drGXRaN*Z;2n@7nlibIwDU-AtukR63(pLg6@%>S&!LygW-C`Y@2To$&^4sK zE-pr7t&|ilrDTw~=m-F2v$+{zQHds3h-2?ir-)m8FA?K?`umYkBn0q|?1Y5Ur9>2v z;Eh%93TaowUQQQ4IFxFLiJ#mSDYwsJ!Z4?%sB8Q3Y`MnebHaPx|Ci*LOc|G9GMeC= zqw6}}`PYBL$8Nrtcm2($hphUaBH8}=WSlL)Pu=|SQU-~G%#flS^TFeqU^$&PZTW0I zD`l;^u)d`>3OL+C5F$pxWz9^MR|(aa2Oc=W@h6Y6Jesg$`zqU3&f(mB`#ATkb66dZ z8PygcrtO@QCr`4zzE0alHrjT8Vd6Y>Wxs#dsG+VJs;Xkw?i~atbY0@uu_riw>?A3- zRAEG@9GV3rn*@>s>W2U0lvx)^l5p7}Iig8WA}%{rBhFPNneZe@WOYRCjMZ1A_7!B= zq~$Lq#-bTmDr8a*=ZR_1bmvM~YNwz$i>hXD7YY%+@oQ?snXYU_i(dPHucH7MsK~gl`cPTgItYpdH#U!xa zL=bCh>w_>Q#yr&PyEc*4N-Cq;;B1VEtFO9_3oaP(@Zlq@udNf>$Ydn!-@S(`FTa8V z2M(}z*LL!J&U8BE_=)3eY^*_wR9YujL@43~MFzHfo~Pv8a{P&8QO^g)qkycA z=#nSLgc4~+qmma3BB3}s`+pLpNBG85ke71Dt!hyt4Ui^#7WUV zphG#S_w2!0M6JA#D^KpU_qx3HaJ1qD}=!IH{P7tzo3= zI=UDUZ~7Z`j!ET_AZX0ADKK6h;VRF#9^vai5Kq)Z?h+{*aXFqeIPuiJA-9pysA5!` zR)1XCeL{ugEab&f)}8xAQ#l|rR>u;a6?KfF;^z_XB1_Gfx@age%9@`ujYi5j9HN6m;Z?l!ORn0Ykn0~^m#8Ywum9Kg@XK%d9{_yp)3?&j=bIakP9x}*Q+|9V z62E+*%P&12?;YzKQ}*vYpRvLt_uS2NI%Co_jF!i2UmCG%dCb{6R@pge@LkK}k3Y)e zM<3zX@h6$Jvr^`23JkIf>|L*s_DG?WbGbR|8&jsUDZyLS0PV|2){rq@J5C}S#P$&I zs0XhWAv%OavPh~4Nv748EI_v0j!YI;wBkb6Sd0T|u~JXv94d-eXHruf4kgE_rF9bU zl1bj^#@J;<6SX9Q2mvcGkrO$UW)5{Yh1j(aBU&0!a_OETcxY!sSu~6B3=#~MXMsws zltr?04?bA5DrBY~2rNfJNWLf%MN#K02&m~ByjMJlcHU8WPvs!xj!G4A8FfM})}iLT z<Ifjor)0^J_isi)hP9HYf}SXKDh6#Fe7%>#8QMwGNi#)XYaM~(sd+_ zL+Tc?8=$+Y5^^-=Fn9K0NtI7Ncq^Z|{m4LC$tDPJW|9ql`gLE)Yrg6EIOq7%FMSEO z-gfII2;qvV$nnZ=dL_U3`WyM4Z+i(>yyz#HOqu}&EYJX7^lMJwy>I__cvqteOKya$ zuW|IqVXC@jX=#boX2P!R%k0>;%1Z5+AAf=e<{Qk~IUDWN%13ntzHftEw;DHsNR9bi ztE)Qk*32M&C}F8;Y4t5|Fn8qKLGC~@P7^6d$eFofP%sNgGF?{GSwl!B;Y#kM#o(J} zWQmXSKqjg+!H9aR8u$?o#i<*ZZVK6FO4AM%At4J*wSY&-8X1Y8PH}2YJ|dVpP%BJBM(R3Rz zB~mtsEK(3aqOjINrwR^yHbZm8F;p5M3qGr9DKE=H@PD+ILE(KEF;=%%I$bV77i z+RH6S6_8wvT0o?4lF6mBG2&CicQZy2mZV{)AG6Pm*&ZFPRoGZJ1Xl!0Ba~4okU;`T z6ehMjOPlmyZ>}hfdds$oQ@H_)&*_7)l;2fY+3=L792lBJh?!Ac6Jz2lzWF~6lEHt9 zWIJ-x8vyus-}n9e={w$ms#1mVAOx|)JPya(-}Wc`$shg+x8HLo$4*Q+esX%6f{rt& z>b}rx3jF!+d>4YSJlTn=GF^Mv%5h$(QI?mN@!qqtw9Kv@JJ~*2qMOcGTR(|bj?s8R z%vOrZ$@KHiH%N>opVU}#$b`lgrxh-jW)NR4x?mki=%&R`ddCFI$BQ^eRSkNRaq0+C z`l=it=4`A4TbSVDQ8nAmb>woN6G1_{*-&-RO=(pwq}*m$q(%8~~3Cln7I(@mR~T$67wUD!wtYDb)=c9RYAIkPB(5IT1?DSHuy-oMh{)L>JVdNg!L( ziz8a<);sg!q(s~x$}vb0us)ZJ*JN$h3Qm>WmrS$e%2E`Lt|%=l=WwnfNXBKXf8Qx} zUE`e})N0}cUsZ*S7J`_Q*1|a@5vD02$)jx~Xh-8}mVCq|XNtD9lNMbC# zVkjafyB2^ZMKMS0eW1&UoHDaEF;7~Qdv=~a2x&eicbS!?W!$L25fE?ixxaU*IHsIT z8XhW7v$VvtUgl(;lGjeK)J5iAkvbR6FOXUwf_9JtbOIriU@V~ZrU1GS2oXvYpLUC% z4N<<&Ar#i58GER}`^9lKy@Ig!oPCxj6)iEq^S}C+PRol=CDBxsyFYXz05`t=Mh;$f zF;x|Ynqn^$a6Q~m%hQ55nk`dezIavLKvn=h`F$_rE5Gb&e)G-0#m=2O*tKIPx88O; zp_|)vY8qBnw{zBx9qieAHY=;!nA8)p!t%Clh=*xAW4ye~B~O1k`_6v~la*C#PMFVF zKY4;DAA6KXkKE5)x7uLAX`9%{q={ZB=#f%Zd79IhC3&dEBohLWPKy>1?P)z95{+O_!IANjFiZHqcw z>75VW`qiE5!D$|P0D$7$0!qfIwZE!n8(1Pn*s_Fh001BWNkl%!Xj4Kel&!aXQt`-Mf%8`h|xGs>r^u*_KY;lm`-uv!C z`dqFEGQfitqZ4*BIl8LBPHTyl;K2`>{-zp*Lc6@~zC;7q6;Q zlvls}*?h;VU&J5(@!PrQ@LdEvPCT>e8rnt(!nWllR>u>ba{hky@7c$4HD)Y<?ptqWzOha<8ngeBOS$~I8#r*qRUA3|InwcCLqo?~ ze(e_#5nlEEKQ^4#eTQ!6{qO#Z(#s5g@XNmlNqNMgdA>g>%=Z0e$fIfCfh3tI6*X{T{&M}K+dd&WcoA$h2Q(}ALm8i_>Ej} z<(0#E`cN%Ur!1x%^~lkSBRlYtN-ON58}UV7^|f4Z+2zA$z3s-Iwsb37K`g~YcG;Aa zjI8*_4EF%s$w>NWvB{#QT2#&m-ZeDLoF)5}Fa+-t90X?hS5lPt!>$Oo!W z^Hcol|Awkg`O@b-mDm61*YdWvy_Glo$}f>prV>XJYP_2;KY5bzxMq3#cFx|jkMsAQ z#g3J2_+%=%n2fBNEG=>H`e!j-US__r!R;UY@Bks(jSUWc^5Xzp`K;&IRG30Q2{uKf z?*ZG-uI4o6i%R@ z6r)@2?ZUb@)k}2|ZM8Usj1DEPB9^xy27T@p)10mzMYlWK{Sm(Khw`w-ZTU`({<5=U9PAAeWDH#S1B-ub{%A+ zM06|3;VO`(oKJ+1fl~~9bFM9UGrS%gp*@RONzM5#ApL@r3mdbwL8S7`XWhW7zxTHn z#NOvoxAl4QIp=JLWJ3}BCY4w3j6jBQNnIClNf|X2kGPE~o@!TtQ+fBJUb z|NejAwg2W@t@M(ia-KQ_4qp5;P9A%biELxrXvBFtcCZv0T+H~YCN!0y7)x{6y??)* zb1)~Ab24o_CbfO=?mOAH|9o@C-Vf70dPlaUm)-|P<4K8frW?jrb8cwV{UqcrrwfXc%Ta-A$U~%1R%TreUlNJ<^|v#E_fu`tN_%N zc?1q|Hca-c2VKP}NH_tBodp~gdCgVCY0rrmn`dx?!E0bk{TL|d;sM`-<=&4>M zlhomY!&MEs#W=nQ;te?GtZn?|TfdhhNABm_U;TfvYuk34;3Ld`Fu({T}LMq znkoHg}1S{>{5_s*J|t zvan_7)!zK@J}_QdSuCcUNnJeU7*8`A+2SdNvv%xBX6x&WmX^%euX`qs-FH7JC)}pq zZ{0$2X4EN{T=R4eUiVCPo^uX$(=eY-dHjI~xb1@<6fwhyz}rOaN>z4xb-6+ZJTAZf26pV(OYAxxxa$!A_^!WTDoyiKXQaSK6w+zk3MdnrHOC;;U7KiJAKoS{VV`~bmPyMp^ulyF|q%W z%edgmr?F$-KC01(ZZ_lCqmOd<)?0b>-g~SR96Y1RgcrZ^)u(;#yWad?xax&3X5R%D z(v)#mzxPW&LvCkONeE7uACIh)nJsyyDKTaSZVoGzMf4O4#O^2G3ZwwBs3cE|=9T3# zolWO4LoSh9VyWar;{kGnWTGbW!fB{LK*yVsB8Ha4FGPwx^O_5J_A{;{Ffszh^(?L1 z42}x%(>G#R8y=e!J6|jrHyYJ^l)rh~27(Jnu1L{=bT&gPb!a<- z*^FtPv18vpnsGzh&8#igns&y z)%dQpl9f1I2qkK5jn>wDQe0CJE^LkZo@Qx+c-bOGI(h8aVCZ}I@5k2_lH8^!ZVt-z zb#UOt-|!7wc*T{dDu45qxA5@cd%6B!e>n%Qzn=3B9^{kn`CC5ozW0-J<}E+{)4bs8 zzn%-OxMDb$r#<)iyyyS_LoU4HX}s{|FK5Tzy*%$LznUv)se||Z#h+1)MqF_D{|ZjcYd3zUi1>qy6B?ebD#f;ujdng_Z~j#nFCg7L0L*0S4C7OdZlGcz+y1WIN_mJ3y@)VfI zMYPY>wrcsK1J{-OzO~nrbx-yPL4feo%dRS#@Ws5TFGPxI`T4f-F18)mN!DZ)z?{+2 z1ixVB7u_^jl{QA^sq}_B#~ttgMgF-DRb^>nB;Hp%@5|Z0=P6bODvcdES?NOo;xQ(Z zhLNxESxId~LSVc!A;zxMVHb|%!9#a(@wHncP(2#4_xz`@_xz`D>9v{r?zoLRKl$;} zQRR^`py9M;z9O3GBefu>EovVE&1Af#M2IRWcEd5_jAjtOTLr`58cIyqelm6q>{C+E!lcizE8<@fA9=N$H&cOFL{dg$~{#uBmROhB{pR=%uj>pVOa2~}k( zjlkNmW8C`T4>F&wqbl5g$L*Yd*+I7L-i;4|r#|Zjj=t;9OM^{!x+5+9|2_o7doH~C zn!(7YYik_7*?z{aqjvl!m1n&CO zP3$}Gd{(#bpiUjFCgvxOvo=d~t7CMsg4XHJeEdDNnEJ%dQ4qj4n+nU~}UE7gjqH7~0YrY6|g{W}F zl~)=$MCs>tkfQbYiig`i`9Y>_$F_4;IqR%_R9>i;CjCwdCQvF3`QqTALx)gJoOk)< zj3!H`FH+~Y;Hg*A&SuP{otvc$Bw-U*voK`qLnUPDfZ64?5V@g){h^f8jXfEyMFuxqa_@7c!&LXi}GvaO_<9ZmM>=|c;Sn~^V&K1Fd*7lTO4!{@XoLea9 zLhPO>!vr_w248>_>mRLJXP3G%+spf*ZLjY+Ui1bFL2SsK4;59Y_@RIMedPIkAYaZT zb(d2jx*LtiIdkLB{Je>BO8vhtciCc9LI|v^uClti%F4dd4Zew-lE_R-EHrw}}#g4saZ85%c4_v~%cYM|wH_9Bk)1%iW(oAgQ34coT zk}}$QQM|H0>t;bx&ZkqF$(X7TLgIv6=F4drT(NEU?!~!Xd@*15x*s?r8d}-Ci)LwJ z&gT?o5=we-rbpe>gTZZnG~*FXGdk_2Iqw)vtV_GwP;Z>~7P~;IAs0(U?#>R(G$GS1OK6%fo5TN>rBSiS??XbMvC-H(h%r znOf9rsHtqO-Y~{I5>rQvc@UtH`;pUSwtY@zlZT2rEm@gu%Wg!Aw&n1-yYDRI&Z4xT zUx%f6M1Cx~LFax<$vnxo>%R zO%=Dg%7wSy$`Ab55A&K=zv{F+J|%1Xuc`{2jBze7?>b{jz2I_WKAT!!b#f-?P@x)+ zNYT9MlaD>jvBw?;Cxm9irB8n*=U!y6Z@jcjCZoAS)R!TWXDIKKh-*U>^U!Lz)nUd> zDmN2EOjcHhLry&LI8`yU(Cg>>?!HY^MEl3%4<6y>_x=5_y-`0iPrMN4t*O>HJ<<*% zl21i$VuK#~IdWT^gAY_q!>R7UhroC;wprxW*7sDkwHmwN$~50oexJ8-9v40BY7SiW z^x-<*`r&`%#N&@~*>%^m>zs2J=dfwc{Aq?h8ZF9fXK=Do8y_HBB-NWC8E5R8a^lK$ zv_5hHTyS*r4OBXs6(Kdk(fA~{JhaBrw8A|Kd8BkrX6C!04}T&xOTJ>_8b(eC(xK7~ zv)GN)PLSO&WJ608CzTCTY(o%5bBE405DmDZzv#={{aOik9Xh;q53_%Y6cgnWpFYg* zz4h%}a^5~%cBSl9W}a!UUQ)!_R1_y=Vr90OXs1HK(}}k;ye2|Ed6Ii?xPc2k@)3Ua z^}oc6p8L$9AKjv-p@+-%Uxuo1vYm2l?F8e=7?-Wv3h$_!8VQ9!RL6^7@patwshhax zGdB-4XqRnf`W+wpFy~xwF;WID^p)j-Aj^7YQbBB?kp-1>+F}|+B&8g+vSSx@S)c$9 z-g6g9nI|6HKy+$fV^(G3@2KxV@)vqh8fvv!h6p;k0&2_nEA$<&80hK@z#^( zjJ5t=vbv>Czu5_t`fg5XKt0YmLkI(6+03d36JiZo`_p}&I5_Xp1ilk{64YqOOI4e7M4Jkw}NX#a@F3xl9*poJ?r!OgsAZe^{mwN2>CiaYn>OF4Yo zE#$7iW2cbP03892K73@cuUpw9aUd-=8*z?4E!nJC(;6^+coNhyaq9=ZSUVCbtmcT$ZS8%L!X&9L|U^Lg5HUda3Y^pC8TU({k- zbLW6o;Bq*9Q5ThsoW|8Gq`4bwCt2RMeJ~=;wkO!6OzIh;VUDFDZW7&oK;{6cb3|0O zAc34>U;N%O!G)njp&1qt0IVmF*)K$!=S!Xf+YUn91n*aEDf@8UQtc+`dgCI77ET{((k{wO)5TjU^C+6G-#i5!UxZ`J$tz5>SwU)oc*XO_k8A)eD)(B+%yBf zM@AK0alEM*$(^74INNsbVb3}H@uA|W&w4hufBYk~8yoCA>l_YVdjogh{0WXf{E$hf z%N9hZ;8ANb@|>148$32-aHbFXW5o_#Kp z)$PpI*0|%Q53#y)H~TMnDx=8~`!BwP`wxAV{Ra*X=Xw7fpXHugZ^nzWvC#hXs4fDj zpW<6~#fjaFS?s8ix7}M5f{gHPCqC>(-99?+am_Z64p&EfZmDCWiis*`G6C1Dkh6mr znZ-FiWm=RPAvzG3=ujj_+MJP;Op~88sx3!0<}?mOteM);A<+ahE@k8y2d~i~|CY>6 zw|$!Pp7}!yNP4E$P=vGhZR2Bq`4c?-(km9*-j*$d`rRf%U6lb1CCAPYuePho2S0r? zcb|72i106ZsIu)_zm?s;@C*F#>t4sZ-}z44sl_SRKlM6}+;=aBKX)f}2wZaD0M|bK zYWDBnPwYBE2uzli7>`DTx?=Bn=dtUovsvA}o2Aul)FaC?W7o2N{7D`^az76oy4}X~ z6crc(|N0xh?em`AJKp?jpvu>N*AIODrk0%P=5wYek8|{)Biwu2Eu1|1NZI1Y##38* zZ`y;@m+uM_-Fy9uuDqJ_FT0#=J9iT*8*_a8@yEF5mYaF#&>gmS7x1$0dEFOviQoCg zU+3%#5Ae*FzU;K09l84uAN?Qy9r2DUpZx;PyYwJcRkMELICp*OCid(pvsBfHt6%sf>^P*n{1#%_A+?Pi>(h;rTZTbiDOkr{P`l`F|C2u*4E=v+=)|s{`YCq2_O<-b_x%v} z9=;cxaQ<0m^SL{3=cyN8N?m#8Ya5J5VMs?Y%L}HjvWVV*Apfir7vwWnX&NlbBA>WY^p_fiTU5FD09P9>K5$Z@=k4 z(M1na2+D!Oh8kKnfGqbkr?Tx)PPRXuxA|wWYzt+jK-=xsm0drjY?vAP?Y)W+$WT(R zyI8c?rj*JSOJ!nD83bzEQ(H@0ObMT~G!o_FjC*~5CX$k&NN9mmNGsBmYSMTRS`nZjaW*&JQ~@)b%pe<9b3wnOTHdv1iC)3Ml*DuGGW)= zT^1$!nb5#L{Mo8(5-tRS6*Uc~@i=4|&rY*5E{kD|N z6Z?GKa&H}`dT8IqF>I*7mYLgH1~O3g{L0?QyC`M17_l)<-j^BT&e;SRSK0ASNU3b$ zRBA%53Z>sImJKW2us>RiiN3YlIosaad7)LcQOBEv64LjfJFKVM2{D$*vWSg-3W{nN zHmF!I?0#T;Q%d-HG~}IG1*cXsPg#a7t-3B+t7)Q)%Zf!8Ze5*Lt+c9*^~Z}L9#uw_ zBC{F%FZSL%Ub3sM7ybU$T6^!RI#W-l)7|OLL`Db@hKR_ZC|pp;6@9)72sq(W5J40K zowwjRC_KR2mn`%D?B zwJO#`=v5U=zn>Prvkq*5S`m&+YpfcFDGH2xebDxu*s^Ocs-G@eZzG42n7Y z)rbBDXFTC`seLi48P~ZFjJvK94D~zS`3_uh<(0`=#s@P#&ywerM#%)R4uAHZKizPm z&lcY9?|mS`-Vc2Ubm4{grI)-EgInuIeVE+sbrjssIMf>5vYndTToG6~+z!@fqqD4sX{q-b$G%QSS<1s#d@nNN&51X*VvL^?QF z2Ycoaod^NNLu{Hn32_Np1rbV7M^)_6)8RF;-Z4erIIYk$4lW#0E@;msuRP|U$tS6* z3F(p;P>5e!(};_$<`(%830YGG+%;auq^w|zK6ri$%H4a>-+MZ+?G&t*J?x*n94a`I6)B)5gGh+~Fh!kvu|f*ozmNc$)=1<<~| z%N+ZV?B#>pde=(bI+iv5wIg{U~l)@W>W*h)K^FRC$zH#F>#CR^aPiUo~ zNZ|$l>G^ouTZN)}>-pz{=I8HUAN^b02O^yEFQ38Fp71@WOo5A^{A4Wc*oxclyaPAi z_)Xk+!?magICbZ4Ty*|*~mWLODkW!e~DXeRtb%Fk%53Mzvw`Fxa~&_=HAlP|8y z(w-d(1CSHR@Fui+Ihs@i72G(!1E&J1D5{F-1Stol3TR>w84=ec0}U?@eJW`3QBa*> zCmRNUW2-B$%D|cuu0M}r+YXdFc7YccF)B(Noz|EtjgcWVB!xC+hZ;`k=+;29ZZ{t8 z7Q;1nH&NwUKuitB$ctxtyV<(L0A%u@sv;J@Y@w5q2bOp4#LfE;iVAE85qDqOZSuhP z{@%~vnLqG|E`NO{{Qjdq`!xRRJ3orMu6iq+lW_UFar55e>|NWSKv>?j2haSmA4k>e zVSTiUZ(MghP8_}mla*C$Uzo?~d-h^^>lXA(0Yx5-YETx^zl?UmS}T-Qg?_&uax#o}Xq1Ol3^GWcGs1XDn0$A=^X-WA^^@{<_Z;PTLceK!MMmKPMl{IkzdaHfh)^ncT5G zWurv7GO1WBn@q5Z=FCJxdDM0dAe#UuDH7rK`--1AuMwGG(%COcIL8<}#*{Utra)bl zXjFl*0@ms&oKdibK;(mKv4i&(-V+vzZDQXs19*wQmt_f~#q1%@_1L{?NWqr{YP8qX zP?u3kd-rYQstRIw)?zqZhbF?^2iE`q`yT)60e;&p#%)%hYkk2aZzxNHiymKF zwYPzpptSTLi4^X->UVMOzBAFd;DA|{P+A8uMuzn@YA?kxAN0PWLuIe3Fc=KrylfQg zJo-kX2yP_ad+gkMCN6%;Q?RsU0k_V8io%2@@Tl1CMM^QMX7~E*AwqOYIxKE zNf==vGaWe;9O$j21<2y%lv6D7z&_;gT5FI|VC#dSfh_p4ER%B#1<&%@IXMv(qtPx2 zT1N0woMf@OADeU1GL(vMG~Fnz6dgM`u2Ry{BLc#|(ON1R0!B$=)EmBykf;TwyobC?3C8JIYWI;0ru%@|5K0kcp81q=2T&P~9+gw{)7?j?EV zglu#1^NS{YPe(UdL40b6PCw1fVZsiswh1|?l!%TpGw7_d_i;2^P^96Uob2owx9;DM zFMV}Ce*7ixn(;ZGEs{O3`|i5xt$6s^j}$Nf0aaNgt6=XvYTKZ8O;STeP!Q$tI$EjD zf+@i;&If5LnE+<4k3DCe3Rhdyc7kSYi1pP~j8<3SCN(N8&MSj~_?wlaVHHq-V0t|) z&CjDZH-~02!Du=KtOXSXO081}NkkwQEtB;ImkdC}5OWk=6y%7Zrc)X=&{jQ3p{Mo^ zjctG?R8O_WAe`C-cS%Ok`o|~(Dm0V_M$<9sMv7WRub1ARR|1A%VyWI651@e~58t>f z^$@tKjs}CIl4TTSR!_<^XdeGL5`Y;LCV6Y1_lm)ht`jCIC%RZEG=)v!e9YraT}JlkFa{|7*U4M&9Rh)-b})Vz^IIYR$}yE&_Gdx5)O)_7&oy~ zaOSK-0wxuvDFdTXgI-UgZ< z?w$&TsZxIw0KR_x_4wmAzZgf3{xL59%Kq=jId!x99{z~)I!qi&-GorQDh#wTuuei} z9jtc+Lobp<%pOhMfNg_9tJX#r9!iPYrVECRTFb?3rV~s@V@xL#G&RH70zr*jiee6E zYz^la&efPq#2ZX0G5upE)Qv2x(lE#kL8=bkSzZhun<<*c0k+1J392yY&o7`TjkLw4 zWB9rUau%ct=w69x&=+P{pwU{}q#kguC{UR~dZn?2$DB^t>0~TytiU#N&cYL5$`bv4 zALFLRWHLeHoouRwm?CJ;m`p|?l=Oj%Kv0@ch0t|ssJstYsDIX1zB=n3isdb=~#$W&6AHXlZ@>Teo z_xuw6+Xw#z|K-w;d{^C6mv?TLe&%!v=RC9t&`TybCt`YqE&=MNlfM<4@S)9UfJ(H! z3ZsKFNib^+^hi)k*lCMW9=54vT%}Nj-8(38BpE2{q}}Co4<1@h87n{z@-7%Ei0g;w z!-UQ>ingR7303V~*T%kO)*H<=5cU5eqIth3ttg`D84wrGiwLm&xnhB0y3@ z(1AA0A);Vr?5+mM18y`LNo8Iu(Mb#KuShu3N{dW*5ciBH9jUgh7QO6~O)v$SZ>=)5 zAr{DM@DGm#N@fBF0Y(+xuUt6~qcv>U*%_2K@gnMX=mc1D{J;Civp3bJhC#V)B8L7@nBi?(e`iRI>lo9&X5R;*)> zNn_!aN7<89n82Xt{NR(gC_@P32`$$^LgJX4J^2TohF^a5uLA(~KJGOgA<}PIpxfj= zfNifOuLQ-!gvK^#nknjO;GY*F>S(SK}l<9r2}(K#$aX?TB9l}$-4s0lOWY?=d2hUmh%EihysHwmG42XkD>_uZ72O) zQX<%AokiU=sokXmcb~&Tk7&k& zB2oTPO47B)qHv7DiLH`z@_kUS-u6yhR*Ev19y*UvGsUQ>VT?glR&oef7l=uOs*1=+ z`97Pv7EFcFK}?c5*b<*eO(b;$05%kqBVXT;7>9c2Py`oXV>C2ruoISNJeZgn)9Eyu zM{RdPLVYEzS@vk)!8)iNTPyW}vv+T0mGYhfMhT5C_r}hF5!dd&69DkspZz0TdChID zKHLK=#_im(MMMh1t`{kfP2C8A#51&381x4yt19$i-W9OWMWP|W+APKjI#nlC@a2YQ?Jn|*@()*$f6C5y~0R{rvls* z5xN>qxU{(tWs^V!XA}X))J+3Z%EXCZXc9*pjienGCRCvfdWujQIU(W#Qc9uM6Qo}~ ztuY#p;H;cN$_5|^2tI-<6k#|ViBoEDNNt>`+ALKA@twC8^|VgBa;+s_t;0f(aM1B& z6rvUlrR6$lCE;uneAy*hkg(j6Y=j_D#jSdoce!(@CsWkHvRZ}B)fkPUEa6E^7{=3y z%-6&S6wmj*F))q8bTmR;H%a)>dqxvpvmXRB7>sEoi)f8rm}kS$5MZDzOZ56ZfPuP} z^v8LLWXhrx5Rw=CK@rlXv{7p%b1wMEP3y3*ivp!7!UpY76$WKdp)3m&%AlT1VCz~c z=f;2;m`*1NWf}!HRKNDPfvPOvJ)^E`Sm%;d6$qFc^w8_|P&WM?%r7heET{Q!I245%Xp~ey>q5dl zh2+vXsi*J+lvM@C9;3-veC$jNV;!2h4)olReuOzEc9~tWBa5jcpP#l2pqHXslrSl~RJJ3_bgfKuG8m z)O8JO9jac5$`tZ@V^JD|suaT$@_>sp+-M@IG|I9N3_wj-* zZ5a=`@a)q$iX0}{8B>H)T=F|Y6nN}PPW|&2zJwjiLLaQJ37(Gh;fD3Ei)HD3q3P%v$MX2liQ6m5HZ2olJ!?$P61K zgkoqDFSu6X$*p5$Gn9~%z#|JBHD;EYC?LV2=m?{R2OA1`D-vm=X{HbastyYkFuH`+ z156u_@nj5JH?rdwMQRnL77~Y|khMt{ATH>#tl*ss3w<15xdxgPbnp)oO+HRUnRuc% zO^vz^Rb-`6=pqyggRfpt1JXJWWsCuX(S*)Lk4)AQ%!*H505oM;rfY1Sg(WBRB;@+> zgpFX8*n1X=r-u!TUK_!%OU)$EK)s|>T5GVA2-Ae?2Q6I-@4ZAOkd3Z!0xBws0)-JL zRmBp{YA94y6;h!I;G`B{i~)O(+B?_)-Buwaj*(T})Il1IQdQi?x=KJAy6{qn2XiMMQ@irBzZG(mJNN0l4J}^K^SRFwT zVe6JT?ASIR@*H{0v7<-vqnA8e+8^E}$tCA4j4n_VBETrUM6r+2%D_j)RB#XxhFAbc zC^1BoT*$+a5Hi@y#bXX(e-O`eQ8eGT3q=Q<4RY;7QAg;A~)tNFAmuN;vkZSVeNwH_d1op_$4ZOEm^@zK&dxbmk6~^w7~aa7EK4!L z7}gU^?G&aef?gqmp8c$6u@5_@^A1{RR8`qlhOJ9h!b(Ml4N9(@QeDjyLqgo8v_?PV zKXK=qPRF5|$>GhCR5=4_AWAi*9jhq7Bp*aD*plx^_|jyC78J-o6dPpIlSt_B94e-v?F69eS161|-87g?Ct#8qg6!6M;%mq1voR6|Pp8xHS%NrWCB&PiZp7Ey`)rX1q*-ZD2ihlW zTP-hiZjMPPjdU;s=Px~V$vsJ;s}Loqa3X>kjdy6mcw&X*liW9l_a2o%DKN9-RE}PP zg7)*)La~6SoR^eADTPWK@lubZnBXJGB*jPPJetts1_Mre=rXj%0#mKj0(24@t!uB1 z6Bu$VNXDvm1Yk_fq9FLfAwpEbXLnANolI>beNYMeiXl6V4IFDgKnHR6$ne^XmJUa` zuQLPI0c)el47JsV9bKrBp5vk}QuQ!a`y)7lw1y`uNDD2+BBcr#t=iC#2)=2;qJnU= zNu|8cdEsK4P;ZEr*HWN%Ql^s@dB_wLa~U90KzZr$7DhHfa0B8(VE@$G4mS`xWdP9R zGv`vDeaQhoT@(oy&kQKlppNLS%1911zQ%5%QaNT_R01 zPEe&aOqkrRv2cx*jlU8osk72HQqa&W03c(;Gf(gl8SNAVr5Q$-$+~Ka2IF98pqNC5 zpA;OFZ~|b1EwhFr@lH1x&?i;2Lz+`)NfnJU!mURk?MUYY(yiM1Q=}j#hFd6P!Cy0yI4)HG=t|%FysHMwF`1y*c8kEqz5~LV# z#645ey7PSa_z7S*!N4dQlod2H_sbG~a)K^6?-6X6h@mlc4If`0(Xq85A6r|;Xk3%G zQ!o)1n#fJZY}knrFDcSSvDV^Z!`{bgA+$DNfK6x>2C5_}1-4!s6qO?4u+hMK4sA+O zO0gmp>nbv*!>R8*U+9#W+8p=)BDBf*7hjurmaV~(M{hQXlB0Ys`9P+6$iI)-xR>TM7NY!l0* ziRYb5VP}L(s-zqfLw{G4#w7LJ8Hg}ZzTMLXb)8uXaPrNYG2>`M=nqUH*|vyY|Bk+1zZf8S_nz43FV->GvgxbvMeHoz}8Tu0gn zzs@Y4+pmV(kURUjxK%mnd>1E?GQ+)P;iQ*_ z)c=eMA;|RBX=Wj%o@wUu+%z`0XU8?AI$vN~?799tW*1Mp$T^d6iiMBl-OU_@lhU(& zES7Dy&|?m-ggNJ(mneucdkSV0!Bk*&k;e_ex)u$W%W2K(jc&%f-fY|7d{Y9louxC; zvTE4Of^2P+yP_UBG$PmTn_cXbt+8C!j}ly&^7oTMS?Uy^y3RG&bg|~|E#HhfbG38$ zaAylr5_Ts!- zzK-|))|>eApZ^@_#G$+WtN+V?rT0#Na}M2!SN+5#IOow9;I6M+i%T#4L#&S{Z~=(o zAc!)B_JoQpoLJ>1B}9B=3qPLD-nT!iAg7+mT;)vIYvc9Y&zOo^!^fS6NTAn@W zc>@TFXEwub^gx?NDI0)PozuPjTpKn6+IY+zIdTO5{|#8)whgcQzy41=@(GW{&0qKu z-tfP_5i6@}c)|}p1J8Z>)7hLDT6*sUm^*X;zwv`lgC4D5X}XTHzW1>>{*o8tEpPwB z;JP9Uv+)k(#lTKM79oY6D5=be1JTk+Y@9rA4EZ@US5=_I-!2RLF-F4 zJ`R|CPE~r&++cmcWHZDdup}*3O7Zy&6k7W0Di>@FuSIEhm&I-ac)>X<`fDH&pIaO9pV%h7nz6SLljpQWwmV_!Q?%rGHb>=`S;r>mIvXJK^& zrARwjq11#@DHKMdGFsra#w2h_(W zQLE9RDvKoUsX|H;)MInqHEn`2PXt(Oo~x^fV<2SqO4RAm=8<5mo22J(R@cZvcH|q- zOwQFg!LyTEZQz}E^ZM9!BqA(6>M_`V*7;a?)MHx1&`ylY+2)o<5&;gYy3xU`LC$s8 zUH^a=$pd-r7f;##uj)j9%#)tfS-X!28u(-z{J&rP0;$j4dJD>X4#B$ymw)+lu*SnR z4R)Qf3zuE_MMRy`RKF)#j5hR2m1=iZ$3WwP=wFzCjzy=-rye5$%SH$&-nWvvaU#W2 zMu8Ht2O-o}Du&dQCPC~)JMV&iyfD)QIfr!8X%!ScgK3>G*$hA$&I6OiVSPNsvDI}P zKCy~>Ppshh+8WkJBiMQh14a>E-)JpJDQ%MQWdhKWZl$2Z&z&u9lQ27`3n>)lyl}`f zoPOR!3cI^d;s(>HOt#gLgm6qfe3hM^v@vXM)m*7H>;O8@>6Z1VW~vD%De!Z9Fi;x0 zjSbT4q|K>)9lx13{lDYeRbTyLXYF2f{nrGDbMOGJp42dty{BX8>(@Xlg|}S#PW;l( zy#$XrXD|NzGgshG-uM3SB~Utn*$|q#X)k)pE2Th1Nkos6nrD*#O&dUJ>81i$6!W7j zQuBfKDbQD)2sV^extTaInsfPCwI(z5gMpMCC2QUleMX_jjFcZcj zbDNzl4n^P&ZQ>k9-?Bn0?6r78b2RYFfILk3f~HMQ#k{sd?dCZn;+brQXDZyO`kXa5 zy!RaqdJ5e4ScpoS0k@xpz@aUlZQh%%NKU~+l$KITbqZZ_kf?UgqpqsXzt!8bp7kue z{N=xly?giKmRoMY+urt8Tz>iGFs8ukUiUgY=Q+;-0Q}=W{v+P}<~PIIX4A;y!V4df z?mu?)Fus1xHNff-{PpLq!pHyRpJk!nbsN?m`B)gtFTfl-0`EOm)`s|kZ69ft+0!Y1JY1TsQFjTYpZCQ8m2QE9c+ z9t-b<6g){PQP;It$XgM;x8ApAfkcSSLQT2!k?KT~oKMMbJor@5Jma4Ma| zN&n0_*a^DaVGf+1k>*E^7 z*M>N@x{l+kYnY5Du;Ve%G$8Mw!}vyP7^R@KO0rUFW-=y~QM6RmWEn&oF$|H_7i$2N z!CX@hICL4hy~g%fo-I~_TgF&7Qf5%XCbZ+Vt3SS#et9d3hP{eCIpy?svcYTb{Ug+;In%mzVJefA9zQ`S?4=W1M-}<@l&7@bZiay?h6r=PG%S-cEUfP1W-T({p3m6Or7`rJ}S4TLpKE$z= z6|AnWhvJ#wtqBZGp|usJtk05Hk7y7OwZj3WjHtGFhxtK;t&58o^afa*U%;T>$Jo_a z2@Cx2vEw+gx+Wgjq}!HK;Hl>o;>f6qi!l-~auf#xP|T<_uytt;+qZ0OKW{&L-nAi4 ztghqmu@gA4zSerD#|fYHd^?rt98N-=CiA9!*nHtevPBzVWEJy}qjz)XcnWjs0>sL? zii;+b?3U0!s|zF_ux^V!hgzmkJxgaI8E3Zirm`M&-V^V%1|#Do0g+UYJmc1@JiEQ? zUGIYT9v}PI$FRKIy08A}pZ+Pv<1ya*-uL47e((3b<)XR2kN=eqe+0*eBfRp%|A779 z`?!SGFk%MzpwmUM|7TehPpN=&B~t7}7CchfgC(>d_ z#tM1fo5zG`wd-32QD6YVzWD+6oU;AopLb^LuYUb{99>xvQ3i?&TWtV?bdhA-hQTxw zR8!kOr)aP2&N>T+ z4jnovsOSFNAKMcq?|bJZn|Lv0XJ-^(oZg?qMW>&RU0aqgH|V1w#);`fieLQ-4JoJ~ z^1xnl_w7qt@B8ZHu z&;eZjwXe$9sSn<*x>JU+B-#kq^o))M`ep^byeJwMEPI!o+8$Edqf}wvv`EL@N`5TF zZGhP(4ZtqcR#6wK97PN_n}i+WTaIMR9;>q2KyD5)8yVc6+Zkt^fg?wbq#S+AmM!1b z<4^jy!2q{E_4{Di;#Y6I`{eg8E_I%F>7|$Aw}1P$vA(_z?>!b4giG@0fBxsV^wLZ5 zb3gZU0DyPA;~n_m2S4~775?Jpt}_&s@r>WVQWGITPH`8Q`py#vPTQS=ecp zmf3ABc;2``InVV2zd@;hvubH@@+Wxb)IXannsV zrG@{dH@)e*Qt3AUP-&eNpOnbk2I(6OV2KpA^#`z%2BVdASXE-^8YpHI+ZM2Ac^kIu z-GizqVWt+h95{x1k54e~8l2HDan|TCb}uNLw>$^)m<#a1E3d_HJWdlj+44k!2!Q2& zA3NsezYAl|qj>ZM_=~UJfYtRO0zj>eTC$UfgO~Y^Uhlg)_Md;{daMse=+vH&<+hpa zaIE|%j6!~nQQHSk8*^45j0M9MEte5g6eU3n1V8eaUlZlPoap@)7GtK6!szM(#>jw! z+*rryHb^YdCb)rolU2dZ#XFZGm@bYyhf=rE7jIyX{M)&`?|tvX``-7y4fju{Q@reD zFT=}T_Ofp)JikA!Mgstarr?wkpqdCWLf)fnEVggof@Xb!sRu@yaa37s+r1sT&fEv; zi5f{+JIt3FICU#_pML=?1~`1fjZph<#+EIM(De}8^Z<|CK96T#ynw&`+-K3arh_$) zXqqiWf#q%6zH4J%xP2bae9S!l?hBWNycr!2^A^D2vBjA0`q^wg7#m|YoQs-n2 zx@{dmOsmls4`@v)q5tvw|}Soc{%C-72PlPI*OGk7JCCUJD1Sk zcP6&%IU7%U+@ry#Y{k(l{srjuaPRsUQ`R_T%Q7Bz`Wd+Cwp)->3z-=ufSxfA%9v-J zb_Qj^&j=}%xXowQ$|bC_3zZ3~MJ+L)jE^d~Tyj5~mj z5Gz0EV}J6~pTJ}?Ng=$7YNDGU?WC$s9qJ;I1v55;^WB5FTP#cLv<~G|7HbTzBVNL2 zjjF2B$xSLtC4%t;105iY5BlZeY2n2!C73NZYvGx(^k~7lpLy#yuzJl`XKM4*iAEAp zW+vK+*NbK=dmCC9Inl?5l!mjGpU2UoNB>ZMWQtJM0Ae z9(4|?3(muh*Ia{p`~=)v#6b74XZIf5vj3I@;84sW?fW2(xqH`c+^-~V*rB7rtti7r9(X3Yk>4UpG@kqcJOah7L~uqEjlFEjH;a%Wct@Q@RTzVQzuys> zXl2QD(ln3hg0nVQBMWoR2K~W0xY>GVJE*!&EjYnxbM#=lP^m*$CGg3r?5QH3mGNh| z=$s)7^T_AHWRuO_uD||gaKta(oT@ zyhqR1(6t4bF}yZt$_i{M6jg;iWq}iGH4YxQ3x0VCi~CMT^UYg8Qw!yRf(SddY{C9) z7F0%w*7bup=Ju^yvH$klvhYymN1;S7??L^%Tesns{kJBtO5}X=hP*pN!!c!W*S5!; z+Mg@}lx0z%7?hn8+XinmF_j2OK?sqJF$rS;lHaSU%KG$KXdg~|rFB|7jkSrE+cZsD zk}By0i12bQJkre@TY-*9I!f@_4i}&+SV5VVdj7X4ah0G|JuZ}A$K zP_9i<#2i#8>t=#d5vKJNbNvN8>WtH|)i#(vZ~$kxDF*DIoP6!p8#q(KLWnEQSxjw% z$asukaaR9)!&wd`qp8BND+urus z&jSE{>qmYVFYQ+_M~}j7+m1h;O!3Bl`e^6z@v#7K-g)PzP}&%U=RWtx@a8wa1!tUb z25!IocD(L&uf>Nx^mk&ho!yE;6p~K%_&s~};4l8-uW<3j7vst+uf$LOmGn{+rgA4#!w@ zjAO@6;MjPCQK@lUHCUx7SQC8k;f}Y5YD~^l2IJIt=ss`8VoRr)$DlvJ-24E8elLaT z-L>IUNIw|#Pz0@atyOZd@zLunnC>a1JEx}B21<)HQG6|}bjX)|@CCCX|BRqX@1011 zvxnB=sFR2>k(Z!#>cJ~&t(H^Tak7)9t0vX$)1%AO>$KiNk#GY@CONo0k4J0X34=ShlUNBrpDOS7#W2XG|rWIc~rG_LDyT=}&(;F1+wUOePatdg-OO?z-zv+F&!tbEMGE^q#R@ zY3zZ*X{^y(9bw&iOdVk~nn)brY5-!S*MP*=OEG)_Gz?h9undg7N3T+tFMxZGAB7)} z(TpZAUd;URl;NQolW2za{Sb|9z1Ujyj6u`bHs1|k6Klmz*LjDk>WQgh!VxigRh4|( zI*P3U+~mE3HYRBUC~E!kbTF`t3#-?!FdVsnY?UHfbW6>ZVHE*ouYyuKdCn0D#n(0# zIvP&KdV?6ecNub(<*@u4R_5xZ`=6|cVacKpHiCH%&dz6Wdw zue{|p7^Cj<6whxjd)Y7IpZ@7%SXx@b%F0UWug48&=gysY&1+tRzx>O;#P@yQ_u&_Q z;TQ1nkAHl_Y~8wb^9?nI?y*Yi^PRLPFdU6BsT&+PbQnjDuVc%e zeHiuz7#9Y|rVWO*#kjF(oP~8R@X|e;m!Ca=71xN_owIQ3YnXE$OHioCBb-=W>*j9{ z(U^*Ix7X0-c?iZ{TOXx%S5Xux)C5E*Lu-|C_gHL-vQG>~8AI-X$@c-;>YPiSZV1Mg zvEU?fSqjeC7A+T0fph(SMi>ElRfUDQIn2)uFgF-rX<-3#g8|C2N-ewS&i%dtQbgO=o3tO`9$U8^tqRt@cIcifWZJwLMKiz#d zPW{a1@%FV5UR88Y<8K^1h#&o{zsBHz5LbTx^i%QX+T+wOT#2_@#_ylL_kJ&O0Qj>% z`v6|}!k{v)_}~XWh!?!z1sfiJ{P^)i z$36Aby*PgS_({i9d0yT^4Hc$kfrFDV4y~=@z}h-)I&>Jcbvy2A9EMGUy6R!IcCa2` zAA7DOGD0lAQDgQvZl^f&+_O;tm>fBZYFcB9Ht6XB$4;yS(MY-Q)8Zi*b7dvl&?tF$ zPYd(lj%`YuSYHcr(_Wk}(?O-g`gUd#ayHS8)?zJf#1md=)rwtYJbINy2q}z>cD&(p zyAWAK*UO1t6{BAf1iE)CqMZ~yy{i2La*1u zFZ{wU;!~gc)P3jZF^5w@f{4L@DR4vqZfyl1h0lEb23&CN*=SDLjeEX%J$CQhjz$-# zM?(}46GKG`o(PtKniNiWk9w|$9Xod5z`?t5;?BDue>PhvTFX=Y6)JBAJ~ywv zx1sw>@ve8h3;Xu%!yR|rftSAY7h#M_Rrkqcg3o{c^LWWieip{4lRp0SuYWE6;xGOR ztE;Q2>VC35I^iY1%sW2xSM4c~w7wnc=@j+)Iy?wV+m`X7XFMIxy5L-luKW_{z@6B- zyd85(OPEY27&lWmrQnT$HhoOMIN%)yXP%B@41DA3-^9^74`6#WkE-h9b4L&1&SS?m zkV+ohF%RPQqsKeyD>=gKK^^y5%=)SlnG;Y)*^a3@p=iV9ANr?FJDAI#kt0X$vtYK_ ziF{v=zpvYQ=bfMQ;vVWTcWmE*BhP(4G#>jsZ<@RD`mVwWTI<-UwP?J~Z~#H{sCT2cazk*5kOX zal^4=Nx~}s!j#g2xqmRmJbHA-5hUyBKGHhw&BEX5=w#J{$YqDiBd97*sgtQCo|;t}(4^G<75V2k*e% zC5M}~XOYWKBP*U!r>j++vI{4+?!eaLM^N8$u#+z4wA8Mp6E+pS*uXI3)-J0P31sPL ztC=qnRparvmBilU=4U`P4|KuBP&*dQ9_lgsg8|0pUl@>aGok@G0Aesd54W}kXDx2H zZ9m>WT*L5(o`%PseHQjz_;9S=dk}|Kj-a6iC^Q!PTTyM<0@E}2>fw8E!%er~?)`V7 zbOb+|z-r)b1{xN)Vk>MIzCZ;G7QWkK67FV3lla$^gc+kXk(kvJ<`x#<)>gm!V|$NY z(r=J_Gr~~g`>5+0Wm$?(JJE&-Z=I8c9eC%~S`qZ$&yNQ}peKJI0WFGlV*|n(hcD!Cf_)Os_85S%v2)ijr4; z17fgE6Y`BF(@YAl8EwSwlfP{qdYJ5kF=mSbe#tNM^56eI$SWGN0)};6V>BG1u~NC+ zyJIUJe(I@s>}hA=!gJ3?Z=r`Zs$q#?j!kfQxQ^@YIfyI2`3;;nwu*VLVXWkCYlX%n z3#~f5;tVL#G!2Hsp?JN0Cu726RcqA5ty4)PLuC5q`Dgxajm==J6b5xb{ml&qQv6aH z)(JsmWo1=#)xu<+o12683}ZAHgw@qmfPtzi(W@%>kk1=!&@>H-vIx%&z!^rcx02V7 z7g`i%bgLkv2rl&LN25^)hcOfWc74y1=tYoQPCD$N2XBl)S(ZtQePv}OMGf;8wxRp_ zwO>nZ)wWgEEgp3>^V`iOh3(u0)a4Ra)UmGW%8JKYLp)*sXTQbJ-DD7JQ5KDkA=yS; zl@*LOSX*C1UDvqt@G-0(Tf?y%58&D>uR(vV!eHwb47tYP<41AF>IzP1!n$+7utse) z`elJ>Rls#ZG|Y%Iwz^?)!VHJQ2R>$DQ1?qDN(X1ck4hFsj4JZQUK9lu78V}x*p1bg z@Au&s=7g4-W3B={EA-0HN~P~cYuyq_0=iD_<6zc7NnB#4tDUNA zKFkB2$4>P(bS6bIQwGm)E$kwbD`Y6%1fF8f_G?%&9wxNtRD= zN|qlf=*yzK#7l546$)j7%Vduoh8oD&_2?tFx{k>cafHNRV`#7yt>g$rV zIOH0v)yJ^QS17VESrr&~11JR@B8S*lZoyLA;Z3Ac61P^yxizo~rp3oC&z9*)uL_cFY9 zyD3>~L%qSl6b9Bx)W9Ls&kIpXYbbc3mvWn`MSb{%`S}p>a8}e)a891Y- zfkGb!t-X@bI`FayP53fYCbGa8h=o8fMS;4m)8;Y?r+&n%7lnbHSOGCLHL6~fuBQ%* z&o)gs;T%+0^h#-1+n_8fxTcm3FIXi-kj`j4LdR7()=WqVlsrU0O0^YXag8;ZAqEG| zyA=4WZIb>vP9~l)EzB6(!J#?tT+&Li$ z8$mR!UH&3`M$Yn3;3$o@PSHwldtJvV2hHiD6tFOeqNp)5%0~?GUo{sylaj zXaE2p07*naR0?$jti&irDKyT*JCCX?F&@jC1rO?<0 zg)!25XL&yiU^pD5@G;|*!Uc7h_&uf?fLQCGu`Y!CKs}v?Dt%i}OEystLee7;rJAJ*)?ML%D4m0>~I79zjT#*{2nz&>y@%0UY6AH1te7q*=( zzSCCW;DKwi@tw!6R<*({d10d{{KXUjR4<2upJX96mU^rWj@x zj!7M0FgR|S#rJd76^i8#9WaDGOYl1Am;K3|hdCu!7=v}rl?P1$Km6(djaycod^AeD z)j$m8CX8Wa%hi9n3Oe*pQtKBXETsWU>LyPE)v}nbx6mQ^QnEan8I|lTm8_%DgpCG_ zTeJISx0~kY>f2P^12Sj)n(};!+jKUD3FlGH3agooxpQT8>#UYF`N23G@Z~Kd;)Iu) z7HGsD-&D|WmP~yx7$Za@?&%u58ghw^uXhQkAEVfPL-x)NkQYi;|8#0W9+nh%H$*~K z$mR;*y=)bo<`BpJoz8q#xbYkB@)a##HaMJ8WX?)UyC21|UUY2EOL8m=tbJYbt>>wrGh!M4K z27M3wx$d-JJU*wfBW`)6QLZb=FYoZVYgv#f)uU_!if?w-47Cbxp;JfZyrGTD>T)c^XE{qQ(Z zdAahrI%T}?_D|c~5LCqgndS9g#x=prY__`b&GUQ_yWbBO2Ry?Hm^^k-^TK^WeAM#| z>hrm|VAMmtK`7zJu_QPcpyRR~fiRxM@lP{5iHbOgI~*!+av6Bw+&%$%@PNE(pKtnK z?Bf;vpq-`~-Idnxh5LH!e=teDb?+Y)k4a;~AUK9ru=z1G_jOMwkd6QeA9lt%Cvx%q z>QL}Dt)Av)pHdLJ!~IIZV|Q;PZm%GULFVP&b?G-8Nk|l9Hx~RbyZ#%_e?ZHC;5!{y zZ(k79O_!q2_s6Yv!mz6@%-Py+-3MWq5`{2;G#zTTn3Qq)Z~s;n9`B{8#WoE#7Rs_D zA_ZiAh(s#*I$vS0VlB9W)(VN*DvqmKM&9A(x7y+mZW_Uqp8v*MJ8arW*CttSwX(h$ zdnN^HED_KK_&UwWz>7-%DE)1MPvT-SV4Ri6DkwZYXT&4j0iQF&`BV&~u5BzoHYEss zD~lXhPXQD(lVh~RET2xPdvWeUbD^7&Zv8GnwwIH|!u{J{p}srnZC_o;h`a-8Xn&aC zyP?myF(IlgGs*cz2d4k+rC`7lL0tFo?0+EDb>>nhq+}eyfd41(3#!}W1=DfW(g^!) zRFWU|kJjw|Mf*C~%v-9?*d$1kAN-G~*dZl+fd=WbPdhpO&(mLVU7SB#3d`=k^cOeG zyWUdyg``G9O(+q`!iivop<~0J!O_LUC6P?fvKjk989T?Ve+tVrsKeAL9P|TH(L$cN{_|+<#oNHxCt@S*p>mL1yZoQ{j^Bu&SBg66}3_ zIBVNal*Piq+0C>D6i{jW3zFxGn<`jF?2s~ zfS5c`4fKE!L@;IbtrI~Zx|Bm?$owATf}QDT9v+q;c-;|gY-*}I?i8=mZh(Z5%i&4! zeS2(h9#LR-{Fd!Bp4Ay{3aUCSncf{v?L$I+dtL$h4Kw<`&_)gsr(D<5q9=|eufjs; z*b4J+-H5tVlebF1ivkd8!;>4LDJvKGu}{h8VF+hymBdhzC7v_iu+8++RfhY2r=&#? zpL{P2)v;-ht{=UJS!Q~d2`i)K4QZCMXtJ!yr3(%x-xG_0Ncrs;C4Egi=zxTd+;=mw zbZMb3Q|KQDwBK{}+Y3~FkUzPlEPfDwiT>mlYtxmG zk@oi&w6(Q$adkJ=wEa(fqMO(S)k%wMdh(pw0?*pBJ$56ibebYfCsG|j!IBNuOVh_V z45oD64C)l_H@icij+ou>jbF6>SLQ6>I)Fe#&T3|bikYaYa6_8M3O(22oXsj7ZcMW$vi;3gELf-Ic`JK zoG^x{)u6XD!P!eJ-NuRkLevw$5=n;0Q(`B zeC{#Y4Q4lw?wvV@sTiN{rGl)st88FAyu6F>Xz(*Bw3;kl_gFkUJX9D_HfzoFJRR1I z#ee@PaD_u?RO=KA2>P~D2HI=V_?*5f*4eIcOmpqQ+jU%U6b0L^H9LL2TbzD4GFPXge*n8XFtS zyf^E7y~QBDe@ls!Z#q?~!@nIudGS#OSCi7u981$c9FKK`#5DBPmQY4Pe!x3$W-vB@ zr|-i|PH{1cn0ckikx|jtB)mj@-~r(Bbi*=7*H1X)d*h*0g?d4I!8E&Dj5U^_CxxGk z4-L{6%|NS?WS^6cE`?&&o%FKtwbisbQdH2LgD3lhJG8EP|3V!= z!ZFFhvHh}On31&s3f@(-8)HHg*HOlAHh>$u>1B=|Geduy$opbdpBSpMm59L`%FEL) zVX5qk^m{!ibsoWYcK{(#0e?V?i0?C7TXD&?4m;Rv?CfEEur>^g5Gx*PU+J3lV2wu1=YiHJOp^TU=qJyAKg zd|0o%mO2)=hm4rzSYEzPREA%zwhpp@P|ME55VEOsJK4^g5;Q3VeD&VE+w{PD6*Hgs)0A@gl`4B`Vb3b`*2U^PMzi76Rm65Csi&_v*@9 z9k^aBa+Ol)641L+#VY9~0Ve}?q9z%KhNOC@XJ^vItou&CjTTv^YJ(*glqE*SX+K-A zetQ)BQ&N`Lsnf}&(uzbdTo~N2>it3cyDFQK#I8;v-PJwkm_tGZcV~!YDImTyS!D-> zO)dcbzzUS!4`;2om862u-E-Yc#WkXWN%Nnr00$=0xjUP7`AeIixHnV zJ*}XS>&F5I)RMBcrp;^LQGLHzF>eD22GkgE?{|VdSwG+~46qwzM=n_rukpU~IkqYl&BJ0(E?y z#ViRZ4PH#(WlT|pA?;(pRy$F7kl&{hU9#d+)z8-14`cVlocM7 zKJgmRPRCZTqsM9rM}j@hph(cI=c5<=ekxtDsW{~)kWV|Z0~A*MG!iFBtRa^!vvK%f z(&8dv$JaPn-ZU}`B?sywdU|>ncXw~orkQJ2k_y6FpM|Pw>I^L8&Ia82c(FzeL?)|! zs#Dz4<(@Av(SW6Pe>nbc1&GB#IyO ze{A&d)kpH#)FKmke6TE?Rau92k=z!QBY1dxC3?=niKpTkfWcnxb}8Y=ni@pP$z%LV6Kr&~lk zgMrYy7v!>t*B}Kgj0my*r7cc1{AQhp;<67x(X!f7@TIwRk!~e;)4yyS>JBZSy9%p> zn&$u!FQsKtuMG(aX`QZO_>aFR!D~zcJQ~S_#G2hN)HHY;`b2Ed>F1^pOykuIGZ8a~ zZg^6R29(KEE`j`w1g|YtfwV3%1<5jrm24!BFURe9*uyzgUk8P@&lW z;v-;G{6QsNqozt)ARE0WmtDBL4^A}|5A`}GVerBd{SL`KC)VH3Bp)d%O0z>s!l9tD zSaPGSC}L5ohD}r14v>g(DOS{CSuhv1wk(H`s$bz5vPrTVRa8=$kL(1H=bLb4oMpU@ z@}j!iMexu4kuDWt!kK46YKJzQFDSW3nyU%X@C|puauMtV+r-zP40j-QAzXUMm1F? z;$KscVbP^VsZK92x={E6Tr#+BdQy66AKQ7lcAWC%Uyrqs-+Ob#W{-c7Ft2C<&NI_gSBe0A!u!u55dU&?qwHSr9ixcP>CWcG}?u z$t_vchX34(QNu5ugfbvuYx9F5y$(jInb(pdgPMD}WyIOnlW1&PsAdtU_2x3# zl`y1%;?Ktn0kLZ!kUnY3KpVqtsDw>T8P$LzsiZDHx3gvuKp7sWl5B|OH>a?xVMD0O zSTGJc~%V6_~-2+6cX5Iw6%A22=BJ53yXONiA3l&r1`bfR|u-WMN;ZBV%? z*JzInSew!aEx;=Sap34FHOrS}bfo?k{$<;Ai@!$+lxdTr$uV;rkbY568{fH>#Ah{bv*As*}CJDw4uxKB!sFS=% zXo5%?ri*gWL{pkX2oX;nV7=G;XW4-;DFENE=D&;#WFdb;H zv-dud)&r=rHHkloRoXET(^yK#_0V5zwzRe`_U~<&P60fT@Te^sG|~P1lkYOmmgr}Y zf_s|rqY{9ev9f#HqXGm}HNg6z4-j@$S4ubpXyP`%d=}rAbom^?v){d6SW$<>J??7Iy<;ee$FXBa4^sky!GXV!R+QE*9+X%9O1J zB5&cGYTJhRViss@T5`E+pU^A5Hs$!--Y>EJ9ge{Tsw(n72wrw(3EVoyqi523PV-xT zJJh_|56$E6t4}cI0)nU;{Z~l~T={`^_Q{?*w{f&`8O?zS6hp2y0KE7!n@=keWUWghu}p>K$=K-ECU84AdkAzpf^204`5V zMVgY=Xq}V=!Ds|*7ZNG^066lREF@x1fPWfpA9k6Phz$DeKQTIz(11jdh|eF4W)wLT z8TY~X_?jfaMS$*Hr?yF@x_xk2vKL+9JvJydMbRYZKoJ2&QRBiM;A7_k-9&*B-ke1; zpvD|i04P&jaC-l(Ow9A{<@Pt=EKy2plVBBTdC^J@PCoRsI$%M4kGg?R&z-2{licOU z-^>6xtgZzub72U$D+_|#O%qIdTTAx2GQRq+Xil5seR+Ex?%T=lh@$V|{+C}-{}pVQ z)ASy{7T$dx1Aip1cj9zV<}pRIr)j7Py!rUG+-nWf-EQS8PTQW=4=-wQN4!%85QjCVvi4 zKR%q7En*b4C-Z|CAp#XL)l@lc%19ey#U=Fhm4_t*e#IuIc^pT^ojIJ$igzGn87xkK zSDI)AFd;jV5Zx!BJBUtvlm^*17gL!MGeQ1dfRw z^dn2%uX#Q3}S&9@ALvpry{#-pJrZu?y zh^sK-RAPt-lSDC+9pALQ3SdO~u55N9_IC`vIuU#;TE~HJbf(E+my#3#PaaZbFr<-X zh}lZhc|3#4!~JeU^+q0Q$vgJQfmhJ$swgl~6?-aFh#_(mBClq|`b6m0ORi%^*rLfl zAfqBL4#d%NKfJ$-Lf5ZEhuJ>WOd;)1P-e&_j+s%X$OyDi=(@6Iz@NCRCPi|{+ZQA2?Z%f_9)^NzS>3PTz?VY@P$xJ+GAl()PtI$(iD0G_l>ir$RR$hOM0$Qak4g&Y zurB+3-sL$zED|2<5q@Fyyf4;(wZ7jz^_&vvx4TfwrZIeUK)p?_I6wDec8|72VK{rniQopC2pZ@9OvV7AcKmDI;t&Dd>fK9IJ!O||a{C}K}(fuByBt37-1;GMMmINXT zM+_6jj2<3$+Y>)^0~q~3vVNaPMTT$47j^HO3*nFSvB9Ijum)p9l))CKNG+K7BarG+ zL+i591vMrV=rS1ZTx_V5OsC+)s8G>ga}jBe%qR7^MTv@;bRJjWFyCT1$~p51kr zu0%0!8UXbrYwLmP+Z8|N12SM{#)%6&Nln zSGPv^MzlaRngj7~!Yjf{D$sHSjoN~0+AvVXF6^D1IIYjF_LAaofMHCI1tH<4s8si* zvx3)3EDUI$7)KYpfMz|SRNqJPI2ln~1eq^XgUj`m)2jfD0d!5>F_7GaTBDD5 zmEonL(l>cj@ZM&vCIf1YFiZ96NfPSr5CQ_7av^!#;V^SFi8PiM4s0)xT;(ttvjcvD zT^XGb^pukZE$0tasag_`8E@qIBUr~RWcGP14`Qo6S+PbX6sWb}2YVyKawEnURP8oh z;-sm>DHE*80})R$`Ybx%{E-G+2bHX1*CT^U7ifee}Nf&EI0=MqYP&IKf9i?>`9D9$(hu`e=@v=oG-*v?r^?Bn zTd*j)Yi+Y+hWeOv*=KAeRjOCFamF7ctr)7*OUDIs9u?P}Cg^=Gto0AN-%@9;YIY`UuV=g?#_qo* zU7Eb0%B!fhqg6tR)nC+d`VpQv|6?<-(D-dNTO1XP>M8Bj%*@e}GmA2NqO2(ur*U{h zjAKT$lM{RcqP#e=-TM{JTzLe<36?rrOzA4 z*jTpNRQ{oBR22(8OZy={aFj<{_lm;CtU~j^{@VE>N0Rdq$hjmHTh*4i!5lCz0>V1$xpi!m! ztv8$7+4J$IENPMqsGLOju^iTR0oU^FI>i6Wz58zCYHoi1Oq_P0@u`sTBOGL~h)!$i zn%tL8`ldK*0TO(CzTURX$M>mqKk6!1nlDT#UV5G=&cnwF&Z00a@>4OapyoJ5L~{Nx z%RfZpE(**3qBWxt#f~2%>uVUyS^m@ab|Cmb(V^SYiIkM`dSAX?$yg|Wr&a~xj_I*2$iA+ww)G_CcKng^cA>n4w zHqiAAts`9v>(Z>*c+~2^J;pzOB1nWcwo&xxRSM@cI_Os^4>r|ic=OQ0I@CHG9IM%{H#hl>mEe7}a-(?B$(ZlHav+z(kx~h0j|8dhQ6P!p_B`)XOkc64y?JNVd;ciz z8YJqarA%nDc+Q!m(rNdnrs*GMZ9PNscXiSI>dvkdbYq`Lt5E~j1BzK<6R;WD}jCrnSiQu!SUD(-AE={;%`_2=I z{}2afApesG!DAhsn7;ncr%h+ZhYYVz;MA8S!ad=8T3T(#%VAdA)#e-4B*MS_UN3L2 zI@_$xO@fEYt*_4~kS+eoV7=9`6J&kf10`(aL?VIyVqq)K^A+3gB})I_p9H!t25EQ# zoGQN5V7Cb)wUXRsHGFzAocS9ywTjdsgSPOqBr!R;;EbYEEa;K^sYa{>Bss#3>7spj zzqPguO{WkkEPYWTA*1%h+46-mYiBvABo${5A79EEc(eka7aS6W8RA5ac^}`4Sp2@C z1sekWo`fLqw(u}5uwKWeu5Mz85*JHWc!{F=nm4~Ztu5&%q2HEJt<0PmLRh;9o&aM> zCUV}iug&%#{1D>menSh>YD1euGGwwM2)b_EvSf1JIe_ zpqB)ornHpu_Q|PDE{@|GEZ6%I*c7D83ke0~dC3SA_j~Mq>WcgP^!t1t5mco^597ZA zO~CvhvV_BW32+e2+IhQTU>9F3o0ceVzS8E*YrW)!6KkILp>cHusGO$8h|2c9Y}+Bj z488nI8+2@`AS&{UN8DSFe=$+skw|e-O2xqjo?5z*gQ=u2<-xNSMw#Y#J8$rSdyhsOn^(@TE1 zL+EsFl8TXx^e>)|;q|j{$f}I_=h;kzeb}Mec7x!>@90ZXFT;;F@I88Z6g-FTmc$l{ zlw0u}PfezE(J=2@0oh)F8xt*hUgZh_$KpYV)vYoCEaj_*k5vW5wRJ_7Q>HU89ooU# z8;L=-y$thQ;v9t}DKf4%o0@kwkg4znM0@PiP>kn#9%4`PUhzF#<$d0l`afhF)s2F_ zqMYwnGUB=3b{QNi$Nv6+P<-rU=V~rO(8*%h|6AvdV}U7Wlv`RBFC+z~LM@&04Y6^%kW z=AzvD45tcTNLX!2Q72e$H((qOoZYyT0c|-ZpHK7|VJ6ThX%esI%>X?=?-( zyCn1&GPY#S)xLhRaQ?C$#Nw^uB#=#pb5K-qHcp*PJavlLIq6=`Q9 zN3r)IoP>EJqUs_p2zpz02Kr9*rfz2&%=G-b``mo|%oUZf6;B(0L4*!C;3}ezQfUjc z%+y*Tizwld$YINs^NsxMH-vN}2<+pF2w;ghp?eIcVA-Rb;WI;lJDe7awaGU>ASBK? zOnFB#wPYzM&)FLx1U7H1k+yF@GgTsKzw;T+EJS8b?RS@A@1!RCPJfwq`ssUuY8io!RKLBZe>iS zB8MfInN%WI#GdrmdWqw_AB=QPdziCjZq*{e>Bq)L(D`aZ=G@K4IoC5Rsv;I}`N!Ab zs^C`yf$U67pP?j+qV&=gEdMkgEVoRP8Own#&GV(8+Dqja%c*zG)$~cM^dSr zDKNk{cP(1~(&6LW>6Gg6Cb@imd8sKce=Z)!0pZ~x+$cbd!dY#NE=6`gM8(=_7oaJ^ zYvn8Giu2Zv82o0qA#ieKP}7xL*x=o#hpX-myV5IHxL7|Aooo9(|wCO1{{W$&X^yen9mc>#~x66)}7>Vr;(>OQp%ID+MiVt;)*Fu8xcv!4zkgWjjTGzTCuGP;7@E#+7@!*ggKXzE)AzlO_(IGIjw-+wLk@KxnCB%qii2{`q0=|Zw#~(oL7u- zKK&}%iz(`dyzE3a$rg!!xu0|zqA-OWPhoM*fHcc?;GZ49dK@8oij#OXj zuS-<(WsBQWqt>+LnX_yr;1crl#@_>l7%cH+?swZotAq$!&aW?Ep@=~wPoO6b&)PN= zw?&kRWylUSBOlJ%YpM!e?^L1(TjDLc{mRPXi*3$3VbB~WgOL3A{X^u&eiv9W!>XYKa{G;RUx{S+xO@>b6q4;Zk2hqD+&Fq$qgO*{SsX)2tG; zK{_H}XS-cpccib{E0V>nEl`g}l{%#kPMit@D?!THL7%fNfaJs^G&nd|ZwT~;N#m2m9h0hXJmdO0R zi|dR>prc=^5Fwi{So8I;oI%*E-z1*VC>26xO{~L1GP2D=R{V& zsJJ)+1i290cD1?r5G8Z=~C^q1FAC3`{`7@p*hd z0!-I?T}z|9nHTPHTHMm&)i8m!ChmsbWB%_rJ`tq0A`4ys!5jRXU9S;4+k# z7f{I2(&*8h&qJlY?;^j~Ul|)=Il)yzi0aTjEcny*%R?xsv>=7D1jmVPwXxDot~SB=AAo>g znmW$1qi@>^eK)Pj^M?7t8%v{!lZ)W^^e_NmceuECcfX#Y`*zFmuSS0) zZ<8&DRwC9!M-RVeo`#YgZCmKEygH_4d9lZ{R&$XR2l1N42RH9!vh)S`^^U{2>9L0l zRDTWS`KM=9a{V1Cf-Gbgsn{hId?So&J5|BoieX*`lfZ&SCkvli93YXtpYK^c*e}10n=1F!q~lrozIZgQSOp+ ze_56b!#Qf{hWRA=g4V>WMaT&Eg<4G_Z14NeQ~Si3g2KLS=z^LEw+cp0<&6g z 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 literal 0 HcmV?d00001 diff --git a/plugins/sid/bp.png b/plugins/sid/bp.png new file mode 100644 index 0000000000000000000000000000000000000000..bcad3c0a987ba6eee7dc822e280e1c869f9f14b5 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngd!3HEhbh*6;QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf4Gu;&WAjgXOHKoYBuiW)N}Tg^ zb5rw57@Uhz6H8K46v{J8G8EiBeFMT9`NV;W_IkQFhG?8$JIRo%*+Ibdf7jWln>Qpk z^s#^7sOGx(IO0ZRmC*Y{0Ue!|x7)UE`eD|Y(y6vWa>lcR&v}iN83fc%vo=`lljmxE z$m@IgKxN~$S{XCz9Rbr1Rp|AoM2fI3&rG`i-DgtD)6~eQ7)@7(EoUBEC~+`_gtqQl z7jDOMSZ({6ATOo`&nxFVubiGgYqL)C6rsv_i(l`Wf2Wq;J&+}tXUjE@%O%r)@5}Gs sdtJr;#| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf4Gu;&6XC|3Yj=S{k|nMYCC>S| zxv6<249-QVi6yBi3gww484B*6z5(HleBwYwH#}V&Lp07Orz9l&IPajAkeHB=aN*iD zCC|w{JvxWa&9#=Ck-&8PXshS8nVpSH4m+Q%4qtC*00cg!=E)X%>PHJA!Y3bW>FS{I*P@&|q=vj+9lDGc6`29UkSG&JKPI^-6i_l5!-S$6z@vgRDHd*zrzG%~5{S#-u z&TnjdxZi;P{C|JFZx%=I-o5+Z*udbA`^KI3ueUo+nBBeb{`J`pr|)2KEEG#Q%M}yD z!~b@T#J@lP4+m7d*UT%ls|!hgd}#ih9K$0UtY*LZcxL;1gMVAzzI*34?JPr^O-yyk Tfq)%AKQef_`njxgN@xNA>_nYF literal 0 HcmV?d00001 diff --git a/plugins/sid/envelope.cc b/plugins/sid/envelope.cc new file mode 100644 index 000000000..7be289c53 --- /dev/null +++ b/plugins/sid/envelope.cc @@ -0,0 +1,227 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#define __ENVELOPE_CC__ +#include "envelope.h" + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +EnvelopeGenerator::EnvelopeGenerator() +{ + reset(); +} + +// ---------------------------------------------------------------------------- +// SID reset. +// ---------------------------------------------------------------------------- +void EnvelopeGenerator::reset() +{ + envelope_counter = 0; + + attack = 0; + decay = 0; + sustain = 0; + release = 0; + + gate = 0; + + rate_counter = 0; + exponential_counter = 0; + exponential_counter_period = 1; + + state = RELEASE; + rate_period = rate_counter_period[release]; + hold_zero = true; +} + + +// Rate counter periods are calculated from the Envelope Rates table in +// the Programmer's Reference Guide. The rate counter period is the number of +// cycles between each increment of the envelope counter. +// The rates have been verified by sampling ENV3. +// +// The rate counter is a 16 bit register which is incremented each cycle. +// When the counter reaches a specific comparison value, the envelope counter +// is incremented (attack) or decremented (decay/release) and the +// counter is zeroed. +// +// NB! Sampling ENV3 shows that the calculated values are not exact. +// It may seem like most calculated values have been rounded (.5 is rounded +// down) and 1 has beed added to the result. A possible explanation for this +// is that the SID designers have used the calculated values directly +// as rate counter comparison values, not considering a one cycle delay to +// zero the counter. This would yield an actual period of comparison value + 1. +// +// The time of the first envelope count can not be exactly controlled, except +// possibly by resetting the chip. Because of this we cannot do cycle exact +// sampling and must devise another method to calculate the rate counter +// periods. +// +// The exact rate counter periods can be determined e.g. by counting the number +// of cycles from envelope level 1 to envelope level 129, and dividing the +// number of cycles by 128. CIA1 timer A and B in linked mode can perform +// the cycle count. This is the method used to find the rates below. +// +// To avoid the ADSR delay bug, sampling of ENV3 should be done using +// sustain = release = 0. This ensures that the attack state will not lower +// the current rate counter period. +// +// The ENV3 sampling code below yields a maximum timing error of 14 cycles. +// lda #$01 +// l1: cmp $d41c +// bne l1 +// ... +// lda #$ff +// l2: cmp $d41c +// bne l2 +// +// This yields a maximum error for the calculated rate period of 14/128 cycles. +// The described method is thus sufficient for exact calculation of the rate +// periods. +// +reg16 EnvelopeGenerator::rate_counter_period[] = { + 9, // 2ms*1.0MHz/256 = 7.81 + 32, // 8ms*1.0MHz/256 = 31.25 + 63, // 16ms*1.0MHz/256 = 62.50 + 95, // 24ms*1.0MHz/256 = 93.75 + 149, // 38ms*1.0MHz/256 = 148.44 + 220, // 56ms*1.0MHz/256 = 218.75 + 267, // 68ms*1.0MHz/256 = 265.63 + 313, // 80ms*1.0MHz/256 = 312.50 + 392, // 100ms*1.0MHz/256 = 390.63 + 977, // 250ms*1.0MHz/256 = 976.56 + 1954, // 500ms*1.0MHz/256 = 1953.13 + 3126, // 800ms*1.0MHz/256 = 3125.00 + 3907, // 1 s*1.0MHz/256 = 3906.25 + 11720, // 3 s*1.0MHz/256 = 11718.75 + 19532, // 5 s*1.0MHz/256 = 19531.25 + 31251 // 8 s*1.0MHz/256 = 31250.00 +}; + + +// For decay and release, the clock to the envelope counter is sequentially +// divided by 1, 2, 4, 8, 16, 30, 1 to create a piece-wise linear approximation +// of an exponential. The exponential counter period is loaded at the envelope +// counter values 255, 93, 54, 26, 14, 6, 0. The period can be different for the +// same envelope counter value, depending on whether the envelope has been +// rising (attack -> release) or sinking (decay/release). +// +// Since it is not possible to reset the rate counter (the test bit has no +// influence on the envelope generator whatsoever) a method must be devised to +// do cycle exact sampling of ENV3 to do the investigation. This is possible +// with knowledge of the rate period for A=0, found above. +// +// The CPU can be synchronized with ENV3 by first synchronizing with the rate +// counter by setting A=0 and wait in a carefully timed loop for the envelope +// counter _not_ to change for 9 cycles. We can then wait for a specific value +// of ENV3 with another timed loop to fully synchronize with ENV3. +// +// At the first period when an exponential counter period larger than one +// is used (decay or relase), one extra cycle is spent before the envelope is +// decremented. The envelope output is then delayed one cycle until the state +// is changed to attack. Now one cycle less will be spent before the envelope +// is incremented, and the situation is normalized. +// The delay is probably caused by the comparison with the exponential counter, +// and does not seem to affect the rate counter. This has been verified by +// timing 256 consecutive complete envelopes with A = D = R = 1, S = 0, using +// CIA1 timer A and B in linked mode. If the rate counter is not affected the +// period of each complete envelope is +// (255 + 162*1 + 39*2 + 28*4 + 12*8 + 8*16 + 6*30)*32 = 756*32 = 32352 +// which corresponds exactly to the timed value divided by the number of +// complete envelopes. +// NB! This one cycle delay is not modeled. + + +// From the sustain levels it follows that both the low and high 4 bits of the +// envelope counter are compared to the 4-bit sustain value. +// This has been verified by sampling ENV3. +// +reg8 EnvelopeGenerator::sustain_level[] = { + 0x00, + 0x11, + 0x22, + 0x33, + 0x44, + 0x55, + 0x66, + 0x77, + 0x88, + 0x99, + 0xaa, + 0xbb, + 0xcc, + 0xdd, + 0xee, + 0xff, +}; + + +// ---------------------------------------------------------------------------- +// Register functions. +// ---------------------------------------------------------------------------- +void EnvelopeGenerator::writeCONTROL_REG(reg8 control) +{ + reg8 gate_next = control & 0x01; + + // The rate counter is never reset, thus there will be a delay before the + // envelope counter starts counting up (attack) or down (release). + + // Gate bit on: Start attack, decay, sustain. + if (!gate && gate_next) { + state = ATTACK; + rate_period = rate_counter_period[attack]; + + // Switching to attack state unlocks the zero freeze. + hold_zero = false; + } + // Gate bit off: Start release. + else if (gate && !gate_next) { + state = RELEASE; + rate_period = rate_counter_period[release]; + } + + gate = gate_next; +} + +void EnvelopeGenerator::writeATTACK_DECAY(reg8 attack_decay) +{ + attack = (attack_decay >> 4) & 0x0f; + decay = attack_decay & 0x0f; + if (state == ATTACK) { + rate_period = rate_counter_period[attack]; + } + else if (state == DECAY_SUSTAIN) { + rate_period = rate_counter_period[decay]; + } +} + +void EnvelopeGenerator::writeSUSTAIN_RELEASE(reg8 sustain_release) +{ + sustain = (sustain_release >> 4) & 0x0f; + release = sustain_release & 0x0f; + if (state == RELEASE) { + rate_period = rate_counter_period[release]; + } +} + +reg8 EnvelopeGenerator::readENV() +{ + return output(); +} diff --git a/plugins/sid/envelope.h b/plugins/sid/envelope.h new file mode 100644 index 000000000..0bbe1f0d0 --- /dev/null +++ b/plugins/sid/envelope.h @@ -0,0 +1,305 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __ENVELOPE_H__ +#define __ENVELOPE_H__ + +#include "siddefs.h" + +// ---------------------------------------------------------------------------- +// A 15 bit counter is used to implement the envelope rates, in effect +// dividing the clock to the envelope counter by the currently selected rate +// period. +// In addition, another counter is used to implement the exponential envelope +// decay, in effect further dividing the clock to the envelope counter. +// The period of this counter is set to 1, 2, 4, 8, 16, 30 at the envelope +// counter values 255, 93, 54, 26, 14, 6, respectively. +// ---------------------------------------------------------------------------- +class EnvelopeGenerator +{ +public: + EnvelopeGenerator(); + + enum State { ATTACK, DECAY_SUSTAIN, RELEASE }; + + RESID_INLINE void clock(); + RESID_INLINE void clock(cycle_count delta_t); + void reset(); + + void writeCONTROL_REG(reg8); + void writeATTACK_DECAY(reg8); + void writeSUSTAIN_RELEASE(reg8); + reg8 readENV(); + + // 8-bit envelope output. + RESID_INLINE reg8 output(); + +protected: + reg16 rate_counter; + reg16 rate_period; + reg8 exponential_counter; + reg8 exponential_counter_period; + reg8 envelope_counter; + bool hold_zero; + + reg4 attack; + reg4 decay; + reg4 sustain; + reg4 release; + + reg8 gate; + + State state; + + // Lookup table to convert from attack, decay, or release value to rate + // counter period. + static reg16 rate_counter_period[]; + + // The 16 selectable sustain levels. + static reg8 sustain_level[]; + +friend class SID; +}; + + +// ---------------------------------------------------------------------------- +// Inline functions. +// The following functions are defined inline because they are called every +// time a sample is calculated. +// ---------------------------------------------------------------------------- + +#if RESID_INLINING || defined(__ENVELOPE_CC__) + +// ---------------------------------------------------------------------------- +// SID clocking - 1 cycle. +// ---------------------------------------------------------------------------- +RESID_INLINE +void EnvelopeGenerator::clock() +{ + // Check for ADSR delay bug. + // If the rate counter comparison value is set below the current value of the + // rate counter, the counter will continue counting up until it wraps around + // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the + // envelope can finally be stepped. + // This has been verified by sampling ENV3. + // + if (++rate_counter & 0x8000) { + ++rate_counter &= 0x7fff; + } + + if (rate_counter != rate_period) { + return; + } + + rate_counter = 0; + + // The first envelope step in the attack state also resets the exponential + // counter. This has been verified by sampling ENV3. + // + if (state == ATTACK || ++exponential_counter == exponential_counter_period) + { + exponential_counter = 0; + + // Check whether the envelope counter is frozen at zero. + if (hold_zero) { + return; + } + + switch (state) { + case ATTACK: + // The envelope counter can flip from 0xff to 0x00 by changing state to + // release, then to attack. The envelope counter is then frozen at + // zero; to unlock this situation the state must be changed to release, + // then to attack. This has been verified by sampling ENV3. + // + ++envelope_counter &= 0xff; + if (envelope_counter == 0xff) { + state = DECAY_SUSTAIN; + rate_period = rate_counter_period[decay]; + } + break; + case DECAY_SUSTAIN: + if (envelope_counter != sustain_level[sustain]) { + --envelope_counter; + } + break; + case RELEASE: + // The envelope counter can flip from 0x00 to 0xff by changing state to + // attack, then to release. The envelope counter will then continue + // counting down in the release state. + // This has been verified by sampling ENV3. + // NB! The operation below requires two's complement integer. + // + --envelope_counter &= 0xff; + break; + } + + // Check for change of exponential counter period. + switch (envelope_counter) { + case 0xff: + exponential_counter_period = 1; + break; + case 0x5d: + exponential_counter_period = 2; + break; + case 0x36: + exponential_counter_period = 4; + break; + case 0x1a: + exponential_counter_period = 8; + break; + case 0x0e: + exponential_counter_period = 16; + break; + case 0x06: + exponential_counter_period = 30; + break; + case 0x00: + exponential_counter_period = 1; + + // When the envelope counter is changed to zero, it is frozen at zero. + // This has been verified by sampling ENV3. + hold_zero = true; + break; + } + } +} + + +// ---------------------------------------------------------------------------- +// SID clocking - delta_t cycles. +// ---------------------------------------------------------------------------- +RESID_INLINE +void EnvelopeGenerator::clock(cycle_count delta_t) +{ + // Check for ADSR delay bug. + // If the rate counter comparison value is set below the current value of the + // rate counter, the counter will continue counting up until it wraps around + // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the + // envelope can finally be stepped. + // This has been verified by sampling ENV3. + // + + // NB! This requires two's complement integer. + int rate_step = rate_period - rate_counter; + if (rate_step <= 0) { + rate_step += 0x7fff; + } + + while (delta_t) { + if (delta_t < rate_step) { + rate_counter += delta_t; + if (rate_counter & 0x8000) { + ++rate_counter &= 0x7fff; + } + return; + } + + rate_counter = 0; + delta_t -= rate_step; + + // The first envelope step in the attack state also resets the exponential + // counter. This has been verified by sampling ENV3. + // + if (state == ATTACK || ++exponential_counter == exponential_counter_period) + { + exponential_counter = 0; + + // Check whether the envelope counter is frozen at zero. + if (hold_zero) { + rate_step = rate_period; + continue; + } + + switch (state) { + case ATTACK: + // The envelope counter can flip from 0xff to 0x00 by changing state to + // release, then to attack. The envelope counter is then frozen at + // zero; to unlock this situation the state must be changed to release, + // then to attack. This has been verified by sampling ENV3. + // + ++envelope_counter &= 0xff; + if (envelope_counter == 0xff) { + state = DECAY_SUSTAIN; + rate_period = rate_counter_period[decay]; + } + break; + case DECAY_SUSTAIN: + if (envelope_counter != sustain_level[sustain]) { + --envelope_counter; + } + break; + case RELEASE: + // The envelope counter can flip from 0x00 to 0xff by changing state to + // attack, then to release. The envelope counter will then continue + // counting down in the release state. + // This has been verified by sampling ENV3. + // NB! The operation below requires two's complement integer. + // + --envelope_counter &= 0xff; + break; + } + + // Check for change of exponential counter period. + switch (envelope_counter) { + case 0xff: + exponential_counter_period = 1; + break; + case 0x5d: + exponential_counter_period = 2; + break; + case 0x36: + exponential_counter_period = 4; + break; + case 0x1a: + exponential_counter_period = 8; + break; + case 0x0e: + exponential_counter_period = 16; + break; + case 0x06: + exponential_counter_period = 30; + break; + case 0x00: + exponential_counter_period = 1; + + // When the envelope counter is changed to zero, it is frozen at zero. + // This has been verified by sampling ENV3. + hold_zero = true; + break; + } + } + + rate_step = rate_period; + } +} + + +// ---------------------------------------------------------------------------- +// Read the envelope generator output. +// ---------------------------------------------------------------------------- +RESID_INLINE +reg8 EnvelopeGenerator::output() +{ + return envelope_counter; +} + +#endif // RESID_INLINING || defined(__ENVELOPE_CC__) + +#endif // not __ENVELOPE_H__ diff --git a/plugins/sid/extfilt.cc b/plugins/sid/extfilt.cc new file mode 100644 index 000000000..b875ee2ac --- /dev/null +++ b/plugins/sid/extfilt.cc @@ -0,0 +1,79 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#define __EXTFILT_CC__ +#include "extfilt.h" + + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +ExternalFilter::ExternalFilter() +{ + reset(); + enable_filter(true); + set_chip_model(MOS6581); + + // Low-pass: R = 10kOhm, C = 1000pF; w0l = 1/RC = 1/(1e4*1e-9) = 100000 + // High-pass: R = 1kOhm, C = 10uF; w0h = 1/RC = 1/(1e3*1e-5) = 100 + // Multiply with 1.048576 to facilitate division by 1 000 000 by right- + // shifting 20 times (2 ^ 20 = 1048576). + + w0lp = 104858; + w0hp = 105; +} + + +// ---------------------------------------------------------------------------- +// Enable filter. +// ---------------------------------------------------------------------------- +void ExternalFilter::enable_filter(bool enable) +{ + enabled = enable; +} + + +// ---------------------------------------------------------------------------- +// Set chip model. +// ---------------------------------------------------------------------------- +void ExternalFilter::set_chip_model(chip_model model) +{ + if (model == MOS6581) { + // Maximum mixer DC output level; to be removed if the external + // filter is turned off: ((wave DC + voice DC)*voices + mixer DC)*volume + // See voice.cc and filter.cc for an explanation of the values. + mixer_DC = ((((0x800 - 0x380) + 0x800)*0xff*3 - 0xfff*0xff/18) >> 7)*0x0f; + } + else { + // No DC offsets in the MOS8580. + mixer_DC = 0; + } +} + + +// ---------------------------------------------------------------------------- +// SID reset. +// ---------------------------------------------------------------------------- +void ExternalFilter::reset() +{ + // State of filter. + Vlp = 0; + Vhp = 0; + Vo = 0; +} diff --git a/plugins/sid/extfilt.h b/plugins/sid/extfilt.h new file mode 100644 index 000000000..0ab105235 --- /dev/null +++ b/plugins/sid/extfilt.h @@ -0,0 +1,164 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __EXTFILT_H__ +#define __EXTFILT_H__ + +#include "siddefs.h" + +// ---------------------------------------------------------------------------- +// The audio output stage in a Commodore 64 consists of two STC networks, +// a low-pass filter with 3-dB frequency 16kHz followed by a high-pass +// filter with 3-dB frequency 16Hz (the latter provided an audio equipment +// input impedance of 1kOhm). +// The STC networks are connected with a BJT supposedly meant to act as +// a unity gain buffer, which is not really how it works. A more elaborate +// model would include the BJT, however DC circuit analysis yields BJT +// base-emitter and emitter-base impedances sufficiently low to produce +// additional low-pass and high-pass 3dB-frequencies in the order of hundreds +// of kHz. This calls for a sampling frequency of several MHz, which is far +// too high for practical use. +// ---------------------------------------------------------------------------- +class ExternalFilter +{ +public: + ExternalFilter(); + + void enable_filter(bool enable); + void set_chip_model(chip_model model); + + RESID_INLINE void clock(sound_sample Vi); + RESID_INLINE void clock(cycle_count delta_t, sound_sample Vi); + void reset(); + + // Audio output (20 bits). + RESID_INLINE sound_sample output(); + +protected: + // Filter enabled. + bool enabled; + + // Maximum mixer DC offset. + sound_sample mixer_DC; + + // State of filters. + sound_sample Vlp; // lowpass + sound_sample Vhp; // highpass + sound_sample Vo; + + // Cutoff frequencies. + sound_sample w0lp; + sound_sample w0hp; + +friend class SID; +}; + + +// ---------------------------------------------------------------------------- +// Inline functions. +// The following functions are defined inline because they are called every +// time a sample is calculated. +// ---------------------------------------------------------------------------- + +#if RESID_INLINING || defined(__EXTFILT_CC__) + +// ---------------------------------------------------------------------------- +// SID clocking - 1 cycle. +// ---------------------------------------------------------------------------- +RESID_INLINE +void ExternalFilter::clock(sound_sample Vi) +{ + // This is handy for testing. + if (!enabled) { + // Remove maximum DC level since there is no filter to do it. + Vlp = Vhp = 0; + Vo = Vi - mixer_DC; + return; + } + + // delta_t is converted to seconds given a 1MHz clock by dividing + // with 1 000 000. + + // Calculate filter outputs. + // Vo = Vlp - Vhp; + // Vlp = Vlp + w0lp*(Vi - Vlp)*delta_t; + // Vhp = Vhp + w0hp*(Vlp - Vhp)*delta_t; + + sound_sample dVlp = (w0lp >> 8)*(Vi - Vlp) >> 12; + sound_sample dVhp = w0hp*(Vlp - Vhp) >> 20; + Vo = Vlp - Vhp; + Vlp += dVlp; + Vhp += dVhp; +} + +// ---------------------------------------------------------------------------- +// SID clocking - delta_t cycles. +// ---------------------------------------------------------------------------- +RESID_INLINE +void ExternalFilter::clock(cycle_count delta_t, + sound_sample Vi) +{ + // This is handy for testing. + if (!enabled) { + // Remove maximum DC level since there is no filter to do it. + Vlp = Vhp = 0; + Vo = Vi - mixer_DC; + return; + } + + // Maximum delta cycles for the external filter to work satisfactorily + // is approximately 8. + cycle_count delta_t_flt = 8; + + while (delta_t) { + if (delta_t < delta_t_flt) { + delta_t_flt = delta_t; + } + + // delta_t is converted to seconds given a 1MHz clock by dividing + // with 1 000 000. + + // Calculate filter outputs. + // Vo = Vlp - Vhp; + // Vlp = Vlp + w0lp*(Vi - Vlp)*delta_t; + // Vhp = Vhp + w0hp*(Vlp - Vhp)*delta_t; + + sound_sample dVlp = (w0lp*delta_t_flt >> 8)*(Vi - Vlp) >> 12; + sound_sample dVhp = w0hp*delta_t_flt*(Vlp - Vhp) >> 20; + Vo = Vlp - Vhp; + Vlp += dVlp; + Vhp += dVhp; + + delta_t -= delta_t_flt; + } +} + + +// ---------------------------------------------------------------------------- +// Audio output (19.5 bits). +// ---------------------------------------------------------------------------- +RESID_INLINE +sound_sample ExternalFilter::output() +{ + return Vo; +} + +#endif // RESID_INLINING || defined(__EXTFILT_CC__) + +#endif // not __EXTFILT_H__ diff --git a/plugins/sid/filter.cc b/plugins/sid/filter.cc new file mode 100644 index 000000000..fc603fbd4 --- /dev/null +++ b/plugins/sid/filter.cc @@ -0,0 +1,305 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#define __FILTER_CC__ +#include "filter.h" + +// Maximum cutoff frequency is specified as +// FCmax = 2.6e-5/C = 2.6e-5/2200e-12 = 11818. +// +// Measurements indicate a cutoff frequency range of approximately +// 220Hz - 18kHz on a MOS6581 fitted with 470pF capacitors. The function +// mapping FC to cutoff frequency has the shape of the tanh function, with +// a discontinuity at FCHI = 0x80. +// In contrast, the MOS8580 almost perfectly corresponds with the +// specification of a linear mapping from 30Hz to 12kHz. +// +// The mappings have been measured by feeding the SID with an external +// signal since the chip itself is incapable of generating waveforms of +// higher fundamental frequency than 4kHz. It is best to use the bandpass +// output at full resonance to pick out the cutoff frequency at any given +// FC setting. +// +// The mapping function is specified with spline interpolation points and +// the function values are retrieved via table lookup. +// +// NB! Cutoff frequency characteristics may vary, we have modeled two +// particular Commodore 64s. + +fc_point Filter::f0_points_6581[] = +{ + // FC f FCHI FCLO + // ---------------------------- + { 0, 220 }, // 0x00 - repeated end point + { 0, 220 }, // 0x00 + { 128, 230 }, // 0x10 + { 256, 250 }, // 0x20 + { 384, 300 }, // 0x30 + { 512, 420 }, // 0x40 + { 640, 780 }, // 0x50 + { 768, 1600 }, // 0x60 + { 832, 2300 }, // 0x68 + { 896, 3200 }, // 0x70 + { 960, 4300 }, // 0x78 + { 992, 5000 }, // 0x7c + { 1008, 5400 }, // 0x7e + { 1016, 5700 }, // 0x7f + { 1023, 6000 }, // 0x7f 0x07 + { 1023, 6000 }, // 0x7f 0x07 - discontinuity + { 1024, 4600 }, // 0x80 - + { 1024, 4600 }, // 0x80 + { 1032, 4800 }, // 0x81 + { 1056, 5300 }, // 0x84 + { 1088, 6000 }, // 0x88 + { 1120, 6600 }, // 0x8c + { 1152, 7200 }, // 0x90 + { 1280, 9500 }, // 0xa0 + { 1408, 12000 }, // 0xb0 + { 1536, 14500 }, // 0xc0 + { 1664, 16000 }, // 0xd0 + { 1792, 17100 }, // 0xe0 + { 1920, 17700 }, // 0xf0 + { 2047, 18000 }, // 0xff 0x07 + { 2047, 18000 } // 0xff 0x07 - repeated end point +}; + +fc_point Filter::f0_points_8580[] = +{ + // FC f FCHI FCLO + // ---------------------------- + { 0, 0 }, // 0x00 - repeated end point + { 0, 0 }, // 0x00 + { 128, 800 }, // 0x10 + { 256, 1600 }, // 0x20 + { 384, 2500 }, // 0x30 + { 512, 3300 }, // 0x40 + { 640, 4100 }, // 0x50 + { 768, 4800 }, // 0x60 + { 896, 5600 }, // 0x70 + { 1024, 6500 }, // 0x80 + { 1152, 7500 }, // 0x90 + { 1280, 8400 }, // 0xa0 + { 1408, 9200 }, // 0xb0 + { 1536, 9800 }, // 0xc0 + { 1664, 10500 }, // 0xd0 + { 1792, 11000 }, // 0xe0 + { 1920, 11700 }, // 0xf0 + { 2047, 12500 }, // 0xff 0x07 + { 2047, 12500 } // 0xff 0x07 - repeated end point +}; + + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +Filter::Filter() +{ + fc = 0; + + res = 0; + + filt = 0; + + voice3off = 0; + + hp_bp_lp = 0; + + vol = 0; + + // State of filter. + Vhp = 0; + Vbp = 0; + Vlp = 0; + Vnf = 0; + + enable_filter(true); + + // Create mappings from FC to cutoff frequency. + interpolate(f0_points_6581, f0_points_6581 + + sizeof(f0_points_6581)/sizeof(*f0_points_6581) - 1, + PointPlotter(f0_6581), 1.0); + interpolate(f0_points_8580, f0_points_8580 + + sizeof(f0_points_8580)/sizeof(*f0_points_8580) - 1, + PointPlotter(f0_8580), 1.0); + + set_chip_model(MOS6581); +} + + +// ---------------------------------------------------------------------------- +// Enable filter. +// ---------------------------------------------------------------------------- +void Filter::enable_filter(bool enable) +{ + enabled = enable; +} + + +// ---------------------------------------------------------------------------- +// Set chip model. +// ---------------------------------------------------------------------------- +void Filter::set_chip_model(chip_model model) +{ + if (model == MOS6581) { + // The mixer has a small input DC offset. This is found as follows: + // + // The "zero" output level of the mixer measured on the SID audio + // output pin is 5.50V at zero volume, and 5.44 at full + // volume. This yields a DC offset of (5.44V - 5.50V) = -0.06V. + // + // The DC offset is thus -0.06V/1.05V ~ -1/18 of the dynamic range + // of one voice. See voice.cc for measurement of the dynamic + // range. + + mixer_DC = -0xfff*0xff/18 >> 7; + + f0 = f0_6581; + f0_points = f0_points_6581; + f0_count = sizeof(f0_points_6581)/sizeof(*f0_points_6581); + } + else { + // No DC offsets in the MOS8580. + mixer_DC = 0; + + f0 = f0_8580; + f0_points = f0_points_8580; + f0_count = sizeof(f0_points_8580)/sizeof(*f0_points_8580); + } + + set_w0(); + set_Q(); +} + + +// ---------------------------------------------------------------------------- +// SID reset. +// ---------------------------------------------------------------------------- +void Filter::reset() +{ + fc = 0; + + res = 0; + + filt = 0; + + voice3off = 0; + + hp_bp_lp = 0; + + vol = 0; + + // State of filter. + Vhp = 0; + Vbp = 0; + Vlp = 0; + Vnf = 0; + + set_w0(); + set_Q(); +} + + +// ---------------------------------------------------------------------------- +// Register functions. +// ---------------------------------------------------------------------------- +void Filter::writeFC_LO(reg8 fc_lo) +{ + fc = fc & 0x7f8 | fc_lo & 0x007; + set_w0(); +} + +void Filter::writeFC_HI(reg8 fc_hi) +{ + fc = (fc_hi << 3) & 0x7f8 | fc & 0x007; + set_w0(); +} + +void Filter::writeRES_FILT(reg8 res_filt) +{ + res = (res_filt >> 4) & 0x0f; + set_Q(); + + filt = res_filt & 0x0f; +} + +void Filter::writeMODE_VOL(reg8 mode_vol) +{ + voice3off = mode_vol & 0x80; + + hp_bp_lp = (mode_vol >> 4) & 0x07; + + vol = mode_vol & 0x0f; +} + +// Set filter cutoff frequency. +void Filter::set_w0() +{ + const double pi = 3.1415926535897932385; + + // Multiply with 1.048576 to facilitate division by 1 000 000 by right- + // shifting 20 times (2 ^ 20 = 1048576). + w0 = static_cast(2*pi*f0[fc]*1.048576); + + // Limit f0 to 16kHz to keep 1 cycle filter stable. + const sound_sample w0_max_1 = static_cast(2*pi*16000*1.048576); + w0_ceil_1 = w0 <= w0_max_1 ? w0 : w0_max_1; + + // Limit f0 to 4kHz to keep delta_t cycle filter stable. + const sound_sample w0_max_dt = static_cast(2*pi*4000*1.048576); + w0_ceil_dt = w0 <= w0_max_dt ? w0 : w0_max_dt; +} + +// Set filter resonance. +void Filter::set_Q() +{ + // Q is controlled linearly by res. Q has approximate range [0.707, 1.7]. + // As resonance is increased, the filter must be clocked more often to keep + // stable. + + // The coefficient 1024 is dispensed of later by right-shifting 10 times + // (2 ^ 10 = 1024). + _1024_div_Q = static_cast(1024.0/(0.707 + 1.0*res/0x0f)); +} + +// ---------------------------------------------------------------------------- +// Spline functions. +// ---------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// Return the array of spline interpolation points used to map the FC register +// to filter cutoff frequency. +// ---------------------------------------------------------------------------- +void Filter::fc_default(const fc_point*& points, int& count) +{ + points = f0_points; + count = f0_count; +} + +// ---------------------------------------------------------------------------- +// Given an array of interpolation points p with n points, the following +// statement will specify a new FC mapping: +// interpolate(p, p + n - 1, filter.fc_plotter(), 1.0); +// Note that the x range of the interpolation points *must* be [0, 2047], +// and that additional end points *must* be present since the end points +// are not interpolated. +// ---------------------------------------------------------------------------- +PointPlotter Filter::fc_plotter() +{ + return PointPlotter(f0); +} diff --git a/plugins/sid/filter.h b/plugins/sid/filter.h new file mode 100644 index 000000000..90f3c439b --- /dev/null +++ b/plugins/sid/filter.h @@ -0,0 +1,531 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __FILTER_H__ +#define __FILTER_H__ + +#include "siddefs.h" +#include "spline.h" + +// ---------------------------------------------------------------------------- +// The SID filter is modeled with a two-integrator-loop biquadratic filter, +// which has been confirmed by Bob Yannes to be the actual circuit used in +// the SID chip. +// +// Measurements show that excellent emulation of the SID filter is achieved, +// except when high resonance is combined with high sustain levels. +// In this case the SID op-amps are performing less than ideally and are +// causing some peculiar behavior of the SID filter. This however seems to +// have more effect on the overall amplitude than on the color of the sound. +// +// The theory for the filter circuit can be found in "Microelectric Circuits" +// by Adel S. Sedra and Kenneth C. Smith. +// The circuit is modeled based on the explanation found there except that +// an additional inverter is used in the feedback from the bandpass output, +// allowing the summer op-amp to operate in single-ended mode. This yields +// inverted filter outputs with levels independent of Q, which corresponds with +// the results obtained from a real SID. +// +// We have been able to model the summer and the two integrators of the circuit +// to form components of an IIR filter. +// Vhp is the output of the summer, Vbp is the output of the first integrator, +// and Vlp is the output of the second integrator in the filter circuit. +// +// According to Bob Yannes, the active stages of the SID filter are not really +// op-amps. Rather, simple NMOS inverters are used. By biasing an inverter +// into its region of quasi-linear operation using a feedback resistor from +// input to output, a MOS inverter can be made to act like an op-amp for +// small signals centered around the switching threshold. +// +// Qualified guesses at SID filter schematics are depicted below. +// +// SID filter +// ---------- +// +// ----------------------------------------------- +// | | +// | ---Rq-- | +// | | | | +// | --------------|--R-----[A>--|--R-----[A>--| +// | | | | +// vi -----R1-- | | | +// +// vhp vbp vlp +// +// +// vi - input voltage +// vhp - highpass output +// vbp - bandpass output +// vlp - lowpass output +// [A> - op-amp +// R1 - summer resistor +// Rq - resistor array controlling resonance (4 resistors) +// R - NMOS FET voltage controlled resistor controlling cutoff frequency +// Rs - shunt resitor +// C - capacitor +// +// +// +// SID integrator +// -------------- +// +// V+ +// +// | +// | +// -----| +// | | +// | ||-- +// -|| +// ---C--- ||-> +// | | | +// |---Rs-----------|---- vo +// | | +// | ||-- +// vi ---- -----|------------|| +// | ^ | ||-> +// |___| | | +// ----- | | +// | | | +// |---R2-- | +// | +// R1 V- +// | +// | +// +// Vw +// +// ---------------------------------------------------------------------------- +class Filter +{ +public: + Filter(); + + void enable_filter(bool enable); + void set_chip_model(chip_model model); + + RESID_INLINE + void clock(sound_sample voice1, sound_sample voice2, sound_sample voice3, + sound_sample ext_in); + RESID_INLINE + void clock(cycle_count delta_t, + sound_sample voice1, sound_sample voice2, sound_sample voice3, + sound_sample ext_in); + void reset(); + + // Write registers. + void writeFC_LO(reg8); + void writeFC_HI(reg8); + void writeRES_FILT(reg8); + void writeMODE_VOL(reg8); + + // SID audio output (16 bits). + sound_sample output(); + + // Spline functions. + void fc_default(const fc_point*& points, int& count); + PointPlotter fc_plotter(); + +protected: + void set_w0(); + void set_Q(); + + // Filter enabled. + bool enabled; + + // Filter cutoff frequency. + reg12 fc; + + // Filter resonance. + reg8 res; + + // Selects which inputs to route through filter. + reg8 filt; + + // Switch voice 3 off. + reg8 voice3off; + + // Highpass, bandpass, and lowpass filter modes. + reg8 hp_bp_lp; + + // Output master volume. + reg4 vol; + + // Mixer DC offset. + sound_sample mixer_DC; + + // State of filter. + sound_sample Vhp; // highpass + sound_sample Vbp; // bandpass + sound_sample Vlp; // lowpass + sound_sample Vnf; // not filtered + + // Cutoff frequency, resonance. + sound_sample w0, w0_ceil_1, w0_ceil_dt; + sound_sample _1024_div_Q; + + // Cutoff frequency tables. + // FC is an 11 bit register. + sound_sample f0_6581[2048]; + sound_sample f0_8580[2048]; + sound_sample* f0; + static fc_point f0_points_6581[]; + static fc_point f0_points_8580[]; + fc_point* f0_points; + int f0_count; + +friend class SID; +}; + + +// ---------------------------------------------------------------------------- +// Inline functions. +// The following functions are defined inline because they are called every +// time a sample is calculated. +// ---------------------------------------------------------------------------- + +#if RESID_INLINING || defined(__FILTER_CC__) + +// ---------------------------------------------------------------------------- +// SID clocking - 1 cycle. +// ---------------------------------------------------------------------------- +RESID_INLINE +void Filter::clock(sound_sample voice1, + sound_sample voice2, + sound_sample voice3, + sound_sample ext_in) +{ + // Scale each voice down from 20 to 13 bits. + voice1 >>= 7; + voice2 >>= 7; + + // NB! Voice 3 is not silenced by voice3off if it is routed through + // the filter. + if (voice3off && !(filt & 0x04)) { + voice3 = 0; + } + else { + voice3 >>= 7; + } + + ext_in >>= 7; + + // This is handy for testing. + if (!enabled) { + Vnf = voice1 + voice2 + voice3 + ext_in; + Vhp = Vbp = Vlp = 0; + return; + } + + // Route voices into or around filter. + // The code below is expanded to a switch for faster execution. + // (filt1 ? Vi : Vnf) += voice1; + // (filt2 ? Vi : Vnf) += voice2; + // (filt3 ? Vi : Vnf) += voice3; + + sound_sample Vi; + + switch (filt) { + default: + case 0x0: + Vi = 0; + Vnf = voice1 + voice2 + voice3 + ext_in; + break; + case 0x1: + Vi = voice1; + Vnf = voice2 + voice3 + ext_in; + break; + case 0x2: + Vi = voice2; + Vnf = voice1 + voice3 + ext_in; + break; + case 0x3: + Vi = voice1 + voice2; + Vnf = voice3 + ext_in; + break; + case 0x4: + Vi = voice3; + Vnf = voice1 + voice2 + ext_in; + break; + case 0x5: + Vi = voice1 + voice3; + Vnf = voice2 + ext_in; + break; + case 0x6: + Vi = voice2 + voice3; + Vnf = voice1 + ext_in; + break; + case 0x7: + Vi = voice1 + voice2 + voice3; + Vnf = ext_in; + break; + case 0x8: + Vi = ext_in; + Vnf = voice1 + voice2 + voice3; + break; + case 0x9: + Vi = voice1 + ext_in; + Vnf = voice2 + voice3; + break; + case 0xa: + Vi = voice2 + ext_in; + Vnf = voice1 + voice3; + break; + case 0xb: + Vi = voice1 + voice2 + ext_in; + Vnf = voice3; + break; + case 0xc: + Vi = voice3 + ext_in; + Vnf = voice1 + voice2; + break; + case 0xd: + Vi = voice1 + voice3 + ext_in; + Vnf = voice2; + break; + case 0xe: + Vi = voice2 + voice3 + ext_in; + Vnf = voice1; + break; + case 0xf: + Vi = voice1 + voice2 + voice3 + ext_in; + Vnf = 0; + break; + } + + // delta_t = 1 is converted to seconds given a 1MHz clock by dividing + // with 1 000 000. + + // Calculate filter outputs. + // Vhp = Vbp/Q - Vlp - Vi; + // dVbp = -w0*Vhp*dt; + // dVlp = -w0*Vbp*dt; + + sound_sample dVbp = (w0_ceil_1*Vhp >> 20); + sound_sample dVlp = (w0_ceil_1*Vbp >> 20); + Vbp -= dVbp; + Vlp -= dVlp; + Vhp = (Vbp*_1024_div_Q >> 10) - Vlp - Vi; +} + +// ---------------------------------------------------------------------------- +// SID clocking - delta_t cycles. +// ---------------------------------------------------------------------------- +RESID_INLINE +void Filter::clock(cycle_count delta_t, + sound_sample voice1, + sound_sample voice2, + sound_sample voice3, + sound_sample ext_in) +{ + // Scale each voice down from 20 to 13 bits. + voice1 >>= 7; + voice2 >>= 7; + + // NB! Voice 3 is not silenced by voice3off if it is routed through + // the filter. + if (voice3off && !(filt & 0x04)) { + voice3 = 0; + } + else { + voice3 >>= 7; + } + + ext_in >>= 7; + + // Enable filter on/off. + // This is not really part of SID, but is useful for testing. + // On slow CPUs it may be necessary to bypass the filter to lower the CPU + // load. + if (!enabled) { + Vnf = voice1 + voice2 + voice3 + ext_in; + Vhp = Vbp = Vlp = 0; + return; + } + + // Route voices into or around filter. + // The code below is expanded to a switch for faster execution. + // (filt1 ? Vi : Vnf) += voice1; + // (filt2 ? Vi : Vnf) += voice2; + // (filt3 ? Vi : Vnf) += voice3; + + sound_sample Vi; + + switch (filt) { + default: + case 0x0: + Vi = 0; + Vnf = voice1 + voice2 + voice3 + ext_in; + break; + case 0x1: + Vi = voice1; + Vnf = voice2 + voice3 + ext_in; + break; + case 0x2: + Vi = voice2; + Vnf = voice1 + voice3 + ext_in; + break; + case 0x3: + Vi = voice1 + voice2; + Vnf = voice3 + ext_in; + break; + case 0x4: + Vi = voice3; + Vnf = voice1 + voice2 + ext_in; + break; + case 0x5: + Vi = voice1 + voice3; + Vnf = voice2 + ext_in; + break; + case 0x6: + Vi = voice2 + voice3; + Vnf = voice1 + ext_in; + break; + case 0x7: + Vi = voice1 + voice2 + voice3; + Vnf = ext_in; + break; + case 0x8: + Vi = ext_in; + Vnf = voice1 + voice2 + voice3; + break; + case 0x9: + Vi = voice1 + ext_in; + Vnf = voice2 + voice3; + break; + case 0xa: + Vi = voice2 + ext_in; + Vnf = voice1 + voice3; + break; + case 0xb: + Vi = voice1 + voice2 + ext_in; + Vnf = voice3; + break; + case 0xc: + Vi = voice3 + ext_in; + Vnf = voice1 + voice2; + break; + case 0xd: + Vi = voice1 + voice3 + ext_in; + Vnf = voice2; + break; + case 0xe: + Vi = voice2 + voice3 + ext_in; + Vnf = voice1; + break; + case 0xf: + Vi = voice1 + voice2 + voice3 + ext_in; + Vnf = 0; + break; + } + + // Maximum delta cycles for the filter to work satisfactorily under current + // cutoff frequency and resonance constraints is approximately 8. + cycle_count delta_t_flt = 8; + + while (delta_t) { + if (delta_t < delta_t_flt) { + delta_t_flt = delta_t; + } + + // delta_t is converted to seconds given a 1MHz clock by dividing + // with 1 000 000. This is done in two operations to avoid integer + // multiplication overflow. + + // Calculate filter outputs. + // Vhp = Vbp/Q - Vlp - Vi; + // dVbp = -w0*Vhp*dt; + // dVlp = -w0*Vbp*dt; + sound_sample w0_delta_t = w0_ceil_dt*delta_t_flt >> 6; + + sound_sample dVbp = (w0_delta_t*Vhp >> 14); + sound_sample dVlp = (w0_delta_t*Vbp >> 14); + Vbp -= dVbp; + Vlp -= dVlp; + Vhp = (Vbp*_1024_div_Q >> 10) - Vlp - Vi; + + delta_t -= delta_t_flt; + } +} + + +// ---------------------------------------------------------------------------- +// SID audio output (20 bits). +// ---------------------------------------------------------------------------- +RESID_INLINE +sound_sample Filter::output() +{ + // This is handy for testing. + if (!enabled) { + return (Vnf + mixer_DC)*static_cast(vol); + } + + // Mix highpass, bandpass, and lowpass outputs. The sum is not + // weighted, this can be confirmed by sampling sound output for + // e.g. bandpass, lowpass, and bandpass+lowpass from a SID chip. + + // The code below is expanded to a switch for faster execution. + // if (hp) Vf += Vhp; + // if (bp) Vf += Vbp; + // if (lp) Vf += Vlp; + + sound_sample Vf; + + switch (hp_bp_lp) { + default: + case 0x0: + Vf = 0; + break; + case 0x1: + Vf = Vlp; + break; + case 0x2: + Vf = Vbp; + break; + case 0x3: + Vf = Vlp + Vbp; + break; + case 0x4: + Vf = Vhp; + break; + case 0x5: + Vf = Vlp + Vhp; + break; + case 0x6: + Vf = Vbp + Vhp; + break; + case 0x7: + Vf = Vlp + Vbp + Vhp; + break; + } + + // Sum non-filtered and filtered output. + // Multiply the sum with volume. + return (Vnf + Vf + mixer_DC)*static_cast(vol); +} + +#endif // RESID_INLINING || defined(__FILTER_CC__) + +#endif // not __FILTER_H__ diff --git a/plugins/sid/filter.png b/plugins/sid/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..21a58e4aa4d591c45ab01fedb39f3579e3eab3ec GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^GC<77!3HF4glkxU6k~CayA#8@b22Z19JVBHcNd2L zAh=-f^2tCE&H|6fVg?3oVGw3ym^DWND9B#o>FdgVgM*Pxom2K!MP|ku_QG`p**uBL&4qCHz2%`PaLS|l&6bhh{frvQ+&Ca9e7&fcYQG66A?e^ zEaD%q$L)BtsBP!oX7&Qb9Tl-1i5EitEOfHxNV(U-Q`soUP@;D%GN!<&oB!I^+h_U} z7$mr!6o?4=d=2FOtZN~DTlih(w$qmittLqYFEeGBu*`f*?&_#%cegIniQjC;(|q{t zD;b8}>lS~X$1vkL|6X;^_w%Ek$M_VtUt2e=EW=V!Y4fi2)-lc^uCu<^_Ak;FVdQ&MBb@ E0B}u#>;M1& literal 0 HcmV?d00001 diff --git a/plugins/sid/filterred.png b/plugins/sid/filterred.png new file mode 100644 index 0000000000000000000000000000000000000000..50ee6fae24d46a22b957c692e68ee7ecfac81557 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^GC<77!3HF4glkxU6k~CayA#8@b22Z19JVBHcNd2L zAh=-f^2tCE&H|6fVg?3oVGw3ym^DWND9B#o>FdgVgM*Px-N5O|Gh3jLWQl7;iF1B# zZfaf$gL6@8Vo7R>LV0FMhJw4NZ$Nk>pEyv_Cr=m05R22vDG3Qb)~{WA)ItBi5r_1K z>xUjcIuvnpO4I)nKPFFp``_Ph+y9N7$;p$Owr<_}FZrwD{e6c`xP!z}&Z(fPgg&ebxsLQ0G4T@F8}}l literal 0 HcmV?d00001 diff --git a/plugins/sid/hp.png b/plugins/sid/hp.png new file mode 100644 index 0000000000000000000000000000000000000000..082dab535f3ae9cb95f95cc9b0aeedd88418c61e GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngd!3HEhbh*6;QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf4Gu;&bKU^I9koCq$r9Iy66gHf z+|;}h2Ir#G#FEq$h4Rdj3z*!-AsXk`PO{}{b`WVfu6j1=W&{Uk z#Bt_|mc1?Y;vd;=M^*{FPZZF3^G0mTMxi+-hAsx2KP4-4tUvsC_BNWE;p0+11_74m z{j>Ux3$I$$6w$kDUyYC04@Y~`$KMiEPTHKe>{ISF^qKVJUG`c_U*X%^QYG3#yaXA{ zpCn2=sFYiz(RA(CyYg7}>!pDrtfw~JQRi0tQ4#O2smgd^Tkg5fd;H_3rIxQV@l{;v zGA%V@R@(08<)3Qhk4b!~?YHQAXmQT$+vcdp_Sf>>?0| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf4Gu;&a}8;)94nxZWQl7;iF1B# zZfaf$gL6@8Vo7R>LV0FMhJw4NZ$Nk>pEyv_e@_?35RLO|Cm!@-N)&0`UniO(N(JHxOUMfEx0@K%BEgD<%x`(g@yq~Oe$l2Eeu4n z*!iYcKm0WJ^j(G)(Wz`Ju9r`bS`}heD8nwwE4Sv-rIe#mQQ4Nf7vA$9*t9d_O|eBK z>(obDlb^o%#kN27bI9$)^U{K|)b1`kZqaGOYq#>=?m6`=bJ`Am|MT?i+}!UIqo+RH zv`us|w?f_NX;XqW-EiMJ!Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iON3 z6BP)(SaaF{00du2L_t(&-tC%eOj~6b$N#<1Qd(F`>F5fzQtj$!f^24CV}XfT=!Yfv zVGAT(9WWqniHpV%FI&`TGM%>}34|Cn*oDok?h-MJV^cSyY{ARy)FQ~B>7WOcJ1vy9 zr>&o6va~&?*wS(mp3kTM^Z%XqeV^xjpSP?)AP@k9gAIlU;{mv_6bl3b@OXXjcu4sC zesI`q@OWJCk~mo0q49MUebpoE(anZA2Mkw)~hp7 zuu%5q32gC^A_>VTm3lr#yL#SEHEz%nL2;Mt4A)vOZu3XM!)DXE79w4%+29f9fD1sr&-1Fl8ylEft96y$2wL6x0>WIh**ZW6YU3G@z( zF5CJE3GiXdRou5vMOH{yER+;#QB|=GTQ{j85b%PYak)IWeP;+K&v%0zINm`+z0!`e_%cQ9|+f<7jWd?O2`)6W~R&0Z2UDSqBMajqt@g+lrAeo2e zcMZ_wWYSmSS%-_dWOLa_6A7XQs5KO!)=;$Cl?WPv2YEGIkfa}TP8Tv|X;Hm!=J;{U zw6;dJ&k+b9Z*B%(r=tg0n?Y~v&w)|O`4~y~9S)Fod&JKZMkBIJCh#;G>M5kkmePuS z-!l;RDdHO+2eD@lJXR|;z!Q(j!RJw*Ft2?58|D|>afcuY0)){BFF}L{NS6qq(`Hfc zB%O1v4GgS7rxoqV1P%m(xETW(TZ652~@t=hRJDXLLl5`Ge&D_ z;CDLXf215~I|J6$FJl6dQd}ImxqIm7C7k~J_Ocx6^L0wR{Cw&19qJ#nRdznt7;$G} zDQ%Tlcc;U)*YEZYV|QK4l6ymR5o>_3o4F@*mH6n*a&WmTd%s8N?pb|4J~+IaHnpx; z001a2+l=;xYDmN>%me^{rwg^{Jb4fW8*`Wm00244446LMkB{Ffhf*P79smGvIBZmu zZN@jIdc1#l7xFe_FWdEL)M+%*VB|GxxJblBH*59J9;*P+#lLo{&LbP+j%ok^002ov JPDHLkV1j&KI;j8v literal 0 HcmV?d00001 diff --git a/plugins/sid/lp.png b/plugins/sid/lp.png new file mode 100644 index 0000000000000000000000000000000000000000..012140697330de389ae9d0e3b7513fe228ef86a3 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngd!3HEhbh*6;QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf4Gu;&6Vu?tULV0FMhJw4NZ$Nk>pEyv_I!_nJ5RLOoC)si}I|#Jy=gqu!?_5Kv zO@sT5;10Rtx2{dD;BRi7n~E{z}+wGYZW6>CVbdQ*t!=!zGHtCq2-~4M|_^f5`=M?)jn9XcYRN!%5wQAA2Z2PqA zwG6C|3sNKh%=m0`Jjy#zq$KwH|8v| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf4Gu;&Q=#_-*Fok>mbgZgIOpf) zrskC}I2WZRmZYXAlxLP?D7bt2281{Ai31fK^K@|x(Kw%+l92G@yn|XoVnRZ~g=^Q8 zJSX?`=o~&b*IIJM1lIm;?#U?}!py73XP$lH zkHhEB2mJV;dHB#{^#^ro8J`!wzb`4mKR@Bdxg)18tXA=#wfVDoZd%3fr`*o>mg(~3 z=*Lf3w)6h=cE<^`yBFTSKKtSH9V}(`kD0h)VtDx9u95in=l|h=iuamfrvEoS1lsh! y@Z`?jyZ@&Ho$5ck;@R!;89OS<%FESHr!kyA=Ex!0W!Me$5re0zpUXO@geCw_#E%I8 literal 0 HcmV?d00001 diff --git a/plugins/sid/noise.png b/plugins/sid/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..bceefd44bf13f5350ca4bad53631f2f3944faf35 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPS2P2!VRm8pLD}h3iC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3hti10pX2&;y|lpJzX3_G|tbRWSGU|DAHzsG-;-Bj-J3l z<`&Q0$%;$v-V@F!5@wzq@g{19uVAvaOU`DFNltUzj!3^?Eql21V&FlCF9!|m-`B@~ z{yd%GVb@BAkk#A89rx8c|E!p}?EU|?(+q3Fq#L5vKI`#&e)HwgL-W{YpH&O|!sM|3 z|1-X=`^wwjE_aveZ5NJkak=*T>q&hjquGBga@UFqPK?tROzxRd_Q3VwmDgV{7o6+e z`t5zeB@@3b^?{x*B7~FVa1u zeQQEatBDfFrnz$yl(#+7-?(9u@WzYh+^R1gbJ`+Ulc3x&Av`(BN$%KQE3xZ3g32>^ zba;NBoq6|f8B>FSg9XFPGbQl>R<@oSs*}y%{FCNmT2n8gw0mz@gj zYh+N^+PZV!nMk=X`?D`a`Fo$;eQ(x5o%YR;peaF29oM3mn$N7dCgq-Od!pwv>w(!tpB7u(hy?~S NgQu&X%Q~loCIDDbxm*AM literal 0 HcmV?d00001 diff --git a/plugins/sid/pot.cc b/plugins/sid/pot.cc new file mode 100644 index 000000000..b60b2ec75 --- /dev/null +++ b/plugins/sid/pot.cc @@ -0,0 +1,26 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "pot.h" + +reg8 Potentiometer::readPOT() +{ + // NB! Not modeled. + return 0xff; +} diff --git a/plugins/sid/pot.h b/plugins/sid/pot.h new file mode 100644 index 000000000..6d44cb1a0 --- /dev/null +++ b/plugins/sid/pot.h @@ -0,0 +1,31 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __POT_H__ +#define __POT_H__ + +#include "siddefs.h" + +class Potentiometer +{ +public: + reg8 readPOT(); +}; + +#endif diff --git a/plugins/sid/pulse.png b/plugins/sid/pulse.png new file mode 100644 index 0000000000000000000000000000000000000000..a2dbe5935e7f24cbeb353034d694ea793757c0a6 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPS2P2z?lG)MjT|gnp64!_l=ltB< z)VvY~=c3falGGH1^30M91$R&1fbd2>aiCQyo-U3d8t3OuI+%6HL7;6v%V!}|xi=e6 zYPUG(S8`OJa9sOd?aK5(7Z%M3r|u=?o2{*FRooVRUBG<$-quhd3UNY{o#XDpEavv>pk>GnJoqzOULBj64kLEnCw0N@ee!lI0m1B=jidxJ+ zKhsbBOxpVz9WjO;xBTbkOmE8O>rPm4O%J@-9T!AS%j8!$y=k}oPkE`VjjdN_*YW}bmBG{1&t;ucLK6TE`>l%r literal 0 HcmV?d00001 diff --git a/plugins/sid/pulsered.png b/plugins/sid/pulsered.png new file mode 100644 index 0000000000000000000000000000000000000000..81940fd07cd863af87a79fdc4c4860345c1b7d9d GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPS2P2!Ncx7(g4WN)@iEBiObAE1a zYF-J0b5UwyNotBhd1gt5g1e`0KzJjcIM6B;PZ!4!jq`ISo%UjO6ma!F_EJSDDMid# zr73%}7|)LRd$T_a|4P*R(^1o;(A3?qVzHXE@#MNtvCjuQLppeQT|?(qcdyH1JY?_3 zVIVUvkCm70IIBgcvfFz3-bX5ZbuFv*eb9dzA}zO>N6_Nt+oCI(*S9X+RD;H(6X;UY2xm%z69% z>bi3oEC#Zy4T70XZY*nM9Upv5J=c}6mQntS_2>K7169{t-jef>?}7J5F~0C;DR(b+ zKUlMR?kdeSn-#7+IJRQ(J;qzyO$CKFw2wAyx;S<7uF`@#{gU4wAG5OS%{;R6`gTe~DWM4f*QB#r literal 0 HcmV?d00001 diff --git a/plugins/sid/ring.png b/plugins/sid/ring.png new file mode 100644 index 0000000000000000000000000000000000000000..b81332e40b5fbd2e9ecba678bbda9bf70579f957 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^GC<7F!3HG1`>$UJq!^2X+?^QKos)S9lk5Zkb^|q{0yawEX~U| zgiMH2irCY%Jz(>cpqQK79{dU4^Oj7QYTF!ZYJS2=Cq!%h(|HamwS;rAY#=^6v9G4i&!2*`9x6+u5qUo$vod1SzzozT}>Et-xYI z*yay5@5|3C_3yfy?Y3CjY$UJq!^2X+?^QKos)S9lS| zxv6<249-QVi6yBi3gww484B*6z5(HleBwZ>_&r@5Lo7}wr!+MD=P6<8;o;%=zjf=@ z7pd~h!iHUa-Q1V2JDr}MzfyXMj*d?Wr(bC)?;E?C^z^eEe4-~moIBTaPQT9e)r-!2 zICpLqi0iy0hG&9TF$K-6=CDkRjsOig#-~Bv`-2D@#R)2nN-h5^zH;-p{zJbYV z4I={}SYv!4F=PM#4##(QT-&Pe*H4gZH;&(%_T%?={ji;V$NeSt)&4%U;h}EU9lzS& zeGgAh*XNmhf3Nc0L-zG`kFR|B|KEPiqnn4Ecw%Di@a%MQnzA$~$>Bn)HqX?qA|8Jq z9*L5Q9WSSQ-MnETk+oD+V$xDo$t8U<$32$nT=DsKLi6(bKTjR!@Mp$VT)ynYaD8Fu VB*yubYQXSg@O1TaS?83{1ONh{twI0* literal 0 HcmV?d00001 diff --git a/plugins/sid/saw.png b/plugins/sid/saw.png new file mode 100644 index 0000000000000000000000000000000000000000..bd65d126035726521682bc20fdada4fc435cb185 GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPS2P2z~wb`L(bwDA>64!_l=ltB< z)VvY~=c3falGGH1^30M91$R&1fbd2>aiCQpo-U3d8t3Ou+UU(xDA6{byWPU$%+9jY zibi{+TH0FVU8kFHTB?X&yszNV(X6nv_{a5-Z5a>V=*3uNXeK_W{BD{NDG;*nL*9L6 zeffSij^ZQi0(|TLb4Nu+rZ!qW{{1@f<*QlOA5O^H>b3diAK5!MdJ5)vEco`FF~dZP zVe-nd-Oah>3>n+!Z+Odh_@VT~6JpkF2jgt~_QtU%7*x#kEp_M1xRA9~pwS^g^7N(? zX`2~DxLAMvwQEa!VDXMeW_PlU4bwk`-MbAJUCh1oGT7^>QU6z|tGn6x`uG?HzH`5@ z;5(Qw;d8g~r=2zoJ5PJ(X^HN-D<}29m+|`Nw1ihGt{J*5sgWYxu31~9wtxR_Q(nEm zSETT+;pEbL&mTWgp6TQE$GdLktuJerWuD3~5xQ*Rs;SB_$wv)H{aW--nWbahYoYF= rF4s!~y*kbMS9@vJc&*$yrJ9{RYOcWfR`YGZNMP`E^>bP0l+XkKLbb+M literal 0 HcmV?d00001 diff --git a/plugins/sid/sawred.png b/plugins/sid/sawred.png new file mode 100644 index 0000000000000000000000000000000000000000..fb57e98fccb36003da42af6507599f5553099b72 GIT binary patch literal 508 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1}z$6u*YEl000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}00043Nklk1;Jk=bn2cKrn=4fLt#7FHj(jg5@nr$?OXMfBK#8a<1sxX0M%YLuIC^~I+OoL_ zjZzE+00e{KxUP$;s%(wR?99yruzz3X^u0~JVIl$kj0%7l+_)Btl9`-fGnwG9taD}B zoC#>w8z6Nn;`a>SP>-|STXyeCoHQ&f+v>;K>s8bBaD|}dcEgbXu{s;a^nA{pHqM9h y<6FYvFbh$I+h&VGq3{LrKWUnVtZCX%mHPw`%ZwD!i)3H`0000 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "sid.h" +#include + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +SID::SID() +{ + // Initialize pointers. + sample = 0; + fir = 0; + + voice[0].set_sync_source(&voice[2]); + voice[1].set_sync_source(&voice[0]); + voice[2].set_sync_source(&voice[1]); + + set_sampling_parameters(985248, SAMPLE_FAST, 44100); + + bus_value = 0; + bus_value_ttl = 0; + + ext_in = 0; +} + + +// ---------------------------------------------------------------------------- +// Destructor. +// ---------------------------------------------------------------------------- +SID::~SID() +{ + delete[] sample; + delete[] fir; +} + + +// ---------------------------------------------------------------------------- +// Set chip model. +// ---------------------------------------------------------------------------- +void SID::set_chip_model(chip_model model) +{ + for (int i = 0; i < 3; i++) { + voice[i].set_chip_model(model); + } + + filter.set_chip_model(model); + extfilt.set_chip_model(model); +} + + +// ---------------------------------------------------------------------------- +// SID reset. +// ---------------------------------------------------------------------------- +void SID::reset() +{ + for (int i = 0; i < 3; i++) { + voice[i].reset(); + } + filter.reset(); + extfilt.reset(); + + bus_value = 0; + bus_value_ttl = 0; +} + + +// ---------------------------------------------------------------------------- +// Write 16-bit sample to audio input. +// NB! The caller is responsible for keeping the value within 16 bits. +// Note that to mix in an external audio signal, the signal should be +// resampled to 1MHz first to avoid sampling noise. +// ---------------------------------------------------------------------------- +void SID::input(int sample) +{ + // Voice outputs are 20 bits. Scale up to match three voices in order + // to facilitate simulation of the MOS8580 "digi boost" hardware hack. + ext_in = (sample << 4)*3; +} + +// ---------------------------------------------------------------------------- +// Read sample from audio output. +// Both 16-bit and n-bit output is provided. +// ---------------------------------------------------------------------------- +int SID::output() +{ + const int range = 1 << 16; + const int half = range >> 1; + int sample = extfilt.output()/((4095*255 >> 7)*3*15*2/range); + if (sample >= half) { + return half - 1; + } + if (sample < -half) { + return -half; + } + return sample; +} + +int SID::output(int bits) +{ + const int range = 1 << bits; + const int half = range >> 1; + int sample = extfilt.output()/((4095*255 >> 7)*3*15*2/range); + if (sample >= half) { + return half - 1; + } + if (sample < -half) { + return -half; + } + return sample; +} + + +// ---------------------------------------------------------------------------- +// Read registers. +// +// Reading a write only register returns the last byte written to any SID +// register. The individual bits in this value start to fade down towards +// zero after a few cycles. All bits reach zero within approximately +// $2000 - $4000 cycles. +// It has been claimed that this fading happens in an orderly fashion, however +// sampling of write only registers reveals that this is not the case. +// NB! This is not correctly modeled. +// The actual use of write only registers has largely been made in the belief +// that all SID registers are readable. To support this belief the read +// would have to be done immediately after a write to the same register +// (remember that an intermediate write to another register would yield that +// value instead). With this in mind we return the last value written to +// any SID register for $2000 cycles without modeling the bit fading. +// ---------------------------------------------------------------------------- +reg8 SID::read(reg8 offset) +{ + switch (offset) { + case 0x19: + return potx.readPOT(); + case 0x1a: + return poty.readPOT(); + case 0x1b: + return voice[2].wave.readOSC(); + case 0x1c: + return voice[2].envelope.readENV(); + default: + return bus_value; + } +} + + +// ---------------------------------------------------------------------------- +// Write registers. +// ---------------------------------------------------------------------------- +void SID::write(reg8 offset, reg8 value) +{ + bus_value = value; + bus_value_ttl = 0x2000; + + switch (offset) { + case 0x00: + voice[0].wave.writeFREQ_LO(value); + break; + case 0x01: + voice[0].wave.writeFREQ_HI(value); + break; + case 0x02: + voice[0].wave.writePW_LO(value); + break; + case 0x03: + voice[0].wave.writePW_HI(value); + break; + case 0x04: + voice[0].writeCONTROL_REG(value); + break; + case 0x05: + voice[0].envelope.writeATTACK_DECAY(value); + break; + case 0x06: + voice[0].envelope.writeSUSTAIN_RELEASE(value); + break; + case 0x07: + voice[1].wave.writeFREQ_LO(value); + break; + case 0x08: + voice[1].wave.writeFREQ_HI(value); + break; + case 0x09: + voice[1].wave.writePW_LO(value); + break; + case 0x0a: + voice[1].wave.writePW_HI(value); + break; + case 0x0b: + voice[1].writeCONTROL_REG(value); + break; + case 0x0c: + voice[1].envelope.writeATTACK_DECAY(value); + break; + case 0x0d: + voice[1].envelope.writeSUSTAIN_RELEASE(value); + break; + case 0x0e: + voice[2].wave.writeFREQ_LO(value); + break; + case 0x0f: + voice[2].wave.writeFREQ_HI(value); + break; + case 0x10: + voice[2].wave.writePW_LO(value); + break; + case 0x11: + voice[2].wave.writePW_HI(value); + break; + case 0x12: + voice[2].writeCONTROL_REG(value); + break; + case 0x13: + voice[2].envelope.writeATTACK_DECAY(value); + break; + case 0x14: + voice[2].envelope.writeSUSTAIN_RELEASE(value); + break; + case 0x15: + filter.writeFC_LO(value); + break; + case 0x16: + filter.writeFC_HI(value); + break; + case 0x17: + filter.writeRES_FILT(value); + break; + case 0x18: + filter.writeMODE_VOL(value); + break; + default: + break; + } +} + + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +SID::State::State() +{ + int i; + + for (i = 0; i < 0x20; i++) { + sid_register[i] = 0; + } + + bus_value = 0; + bus_value_ttl = 0; + + for (i = 0; i < 3; i++) { + accumulator[i] = 0; + shift_register[i] = 0x7ffff8; + rate_counter[i] = 0; + rate_counter_period[i] = 9; + exponential_counter[i] = 0; + exponential_counter_period[i] = 1; + envelope_counter[i] = 0; + envelope_state[i] = EnvelopeGenerator::RELEASE; + hold_zero[i] = true; + } +} + + +// ---------------------------------------------------------------------------- +// Read state. +// ---------------------------------------------------------------------------- +SID::State SID::read_state() +{ + State state; + int i, j; + + for (i = 0, j = 0; i < 3; i++, j += 7) { + WaveformGenerator& wave = voice[i].wave; + EnvelopeGenerator& envelope = voice[i].envelope; + state.sid_register[j + 0] = wave.freq & 0xff; + state.sid_register[j + 1] = wave.freq >> 8; + state.sid_register[j + 2] = wave.pw & 0xff; + state.sid_register[j + 3] = wave.pw >> 8; + state.sid_register[j + 4] = + (wave.waveform << 4) + | (wave.test ? 0x08 : 0) + | (wave.ring_mod ? 0x04 : 0) + | (wave.sync ? 0x02 : 0) + | (envelope.gate ? 0x01 : 0); + state.sid_register[j + 5] = (envelope.attack << 4) | envelope.decay; + state.sid_register[j + 6] = (envelope.sustain << 4) | envelope.release; + } + + state.sid_register[j++] = filter.fc & 0x007; + state.sid_register[j++] = filter.fc >> 3; + state.sid_register[j++] = (filter.res << 4) | filter.filt; + state.sid_register[j++] = + (filter.voice3off ? 0x80 : 0) + | (filter.hp_bp_lp << 4) + | filter.vol; + + // These registers are superfluous, but included for completeness. + for (; j < 0x1d; j++) { + state.sid_register[j] = read(j); + } + for (; j < 0x20; j++) { + state.sid_register[j] = 0; + } + + state.bus_value = bus_value; + state.bus_value_ttl = bus_value_ttl; + + for (i = 0; i < 3; i++) { + state.accumulator[i] = voice[i].wave.accumulator; + state.shift_register[i] = voice[i].wave.shift_register; + state.rate_counter[i] = voice[i].envelope.rate_counter; + state.rate_counter_period[i] = voice[i].envelope.rate_period; + state.exponential_counter[i] = voice[i].envelope.exponential_counter; + state.exponential_counter_period[i] = voice[i].envelope.exponential_counter_period; + state.envelope_counter[i] = voice[i].envelope.envelope_counter; + state.envelope_state[i] = voice[i].envelope.state; + state.hold_zero[i] = voice[i].envelope.hold_zero; + } + + return state; +} + + +// ---------------------------------------------------------------------------- +// Write state. +// ---------------------------------------------------------------------------- +void SID::write_state(const State& state) +{ + int i; + + for (i = 0; i <= 0x18; i++) { + write(i, state.sid_register[i]); + } + + bus_value = state.bus_value; + bus_value_ttl = state.bus_value_ttl; + + for (i = 0; i < 3; i++) { + voice[i].wave.accumulator = state.accumulator[i]; + voice[i].wave.shift_register = state.shift_register[i]; + voice[i].envelope.rate_counter = state.rate_counter[i]; + voice[i].envelope.rate_period = state.rate_counter_period[i]; + voice[i].envelope.exponential_counter = state.exponential_counter[i]; + voice[i].envelope.exponential_counter_period = state.exponential_counter_period[i]; + voice[i].envelope.envelope_counter = state.envelope_counter[i]; + voice[i].envelope.state = state.envelope_state[i]; + voice[i].envelope.hold_zero = state.hold_zero[i]; + } +} + + +// ---------------------------------------------------------------------------- +// Enable filter. +// ---------------------------------------------------------------------------- +void SID::enable_filter(bool enable) +{ + filter.enable_filter(enable); +} + + +// ---------------------------------------------------------------------------- +// Enable external filter. +// ---------------------------------------------------------------------------- +void SID::enable_external_filter(bool enable) +{ + extfilt.enable_filter(enable); +} + + +// ---------------------------------------------------------------------------- +// I0() computes the 0th order modified Bessel function of the first kind. +// This function is originally from resample-1.5/filterkit.c by J. O. Smith. +// ---------------------------------------------------------------------------- +double SID::I0(double x) +{ + // Max error acceptable in I0. + const double I0e = 1e-6; + + double sum, u, halfx, temp; + int n; + + sum = u = n = 1; + halfx = x/2.0; + + do { + temp = halfx/n++; + u *= temp*temp; + sum += u; + } while (u >= I0e*sum); + + return sum; +} + + +// ---------------------------------------------------------------------------- +// Setting of SID sampling parameters. +// +// Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. +// The default end of passband frequency is pass_freq = 0.9*sample_freq/2 +// for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample +// frequencies. +// +// For resampling, the ratio between the clock frequency and the sample +// frequency is limited as follows: +// 125*clock_freq/sample_freq < 16384 +// E.g. provided a clock frequency of ~ 1MHz, the sample frequency can not +// be set lower than ~ 8kHz. A lower sample frequency would make the +// resampling code overfill its 16k sample ring buffer. +// +// The end of passband frequency is also limited: +// pass_freq <= 0.9*sample_freq/2 + +// E.g. for a 44.1kHz sampling rate the end of passband frequency is limited +// to slightly below 20kHz. This constraint ensures that the FIR table is +// not overfilled. +// ---------------------------------------------------------------------------- +bool SID::set_sampling_parameters(double clock_freq, sampling_method method, + double sample_freq, double pass_freq, + double filter_scale) +{ + // Check resampling constraints. + if (method == SAMPLE_RESAMPLE_INTERPOLATE || method == SAMPLE_RESAMPLE_FAST) + { + // Check whether the sample ring buffer would overfill. + if (FIR_N*clock_freq/sample_freq >= RINGSIZE) { + return false; + } + + // The default passband limit is 0.9*sample_freq/2 for sample + // frequencies below ~ 44.1kHz, and 20kHz for higher sample frequencies. + if (pass_freq < 0) { + pass_freq = 20000; + if (2*pass_freq/sample_freq >= 0.9) { + pass_freq = 0.9*sample_freq/2; + } + } + // Check whether the FIR table would overfill. + else if (pass_freq > 0.9*sample_freq/2) { + return false; + } + + // The filter scaling is only included to avoid clipping, so keep + // it sane. + if (filter_scale < 0.9 || filter_scale > 1.0) { + return false; + } + } + + clock_frequency = clock_freq; + sampling = method; + + cycles_per_sample = + cycle_count(clock_freq/sample_freq*(1 << FIXP_SHIFT) + 0.5); + + sample_offset = 0; + sample_prev = 0; + + // FIR initialization is only necessary for resampling. + if (method != SAMPLE_RESAMPLE_INTERPOLATE && method != SAMPLE_RESAMPLE_FAST) + { + delete[] sample; + delete[] fir; + sample = 0; + fir = 0; + return true; + } + + const double pi = 3.1415926535897932385; + + // 16 bits -> -96dB stopband attenuation. + const double A = -20*log10(1.0/(1 << 16)); + // A fraction of the bandwidth is allocated to the transition band, + double dw = (1 - 2*pass_freq/sample_freq)*pi; + // The cutoff frequency is midway through the transition band. + double wc = (2*pass_freq/sample_freq + 1)*pi/2; + + // For calculation of beta and N see the reference for the kaiserord + // function in the MATLAB Signal Processing Toolbox: + // http://www.mathworks.com/access/helpdesk/help/toolbox/signal/kaiserord.html + const double beta = 0.1102*(A - 8.7); + const double I0beta = I0(beta); + + // The filter order will maximally be 124 with the current constraints. + // N >= (96.33 - 7.95)/(2.285*0.1*pi) -> N >= 123 + // The filter order is equal to the number of zero crossings, i.e. + // it should be an even number (sinc is symmetric about x = 0). + int N = int((A - 7.95)/(2.285*dw) + 0.5); + N += N & 1; + + double f_samples_per_cycle = sample_freq/clock_freq; + double f_cycles_per_sample = clock_freq/sample_freq; + + // The filter length is equal to the filter order + 1. + // The filter length must be an odd number (sinc is symmetric about x = 0). + fir_N = int(N*f_cycles_per_sample) + 1; + fir_N |= 1; + + // We clamp the filter table resolution to 2^n, making the fixpoint + // sample_offset a whole multiple of the filter table resolution. + int res = method == SAMPLE_RESAMPLE_INTERPOLATE ? + FIR_RES_INTERPOLATE : FIR_RES_FAST; + int n = (int)ceil(log(res/f_cycles_per_sample)/log(2)); + fir_RES = 1 << n; + + // Allocate memory for FIR tables. + delete[] fir; + fir = new short[fir_N*fir_RES]; + + // Calculate fir_RES FIR tables for linear interpolation. + for (int i = 0; i < fir_RES; i++) { + int fir_offset = i*fir_N + fir_N/2; + double j_offset = double(i)/fir_RES; + // Calculate FIR table. This is the sinc function, weighted by the + // Kaiser window. + for (int j = -fir_N/2; j <= fir_N/2; j++) { + double jx = j - j_offset; + double wt = wc*jx/f_cycles_per_sample; + double temp = jx/(fir_N/2); + double Kaiser = + fabs(temp) <= 1 ? I0(beta*sqrt(1 - temp*temp))/I0beta : 0; + double sincwt = + fabs(wt) >= 1e-6 ? sin(wt)/wt : 1; + double val = + (1 << FIR_SHIFT)*filter_scale*f_samples_per_cycle*wc/pi*sincwt*Kaiser; + fir[fir_offset + j] = short(val + 0.5); + } + } + + // Allocate sample buffer. + if (!sample) { + sample = new short[RINGSIZE*2]; + } + // Clear sample buffer. + for (int j = 0; j < RINGSIZE*2; j++) { + sample[j] = 0; + } + sample_index = 0; + + return true; +} + + +// ---------------------------------------------------------------------------- +// Adjustment of SID sampling frequency. +// +// In some applications, e.g. a C64 emulator, it can be desirable to +// synchronize sound with a timer source. This is supported by adjustment of +// the SID sampling frequency. +// +// NB! Adjustment of the sampling frequency may lead to noticeable shifts in +// frequency, and should only be used for interactive applications. Note also +// that any adjustment of the sampling frequency will change the +// characteristics of the resampling filter, since the filter is not rebuilt. +// ---------------------------------------------------------------------------- +void SID::adjust_sampling_frequency(double sample_freq) +{ + cycles_per_sample = + cycle_count(clock_frequency/sample_freq*(1 << FIXP_SHIFT) + 0.5); +} + + +// ---------------------------------------------------------------------------- +// Return array of default spline interpolation points to map FC to +// filter cutoff frequency. +// ---------------------------------------------------------------------------- +void SID::fc_default(const fc_point*& points, int& count) +{ + filter.fc_default(points, count); +} + + +// ---------------------------------------------------------------------------- +// Return FC spline plotter object. +// ---------------------------------------------------------------------------- +PointPlotter SID::fc_plotter() +{ + return filter.fc_plotter(); +} + + +// ---------------------------------------------------------------------------- +// SID clocking - 1 cycle. +// ---------------------------------------------------------------------------- +void SID::clock() +{ + int i; + + // Age bus value. + if (--bus_value_ttl <= 0) { + bus_value = 0; + bus_value_ttl = 0; + } + + // Clock amplitude modulators. + for (i = 0; i < 3; i++) { + voice[i].envelope.clock(); + } + + // Clock oscillators. + for (i = 0; i < 3; i++) { + voice[i].wave.clock(); + } + + // Synchronize oscillators. + for (i = 0; i < 3; i++) { + voice[i].wave.synchronize(); + } + + // Clock filter. + filter.clock(voice[0].output(), voice[1].output(), voice[2].output(), ext_in); + + // Clock external filter. + extfilt.clock(filter.output()); +} + + +// ---------------------------------------------------------------------------- +// SID clocking - delta_t cycles. +// ---------------------------------------------------------------------------- +void SID::clock(cycle_count delta_t) +{ + int i; + + if (delta_t <= 0) { + return; + } + + // Age bus value. + bus_value_ttl -= delta_t; + if (bus_value_ttl <= 0) { + bus_value = 0; + bus_value_ttl = 0; + } + + // Clock amplitude modulators. + for (i = 0; i < 3; i++) { + voice[i].envelope.clock(delta_t); + } + + // Clock and synchronize oscillators. + // Loop until we reach the current cycle. + cycle_count delta_t_osc = delta_t; + while (delta_t_osc) { + cycle_count delta_t_min = delta_t_osc; + + // Find minimum number of cycles to an oscillator accumulator MSB toggle. + // We have to clock on each MSB on / MSB off for hard sync to operate + // correctly. + for (i = 0; i < 3; i++) { + WaveformGenerator& wave = voice[i].wave; + + // It is only necessary to clock on the MSB of an oscillator that is + // a sync source and has freq != 0. + if (!(wave.sync_dest->sync && wave.freq)) { + continue; + } + + reg16 freq = wave.freq; + reg24 accumulator = wave.accumulator; + + // Clock on MSB off if MSB is on, clock on MSB on if MSB is off. + reg24 delta_accumulator = + (accumulator & 0x800000 ? 0x1000000 : 0x800000) - accumulator; + + cycle_count delta_t_next = delta_accumulator/freq; + if (delta_accumulator%freq) { + ++delta_t_next; + } + + if (delta_t_next < delta_t_min) { + delta_t_min = delta_t_next; + } + } + + // Clock oscillators. + for (i = 0; i < 3; i++) { + voice[i].wave.clock(delta_t_min); + } + + // Synchronize oscillators. + for (i = 0; i < 3; i++) { + voice[i].wave.synchronize(); + } + + delta_t_osc -= delta_t_min; + } + + // Clock filter. + filter.clock(delta_t, + voice[0].output(), voice[1].output(), voice[2].output(), ext_in); + + // Clock external filter. + extfilt.clock(delta_t, filter.output()); +} + + +// ---------------------------------------------------------------------------- +// SID clocking with audio sampling. +// Fixpoint arithmetics is used. +// +// The example below shows how to clock the SID a specified amount of cycles +// while producing audio output: +// +// while (delta_t) { +// bufindex += sid.clock(delta_t, buf + bufindex, buflength - bufindex); +// write(dsp, buf, bufindex*2); +// bufindex = 0; +// } +// +// ---------------------------------------------------------------------------- +int SID::clock(cycle_count& delta_t, short* buf, int n, int interleave) +{ + switch (sampling) { + default: + case SAMPLE_FAST: + return clock_fast(delta_t, buf, n, interleave); + case SAMPLE_INTERPOLATE: + return clock_interpolate(delta_t, buf, n, interleave); + case SAMPLE_RESAMPLE_INTERPOLATE: + return clock_resample_interpolate(delta_t, buf, n, interleave); + case SAMPLE_RESAMPLE_FAST: + return clock_resample_fast(delta_t, buf, n, interleave); + } +} + +// ---------------------------------------------------------------------------- +// SID clocking with audio sampling - delta clocking picking nearest sample. +// ---------------------------------------------------------------------------- +RESID_INLINE +int SID::clock_fast(cycle_count& delta_t, short* buf, int n, + int interleave) +{ + int s = 0; + + for (;;) { + cycle_count next_sample_offset = sample_offset + cycles_per_sample + (1 << (FIXP_SHIFT - 1)); + cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; + if (delta_t_sample > delta_t) { + break; + } + if (s >= n) { + return s; + } + clock(delta_t_sample); + delta_t -= delta_t_sample; + sample_offset = (next_sample_offset & FIXP_MASK) - (1 << (FIXP_SHIFT - 1)); + buf[s++*interleave] = output(); + } + + clock(delta_t); + sample_offset -= delta_t << FIXP_SHIFT; + delta_t = 0; + return s; +} + + +// ---------------------------------------------------------------------------- +// SID clocking with audio sampling - cycle based with linear sample +// interpolation. +// +// Here the chip is clocked every cycle. This yields higher quality +// sound since the samples are linearly interpolated, and since the +// external filter attenuates frequencies above 16kHz, thus reducing +// sampling noise. +// ---------------------------------------------------------------------------- +RESID_INLINE +int SID::clock_interpolate(cycle_count& delta_t, short* buf, int n, + int interleave) +{ + int s = 0; + int i; + + for (;;) { + cycle_count next_sample_offset = sample_offset + cycles_per_sample; + cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; + if (delta_t_sample > delta_t) { + break; + } + if (s >= n) { + return s; + } + for (i = 0; i < delta_t_sample - 1; i++) { + clock(); + } + if (i < delta_t_sample) { + sample_prev = output(); + clock(); + } + + delta_t -= delta_t_sample; + sample_offset = next_sample_offset & FIXP_MASK; + + short sample_now = output(); + buf[s++*interleave] = + sample_prev + (sample_offset*(sample_now - sample_prev) >> FIXP_SHIFT); + sample_prev = sample_now; + } + + for (i = 0; i < delta_t - 1; i++) { + clock(); + } + if (i < delta_t) { + sample_prev = output(); + clock(); + } + sample_offset -= delta_t << FIXP_SHIFT; + delta_t = 0; + return s; +} + + +// ---------------------------------------------------------------------------- +// SID clocking with audio sampling - cycle based with audio resampling. +// +// This is the theoretically correct (and computationally intensive) audio +// sample generation. The samples are generated by resampling to the specified +// sampling frequency. The work rate is inversely proportional to the +// percentage of the bandwidth allocated to the filter transition band. +// +// This implementation is based on the paper "A Flexible Sampling-Rate +// Conversion Method", by J. O. Smith and P. Gosset, or rather on the +// expanded tutorial on the "Digital Audio Resampling Home Page": +// http://www-ccrma.stanford.edu/~jos/resample/ +// +// By building shifted FIR tables with samples according to the +// sampling frequency, this implementation dramatically reduces the +// computational effort in the filter convolutions, without any loss +// of accuracy. The filter convolutions are also vectorizable on +// current hardware. +// +// Further possible optimizations are: +// * An equiripple filter design could yield a lower filter order, see +// http://www.mwrf.com/Articles/ArticleID/7229/7229.html +// * The Convolution Theorem could be used to bring the complexity of +// convolution down from O(n*n) to O(n*log(n)) using the Fast Fourier +// Transform, see http://en.wikipedia.org/wiki/Convolution_theorem +// * Simply resampling in two steps can also yield computational +// savings, since the transition band will be wider in the first step +// and the required filter order is thus lower in this step. +// Laurent Ganier has found the optimal intermediate sampling frequency +// to be (via derivation of sum of two steps): +// 2 * pass_freq + sqrt [ 2 * pass_freq * orig_sample_freq +// * (dest_sample_freq - 2 * pass_freq) / dest_sample_freq ] +// +// NB! the result of right shifting negative numbers is really +// implementation dependent in the C++ standard. +// ---------------------------------------------------------------------------- +RESID_INLINE +int SID::clock_resample_interpolate(cycle_count& delta_t, short* buf, int n, + int interleave) +{ + int s = 0; + + for (;;) { + cycle_count next_sample_offset = sample_offset + cycles_per_sample; + cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; + if (delta_t_sample > delta_t) { + break; + } + if (s >= n) { + return s; + } + for (int i = 0; i < delta_t_sample; i++) { + clock(); + sample[sample_index] = sample[sample_index + RINGSIZE] = output(); + ++sample_index; + sample_index &= 0x3fff; + } + delta_t -= delta_t_sample; + sample_offset = next_sample_offset & FIXP_MASK; + + int fir_offset = sample_offset*fir_RES >> FIXP_SHIFT; + int fir_offset_rmd = sample_offset*fir_RES & FIXP_MASK; + short* fir_start = fir + fir_offset*fir_N; + short* sample_start = sample + sample_index - fir_N + RINGSIZE; + + // Convolution with filter impulse response. + int v1 = 0; + for (int j = 0; j < fir_N; j++) { + v1 += sample_start[j]*fir_start[j]; + } + + // Use next FIR table, wrap around to first FIR table using + // previous sample. + if (++fir_offset == fir_RES) { + fir_offset = 0; + --sample_start; + } + fir_start = fir + fir_offset*fir_N; + + // Convolution with filter impulse response. + int v2 = 0; + for (int j = 0; j < fir_N; j++) { + v2 += sample_start[j]*fir_start[j]; + } + + // Linear interpolation. + // fir_offset_rmd is equal for all samples, it can thus be factorized out: + // sum(v1 + rmd*(v2 - v1)) = sum(v1) + rmd*(sum(v2) - sum(v1)) + int v = v1 + (fir_offset_rmd*(v2 - v1) >> FIXP_SHIFT); + + v >>= FIR_SHIFT; + + // Saturated arithmetics to guard against 16 bit sample overflow. + const int half = 1 << 15; + if (v >= half) { + v = half - 1; + } + else if (v < -half) { + v = -half; + } + + buf[s++*interleave] = v; + } + + for (int i = 0; i < delta_t; i++) { + clock(); + sample[sample_index] = sample[sample_index + RINGSIZE] = output(); + ++sample_index; + sample_index &= 0x3fff; + } + sample_offset -= delta_t << FIXP_SHIFT; + delta_t = 0; + return s; +} + + +// ---------------------------------------------------------------------------- +// SID clocking with audio sampling - cycle based with audio resampling. +// ---------------------------------------------------------------------------- +RESID_INLINE +int SID::clock_resample_fast(cycle_count& delta_t, short* buf, int n, + int interleave) +{ + int s = 0; + + for (;;) { + cycle_count next_sample_offset = sample_offset + cycles_per_sample; + cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; + if (delta_t_sample > delta_t) { + break; + } + if (s >= n) { + return s; + } + for (int i = 0; i < delta_t_sample; i++) { + clock(); + sample[sample_index] = sample[sample_index + RINGSIZE] = output(); + ++sample_index; + sample_index &= 0x3fff; + } + delta_t -= delta_t_sample; + sample_offset = next_sample_offset & FIXP_MASK; + + int fir_offset = sample_offset*fir_RES >> FIXP_SHIFT; + short* fir_start = fir + fir_offset*fir_N; + short* sample_start = sample + sample_index - fir_N + RINGSIZE; + + // Convolution with filter impulse response. + int v = 0; + for (int j = 0; j < fir_N; j++) { + v += sample_start[j]*fir_start[j]; + } + + v >>= FIR_SHIFT; + + // Saturated arithmetics to guard against 16 bit sample overflow. + const int half = 1 << 15; + if (v >= half) { + v = half - 1; + } + else if (v < -half) { + v = -half; + } + + buf[s++*interleave] = v; + } + + for (int i = 0; i < delta_t; i++) { + clock(); + sample[sample_index] = sample[sample_index + RINGSIZE] = output(); + ++sample_index; + sample_index &= 0x3fff; + } + sample_offset -= delta_t << FIXP_SHIFT; + delta_t = 0; + return s; +} diff --git a/plugins/sid/sid.h b/plugins/sid/sid.h new file mode 100644 index 000000000..3292cd8fc --- /dev/null +++ b/plugins/sid/sid.h @@ -0,0 +1,146 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __SID_H__ +#define __SID_H__ + +#include "siddefs.h" +#include "voice.h" +#include "filter.h" +#include "extfilt.h" +#include "pot.h" + +class SID +{ +public: + SID(); + ~SID(); + + void set_chip_model(chip_model model); + void enable_filter(bool enable); + void enable_external_filter(bool enable); + bool set_sampling_parameters(double clock_freq, sampling_method method, + double sample_freq, double pass_freq = -1, + double filter_scale = 0.97); + void adjust_sampling_frequency(double sample_freq); + + void fc_default(const fc_point*& points, int& count); + PointPlotter fc_plotter(); + + void clock(); + void clock(cycle_count delta_t); + int clock(cycle_count& delta_t, short* buf, int n, int interleave = 1); + void reset(); + + // Read/write registers. + reg8 read(reg8 offset); + void write(reg8 offset, reg8 value); + + // Read/write state. + class State + { + public: + State(); + + char sid_register[0x20]; + + reg8 bus_value; + cycle_count bus_value_ttl; + + reg24 accumulator[3]; + reg24 shift_register[3]; + reg16 rate_counter[3]; + reg16 rate_counter_period[3]; + reg16 exponential_counter[3]; + reg16 exponential_counter_period[3]; + reg8 envelope_counter[3]; + EnvelopeGenerator::State envelope_state[3]; + bool hold_zero[3]; + }; + + State read_state(); + void write_state(const State& state); + + // 16-bit input (EXT IN). + void input(int sample); + + // 16-bit output (AUDIO OUT). + int output(); + // n-bit output. + int output(int bits); + +protected: + static double I0(double x); + RESID_INLINE int clock_fast(cycle_count& delta_t, short* buf, int n, + int interleave); + RESID_INLINE int clock_interpolate(cycle_count& delta_t, short* buf, int n, + int interleave); + RESID_INLINE int clock_resample_interpolate(cycle_count& delta_t, short* buf, + int n, int interleave); + RESID_INLINE int clock_resample_fast(cycle_count& delta_t, short* buf, + int n, int interleave); + + Voice voice[3]; + Filter filter; + ExternalFilter extfilt; + Potentiometer potx; + Potentiometer poty; + + reg8 bus_value; + cycle_count bus_value_ttl; + + double clock_frequency; + + // External audio input. + int ext_in; + + // Resampling constants. + // The error in interpolated lookup is bounded by 1.234/L^2, + // while the error in non-interpolated lookup is bounded by + // 0.7854/L + 0.4113/L^2, see + // http://www-ccrma.stanford.edu/~jos/resample/Choice_Table_Size.html + // For a resolution of 16 bits this yields L >= 285 and L >= 51473, + // respectively. + static const int FIR_N = 125; + static const int FIR_RES_INTERPOLATE = 285; + static const int FIR_RES_FAST = 51473; + static const int FIR_SHIFT = 15; + static const int RINGSIZE = 16384; + + // Fixpoint constants (16.16 bits). + static const int FIXP_SHIFT = 16; + static const int FIXP_MASK = 0xffff; + + // Sampling variables. + sampling_method sampling; + cycle_count cycles_per_sample; + cycle_count sample_offset; + int sample_index; + short sample_prev; + int fir_N; + int fir_RES; + + // Ring buffer with overflow for contiguous storage of RINGSIZE samples. + short* sample; + + // FIR_RES filter tables (FIR_N*FIR_RES). + short* fir; +}; + +#endif // not __SID_H__ diff --git a/plugins/sid/sid_instrument.cpp b/plugins/sid/sid_instrument.cpp new file mode 100644 index 000000000..7dae17d4f --- /dev/null +++ b/plugins/sid/sid_instrument.cpp @@ -0,0 +1,779 @@ +/* + * sid_instrument.cpp - ResID based software-synthesizer + * + * Copyright (c) 2008 Csaba Hruska + * Attila Herman + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include +#include +#include "sid.h" + +#include "sid_instrument.h" +#include "engine.h" +#include "instrument_track.h" +#include "knob.h" +#include "note_play_handle.h" +#include "sweep_oscillator.h" +#include "pixmap_button.h" +#include "tooltip.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" + +#define C64_PAL_CYCLES_PER_SEC 985248 + +#define NUMSIDREGS 0x19 +#define SIDWRITEDELAY 9 // lda $xxxx,x 4 cycles, sta $d400,x 5 cycles +#define SIDWAVEDELAY 4 // and $xxxx,x 4 cycles extra + +unsigned char sidreg[NUMSIDREGS]; +unsigned char sidorder[] = + {0x15,0x16,0x18,0x17, + 0x05,0x06,0x02,0x03,0x00,0x01,0x04, + 0x0c,0x0d,0x09,0x0a,0x07,0x08,0x0b, + 0x13,0x14,0x10,0x11,0x0e,0x0f,0x12}; + +static const char *attackTime[16] = { "2 mS", "8 mS", "16 mS", "24 mS", + "38 mS", "56 mS", "68 mS", "80 mS", + "100 mS", "250 mS", "500 mS", "800 mS", + "1 S", "3 S", "5 S", "8 S" }; +static const char *decRelTime[16] = { "6 mS", "24 mS", "48 mS", "72 mS", + "114 mS", "168 mS", "204 mS", "240 mS", + "300 mS", "750 mS", "1.5 S", "2.4 S", + "3 S", "9 S", "15 S", "24 S" }; +// release time time in ms +static const int relTime[16] = { 6, 24, 48, 72, 114, 168, 204, 240, 300, 750, + 1500, 2400, 3000, 9000, 15000, 24000 }; + + +extern "C" +{ +plugin::descriptor PLUGIN_EXPORT sid_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "SID", + QT_TRANSLATE_NOOP( "pluginBrowser", "Emulation of the MOS6581 SID.\n"\ + "This chip was used in the Commodore 64 computer." ), + + "Csaba Hruska " + "Attila Herman ", + 0x0100, + plugin::Instrument, + new pluginPixmapLoader( "logo" ), + NULL +} ; + +} + +voiceObject::voiceObject( model * _parent, int _idx ) : + model( _parent ), + m_pulseWidthModel( 2048.0f, 0.0f, 4095.0f, 1.0f, this, + tr( "Voice %1 pulse width" ).arg( _idx+1 ) ), + m_attackModel( 8.0f, 0.0f, 15.0f, 1.0f, this, + tr( "Voice %1 attack" ).arg( _idx+1 ) ), + m_decayModel( 8.0f, 0.0f, 15.0f, 1.0f, this, + tr( "Voice %1 decay" ).arg( _idx+1 ) ), + m_sustainModel( 15.0f, 0.0f, 15.0f, 1.0f, this, + tr( "Voice %1 sustain" ).arg( _idx+1 ) ), + m_releaseModel( 8.0f, 0.0f, 15.0f, 1.0f, this, + tr( "Voice %1 release" ).arg( _idx+1 ) ), + m_coarseModel( 0.0f, -24.0, 24.0, 1.0f, this, + tr( "Voice %1 coarse detuning" ).arg( _idx+1 ) ), + m_waveFormModel( TriangleWave, 0, NumWaveShapes-1, this, + tr( "Voice %1 wave shape" ).arg( _idx+1 ) ), + + m_syncModel( false, this, tr( "Voice %1 sync" ).arg( _idx+1 ) ), + m_ringModModel( false, this, tr( "Voice %1 ring modulate" ).arg( _idx+1 ) ), + m_filteredModel( false, this, tr( "Voice %1 filtered" ).arg( _idx+1 ) ) +{ +} + + +voiceObject::~voiceObject() +{ +} + + +sidInstrument::sidInstrument( instrumentTrack * _instrument_track ) : + instrument( _instrument_track, &sid_plugin_descriptor ), + // filter + m_filterFCModel( 1024.0f, 0.0f, 2047.0f, 1.0f, this, tr( "Cutoff" ) ), + m_filterResonanceModel( 8.0f, 0.0f, 15.0f, 1.0f, this, tr( "Resonance" ) ), + m_filterModeModel( LowPass, 0, NumFilterTypes-1, this, tr( "Filter type" )), + + // misc + m_voice3OffModel( false, this, tr( "Voice 3 off" ) ), + m_volumeModel( 15.0f, 0.0f, 15.0f, 1.0f, this, tr( "Volume" ) ), + m_chipModel( sidMOS6581, 0, NumChipModels-1, this, tr( "Chip model" ) ) +{ + for( int i = 0; i < 3; ++i ) + { + m_voice[i] = new voiceObject( this, i ); + } +} + + +sidInstrument::~sidInstrument() +{ +} + + +void sidInstrument::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + // voices + for( int i = 0; i < 3; ++i ) + { + const QString is = QString::number( i ); + + m_voice[i]->m_pulseWidthModel.saveSettings( + _doc, _this, "pulsewidth" + is ); + m_voice[i]->m_attackModel.saveSettings( + _doc, _this, "attack" + is ); + m_voice[i]->m_decayModel.saveSettings( + _doc, _this, "decay" + is ); + m_voice[i]->m_sustainModel.saveSettings( + _doc, _this, "sustain" + is ); + m_voice[i]->m_releaseModel.saveSettings( + _doc, _this, "release" + is ); + m_voice[i]->m_waveFormModel.saveSettings( + _doc, _this,"waveform" + is ); + m_voice[i]->m_syncModel.saveSettings( + _doc, _this, "sync" + is ); + m_voice[i]->m_ringModModel.saveSettings( + _doc, _this, "ringmod" + is ); + m_voice[i]->m_filteredModel.saveSettings( + _doc, _this,"filtered" + is ); + } + + // filter + m_filterFCModel.saveSettings( _doc, _this, "filterFC" ); + m_filterResonanceModel.saveSettings( _doc, _this, "filterResonance" ); + m_filterModeModel.saveSettings( _doc, _this, "filterMode" ); + + // misc + m_voice3OffModel.saveSettings( _doc, _this, "voice3Off" ); + m_volumeModel.saveSettings( _doc, _this, "volume" ); + m_chipModel.saveSettings( _doc, _this, "chipModel" ); +} + + + + +void sidInstrument::loadSettings( const QDomElement & _this ) +{ + // voices + for( int i = 0; i < 3; ++i ) + { + const QString is = QString::number( i ); + + m_voice[i]->m_pulseWidthModel.loadSettings( _this, "pulsewidth" + is ); + m_voice[i]->m_attackModel.loadSettings( _this, "attack" + is ); + m_voice[i]->m_decayModel.loadSettings( _this, "decay" + is ); + m_voice[i]->m_sustainModel.loadSettings( _this, "sustain" + is ); + m_voice[i]->m_releaseModel.loadSettings( _this, "release" + is ); + m_voice[i]->m_waveFormModel.loadSettings( _this, "waveform" + is ); + m_voice[i]->m_syncModel.loadSettings( _this, "sync" + is ); + m_voice[i]->m_ringModModel.loadSettings( _this, "ringmod" + is ); + m_voice[i]->m_filteredModel.loadSettings( _this, "filtered" + is ); + } + + // filter + m_filterFCModel.loadSettings( _this, "filterFC" ); + m_filterResonanceModel.loadSettings( _this, "filterResonance" ); + m_filterModeModel.loadSettings( _this, "filterMode" ); + + // misc + m_voice3OffModel.loadSettings( _this, "voice3Off" ); + m_volumeModel.loadSettings( _this, "volume" ); + m_chipModel.loadSettings( _this, "chipModel" ); +} + + + + +QString sidInstrument::nodeName( void ) const +{ + return( sid_plugin_descriptor.name ); +} + + + + +f_cnt_t sidInstrument::desiredReleaseFrames( void ) const +{ + const float samplerate = engine::getMixer()->processingSampleRate(); + int maxrel = 0; + for( int i = 0 ; i < 3 ; ++i ) + { + if( maxrel < m_voice[i]->m_releaseModel.value() ) + maxrel = m_voice[i]->m_releaseModel.value(); + } + + return f_cnt_t( float(relTime[maxrel])*samplerate/1000.0 ); +} + + + + +int sid_fillbuffer(SID *sid, int tdelta, short *ptr, int samples) +{ + int tdelta2; + int result; + int total = 0; + int c; +// customly added + int residdelay = 0; + + int badline = rand() % NUMSIDREGS; + + for (c = 0; c < NUMSIDREGS; c++) + { + unsigned char o = sidorder[c]; + + // Extra delay for loading the waveform (and mt_chngate,x) + if ((o == 4) || (o == 11) || (o == 18)) + { + tdelta2 = SIDWAVEDELAY; + result = sid->clock(tdelta2, ptr, samples); + total += result; + ptr += result; + samples -= result; + tdelta -= SIDWAVEDELAY; + } + + // Possible random badline delay once per writing + if ((badline == c) && (residdelay)) + { + tdelta2 = residdelay; + result = sid->clock(tdelta2, ptr, samples); + total += result; + ptr += result; + samples -= result; + tdelta -= residdelay; + } + + sid->write(o, sidreg[o]); + + tdelta2 = SIDWRITEDELAY; + result = sid->clock(tdelta2, ptr, samples); + total += result; + ptr += result; + samples -= result; + tdelta -= SIDWRITEDELAY; + } + result = sid->clock(tdelta, ptr, samples); + total += result; + + return total; +} + + + + +void sidInstrument::playNote( notePlayHandle * _n, bool, + sampleFrame * _working_buffer ) +{ + const f_cnt_t tfp = _n->totalFramesPlayed(); + + const int clockrate = C64_PAL_CYCLES_PER_SEC; + const int samplerate = engine::getMixer()->processingSampleRate(); + + if ( tfp == 0 ) + { + SID *sid = new SID(); + sid->set_sampling_parameters( clockrate, SAMPLE_FAST, samplerate ); + sid->set_chip_model( MOS6581 ); + sid->enable_filter( true ); + sid->reset(); + _n->m_pluginData = sid; + } + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + + SID *sid = static_cast( _n->m_pluginData ); + int delta_t = clockrate * frames / samplerate + 4; + short buf[frames]; + + for (int c = 0; c < NUMSIDREGS; c++) + { + sidreg[c] = 0x00; + } + + if( (ChipModel)m_chipModel.value() == sidMOS6581 ) + { + sid->set_chip_model( MOS6581 ); + } + else + { + sid->set_chip_model( MOS8580 ); + } + + // voices + reg8 data8 = 0; + reg8 data16 = 0; + reg8 base = 0; + float freq = 0.0; + float note = 0.0; + for( reg8 i = 0 ; i < 3 ; ++i ) + { + base = i*7; + // freq ( Fn = Fout / Fclk * 16777216 ) + coarse detuning + freq = _n->frequency(); + note = 69.0 + 12.0 * log( freq / 440.0 ) / log( 2 ); + note += m_voice[i]->m_coarseModel.value(); + freq = 440.0 * pow( 2.0, (note-69.0)/12.0 ); + data16 = int( freq / float(clockrate) * 16777216.0 ); + + sidreg[base+0] = data16&0x00FF; + sidreg[base+1] = (data16>>8)&0x00FF; + // pw + data16 = m_voice[i]->m_pulseWidthModel.value(); + + sidreg[base+2] = data16&0x00FF; + sidreg[base+3] = (data16>>8)&0x000F; + // control: wave form, (test), ringmod, sync, gate + data8 = _n->released()?0:1; + data8 += m_voice[i]->m_syncModel.value()?2:0; + data8 += m_voice[i]->m_ringModModel.value()?4:0; + switch( m_voice[i]->m_waveFormModel.value() ) + { + default: break; + case voiceObject::NoiseWave: data8 += 128; break; + case voiceObject::SquareWave: data8 += 64; break; + case voiceObject::SawWave: data8 += 32; break; + case voiceObject::TriangleWave: data8 += 16; break; + } + sidreg[base+4] = data8&0x00FF; + // ad + data16 = m_voice[i]->m_attackModel.value(); + + data8 = (data16&0x0F)<<4; + data16 = m_voice[i]->m_decayModel.value(); + + data8 += (data16&0x0F); + sidreg[base+5] = data8&0x00FF; + // sr + data16 = m_voice[i]->m_sustainModel.value(); + + data8 = (data16&0x0F)<<4; + data16 = m_voice[i]->m_releaseModel.value(); + + data8 += (data16&0x0F); + sidreg[base+6] = data8&0x00FF; + } + // filtered + + // FC (FilterCutoff) + data16 = m_filterFCModel.value(); + sidreg[21] = data16&0x0007; + sidreg[22] = (data16>>3)&0x00FF; + + // res, filt ex,3,2,1 + data16 = m_filterResonanceModel.value(); + data8 = (data16&0x000F)<<4; + data8 += m_voice[2]->m_filteredModel.value()?4:0; + data8 += m_voice[1]->m_filteredModel.value()?2:0; + data8 += m_voice[0]->m_filteredModel.value()?1:0; + sidreg[23] = data8&0x00FF; + + // mode vol + data16 = m_volumeModel.value(); + data8 = data16&0x000F; + data8 += m_voice3OffModel.value()?128:0; + + switch( m_filterModeModel.value() ) + { + default: break; + case LowPass: data8 += 16; break; + case BandPass: data8 += 32; break; + case HighPass: data8 += 64; break; + } + + sidreg[24] = data8&0x00FF; + + int num = sid_fillbuffer(sid,delta_t,buf, frames); + if(num!=frames) + printf("!!!Not enough samples\n"); + + for( fpp_t frame = 0; frame < frames; ++frame ) + { + sample_t s = float(buf[frame])/32768.0; + for( ch_cnt_t ch = 0; ch < DEFAULT_CHANNELS; ++ch ) + { + _working_buffer[frame][ch] = s; + } + } + + getInstrumentTrack()->processAudioBuffer( _working_buffer, frames, _n ); +} + + + + +void sidInstrument::deleteNotePluginData( notePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + + + +pluginView * sidInstrument::instantiateView( QWidget * _parent ) +{ + return( new sidInstrumentView( this, _parent ) ); +} + + + + +class sidKnob : public knob +{ +public: + sidKnob( QWidget * _parent ) : + knob( knobStyled, _parent ) + { + setFixedSize( 26, 25 ); + setCenterPointX( 13.0 ); + setCenterPointY( 14.0 ); + setInnerRadius( 0 ); + setOuterRadius( 5 ); + setTotalAngle( 270.0 ); + setLineWidth( 1 ); + } +}; + + + + +sidInstrumentView::sidInstrumentView( instrument * _instrument, + QWidget * _parent ) : + instrumentView( _instrument, _parent ) +{ + + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); + + m_volKnob = new sidKnob( this ); + m_volKnob->setHintText( tr( "Volume:" ) + " ", "" ); + m_volKnob->move( 7, 60 ); + + m_resKnob = new sidKnob( this ); + m_resKnob->setHintText( tr( "Resonance:" ) + " ", "" ); + m_resKnob->move( 7 + 29, 60 ); + + m_cutKnob = new sidKnob( this ); + m_cutKnob->setHintText( tr( "Cutoff frequency:" ) + " ", "Hz" ); + m_cutKnob->move( 7 + 2*29, 60 ); + + pixmapButton * hp_btn = new pixmapButton( this, NULL ); + hp_btn->move( 176, 53 ); + hp_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "hpred" ) ); + hp_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "hp" ) ); + toolTip::add( hp_btn, tr( "High-Pass filter ") ); + + pixmapButton * bp_btn = new pixmapButton( this, NULL ); + bp_btn->move( 176 + 14, 53 ); + bp_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "bpred" ) ); + bp_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "bp" ) ); + toolTip::add( bp_btn, tr( "Band-Pass filter ") ); + + pixmapButton * lp_btn = new pixmapButton( this, NULL ); + lp_btn->move( 176 +2*14, 53 ); + lp_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "lpred" ) ); + lp_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "lp" ) ); + toolTip::add( lp_btn, tr( "Low-Pass filter ") ); + + m_passBtnGrp = new automatableButtonGroup( this ); + m_passBtnGrp->addButton( hp_btn ); + m_passBtnGrp->addButton( bp_btn ); + m_passBtnGrp->addButton( lp_btn ); + + m_offButton = new pixmapButton( this, NULL ); + m_offButton->setCheckable( TRUE ); + m_offButton->move( 176 + 3*14, 53 ); + m_offButton->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "3offred" ) ); + m_offButton->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "3off" ) ); + toolTip::add( m_offButton, tr( "Voice3 Off ") ); + + pixmapButton * mos6581_btn = new pixmapButton( this, NULL ); + mos6581_btn->move( 190, 67 ); + mos6581_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "6581red" ) ); + mos6581_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "6581" ) ); + toolTip::add( mos6581_btn, tr( "MOS6581 SID ") ); + + pixmapButton * mos8580_btn = new pixmapButton( this, NULL ); + mos8580_btn->move( 218, 67 ); + mos8580_btn->setActiveGraphic( PLUGIN_NAME::getIconPixmap( "8580red" ) ); + mos8580_btn->setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "8580" ) ); + toolTip::add( mos8580_btn, tr( "MOS8580 SID ") ); + + m_sidTypeBtnGrp = new automatableButtonGroup( this ); + m_sidTypeBtnGrp->addButton( mos6581_btn ); + m_sidTypeBtnGrp->addButton( mos8580_btn ); + + for( int i = 0; i < 3; i++ ) + { + knob *ak = new sidKnob( this ); + ak->setHintText( tr("Attack:") + " ", "" ); + ak->move( 7, 110 + i*50 ); + + knob *dk = new sidKnob( this ); + dk->setHintText( tr("Decay:") + " ", "" ); + dk->move( 7 + 29, 110 + i*50 ); + + knob *sk = new sidKnob( this ); + sk->setHintText( tr("Sustain:") + " ", "" ); + sk->move( 7 + 2*29, 110 + i*50 ); + + knob *rk = new sidKnob( this ); + rk->setHintText( tr("Release:") + " ", "" ); + rk->move( 7 + 3*29, 110 + i*50 ); + + knob *pwk = new sidKnob( this ); + pwk->setHintText( tr("Pulse Width:") + " ", "" ); + pwk->move( 7 + 4*29, 110 + i*50 ); + + knob *crsk = new sidKnob( this ); + crsk->setHintText( tr("Coarse:") + " ", " semitones" ); + crsk->move( 160, 110 + i*50 ); + + pixmapButton * pulse_btn = new pixmapButton( this, NULL ); + pulse_btn->move( 191, 103 + i*50 ); + pulse_btn->setActiveGraphic( + PLUGIN_NAME::getIconPixmap( "pulsered" ) ); + pulse_btn->setInactiveGraphic( + PLUGIN_NAME::getIconPixmap( "pulse" ) ); + toolTip::add( pulse_btn, tr( "Pulse Wave" ) ); + + pixmapButton * triangle_btn = new pixmapButton( this, NULL ); + triangle_btn->move( 191 + 14, 103 + i*50 ); + triangle_btn->setActiveGraphic( + PLUGIN_NAME::getIconPixmap( "trianglered" ) ); + triangle_btn->setInactiveGraphic( + PLUGIN_NAME::getIconPixmap( "triangle" ) ); + toolTip::add( triangle_btn, tr( "Triangle Wave" ) ); + + pixmapButton * saw_btn = new pixmapButton( this, NULL ); + saw_btn->move( 191 + 2*14, 103 + i*50 ); + saw_btn->setActiveGraphic( + PLUGIN_NAME::getIconPixmap( "sawred" ) ); + saw_btn->setInactiveGraphic( + PLUGIN_NAME::getIconPixmap( "saw" ) ); + toolTip::add( saw_btn, tr( "SawTooth" ) ); + + pixmapButton * noise_btn = new pixmapButton( this, NULL ); + noise_btn->move( 191 + 3*14, 103 + i*50 ); + noise_btn->setActiveGraphic( + PLUGIN_NAME::getIconPixmap( "noisered" ) ); + noise_btn->setInactiveGraphic( + PLUGIN_NAME::getIconPixmap( "noise" ) ); + toolTip::add( noise_btn, tr( "Noise" ) ); + + automatableButtonGroup * wfbg = + new automatableButtonGroup( this ); + + wfbg->addButton( pulse_btn ); + wfbg->addButton( triangle_btn ); + wfbg->addButton( saw_btn ); + wfbg->addButton( noise_btn ); + + pixmapButton * sync_btn = new pixmapButton( this, NULL ); + sync_btn->setCheckable( TRUE ); + sync_btn->move( 191, 117 + i*50 ); + sync_btn->setActiveGraphic( + PLUGIN_NAME::getIconPixmap( "syncred" ) ); + sync_btn->setInactiveGraphic( + PLUGIN_NAME::getIconPixmap( "sync" ) ); + toolTip::add( sync_btn, tr( "Sync" ) ); + + pixmapButton * ringMod_btn = new pixmapButton( this, NULL ); + ringMod_btn->setCheckable( TRUE ); + ringMod_btn->move( 191 + 2*14, 117 + i*50 ); + ringMod_btn->setActiveGraphic( + PLUGIN_NAME::getIconPixmap( "ringred" ) ); + ringMod_btn->setInactiveGraphic( + PLUGIN_NAME::getIconPixmap( "ring" ) ); + toolTip::add( ringMod_btn, tr( "Ring-Mod" ) ); + + pixmapButton * filter_btn = new pixmapButton( this, NULL ); + filter_btn->setCheckable( TRUE ); + filter_btn->move( 204, 131 + i*50 ); + filter_btn->setActiveGraphic( + PLUGIN_NAME::getIconPixmap( "filterred" ) ); + filter_btn->setInactiveGraphic( + PLUGIN_NAME::getIconPixmap( "filter" ) ); + toolTip::add( filter_btn, tr( "Filtered" ) ); + + m_voiceKnobs[i] = voiceKnobs( ak, dk, sk, rk, pwk, crsk, wfbg, + sync_btn, ringMod_btn, filter_btn ); + } + + for( int i = 0; i < 3; ++i ) + { + connect( m_voiceKnobs[i].m_attKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobHint() ) ); + connect( m_voiceKnobs[i].m_decKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobHint() ) ); + connect( m_voiceKnobs[i].m_relKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobHint() ) ); + connect( m_voiceKnobs[i].m_pwKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobHint() ) ); + connect( m_voiceKnobs[i].m_sustKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobToolTip() ) ); + connect( m_voiceKnobs[i].m_crsKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobToolTip() ) ); + } + connect( m_volKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobToolTip() ) ); + connect( m_resKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobToolTip() ) ); + connect( m_cutKnob, SIGNAL( sliderMoved( float ) ), + this, SLOT( updateKnobHint() ) ); + updateKnobHint(); + updateKnobToolTip(); +} + + +sidInstrumentView::~sidInstrumentView() +{ +} + +void sidInstrumentView::updateKnobHint( void ) +{ + sidInstrument * k = castModel(); + + for( int i = 0; i < 3; ++i ) + { + m_voiceKnobs[i].m_attKnob->setHintText( tr( "Attack:" ) + " ", " (" + + QString::fromAscii( attackTime[(int)k->m_voice[i]-> + m_attackModel.value()] ) + ")" ); + toolTip::add( m_voiceKnobs[i].m_attKnob, + attackTime[(int)k->m_voice[i]->m_attackModel.value()] ); + + m_voiceKnobs[i].m_decKnob->setHintText( tr( "Decay:" ) + " ", " (" + + QString::fromAscii( decRelTime[(int)k->m_voice[i]-> + m_decayModel.value()] ) + ")" ); + toolTip::add( m_voiceKnobs[i].m_decKnob, + decRelTime[(int)k->m_voice[i]->m_decayModel.value()] ); + + m_voiceKnobs[i].m_relKnob->setHintText( tr( "Release:" ) + " ", " (" + + QString::fromAscii( decRelTime[(int)k->m_voice[i]-> + m_releaseModel.value()] ) + ")" ); + toolTip::add( m_voiceKnobs[i].m_relKnob, + decRelTime[(int)k->m_voice[i]->m_releaseModel.value()]); + + m_voiceKnobs[i].m_pwKnob->setHintText( tr( "Pulse Width:" )+ " ", " (" + + QString::number( (double)k->m_voice[i]-> + m_pulseWidthModel.value() / 40.95 ) + "%)" ); + toolTip::add( m_voiceKnobs[i].m_pwKnob, + QString::number( (double)k->m_voice[i]-> + m_pulseWidthModel.value() / 40.95 ) + "%" ); + } + m_cutKnob->setHintText( tr( "Cutoff frequency:" ) + " ", " (" + + QString::number ( (int) ( 9970.0 / 2047.0 * + (double)k->m_filterFCModel.value() + 30.0 ) ) + "Hz)" ); + toolTip::add( m_cutKnob, QString::number( (int) ( 9970.0 / 2047.0 * + (double)k->m_filterFCModel.value() + 30.0 ) ) + "Hz" ); +} + + + + +void sidInstrumentView::updateKnobToolTip( void ) +{ + sidInstrument * k = castModel(); + for( int i = 0; i < 3; ++i ) + { + toolTip::add( m_voiceKnobs[i].m_sustKnob, + QString::number( (int)k->m_voice[i]->m_sustainModel.value() ) ); + toolTip::add( m_voiceKnobs[i].m_crsKnob, + QString::number( (int)k->m_voice[i]->m_coarseModel.value() ) + + " semitones" ); + } + toolTip::add( m_volKnob, + QString::number( (int)k->m_volumeModel.value() ) ); + toolTip::add( m_resKnob, + QString::number( (int)k->m_filterResonanceModel.value() ) ); +} + + + + +void sidInstrumentView::modelChanged( void ) +{ + sidInstrument * k = castModel(); + + m_volKnob->setModel( &k->m_volumeModel ); + m_resKnob->setModel( &k->m_filterResonanceModel ); + m_cutKnob->setModel( &k->m_filterFCModel ); + m_passBtnGrp->setModel( &k->m_filterModeModel ); + m_offButton->setModel( &k->m_voice3OffModel ); + m_sidTypeBtnGrp->setModel( &k->m_chipModel ); + + for( int i = 0; i < 3; ++i ) + { + m_voiceKnobs[i].m_attKnob->setModel( + &k->m_voice[i]->m_attackModel ); + m_voiceKnobs[i].m_decKnob->setModel( + &k->m_voice[i]->m_decayModel ); + m_voiceKnobs[i].m_sustKnob->setModel( + &k->m_voice[i]->m_sustainModel ); + m_voiceKnobs[i].m_relKnob->setModel( + &k->m_voice[i]->m_releaseModel ); + m_voiceKnobs[i].m_pwKnob->setModel( + &k->m_voice[i]->m_pulseWidthModel ); + m_voiceKnobs[i].m_crsKnob->setModel( + &k->m_voice[i]->m_coarseModel ); + m_voiceKnobs[i].m_waveFormBtnGrp->setModel( + &k->m_voice[i]->m_waveFormModel ); + m_voiceKnobs[i].m_syncButton->setModel( + &k->m_voice[i]->m_syncModel ); + m_voiceKnobs[i].m_ringModButton->setModel( + &k->m_voice[i]->m_ringModModel ); + m_voiceKnobs[i].m_filterButton->setModel( + &k->m_voice[i]->m_filteredModel ); + } +} + + + + + +extern "C" +{ + +// neccessary for getting instance out of shared lib +plugin * PLUGIN_EXPORT lmms_plugin_main( model *, void * _data ) +{ + return( new sidInstrument( + static_cast( _data ) ) ); +} + + +} + + +#include "moc_sid_instrument.cxx" + diff --git a/plugins/sid/sid_instrument.h b/plugins/sid/sid_instrument.h new file mode 100644 index 000000000..b5e3bdaf5 --- /dev/null +++ b/plugins/sid/sid_instrument.h @@ -0,0 +1,198 @@ +/* + * sid_instrument.h - ResID based software-synthesizer + * + * Copyright (c) 2008 Csaba Hruska + * Attila Herman + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef _SID_H +#define _SID_H + +#include +#include "instrument.h" +#include "instrument_view.h" +#include "knob.h" + + +class sidInstrumentView; +class notePlayHandle; +class automatableButtonGroup; +class pixmapButton; + +class voiceObject : public model +{ + Q_OBJECT +public: + enum WaveForm { + SquareWave = 0, + TriangleWave, + SawWave, + NoiseWave, + NumWaveShapes + }; + voiceObject( model * _parent, int _idx ); + virtual ~voiceObject(); + + +private: + knobModel m_pulseWidthModel; + knobModel m_attackModel; + knobModel m_decayModel; + knobModel m_sustainModel; + knobModel m_releaseModel; + knobModel m_coarseModel; + intModel m_waveFormModel; + boolModel m_syncModel; + boolModel m_ringModModel; + boolModel m_filteredModel; + + friend class sidInstrument; + friend class sidInstrumentView; +} ; + +class sidInstrument : public instrument +{ + Q_OBJECT +public: + enum FilerType { + HighPass = 0, + BandPass, + LowPass, + NumFilterTypes + }; + + enum ChipModel { + sidMOS6581 = 0, + sidMOS8580, + NumChipModels + }; + + + sidInstrument( instrumentTrack * _instrument_track ); + virtual ~sidInstrument(); + + virtual void playNote( notePlayHandle * _n, bool _try_parallelizing, + sampleFrame * _working_buffer ); + virtual void deleteNotePluginData( notePlayHandle * _n ); + + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + + virtual QString nodeName( void ) const; + + virtual f_cnt_t desiredReleaseFrames( void ) const; + + virtual pluginView * instantiateView( QWidget * _parent ); + + +public slots: + void updateKnobHint( void ); + void updateKnobToolTip( void ); + +private: + // voices + voiceObject * m_voice[3]; + + // filter + knobModel m_filterFCModel; + knobModel m_filterResonanceModel; + intModel m_filterModeModel; + + // misc + boolModel m_voice3OffModel; + knobModel m_volumeModel; + + intModel m_chipModel; + + friend class sidInstrumentView; + +} ; + + + +class sidInstrumentView : public instrumentView +{ + Q_OBJECT +public: + sidInstrumentView( instrument * _instrument, QWidget * _parent ); + virtual ~sidInstrumentView(); + +private: + virtual void modelChanged( void ); + + automatableButtonGroup * m_passBtnGrp; + automatableButtonGroup * m_sidTypeBtnGrp; + + struct voiceKnobs + { + voiceKnobs( knob * a, + knob * d, + knob * s, + knob * r, + knob * pw, + knob * crs, + automatableButtonGroup * wfbg, + pixmapButton * syncb, + pixmapButton * ringb, + pixmapButton * filterb ) : + m_attKnob( a ), + m_decKnob( d ), + m_sustKnob( s ), + m_relKnob( r ), + m_pwKnob( pw ), + m_crsKnob( crs ), + m_waveFormBtnGrp( wfbg ), + m_syncButton( syncb ), + m_ringModButton( ringb ), + m_filterButton( filterb ) + { + } + voiceKnobs() + { + } + knob * m_attKnob; + knob * m_decKnob; + knob * m_sustKnob; + knob * m_relKnob; + knob * m_pwKnob; + knob * m_crsKnob; + automatableButtonGroup * m_waveFormBtnGrp; + pixmapButton * m_syncButton; + pixmapButton * m_ringModButton; + pixmapButton * m_filterButton; + } ; + + voiceKnobs m_voiceKnobs[3]; + + knob * m_volKnob; + knob * m_resKnob; + knob * m_cutKnob; + pixmapButton * m_offButton; + +protected slots: + void updateKnobHint( void ); + void updateKnobToolTip( void ); +} ; + + +#endif diff --git a/plugins/sid/siddefs.h b/plugins/sid/siddefs.h new file mode 100644 index 000000000..e8a9ef578 --- /dev/null +++ b/plugins/sid/siddefs.h @@ -0,0 +1,69 @@ +#define VERSION "0.16" + +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 1999 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __SIDDEFS_H__ +#define __SIDDEFS_H__ + +// Define bool, true, and false for C++ compilers that lack these keywords. +#define RESID_HAVE_BOOL 1 + +#if !RESID_HAVE_BOOL +typedef int bool; +const bool true = 1; +const bool false = 0; +#endif + +// We could have used the smallest possible data type for each SID register, +// however this would give a slower engine because of data type conversions. +// An int is assumed to be at least 32 bits (necessary in the types reg24, +// cycle_count, and sound_sample). GNU does not support 16-bit machines +// (GNU Coding Standards: Portability between CPUs), so this should be +// a valid assumption. + +typedef unsigned int reg4; +typedef unsigned int reg8; +typedef unsigned int reg12; +typedef unsigned int reg16; +typedef unsigned int reg24; + +typedef int cycle_count; +typedef int sound_sample; +typedef sound_sample fc_point[2]; + +enum chip_model { MOS6581, MOS8580 }; + +enum sampling_method { SAMPLE_FAST, SAMPLE_INTERPOLATE, + SAMPLE_RESAMPLE_INTERPOLATE, SAMPLE_RESAMPLE_FAST }; + +extern "C" +{ +#ifndef __VERSION_CC__ +extern const char* resid_version_string; +#else +const char* resid_version_string = VERSION; +#endif +} + +// Inlining on/off. +#define RESID_INLINING 1 +#define RESID_INLINE inline + +#endif // not __SIDDEFS_H__ diff --git a/plugins/sid/spline.h b/plugins/sid/spline.h new file mode 100644 index 000000000..93ba2776a --- /dev/null +++ b/plugins/sid/spline.h @@ -0,0 +1,272 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __SPLINE_H__ +#define __SPLINE_H__ + +// Our objective is to construct a smooth interpolating single-valued function +// y = f(x). +// +// Catmull-Rom splines are widely used for interpolation, however these are +// parametric curves [x(t) y(t) ...] and can not be used to directly calculate +// y = f(x). +// For a discussion of Catmull-Rom splines see Catmull, E., and R. Rom, +// "A Class of Local Interpolating Splines", Computer Aided Geometric Design. +// +// Natural cubic splines are single-valued functions, and have been used in +// several applications e.g. to specify gamma curves for image display. +// These splines do not afford local control, and a set of linear equations +// including all interpolation points must be solved before any point on the +// curve can be calculated. The lack of local control makes the splines +// more difficult to handle than e.g. Catmull-Rom splines, and real-time +// interpolation of a stream of data points is not possible. +// For a discussion of natural cubic splines, see e.g. Kreyszig, E., "Advanced +// Engineering Mathematics". +// +// Our approach is to approximate the properties of Catmull-Rom splines for +// piecewice cubic polynomials f(x) = ax^3 + bx^2 + cx + d as follows: +// Each curve segment is specified by four interpolation points, +// p0, p1, p2, p3. +// The curve between p1 and p2 must interpolate both p1 and p2, and in addition +// f'(p1.x) = k1 = (p2.y - p0.y)/(p2.x - p0.x) and +// f'(p2.x) = k2 = (p3.y - p1.y)/(p3.x - p1.x). +// +// The constraints are expressed by the following system of linear equations +// +// [ 1 xi xi^2 xi^3 ] [ d ] [ yi ] +// [ 1 2*xi 3*xi^2 ] * [ c ] = [ ki ] +// [ 1 xj xj^2 xj^3 ] [ b ] [ yj ] +// [ 1 2*xj 3*xj^2 ] [ a ] [ kj ] +// +// Solving using Gaussian elimination and back substitution, setting +// dy = yj - yi, dx = xj - xi, we get +// +// a = ((ki + kj) - 2*dy/dx)/(dx*dx); +// b = ((kj - ki)/dx - 3*(xi + xj)*a)/2; +// c = ki - (3*xi*a + 2*b)*xi; +// d = yi - ((xi*a + b)*xi + c)*xi; +// +// Having calculated the coefficients of the cubic polynomial we have the +// choice of evaluation by brute force +// +// for (x = x1; x <= x2; x += res) { +// y = ((a*x + b)*x + c)*x + d; +// plot(x, y); +// } +// +// or by forward differencing +// +// y = ((a*x1 + b)*x1 + c)*x1 + d; +// dy = (3*a*(x1 + res) + 2*b)*x1*res + ((a*res + b)*res + c)*res; +// d2y = (6*a*(x1 + res) + 2*b)*res*res; +// d3y = 6*a*res*res*res; +// +// for (x = x1; x <= x2; x += res) { +// plot(x, y); +// y += dy; dy += d2y; d2y += d3y; +// } +// +// See Foley, Van Dam, Feiner, Hughes, "Computer Graphics, Principles and +// Practice" for a discussion of forward differencing. +// +// If we have a set of interpolation points p0, ..., pn, we may specify +// curve segments between p0 and p1, and between pn-1 and pn by using the +// following constraints: +// f''(p0.x) = 0 and +// f''(pn.x) = 0. +// +// Substituting the results for a and b in +// +// 2*b + 6*a*xi = 0 +// +// we get +// +// ki = (3*dy/dx - kj)/2; +// +// or by substituting the results for a and b in +// +// 2*b + 6*a*xj = 0 +// +// we get +// +// kj = (3*dy/dx - ki)/2; +// +// Finally, if we have only two interpolation points, the cubic polynomial +// will degenerate to a straight line if we set +// +// ki = kj = dy/dx; +// + + +#if SPLINE_BRUTE_FORCE +#define interpolate_segment interpolate_brute_force +#else +#define interpolate_segment interpolate_forward_difference +#endif + + +// ---------------------------------------------------------------------------- +// Calculation of coefficients. +// ---------------------------------------------------------------------------- +inline +void cubic_coefficients(double x1, double y1, double x2, double y2, + double k1, double k2, + double& a, double& b, double& c, double& d) +{ + double dx = x2 - x1, dy = y2 - y1; + + a = ((k1 + k2) - 2*dy/dx)/(dx*dx); + b = ((k2 - k1)/dx - 3*(x1 + x2)*a)/2; + c = k1 - (3*x1*a + 2*b)*x1; + d = y1 - ((x1*a + b)*x1 + c)*x1; +} + +// ---------------------------------------------------------------------------- +// Evaluation of cubic polynomial by brute force. +// ---------------------------------------------------------------------------- +template +inline +void interpolate_brute_force(double x1, double y1, double x2, double y2, + double k1, double k2, + PointPlotter plot, double res) +{ + double a, b, c, d; + cubic_coefficients(x1, y1, x2, y2, k1, k2, a, b, c, d); + + // Calculate each point. + for (double x = x1; x <= x2; x += res) { + double y = ((a*x + b)*x + c)*x + d; + plot(x, y); + } +} + +// ---------------------------------------------------------------------------- +// Evaluation of cubic polynomial by forward differencing. +// ---------------------------------------------------------------------------- +template +inline +void interpolate_forward_difference(double x1, double y1, double x2, double y2, + double k1, double k2, + PointPlotter plot, double res) +{ + double a, b, c, d; + cubic_coefficients(x1, y1, x2, y2, k1, k2, a, b, c, d); + + double y = ((a*x1 + b)*x1 + c)*x1 + d; + double dy = (3*a*(x1 + res) + 2*b)*x1*res + ((a*res + b)*res + c)*res; + double d2y = (6*a*(x1 + res) + 2*b)*res*res; + double d3y = 6*a*res*res*res; + + // Calculate each point. + for (double x = x1; x <= x2; x += res) { + plot(x, y); + y += dy; dy += d2y; d2y += d3y; + } +} + +template +inline +double x(PointIter p) +{ + return (*p)[0]; +} + +template +inline +double y(PointIter p) +{ + return (*p)[1]; +} + +// ---------------------------------------------------------------------------- +// Evaluation of complete interpolating function. +// Note that since each curve segment is controlled by four points, the +// end points will not be interpolated. If extra control points are not +// desirable, the end points can simply be repeated to ensure interpolation. +// Note also that points of non-differentiability and discontinuity can be +// introduced by repeating points. +// ---------------------------------------------------------------------------- +template +inline +void interpolate(PointIter p0, PointIter pn, PointPlotter plot, double res) +{ + double k1, k2; + + // Set up points for first curve segment. + PointIter p1 = p0; ++p1; + PointIter p2 = p1; ++p2; + PointIter p3 = p2; ++p3; + + // Draw each curve segment. + for (; p2 != pn; ++p0, ++p1, ++p2, ++p3) { + // p1 and p2 equal; single point. + if (x(p1) == x(p2)) { + continue; + } + // Both end points repeated; straight line. + if (x(p0) == x(p1) && x(p2) == x(p3)) { + k1 = k2 = (y(p2) - y(p1))/(x(p2) - x(p1)); + } + // p0 and p1 equal; use f''(x1) = 0. + else if (x(p0) == x(p1)) { + k2 = (y(p3) - y(p1))/(x(p3) - x(p1)); + k1 = (3*(y(p2) - y(p1))/(x(p2) - x(p1)) - k2)/2; + } + // p2 and p3 equal; use f''(x2) = 0. + else if (x(p2) == x(p3)) { + k1 = (y(p2) - y(p0))/(x(p2) - x(p0)); + k2 = (3*(y(p2) - y(p1))/(x(p2) - x(p1)) - k1)/2; + } + // Normal curve. + else { + k1 = (y(p2) - y(p0))/(x(p2) - x(p0)); + k2 = (y(p3) - y(p1))/(x(p3) - x(p1)); + } + + interpolate_segment(x(p1), y(p1), x(p2), y(p2), k1, k2, plot, res); + } +} + +// ---------------------------------------------------------------------------- +// Class for plotting integers into an array. +// ---------------------------------------------------------------------------- +template +class PointPlotter +{ + protected: + F* f; + + public: + PointPlotter(F* arr) : f(arr) + { + } + + void operator ()(double x, double y) + { + // Clamp negative values to zero. + if (y < 0) { + y = 0; + } + + f[F(x)] = F(y); + } +}; + + +#endif // not __SPLINE_H__ diff --git a/plugins/sid/sync.png b/plugins/sid/sync.png new file mode 100644 index 0000000000000000000000000000000000000000..a8105db270b4fbec11174299a292f47b5d62a976 GIT binary patch literal 478 zcmV<40U`d0P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1|u7aG}?Ip000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0003wNklfy1!?5CuvA!1L;b0c{kl!hse5iWI}G)oza`Tr6T} zotf%%?xA%C%lc~7Izyx3L+cFl`NH%Lha&($vv~)lK8*ie6tPW_pi+t= zHrMMn_Ii&d*l{HH+5KCoxVhY4f%^)AzyyfcT&-4&qKMn=_6YD3@azc>700phtJNEl zwPTMIt&ecD^G(`eG0qzSE U)3#NJ-~a#s07*qoM6N<$f}v&0ga7~l literal 0 HcmV?d00001 diff --git a/plugins/sid/syncred.png b/plugins/sid/syncred.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7ead1b5992f9d2d9e8e48cc1c50854512dd099 GIT binary patch literal 560 zcmV-00?+-4P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1|_CX>@2HM@dakSAh-}0004tNkleC zv{J-OD?bmIIc!4_D?Se9%TOYHz3WrY=jq+^?(;nF=c54xDnbHqIEqyh)S@y}7t{bk zlGM?)+Y4W2_#V?XE1g*x%Drvd&w{fAuET@WZ5J$9}LkQ=Z_tpFdGa~ zqu1l9C_@vkk+!m)pdlnltDKugml(F>2!kP2$!*kDiXKy@kR+{WHl_(*UA4j;%eM%F zAyu@?>Efo*rR2x0c|xa4NvQ2`6pK&2962~*$YSQK%E?TD4S?R*Ba;PI0Q$`)Mh}h^ z{>14ScXziehQkSUrov$!9`3(4&D=$Z>@_b%!5$N=o_`dEox(Iv|i>2!Fa(YN-* z+x!uOMk7f{$zSi`dqmvzN<1G7De*w$8o%Af=;86V=4jdS;i)KPFgN?t41eU(rSdXb y_X5OXvA=WaS9pDOUts^&V*j>>|MSzRDfkRM$BsHJ#cGZK0000+Vtj literal 0 HcmV?d00001 diff --git a/plugins/sid/triangle.png b/plugins/sid/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..6539efe08a75b04f3687ad3186ead331df28d8f0 GIT binary patch literal 510 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOP! z1}p{lqx;nW000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}00045Nklsy)MAk1K&=BGpa(AZ0f&1o_c(y~2etqjjr~87_V(&*@K5|mOp;rYXN|L(W zj@)ut#u#k?c%DbA*#cm8b3r6{m=!R&elK(pDx^St$)iUyIawd(i#s#Gd+ z97i~g;4Sa&R&?AymbF%cK_p|003=Ca7|Qp3y*uek_`a|3G?b)IsQ}aI1zDE;__r*} zm|jlTy#vS?!+1QVD2iX*QYw{bx7%;T550fIEAc_B9+r4% A{{R30 literal 0 HcmV?d00001 diff --git a/plugins/sid/trianglered.png b/plugins/sid/trianglered.png new file mode 100644 index 0000000000000000000000000000000000000000..06831e083db4d3bbe3272fb5c9bcfa54321039b5 GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPS2P2z~TYEF? z*B+iqWPkYV(Wb?dSspSLO!0`Z)cwfg(elAXth1|vD@Sox-j!QP^}o_f4|pZ9|Graq z|4HeOTKjm$ju(o|493Qn|2w_h;wEpqO#8}JmR+-c$OEa?S-uO?%8%AEv_&2?(7H04 z_u5`HhIF@9bTa;y0X!q=kf()Cw&ZMdwDF~KJQJ$Lef8CK(=_Z9gd%8FT9w;^Jy)6`d%OYV> z{o%Kqz0H@H+x7X@z5W*$&$4ya(ZCnRSMHxbx8&HT^HwFl`M)Tyd%ftk-*a7ti;r$- yh_BE85ikEz60iGfZZmup`aXdk-)s7(8A5T-G@yGywot=+Y?w literal 0 HcmV?d00001 diff --git a/plugins/sid/version.cc b/plugins/sid/version.cc new file mode 100644 index 000000000..3b61afd24 --- /dev/null +++ b/plugins/sid/version.cc @@ -0,0 +1,21 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#define __VERSION_CC__ +#include "siddefs.h" diff --git a/plugins/sid/voice.cc b/plugins/sid/voice.cc new file mode 100644 index 000000000..9c0017f99 --- /dev/null +++ b/plugins/sid/voice.cc @@ -0,0 +1,132 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#define __VOICE_CC__ +#include "voice.h" + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +Voice::Voice() +{ + set_chip_model(MOS6581); +} + +// ---------------------------------------------------------------------------- +// Set chip model. +// ---------------------------------------------------------------------------- +void Voice::set_chip_model(chip_model model) +{ + wave.set_chip_model(model); + + if (model == MOS6581) { + // The waveform D/A converter introduces a DC offset in the signal + // to the envelope multiplying D/A converter. The "zero" level of + // the waveform D/A converter can be found as follows: + // + // Measure the "zero" voltage of voice 3 on the SID audio output + // pin, routing only voice 3 to the mixer ($d417 = $0b, $d418 = + // $0f, all other registers zeroed). + // + // Then set the sustain level for voice 3 to maximum and search for + // the waveform output value yielding the same voltage as found + // above. This is done by trying out different waveform output + // values until the correct value is found, e.g. with the following + // program: + // + // lda #$08 + // sta $d412 + // lda #$0b + // sta $d417 + // lda #$0f + // sta $d418 + // lda #$f0 + // sta $d414 + // lda #$21 + // sta $d412 + // lda #$01 + // sta $d40e + // + // ldx #$00 + // lda #$38 ; Tweak this to find the "zero" level + //l cmp $d41b + // bne l + // stx $d40e ; Stop frequency counter - freeze waveform output + // brk + // + // The waveform output range is 0x000 to 0xfff, so the "zero" + // level should ideally have been 0x800. In the measured chip, the + // waveform output "zero" level was found to be 0x380 (i.e. $d41b + // = 0x38) at 5.94V. + + wave_zero = 0x380; + + // The envelope multiplying D/A converter introduces another DC + // offset. This is isolated by the following measurements: + // + // * The "zero" output level of the mixer at full volume is 5.44V. + // * Routing one voice to the mixer at full volume yields + // 6.75V at maximum voice output (wave = 0xfff, sustain = 0xf) + // 5.94V at "zero" voice output (wave = any, sustain = 0x0) + // 5.70V at minimum voice output (wave = 0x000, sustain = 0xf) + // * The DC offset of one voice is (5.94V - 5.44V) = 0.50V + // * The dynamic range of one voice is |6.75V - 5.70V| = 1.05V + // * The DC offset is thus 0.50V/1.05V ~ 1/2 of the dynamic range. + // + // Note that by removing the DC offset, we get the following ranges for + // one voice: + // y > 0: (6.75V - 5.44V) - 0.50V = 0.81V + // y < 0: (5.70V - 5.44V) - 0.50V = -0.24V + // The scaling of the voice amplitude is not symmetric about y = 0; + // this follows from the DC level in the waveform output. + + voice_DC = 0x800*0xff; + } + else { + // No DC offsets in the MOS8580. + wave_zero = 0x800; + voice_DC = 0; + } +} + +// ---------------------------------------------------------------------------- +// Set sync source. +// ---------------------------------------------------------------------------- +void Voice::set_sync_source(Voice* source) +{ + wave.set_sync_source(&source->wave); +} + +// ---------------------------------------------------------------------------- +// Register functions. +// ---------------------------------------------------------------------------- +void Voice::writeCONTROL_REG(reg8 control) +{ + wave.writeCONTROL_REG(control); + envelope.writeCONTROL_REG(control); +} + +// ---------------------------------------------------------------------------- +// SID reset. +// ---------------------------------------------------------------------------- +void Voice::reset() +{ + wave.reset(); + envelope.reset(); +} diff --git a/plugins/sid/voice.h b/plugins/sid/voice.h new file mode 100644 index 000000000..d248f32ae --- /dev/null +++ b/plugins/sid/voice.h @@ -0,0 +1,77 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __VOICE_H__ +#define __VOICE_H__ + +#include "siddefs.h" +#include "wave.h" +#include "envelope.h" + +class Voice +{ +public: + Voice(); + + void set_chip_model(chip_model model); + void set_sync_source(Voice*); + void reset(); + + void writeCONTROL_REG(reg8); + + // Amplitude modulated waveform output. + // Range [-2048*255, 2047*255]. + RESID_INLINE sound_sample output(); + +protected: + WaveformGenerator wave; + EnvelopeGenerator envelope; + + // Waveform D/A zero level. + sound_sample wave_zero; + + // Multiplying D/A DC offset. + sound_sample voice_DC; + +friend class SID; +}; + + +// ---------------------------------------------------------------------------- +// Inline functions. +// The following function is defined inline because it is called every +// time a sample is calculated. +// ---------------------------------------------------------------------------- + +#if RESID_INLINING || defined(__VOICE_CC__) + +// ---------------------------------------------------------------------------- +// Amplitude modulated waveform output. +// Ideal range [-2048*255, 2047*255]. +// ---------------------------------------------------------------------------- +RESID_INLINE +sound_sample Voice::output() +{ + // Multiply oscillator output with envelope output. + return (wave.output() - wave_zero)*envelope.output() + voice_DC; +} + +#endif // RESID_INLINING || defined(__VOICE_CC__) + +#endif // not __VOICE_H__ diff --git a/plugins/sid/wave.cc b/plugins/sid/wave.cc new file mode 100644 index 000000000..fbcb58c12 --- /dev/null +++ b/plugins/sid/wave.cc @@ -0,0 +1,144 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#define __WAVE_CC__ +#include "wave.h" + +// ---------------------------------------------------------------------------- +// Constructor. +// ---------------------------------------------------------------------------- +WaveformGenerator::WaveformGenerator() +{ + sync_source = this; + + set_chip_model(MOS6581); + + reset(); +} + + +// ---------------------------------------------------------------------------- +// Set sync source. +// ---------------------------------------------------------------------------- +void WaveformGenerator::set_sync_source(WaveformGenerator* source) +{ + sync_source = source; + source->sync_dest = this; +} + + +// ---------------------------------------------------------------------------- +// Set chip model. +// ---------------------------------------------------------------------------- +void WaveformGenerator::set_chip_model(chip_model model) +{ + if (model == MOS6581) { + wave__ST = wave6581__ST; + wave_P_T = wave6581_P_T; + wave_PS_ = wave6581_PS_; + wave_PST = wave6581_PST; + } + else { + wave__ST = wave8580__ST; + wave_P_T = wave8580_P_T; + wave_PS_ = wave8580_PS_; + wave_PST = wave8580_PST; + } +} + + +// ---------------------------------------------------------------------------- +// Register functions. +// ---------------------------------------------------------------------------- +void WaveformGenerator::writeFREQ_LO(reg8 freq_lo) +{ + freq = freq & 0xff00 | freq_lo & 0x00ff; +} + +void WaveformGenerator::writeFREQ_HI(reg8 freq_hi) +{ + freq = (freq_hi << 8) & 0xff00 | freq & 0x00ff; +} + +void WaveformGenerator::writePW_LO(reg8 pw_lo) +{ + pw = pw & 0xf00 | pw_lo & 0x0ff; +} + +void WaveformGenerator::writePW_HI(reg8 pw_hi) +{ + pw = (pw_hi << 8) & 0xf00 | pw & 0x0ff; +} + +void WaveformGenerator::writeCONTROL_REG(reg8 control) +{ + waveform = (control >> 4) & 0x0f; + ring_mod = control & 0x04; + sync = control & 0x02; + + reg8 test_next = control & 0x08; + + // Test bit set. + // The accumulator and the shift register are both cleared. + // NB! The shift register is not really cleared immediately. It seems like + // the individual bits in the shift register start to fade down towards + // zero when test is set. All bits reach zero within approximately + // $2000 - $4000 cycles. + // This is not modeled. There should fortunately be little audible output + // from this peculiar behavior. + if (test_next) { + accumulator = 0; + shift_register = 0; + } + // Test bit cleared. + // The accumulator starts counting, and the shift register is reset to + // the value 0x7ffff8. + // NB! The shift register will not actually be set to this exact value if the + // shift register bits have not had time to fade to zero. + // This is not modeled. + else if (test) { + shift_register = 0x7ffff8; + } + + test = test_next; + + // The gate bit is handled by the EnvelopeGenerator. +} + +reg8 WaveformGenerator::readOSC() +{ + return output() >> 4; +} + +// ---------------------------------------------------------------------------- +// SID reset. +// ---------------------------------------------------------------------------- +void WaveformGenerator::reset() +{ + accumulator = 0; + shift_register = 0x7ffff8; + freq = 0; + pw = 0; + + test = 0; + ring_mod = 0; + sync = 0; + + msb_rising = false; +} diff --git a/plugins/sid/wave.h b/plugins/sid/wave.h new file mode 100644 index 000000000..b86de99b3 --- /dev/null +++ b/plugins/sid/wave.h @@ -0,0 +1,503 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#ifndef __WAVE_H__ +#define __WAVE_H__ + +#include "siddefs.h" + +// ---------------------------------------------------------------------------- +// A 24 bit accumulator is the basis for waveform generation. FREQ is added to +// the lower 16 bits of the accumulator each cycle. +// The accumulator is set to zero when TEST is set, and starts counting +// when TEST is cleared. +// The noise waveform is taken from intermediate bits of a 23 bit shift +// register. This register is clocked by bit 19 of the accumulator. +// ---------------------------------------------------------------------------- +class WaveformGenerator +{ +public: + WaveformGenerator(); + + void set_sync_source(WaveformGenerator*); + void set_chip_model(chip_model model); + + RESID_INLINE void clock(); + RESID_INLINE void clock(cycle_count delta_t); + RESID_INLINE void synchronize(); + void reset(); + + void writeFREQ_LO(reg8); + void writeFREQ_HI(reg8); + void writePW_LO(reg8); + void writePW_HI(reg8); + void writeCONTROL_REG(reg8); + reg8 readOSC(); + + // 12-bit waveform output. + RESID_INLINE reg12 output(); + +protected: + const WaveformGenerator* sync_source; + WaveformGenerator* sync_dest; + + // Tell whether the accumulator MSB was set high on this cycle. + bool msb_rising; + + reg24 accumulator; + reg24 shift_register; + + // Fout = (Fn*Fclk/16777216)Hz + reg16 freq; + // PWout = (PWn/40.95)% + reg12 pw; + + // The control register right-shifted 4 bits; used for output function + // table lookup. + reg8 waveform; + + // The remaining control register bits. + reg8 test; + reg8 ring_mod; + reg8 sync; + // The gate bit is handled by the EnvelopeGenerator. + + // 16 possible combinations of waveforms. + RESID_INLINE reg12 output____(); + RESID_INLINE reg12 output___T(); + RESID_INLINE reg12 output__S_(); + RESID_INLINE reg12 output__ST(); + RESID_INLINE reg12 output_P__(); + RESID_INLINE reg12 output_P_T(); + RESID_INLINE reg12 output_PS_(); + RESID_INLINE reg12 output_PST(); + RESID_INLINE reg12 outputN___(); + RESID_INLINE reg12 outputN__T(); + RESID_INLINE reg12 outputN_S_(); + RESID_INLINE reg12 outputN_ST(); + RESID_INLINE reg12 outputNP__(); + RESID_INLINE reg12 outputNP_T(); + RESID_INLINE reg12 outputNPS_(); + RESID_INLINE reg12 outputNPST(); + + // Sample data for combinations of waveforms. + static reg8 wave6581__ST[]; + static reg8 wave6581_P_T[]; + static reg8 wave6581_PS_[]; + static reg8 wave6581_PST[]; + + static reg8 wave8580__ST[]; + static reg8 wave8580_P_T[]; + static reg8 wave8580_PS_[]; + static reg8 wave8580_PST[]; + + reg8* wave__ST; + reg8* wave_P_T; + reg8* wave_PS_; + reg8* wave_PST; + +friend class Voice; +friend class SID; +}; + + +// ---------------------------------------------------------------------------- +// Inline functions. +// The following functions are defined inline because they are called every +// time a sample is calculated. +// ---------------------------------------------------------------------------- + +#if RESID_INLINING || defined(__WAVE_CC__) + +// ---------------------------------------------------------------------------- +// SID clocking - 1 cycle. +// ---------------------------------------------------------------------------- +RESID_INLINE +void WaveformGenerator::clock() +{ + // No operation if test bit is set. + if (test) { + return; + } + + reg24 accumulator_prev = accumulator; + + // Calculate new accumulator value; + accumulator += freq; + accumulator &= 0xffffff; + + // Check whether the MSB is set high. This is used for synchronization. + msb_rising = !(accumulator_prev & 0x800000) && (accumulator & 0x800000); + + // Shift noise register once for each time accumulator bit 19 is set high. + if (!(accumulator_prev & 0x080000) && (accumulator & 0x080000)) { + reg24 bit0 = ((shift_register >> 22) ^ (shift_register >> 17)) & 0x1; + shift_register <<= 1; + shift_register &= 0x7fffff; + shift_register |= bit0; + } +} + +// ---------------------------------------------------------------------------- +// SID clocking - delta_t cycles. +// ---------------------------------------------------------------------------- +RESID_INLINE +void WaveformGenerator::clock(cycle_count delta_t) +{ + // No operation if test bit is set. + if (test) { + return; + } + + reg24 accumulator_prev = accumulator; + + // Calculate new accumulator value; + reg24 delta_accumulator = delta_t*freq; + accumulator += delta_accumulator; + accumulator &= 0xffffff; + + // Check whether the MSB is set high. This is used for synchronization. + msb_rising = !(accumulator_prev & 0x800000) && (accumulator & 0x800000); + + // Shift noise register once for each time accumulator bit 19 is set high. + // Bit 19 is set high each time 2^20 (0x100000) is added to the accumulator. + reg24 shift_period = 0x100000; + + while (delta_accumulator) { + if (delta_accumulator < shift_period) { + shift_period = delta_accumulator; + // Determine whether bit 19 is set on the last period. + // NB! Requires two's complement integer. + if (shift_period <= 0x080000) { + // Check for flip from 0 to 1. + if (((accumulator - shift_period) & 0x080000) || !(accumulator & 0x080000)) + { + break; + } + } + else { + // Check for flip from 0 (to 1 or via 1 to 0) or from 1 via 0 to 1. + if (((accumulator - shift_period) & 0x080000) && !(accumulator & 0x080000)) + { + break; + } + } + } + + // Shift the noise/random register. + // NB! The shift is actually delayed 2 cycles, this is not modeled. + reg24 bit0 = ((shift_register >> 22) ^ (shift_register >> 17)) & 0x1; + shift_register <<= 1; + shift_register &= 0x7fffff; + shift_register |= bit0; + + delta_accumulator -= shift_period; + } +} + + +// ---------------------------------------------------------------------------- +// Synchronize oscillators. +// This must be done after all the oscillators have been clock()'ed since the +// oscillators operate in parallel. +// Note that the oscillators must be clocked exactly on the cycle when the +// MSB is set high for hard sync to operate correctly. See SID::clock(). +// ---------------------------------------------------------------------------- +RESID_INLINE +void WaveformGenerator::synchronize() +{ + // A special case occurs when a sync source is synced itself on the same + // cycle as when its MSB is set high. In this case the destination will + // not be synced. This has been verified by sampling OSC3. + if (msb_rising && sync_dest->sync && !(sync && sync_source->msb_rising)) { + sync_dest->accumulator = 0; + } +} + + +// ---------------------------------------------------------------------------- +// Output functions. +// NB! The output from SID 8580 is delayed one cycle compared to SID 6581, +// this is not modeled. +// ---------------------------------------------------------------------------- + +// No waveform: +// Zero output. +// +RESID_INLINE +reg12 WaveformGenerator::output____() +{ + return 0x000; +} + +// Triangle: +// The upper 12 bits of the accumulator are used. +// The MSB is used to create the falling edge of the triangle by inverting +// the lower 11 bits. The MSB is thrown away and the lower 11 bits are +// left-shifted (half the resolution, full amplitude). +// Ring modulation substitutes the MSB with MSB EOR sync_source MSB. +// +RESID_INLINE +reg12 WaveformGenerator::output___T() +{ + reg24 msb = (ring_mod ? accumulator ^ sync_source->accumulator : accumulator) + & 0x800000; + return ((msb ? ~accumulator : accumulator) >> 11) & 0xfff; +} + +// Sawtooth: +// The output is identical to the upper 12 bits of the accumulator. +// +RESID_INLINE +reg12 WaveformGenerator::output__S_() +{ + return accumulator >> 12; +} + +// Pulse: +// The upper 12 bits of the accumulator are used. +// These bits are compared to the pulse width register by a 12 bit digital +// comparator; output is either all one or all zero bits. +// NB! The output is actually delayed one cycle after the compare. +// This is not modeled. +// +// The test bit, when set to one, holds the pulse waveform output at 0xfff +// regardless of the pulse width setting. +// +RESID_INLINE +reg12 WaveformGenerator::output_P__() +{ + return (test || (accumulator >> 12) >= pw) ? 0xfff : 0x000; +} + +// Noise: +// The noise output is taken from intermediate bits of a 23-bit shift register +// which is clocked by bit 19 of the accumulator. +// NB! The output is actually delayed 2 cycles after bit 19 is set high. +// This is not modeled. +// +// Operation: Calculate EOR result, shift register, set bit 0 = result. +// +// ----------------------->--------------------- +// | | +// ----EOR---- | +// | | | +// 2 2 2 1 1 1 1 1 1 1 1 1 1 | +// Register bits: 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 <--- +// | | | | | | | | +// OSC3 bits : 7 6 5 4 3 2 1 0 +// +// Since waveform output is 12 bits the output is left-shifted 4 times. +// +RESID_INLINE +reg12 WaveformGenerator::outputN___() +{ + return + ((shift_register & 0x400000) >> 11) | + ((shift_register & 0x100000) >> 10) | + ((shift_register & 0x010000) >> 7) | + ((shift_register & 0x002000) >> 5) | + ((shift_register & 0x000800) >> 4) | + ((shift_register & 0x000080) >> 1) | + ((shift_register & 0x000010) << 1) | + ((shift_register & 0x000004) << 2); +} + +// Combined waveforms: +// By combining waveforms, the bits of each waveform are effectively short +// circuited. A zero bit in one waveform will result in a zero output bit +// (thus the infamous claim that the waveforms are AND'ed). +// However, a zero bit in one waveform will also affect the neighboring bits +// in the output. The reason for this has not been determined. +// +// Example: +// +// 1 1 +// Bit # 1 0 9 8 7 6 5 4 3 2 1 0 +// ----------------------- +// Sawtooth 0 0 0 1 1 1 1 1 1 0 0 0 +// +// Triangle 0 0 1 1 1 1 1 1 0 0 0 0 +// +// AND 0 0 0 1 1 1 1 1 0 0 0 0 +// +// Output 0 0 0 0 1 1 1 0 0 0 0 0 +// +// +// This behavior would be quite difficult to model exactly, since the SID +// in this case does not act as a digital state machine. Tests show that minor +// (1 bit) differences can actually occur in the output from otherwise +// identical samples from OSC3 when waveforms are combined. To further +// complicate the situation the output changes slightly with time (more +// neighboring bits are successively set) when the 12-bit waveform +// registers are kept unchanged. +// +// It is probably possible to come up with a valid model for the +// behavior, however this would be far too slow for practical use since it +// would have to be based on the mutual influence of individual bits. +// +// The output is instead approximated by using the upper bits of the +// accumulator as an index to look up the combined output in a table +// containing actual combined waveform samples from OSC3. +// These samples are 8 bit, so 4 bits of waveform resolution is lost. +// All OSC3 samples are taken with FREQ=0x1000, adding a 1 to the upper 12 +// bits of the accumulator each cycle for a sample period of 4096 cycles. +// +// Sawtooth+Triangle: +// The sawtooth output is used to look up an OSC3 sample. +// +// Pulse+Triangle: +// The triangle output is right-shifted and used to look up an OSC3 sample. +// The sample is output if the pulse output is on. +// The reason for using the triangle output as the index is to handle ring +// modulation. Only the first half of the sample is used, which should be OK +// since the triangle waveform has half the resolution of the accumulator. +// +// Pulse+Sawtooth: +// The sawtooth output is used to look up an OSC3 sample. +// The sample is output if the pulse output is on. +// +// Pulse+Sawtooth+Triangle: +// The sawtooth output is used to look up an OSC3 sample. +// The sample is output if the pulse output is on. +// +RESID_INLINE +reg12 WaveformGenerator::output__ST() +{ + return wave__ST[output__S_()] << 4; +} + +RESID_INLINE +reg12 WaveformGenerator::output_P_T() +{ + return (wave_P_T[output___T() >> 1] << 4) & output_P__(); +} + +RESID_INLINE +reg12 WaveformGenerator::output_PS_() +{ + return (wave_PS_[output__S_()] << 4) & output_P__(); +} + +RESID_INLINE +reg12 WaveformGenerator::output_PST() +{ + return (wave_PST[output__S_()] << 4) & output_P__(); +} + +// Combined waveforms including noise: +// All waveform combinations including noise output zero after a few cycles. +// NB! The effects of such combinations are not fully explored. It is claimed +// that the shift register may be filled with zeroes and locked up, which +// seems to be true. +// We have not attempted to model this behavior, suffice to say that +// there is very little audible output from waveform combinations including +// noise. We hope that nobody is actually using it. +// +RESID_INLINE +reg12 WaveformGenerator::outputN__T() +{ + return 0; +} + +RESID_INLINE +reg12 WaveformGenerator::outputN_S_() +{ + return 0; +} + +RESID_INLINE +reg12 WaveformGenerator::outputN_ST() +{ + return 0; +} + +RESID_INLINE +reg12 WaveformGenerator::outputNP__() +{ + return 0; +} + +RESID_INLINE +reg12 WaveformGenerator::outputNP_T() +{ + return 0; +} + +RESID_INLINE +reg12 WaveformGenerator::outputNPS_() +{ + return 0; +} + +RESID_INLINE +reg12 WaveformGenerator::outputNPST() +{ + return 0; +} + +// ---------------------------------------------------------------------------- +// Select one of 16 possible combinations of waveforms. +// ---------------------------------------------------------------------------- +RESID_INLINE +reg12 WaveformGenerator::output() +{ + // It may seem cleaner to use an array of member functions to return + // waveform output; however a switch with inline functions is faster. + + switch (waveform) { + default: + case 0x0: + return output____(); + case 0x1: + return output___T(); + case 0x2: + return output__S_(); + case 0x3: + return output__ST(); + case 0x4: + return output_P__(); + case 0x5: + return output_P_T(); + case 0x6: + return output_PS_(); + case 0x7: + return output_PST(); + case 0x8: + return outputN___(); + case 0x9: + return outputN__T(); + case 0xa: + return outputN_S_(); + case 0xb: + return outputN_ST(); + case 0xc: + return outputNP__(); + case 0xd: + return outputNP_T(); + case 0xe: + return outputNPS_(); + case 0xf: + return outputNPST(); + } +} + +#endif // RESID_INLINING || defined(__WAVE_CC__) + +#endif // not __WAVE_H__ diff --git a/plugins/sid/wave6581_PST.cc b/plugins/sid/wave6581_PST.cc new file mode 100644 index 000000000..49a4ea246 --- /dev/null +++ b/plugins/sid/wave6581_PST.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave6581_PST[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +/* 0x7f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +/* 0x7f8: */ 0x00, 0x00, 0x00, 0x78, 0x78, 0x7e, 0x7f, 0x7f, +/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, +/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, +/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +/* 0xff8: */ 0x00, 0x00, 0x00, 0x78, 0x78, 0x7e, 0x7f, 0x7f, +}; diff --git a/plugins/sid/wave6581_PS_.cc b/plugins/sid/wave6581_PS_.cc new file mode 100644 index 000000000..ffccd23e8 --- /dev/null +++ b/plugins/sid/wave6581_PS_.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave6581_PS_[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, +/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, +/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3f, +/* 0x3f8: */ 0x00, 0x30, 0x38, 0x3f, 0x3e, 0x3f, 0x3f, 0x3f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, +/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, +/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, +/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, +/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, +/* 0x5f8: */ 0x00, 0x40, 0x40, 0x5f, 0x5c, 0x5f, 0x5f, 0x5f, +/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, +/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6b, +/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x6d, +/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x6e8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x6e, +/* 0x6f0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x6f, +/* 0x6f8: */ 0x00, 0x60, 0x60, 0x6f, 0x60, 0x6f, 0x6f, 0x6f, +/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x738: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x60, 0x73, +/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x758: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x75, +/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x768: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x76, +/* 0x770: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x77, +/* 0x778: */ 0x00, 0x70, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, +/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x798: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x79, +/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x7a8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x70, 0x7a, +/* 0x7b0: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7b, +/* 0x7b8: */ 0x40, 0x70, 0x70, 0x7b, 0x78, 0x7b, 0x7b, 0x7b, +/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, +/* 0x7c8: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7c, +/* 0x7d0: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7d, +/* 0x7d8: */ 0x40, 0x70, 0x78, 0x7d, 0x78, 0x7d, 0x7d, 0x7d, +/* 0x7e0: */ 0x00, 0x40, 0x40, 0x78, 0x60, 0x78, 0x78, 0x7e, +/* 0x7e8: */ 0x60, 0x78, 0x78, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, +/* 0x7f0: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, +/* 0x7f8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, +/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, +/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, +/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, +/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, +/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, +/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, +/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3f, +/* 0xbf8: */ 0x00, 0x30, 0x38, 0x3f, 0x3e, 0x3f, 0x3f, 0x3f, +/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, +/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, +/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, +/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, +/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, +/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, +/* 0xdf8: */ 0x00, 0x40, 0x40, 0x5f, 0x5c, 0x5f, 0x5f, 0x5f, +/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, +/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6b, +/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6d, +/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0xee8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x6e, +/* 0xef0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x6f, +/* 0xef8: */ 0x00, 0x60, 0x60, 0x6f, 0x60, 0x6f, 0x6f, 0x6f, +/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0xf38: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x60, 0x73, +/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0xf58: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x75, +/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0xf68: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x76, +/* 0xf70: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x77, +/* 0xf78: */ 0x00, 0x70, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, +/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0xf98: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x79, +/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0xfa8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x70, 0x7a, +/* 0xfb0: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7b, +/* 0xfb8: */ 0x40, 0x70, 0x70, 0x7b, 0x78, 0x7b, 0x7b, 0x7b, +/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, +/* 0xfc8: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7c, +/* 0xfd0: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7d, +/* 0xfd8: */ 0x40, 0x70, 0x78, 0x7d, 0x78, 0x7d, 0x7d, 0x7d, +/* 0xfe0: */ 0x00, 0x40, 0x40, 0x78, 0x60, 0x78, 0x78, 0x7e, +/* 0xfe8: */ 0x60, 0x78, 0x78, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, +/* 0xff0: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7c, 0x7f, 0x7f, 0x7f, +/* 0xff8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, +}; diff --git a/plugins/sid/wave6581_P_T.cc b/plugins/sid/wave6581_P_T.cc new file mode 100644 index 000000000..a8109eeb1 --- /dev/null +++ b/plugins/sid/wave6581_P_T.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave6581_P_T[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x38, 0x3f, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x5f, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x378: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x6f, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x3b8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x70, 0x77, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +/* 0x3d8: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7b, +/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, +/* 0x3e8: */ 0x00, 0x40, 0x40, 0x70, 0x60, 0x70, 0x78, 0x7d, +/* 0x3f0: */ 0x00, 0x40, 0x60, 0x78, 0x60, 0x78, 0x78, 0x7e, +/* 0x3f8: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x4f8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9f, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x578: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xa0, 0xaf, +/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, +/* 0x5b0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, +/* 0x5b8: */ 0x00, 0x80, 0x80, 0xa0, 0x80, 0xa0, 0xb0, 0xb7, +/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x5c8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, +/* 0x5d0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, +/* 0x5d8: */ 0x00, 0x80, 0x80, 0xa0, 0x80, 0xb0, 0xb0, 0xbb, +/* 0x5e0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xb0, +/* 0x5e8: */ 0x80, 0x80, 0x80, 0xb0, 0x80, 0xb0, 0xb8, 0xbd, +/* 0x5f0: */ 0x80, 0x80, 0x80, 0xb8, 0xa0, 0xb8, 0xb8, 0xbe, +/* 0x5f8: */ 0xa0, 0xb8, 0xbc, 0xbf, 0xbe, 0xbf, 0xbf, 0xbf, +/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, +/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, +/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x668: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, +/* 0x670: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, +/* 0x678: */ 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, +/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x698: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, +/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x6a8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, +/* 0x6b0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0xc0, 0xc0, +/* 0x6b8: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd7, +/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x6c8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xc0, 0xc0, +/* 0x6d0: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, +/* 0x6d8: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd0, 0xdb, +/* 0x6e0: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xd0, +/* 0x6e8: */ 0x80, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd8, 0xdd, +/* 0x6f0: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd8, 0xd8, 0xde, +/* 0x6f8: */ 0xc0, 0xd8, 0xdc, 0xdf, 0xdc, 0xdf, 0xdf, 0xdf, +/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x718: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xe0, +/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x728: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, +/* 0x730: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, +/* 0x738: */ 0x80, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe7, +/* 0x740: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, +/* 0x748: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, +/* 0x750: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, +/* 0x758: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xeb, +/* 0x760: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, +/* 0x768: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xed, +/* 0x770: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xe8, 0xee, +/* 0x778: */ 0xe0, 0xe8, 0xec, 0xef, 0xec, 0xef, 0xef, 0xef, +/* 0x780: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0x788: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf0, +/* 0x790: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, +/* 0x798: */ 0xc0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf3, +/* 0x7a0: */ 0x80, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xf0, +/* 0x7a8: */ 0xc0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf5, +/* 0x7b0: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf6, +/* 0x7b8: */ 0xf0, 0xf0, 0xf4, 0xf7, 0xf4, 0xf7, 0xf7, 0xf7, +/* 0x7c0: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, +/* 0x7c8: */ 0xe0, 0xe0, 0xe0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf9, +/* 0x7d0: */ 0xe0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xfa, +/* 0x7d8: */ 0xf0, 0xf8, 0xf8, 0xfb, 0xf8, 0xfb, 0xfb, 0xfb, +/* 0x7e0: */ 0xe0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xfc, 0xfc, +/* 0x7e8: */ 0xf8, 0xfc, 0xfc, 0xfd, 0xfc, 0xfd, 0xfd, 0xfd, +/* 0x7f0: */ 0xf8, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, +/* 0x7f8: */ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/* 0x800: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, +/* 0x808: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xf8, +/* 0x810: */ 0xfd, 0xfd, 0xfd, 0xfc, 0xfd, 0xfc, 0xfc, 0xf8, +/* 0x818: */ 0xfc, 0xfc, 0xfc, 0xf0, 0xf8, 0xf0, 0xf0, 0xe0, +/* 0x820: */ 0xfb, 0xfb, 0xfb, 0xf8, 0xfb, 0xf8, 0xf8, 0xf0, +/* 0x828: */ 0xfa, 0xf8, 0xf8, 0xf0, 0xf8, 0xf0, 0xf0, 0xe0, +/* 0x830: */ 0xf9, 0xf8, 0xf8, 0xf0, 0xf8, 0xf0, 0xe0, 0xe0, +/* 0x838: */ 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, +/* 0x840: */ 0xf7, 0xf7, 0xf7, 0xf4, 0xf7, 0xf4, 0xf0, 0xf0, +/* 0x848: */ 0xf6, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, +/* 0x850: */ 0xf5, 0xf0, 0xf0, 0xe0, 0xf0, 0xe0, 0xe0, 0xc0, +/* 0x858: */ 0xf0, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xc0, 0x80, +/* 0x860: */ 0xf3, 0xf0, 0xf0, 0xe0, 0xf0, 0xe0, 0xe0, 0xc0, +/* 0x868: */ 0xf0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, +/* 0x870: */ 0xf0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, +/* 0x878: */ 0xc0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, +/* 0x880: */ 0xef, 0xef, 0xef, 0xec, 0xef, 0xec, 0xe8, 0xe0, +/* 0x888: */ 0xee, 0xe8, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, +/* 0x890: */ 0xed, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, +/* 0x898: */ 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, +/* 0x8a0: */ 0xeb, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, +/* 0x8a8: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, +/* 0x8b0: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, +/* 0x8b8: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0x8c0: */ 0xe7, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xc0, 0x80, +/* 0x8c8: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, +/* 0x8d0: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, +/* 0x8d8: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e0: */ 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, +/* 0x8e8: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x900: */ 0xdf, 0xdf, 0xdf, 0xdc, 0xdf, 0xdc, 0xd8, 0xc0, +/* 0x908: */ 0xde, 0xd8, 0xd8, 0xc0, 0xd8, 0xc0, 0xc0, 0xc0, +/* 0x910: */ 0xdd, 0xd8, 0xd0, 0xc0, 0xd0, 0xc0, 0xc0, 0x80, +/* 0x918: */ 0xd0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, +/* 0x920: */ 0xdb, 0xd0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, +/* 0x928: */ 0xc0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, +/* 0x930: */ 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, +/* 0x938: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x940: */ 0xd7, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, +/* 0x948: */ 0xc0, 0xc0, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0x950: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0x958: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x960: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0x968: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x970: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x980: */ 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, +/* 0x988: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0x990: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a0: */ 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c0: */ 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa00: */ 0xbf, 0xbf, 0xbf, 0xbe, 0xbf, 0xbc, 0xbc, 0xa0, +/* 0xa08: */ 0xbe, 0xbc, 0xb8, 0xa0, 0xb8, 0xa0, 0x80, 0x80, +/* 0xa10: */ 0xbd, 0xb8, 0xb0, 0x80, 0xb0, 0x80, 0x80, 0x80, +/* 0xa18: */ 0xb0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, +/* 0xa20: */ 0xbb, 0xb0, 0xb0, 0x80, 0xa0, 0x80, 0x80, 0x00, +/* 0xa28: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0xa30: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0xa38: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa40: */ 0xb7, 0xb0, 0xa0, 0x80, 0xa0, 0x80, 0x80, 0x00, +/* 0xa48: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0xa50: */ 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa60: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa80: */ 0xaf, 0xa0, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x00, +/* 0xa88: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa90: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb00: */ 0x9f, 0x90, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, +/* 0xb08: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb10: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb20: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb40: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb80: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc00: */ 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7c, 0x7c, 0x70, +/* 0xc08: */ 0x7e, 0x7c, 0x78, 0x60, 0x78, 0x60, 0x60, 0x00, +/* 0xc10: */ 0x7d, 0x78, 0x78, 0x60, 0x70, 0x40, 0x40, 0x00, +/* 0xc18: */ 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc20: */ 0x7b, 0x78, 0x70, 0x40, 0x70, 0x40, 0x00, 0x00, +/* 0xc28: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc30: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc40: */ 0x77, 0x70, 0x70, 0x00, 0x60, 0x00, 0x00, 0x00, +/* 0xc48: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc50: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc60: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc80: */ 0x6f, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, +/* 0xc88: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc90: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd00: */ 0x5f, 0x58, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, +/* 0xd08: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe00: */ 0x3f, 0x3c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xff8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/plugins/sid/wave6581__ST.cc b/plugins/sid/wave6581__ST.cc new file mode 100644 index 000000000..add4d387a --- /dev/null +++ b/plugins/sid/wave6581__ST.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave6581__ST[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3f0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +/* 0x3f8: */ 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x3f, 0x3f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, +/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7e0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +/* 0x7e8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +/* 0x7f0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +/* 0x7f8: */ 0x3e, 0x3e, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, +/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, +/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +/* 0xbf8: */ 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x3f, 0x3f, +/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, +/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfe0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +/* 0xfe8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +/* 0xff0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, +/* 0xff8: */ 0x3e, 0x3e, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, +}; diff --git a/plugins/sid/wave8580_PST.cc b/plugins/sid/wave8580_PST.cc new file mode 100644 index 000000000..a3958c192 --- /dev/null +++ b/plugins/sid/wave8580_PST.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave8580_PST[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, +/* 0x7f0: */ 0x60, 0x20, 0x70, 0x70, 0x70, 0x70, 0x70, 0x78, +/* 0x7f8: */ 0x78, 0x78, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, +/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1e, 0x3f, +/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xdf8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x8c, 0x9f, +/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, +/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, +/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +/* 0xe68: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe80: */ 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, +/* 0xe88: */ 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xea0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xea8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xeb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xeb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xec0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xec8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xed0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xed8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xee0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xee8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, +/* 0xef0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xef8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, +/* 0xf00: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf08: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf10: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf18: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf20: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf28: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf30: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf38: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf40: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf48: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf50: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf58: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf68: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, +/* 0xf70: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, +/* 0xf80: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf88: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf90: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf98: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xfa0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xfa8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xfb0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, +/* 0xfb8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfc0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfc8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfd0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfd8: */ 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0xfe0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0xfe8: */ 0xf8, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, +/* 0xff0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, +/* 0xff8: */ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +}; diff --git a/plugins/sid/wave8580_PS_.cc b/plugins/sid/wave8580_PS_.cc new file mode 100644 index 000000000..795044d60 --- /dev/null +++ b/plugins/sid/wave8580_PS_.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave8580_PS_[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x1f, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, +/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, +/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, +/* 0x3f8: */ 0x00, 0x0c, 0x1c, 0x3f, 0x1e, 0x3f, 0x3f, 0x3f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, +/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, +/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, +/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, +/* 0x5f8: */ 0x00, 0x00, 0x00, 0x5f, 0x0c, 0x5f, 0x5f, 0x5f, +/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, +/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, +/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, +/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, +/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, +/* 0x6f8: */ 0x00, 0x40, 0x40, 0x6f, 0x40, 0x6f, 0x6f, 0x6f, +/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, +/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x61, +/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x768: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x70, +/* 0x770: */ 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, +/* 0x778: */ 0x40, 0x60, 0x60, 0x77, 0x60, 0x77, 0x77, 0x77, +/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, +/* 0x798: */ 0x00, 0x40, 0x40, 0x60, 0x40, 0x60, 0x60, 0x79, +/* 0x7a0: */ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x60, +/* 0x7a8: */ 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x78, +/* 0x7b0: */ 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, +/* 0x7b8: */ 0x60, 0x70, 0x70, 0x78, 0x70, 0x79, 0x7b, 0x7b, +/* 0x7c0: */ 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, +/* 0x7c8: */ 0x60, 0x60, 0x60, 0x70, 0x60, 0x70, 0x70, 0x7c, +/* 0x7d0: */ 0x60, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x7c, +/* 0x7d8: */ 0x70, 0x78, 0x78, 0x7c, 0x78, 0x7c, 0x7c, 0x7d, +/* 0x7e0: */ 0x70, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x7c, +/* 0x7e8: */ 0x78, 0x7c, 0x7c, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, +/* 0x7f0: */ 0x7c, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, +/* 0x7f8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, +/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, +/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, +/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, +/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, +/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8d, +/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x9e8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x8e, +/* 0x9f0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x8f, +/* 0x9f8: */ 0x80, 0x80, 0x80, 0x9f, 0x80, 0x9f, 0x9f, 0x9f, +/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xa78: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x87, +/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xab8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x83, +/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, +/* 0xad8: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, +/* 0xae0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xae8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x84, +/* 0xaf0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x87, +/* 0xaf8: */ 0x80, 0x80, 0x80, 0x87, 0x80, 0x8f, 0xaf, 0xaf, +/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0xb18: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb20: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, +/* 0xb28: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x83, +/* 0xb40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, +/* 0xb60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, +/* 0xb70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, +/* 0xb78: */ 0x80, 0x80, 0x80, 0xa0, 0x80, 0xa3, 0xb7, 0xb7, +/* 0xb80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb1, +/* 0xba0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xba8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb0, +/* 0xbb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb0, +/* 0xbb8: */ 0x80, 0xa0, 0xa0, 0xb0, 0xa0, 0xb8, 0xb9, 0xbb, +/* 0xbc0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, +/* 0xbc8: */ 0x80, 0x80, 0x80, 0xa0, 0x80, 0xa0, 0xa0, 0xb8, +/* 0xbd0: */ 0x80, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xb8, +/* 0xbd8: */ 0xa0, 0xb0, 0xb0, 0xb8, 0xb0, 0xbc, 0xbc, 0xbd, +/* 0xbe0: */ 0xa0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb8, 0xb8, 0xbc, +/* 0xbe8: */ 0xb0, 0xb8, 0xb8, 0xbc, 0xb8, 0xbc, 0xbe, 0xbe, +/* 0xbf0: */ 0xb8, 0xbc, 0xbc, 0xbe, 0xbc, 0xbe, 0xbe, 0xbf, +/* 0xbf8: */ 0xbe, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, +/* 0xc00: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, +/* 0xc08: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, +/* 0xc10: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc18: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc28: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, +/* 0xc40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc7, +/* 0xc80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xc98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xca0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xca8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xcb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xcb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc3, +/* 0xcc0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xcc8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0xcd0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0xcd8: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc1, +/* 0xce0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0xce8: */ 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xcf0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc7, +/* 0xcf8: */ 0xc0, 0xc0, 0xc0, 0xc7, 0xc0, 0xcf, 0xcf, 0xcf, +/* 0xd00: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xd08: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xd10: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xd18: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0xd20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xd28: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0xd30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, +/* 0xd38: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc3, +/* 0xd40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0xd48: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, +/* 0xd50: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xd58: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, +/* 0xd60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xd68: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xd70: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xd78: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc7, 0xd7, +/* 0xd80: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xd88: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xd90: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xd98: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xda0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xda8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, +/* 0xdb0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, +/* 0xdb8: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd8, 0xdb, +/* 0xdc0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xdc8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd8, +/* 0xdd0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd8, +/* 0xdd8: */ 0xc0, 0xc0, 0xc0, 0xd8, 0xd0, 0xd8, 0xd8, 0xdd, +/* 0xde0: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd0, 0xdc, +/* 0xde8: */ 0xd0, 0xd8, 0xd8, 0xdc, 0xd8, 0xdc, 0xdc, 0xde, +/* 0xdf0: */ 0xd8, 0xdc, 0xdc, 0xde, 0xdc, 0xde, 0xde, 0xdf, +/* 0xdf8: */ 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, +/* 0xe00: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe08: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe10: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe18: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe20: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe28: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe30: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe38: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe3, +/* 0xe40: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe48: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xe50: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, +/* 0xe58: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe1, +/* 0xe60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, +/* 0xe68: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xe70: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xe78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe3, 0xe7, +/* 0xe80: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, +/* 0xe88: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, +/* 0xe90: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, +/* 0xe98: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xea0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xea8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xeb0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xeb8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xeb, +/* 0xec0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xec8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xed0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xed8: */ 0xe0, 0xe0, 0xe0, 0xe8, 0xe0, 0xe8, 0xe8, 0xed, +/* 0xee0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xec, +/* 0xee8: */ 0xe0, 0xe0, 0xe0, 0xec, 0xe8, 0xec, 0xec, 0xee, +/* 0xef0: */ 0xe8, 0xe8, 0xe8, 0xec, 0xec, 0xee, 0xee, 0xef, +/* 0xef8: */ 0xec, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, +/* 0xf00: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf08: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf10: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf18: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, +/* 0xf20: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, +/* 0xf28: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0, +/* 0xf30: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf38: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, +/* 0xf40: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf48: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf50: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf58: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf5, +/* 0xf60: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf68: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf6, +/* 0xf70: */ 0xf0, 0xf0, 0xf0, 0xf4, 0xf0, 0xf4, 0xf6, 0xf7, +/* 0xf78: */ 0xf4, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, +/* 0xf80: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, +/* 0xf88: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, +/* 0xf90: */ 0xf0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf8, +/* 0xf98: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, +/* 0xfa0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0xfa8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xfa, +/* 0xfb0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xfb, +/* 0xfb8: */ 0xf8, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, +/* 0xfc0: */ 0xf8, 0xf8, 0xf8, 0xfc, 0xf8, 0xfc, 0xfc, 0xfc, +/* 0xfc8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, +/* 0xfd0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, +/* 0xfd8: */ 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +/* 0xfe0: */ 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, +/* 0xfe8: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, +/* 0xff0: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/* 0xff8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +}; diff --git a/plugins/sid/wave8580_P_T.cc b/plugins/sid/wave8580_P_T.cc new file mode 100644 index 000000000..a2fff3a23 --- /dev/null +++ b/plugins/sid/wave8580_P_T.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave8580_P_T[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x00, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x3f, 0x3f, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x5e, 0x5f, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x378: */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x60, 0x60, 0x6f, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x60, +/* 0x3b8: */ 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x70, 0x77, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, +/* 0x3c8: */ 0x40, 0x40, 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, +/* 0x3d0: */ 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x70, +/* 0x3d8: */ 0x60, 0x60, 0x60, 0x70, 0x70, 0x70, 0x78, 0x7b, +/* 0x3e0: */ 0x60, 0x60, 0x60, 0x70, 0x60, 0x70, 0x70, 0x70, +/* 0x3e8: */ 0x70, 0x70, 0x70, 0x78, 0x78, 0x78, 0x78, 0x7c, +/* 0x3f0: */ 0x78, 0x78, 0x78, 0x7c, 0x78, 0x7c, 0x7c, 0x7e, +/* 0x3f8: */ 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x4d8: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x4e8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x4f0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x4f8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x8e, 0x9f, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, +/* 0x530: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x538: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x540: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, +/* 0x548: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x550: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x558: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x560: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x568: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x570: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x578: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xaf, +/* 0x580: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x588: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x590: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x598: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x5a0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x5a8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x5b0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x5b8: */ 0x80, 0x80, 0x80, 0xa0, 0xa0, 0xa0, 0xa0, 0xb7, +/* 0x5c0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x5c8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, +/* 0x5d0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xa0, +/* 0x5d8: */ 0xa0, 0xa0, 0xa0, 0xb0, 0xa0, 0xb0, 0xb0, 0xbb, +/* 0x5e0: */ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xb0, 0xb0, +/* 0x5e8: */ 0xa0, 0xb0, 0xb0, 0xb8, 0xb0, 0xb8, 0xb8, 0xbc, +/* 0x5f0: */ 0xb0, 0xb8, 0xb8, 0xb8, 0xb8, 0xbc, 0xbc, 0xbe, +/* 0x5f8: */ 0xbc, 0xbc, 0xbe, 0xbf, 0xbe, 0xbf, 0xbf, 0xbf, +/* 0x600: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x608: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x610: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x618: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x620: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x628: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x630: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x638: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, +/* 0x640: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x648: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x650: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, +/* 0x658: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x660: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, +/* 0x668: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x670: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x678: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, +/* 0x680: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, +/* 0x688: */ 0xc0, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x690: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x698: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x6a0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x6a8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x6b0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x6b8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd7, +/* 0x6c0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x6c8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x6d0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x6d8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd0, 0xd9, +/* 0x6e0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, +/* 0x6e8: */ 0xc0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd8, 0xd8, 0xdc, +/* 0x6f0: */ 0xd0, 0xd0, 0xd8, 0xd8, 0xd8, 0xdc, 0xdc, 0xde, +/* 0x6f8: */ 0xdc, 0xdc, 0xde, 0xdf, 0xde, 0xdf, 0xdf, 0xdf, +/* 0x700: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x708: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x710: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x718: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, +/* 0x720: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, +/* 0x728: */ 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x730: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x738: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe7, +/* 0x740: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x748: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x750: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x758: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, +/* 0x760: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x768: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xec, +/* 0x770: */ 0xe0, 0xe0, 0xe0, 0xe8, 0xe8, 0xe8, 0xec, 0xee, +/* 0x778: */ 0xec, 0xec, 0xec, 0xee, 0xee, 0xef, 0xef, 0xef, +/* 0x780: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x788: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, +/* 0x790: */ 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x798: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x7a0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x7a8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, +/* 0x7b0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, +/* 0x7b8: */ 0xf0, 0xf4, 0xf4, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, +/* 0x7c0: */ 0xf0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf8, +/* 0x7c8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0x7d0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0x7d8: */ 0xf8, 0xf8, 0xf8, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, +/* 0x7e0: */ 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, +/* 0x7e8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, +/* 0x7f0: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, +/* 0x7f8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/* 0x800: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/* 0x808: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, +/* 0x810: */ 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, +/* 0x818: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, +/* 0x820: */ 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xf8, 0xf8, 0xf8, +/* 0x828: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0x830: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0x838: */ 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x840: */ 0xf7, 0xf7, 0xf7, 0xf6, 0xf6, 0xf4, 0xf4, 0xf0, +/* 0x848: */ 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x850: */ 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x858: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x860: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0x868: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, +/* 0x870: */ 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x878: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x880: */ 0xef, 0xef, 0xef, 0xee, 0xee, 0xec, 0xec, 0xe8, +/* 0x888: */ 0xee, 0xec, 0xe8, 0xe8, 0xe8, 0xe0, 0xe0, 0xe0, +/* 0x890: */ 0xec, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x898: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x8a0: */ 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x8a8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x8b0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x8b8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x8c0: */ 0xe7, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x8c8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0x8d0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, +/* 0x8d8: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x8e0: */ 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x8e8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x8f0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x8f8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x900: */ 0xdf, 0xdf, 0xdf, 0xde, 0xdf, 0xde, 0xdc, 0xdc, +/* 0x908: */ 0xde, 0xdc, 0xdc, 0xd8, 0xd8, 0xd8, 0xd0, 0xd0, +/* 0x910: */ 0xdc, 0xd8, 0xd8, 0xd0, 0xd0, 0xd0, 0xd0, 0xc0, +/* 0x918: */ 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x920: */ 0xd9, 0xd0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x928: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x930: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x938: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x940: */ 0xd7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x948: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x950: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x958: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x960: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x968: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x970: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, +/* 0x978: */ 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x980: */ 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x988: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x990: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0x998: */ 0xc0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x80, +/* 0x9a0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, +/* 0x9a8: */ 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9b0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9b8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9c0: */ 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9c8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9d0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9d8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9e0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9e8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9f0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0x9f8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa00: */ 0xbf, 0xbf, 0xbf, 0xbe, 0xbf, 0xbe, 0xbc, 0xbc, +/* 0xa08: */ 0xbe, 0xbc, 0xbc, 0xb8, 0xb8, 0xb8, 0xb8, 0xb0, +/* 0xa10: */ 0xbc, 0xb8, 0xb8, 0xb0, 0xb8, 0xb0, 0xb0, 0xb0, +/* 0xa18: */ 0xb0, 0xb0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, +/* 0xa20: */ 0xbb, 0xb0, 0xb0, 0xa0, 0xb0, 0xa0, 0xa0, 0xa0, +/* 0xa28: */ 0xa0, 0xa0, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa30: */ 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa40: */ 0xb7, 0xb0, 0xa0, 0xa0, 0xa0, 0x80, 0x80, 0x80, +/* 0xa48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa80: */ 0xaf, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xa98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xaa0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xaa8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xab0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xab8: */ 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0xac0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xac8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, +/* 0xad0: */ 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae0: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb00: */ 0x9f, 0x9e, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb08: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb10: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xb18: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, +/* 0xb20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, +/* 0xb28: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb30: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb40: */ 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb80: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc00: */ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7c, +/* 0xc08: */ 0x7e, 0x7c, 0x7c, 0x78, 0x7c, 0x78, 0x78, 0x78, +/* 0xc10: */ 0x7c, 0x78, 0x78, 0x78, 0x78, 0x70, 0x70, 0x70, +/* 0xc18: */ 0x78, 0x70, 0x70, 0x60, 0x70, 0x60, 0x60, 0x60, +/* 0xc20: */ 0x7b, 0x78, 0x70, 0x70, 0x70, 0x60, 0x60, 0x60, +/* 0xc28: */ 0x70, 0x60, 0x60, 0x60, 0x60, 0x40, 0x40, 0x40, +/* 0xc30: */ 0x60, 0x60, 0x60, 0x40, 0x40, 0x40, 0x40, 0x40, +/* 0xc38: */ 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, +/* 0xc40: */ 0x77, 0x70, 0x60, 0x60, 0x60, 0x60, 0x40, 0x40, +/* 0xc48: */ 0x60, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, +/* 0xc50: */ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc60: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc80: */ 0x6f, 0x64, 0x60, 0x40, 0x40, 0x00, 0x00, 0x00, +/* 0xc88: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd00: */ 0x5f, 0x5e, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe00: */ 0x3f, 0x3f, 0x3e, 0x00, 0x1c, 0x00, 0x00, 0x00, +/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf00: */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xff8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/plugins/sid/wave8580__ST.cc b/plugins/sid/wave8580__ST.cc new file mode 100644 index 000000000..e50a21d81 --- /dev/null +++ b/plugins/sid/wave8580__ST.cc @@ -0,0 +1,536 @@ +// --------------------------------------------------------------------------- +// This file is part of reSID, a MOS6581 SID emulator engine. +// Copyright (C) 2004 Dag Lem +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// --------------------------------------------------------------------------- + +#include "wave.h" + +reg8 WaveformGenerator::wave8580__ST[] = +{ +/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x1f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, +/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x3f0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +/* 0x3f8: */ 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, +/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x5f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, +/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x7e0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +/* 0x7e8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, +/* 0x7f0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3e, +/* 0x7f8: */ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, +/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0x9f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, +/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xbf0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, +/* 0xbf8: */ 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x3f, +/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, +/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, +/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xdf8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x1f, 0x1f, +/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x83, 0x83, +/* 0xe80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xe98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xea0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xea8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xeb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xeb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xec0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xec8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xed0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xed8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xee0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xee8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xef0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +/* 0xef8: */ 0x80, 0x80, 0x80, 0x80, 0x87, 0x87, 0x87, 0x8f, +/* 0xf00: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, +/* 0xf08: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf10: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf18: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +/* 0xf20: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, +/* 0xf28: */ 0xe0, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, +/* 0xf30: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf38: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf40: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf48: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf50: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf58: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf60: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf68: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf70: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +/* 0xf78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, +/* 0xf80: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf88: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf90: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xf98: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfa0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfa8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfb0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +/* 0xfb8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, +/* 0xfc0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0xfc8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0xfd0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0xfd8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, +/* 0xfe0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, +/* 0xfe8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, +/* 0xff0: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, +/* 0xff8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +};