diff --git a/example/example.mk b/example/example.mk index 410ef99..c945f96 100644 --- a/example/example.mk +++ b/example/example.mk @@ -146,7 +146,9 @@ MODIFIER_VOLUME_WITH_TWO_VOLUMES_OBJ = \ holly/core.o \ holly/region_array.o \ holly/background.o \ - holly/ta_fifo_polygon_converter.o + holly/ta_fifo_polygon_converter.o \ + wolf.data.o \ + macaw.data.o example/modifier_volume_with_two_volumes.elf: LDSCRIPT = $(LIB)/alt.lds example/modifier_volume_with_two_volumes.elf: $(START_OBJ) $(MODIFIER_VOLUME_WITH_TWO_VOLUMES_OBJ) diff --git a/example/modifier_volume_with_two_volumes.cpp b/example/modifier_volume_with_two_volumes.cpp index bd3086b..2b62865 100644 --- a/example/modifier_volume_with_two_volumes.cpp +++ b/example/modifier_volume_with_two_volumes.cpp @@ -22,6 +22,10 @@ #include "math/vec3.hpp" #include "math/vec4.hpp" +#include "macaw.hpp" +#include "wolf.hpp" +#include "twiddle.hpp" + vec3 _transform(const vec3& point, const uint32_t scale, const float theta) @@ -32,9 +36,9 @@ vec3 _transform(const vec3& point, float t; // object transform - t = z * cos(theta) - x * sin(theta); - x = z * sin(theta) + x * cos(theta); - z = t; + //t = z * cos(theta) - x * sin(theta); + //x = z * sin(theta) + x * cos(theta); + //z = t; x *= scale; y *= scale; @@ -74,6 +78,7 @@ uint32_t argb8888(const vec4& color) void transform_polygon(ta_parameter_writer& parameter, const vec3 * vertices, + const vec2 * texture, const face& face, const float scale, const vec4& color0, @@ -82,23 +87,38 @@ void transform_polygon(ta_parameter_writer& parameter, { const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume | para_control::list_type::opaque + | obj_control::col_type::packed_color | obj_control::shadow - | obj_control::volume::polygon::with_two_volumes; + | obj_control::volume::polygon::with_two_volumes + | obj_control::texture; const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater | isp_tsp_instruction_word::culling_mode::no_culling; const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog; + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(128) + | tsp_instruction_word::texture_v_size::from_int(128); + + uint32_t texture_address0 = (offsetof (struct texture_memory_alloc, texture)) + 128 * 128 * 2 * 0; + uint32_t texture_address1 = (offsetof (struct texture_memory_alloc, texture)) + 128 * 128 * 2 * 1; + + const uint32_t texture_control_word_0 = texture_control_word::pixel_format::_565 + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address0 / 8); + + const uint32_t texture_control_word_1 = texture_control_word::pixel_format::_565 + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address1 / 8); parameter.append() = ta_global_parameter::polygon_type_3(parameter_control_word, isp_tsp_instruction_word, - tsp_instruction_word, // tsp_instruction_word_0 - 0, // texture_control_word_0 - tsp_instruction_word, // tsp_instruction_word_1 - 0, // texture_control_word_1 + tsp_instruction_word, // tsp_instruction_word_0 + texture_control_word_0, // texture_control_word_0 + tsp_instruction_word, // tsp_instruction_word_1 + texture_control_word_1, // texture_control_word_1 0, // data_size_for_sort_dma 0 // next_address_for_sort_dma ); @@ -110,15 +130,24 @@ void transform_polygon(ta_parameter_writer& parameter, auto& vertex = vertices[vertex_ix]; auto point = _transform(vertex, scale, theta); + uint32_t texture_ix = face[i].texture; + auto& uv = texture[texture_ix]; + bool end_of_strip = i == strip_length - 1; - parameter.append() = - ta_vertex_parameter::polygon_type_9(polygon_vertex_parameter_control_word(end_of_strip), - point.x, - point.y, - point.z, - argb8888(color0), - argb8888(color1) - ); + parameter.append() = + ta_vertex_parameter::polygon_type_11(polygon_vertex_parameter_control_word(end_of_strip), + point.x, + point.y, + point.z, + uv.u, + uv.v, + argb8888(color0), // base_color_0 + 0, // offset_color_0 + uv.u, + uv.v, + argb8888(color1), // base_color_1 + 0 // offset_color_1 + ); } } @@ -190,12 +219,41 @@ void init_texture_memory(const struct opb_size& opb_size) ); } +void +load_texture(const uint8_t * src, + const uint32_t size, + const uint32_t ix) +{ + auto mem = reinterpret_cast(texture_memory64); + + uint16_t temp[size / 3]; + for (uint32_t px = 0; px < size / 3; px++) { + uint8_t r = src[px * 3 + 0]; + uint8_t g = src[px * 3 + 1]; + uint8_t b = src[px * 3 + 2]; + + uint16_t rgb565 = ((r / 8) << 11) | ((g / 4) << 5) | ((b / 8) << 0); + temp[px] = rgb565; + } + twiddle::texture(&mem->texture[(128 * 128 * 2 * ix) / 2], temp, 128, 128); +} + + uint32_t _ta_parameter_buf[((32 * 8192) + 32) / 4]; void main() { vga(); + auto src0 = reinterpret_cast(&_binary_macaw_data_start); + auto size0 = reinterpret_cast(&_binary_macaw_data_size); + + auto src1 = reinterpret_cast(&_binary_wolf_data_start); + auto size1 = reinterpret_cast(&_binary_wolf_data_size); + + load_texture(src0, size0, 0); + load_texture(src1, size1, 1); + // The address of `ta_parameter_buf` must be a multiple of 32 bytes. // This is mandatory for ch2-dma to the ta fifo polygon converter. uint32_t * ta_parameter_buf = align_32byte(_ta_parameter_buf); @@ -233,12 +291,13 @@ void main() 480 / 32); auto parameter = ta_parameter_writer(ta_parameter_buf); { // plane - vec4 color0 = {1.0, 0.9, 0.4, 0.2}; - vec4 color1 = {1.0, 0.2, 0.9, 0.9}; + vec4 color0 = {1.0, 0.9, 0.9, 0.9}; + vec4 color1 = {1.0, 0.9, 0.9, 0.9}; float scale = 2.f; for (uint32_t i = 0; i < plane::num_faces; i++) { transform_polygon(parameter, plane::vertices, + plane::texture, plane::faces[i], scale, color0, @@ -279,7 +338,7 @@ void main() core_wait_end_of_render_video(frame_ix, num_frames); constexpr float half_degree = 0.01745329f / 2; - theta += half_degree; + //theta += half_degree; frame_ix += 1; } } diff --git a/wolf.data b/wolf.data new file mode 100644 index 0000000..13eb66b --- /dev/null +++ b/wolf.data @@ -0,0 +1,254 @@ +"*+0:=Cתs|/8>#)+   !#&048멲OX`'/2  #=AFDMU$*.ܹ୿՜ƚƕշܳڲ޻(39 "! !" ޤ͙›Ü/8=  "#ABG !!  ӧǙĝƨͣɜ“ֺ4=E}kot!"$ $ ՙĠȧ˭њæ+5<ʜ""")'&$"$ڰ̹׼ҿӶո֯Υǟ¤ɜȩʵ騺Ϟ(.7646򬳵JKV!%!%)047/36158?FKhlrڻڪ˩ʶؿܚð"'-!jjk #)37=ۻ޶ݭ!&+ #  "&'+14yٶ盯ǽJT\!% %)/`glڳݺۯײ٭բ $')U[^衵̷'2; #ჟ $+.ksuػ߹عֲڱע̗ %(*蒨ܸiu|$) |'((qw{$'LRVݶޫӳ۳ݷߵۨΟÕ!!_fjޙƹ߲'3<>AEh#$"$$$$)-׹⪼Ҵܮ֡Ǐ _fjͯkx$&|Vp% KLL]{WWX"7:>۳ܶޱެԚ!$#&x镩(3;435hPijsx|Vr"INRݹ߲޲ۛ‚ ((*ʩUai!"κvb~Lf').Jg^v젣! "#RWYޟ˃Ǵѹ49<韲ɲڱٰز失',1pe~RhIeJLP =W_yTUY!NSWܵ޷߱ڏߵƇLPV"$&}ŷ߫ӪѦЮ,;J_{WpBUxJcDEH8NlZth%&. ?BGݛfwP^p:DP#)1 #)-3޸ݯ֥Ӥnz#)hjk]zTkG]|>NkLa~v5EZQfb} +03ߍrL^t5AO*1<%(1" Ծ𪴺'-7ADFnRiBTt:Je=OkJ_ impB\1 vPiBUt8E^:Ib>QmJazW[e /Ea,8G8H_Og\x"!$%jptꎜ펞Tgz2@N'+2!#(##$  "%'ҞFQ]" "!!# !# "fii[xNf:Ea>H_9Ha@SoLbockw!k&3C)5F7CWBXvWp^x39>u?O^&/9 %"!&! #% $ " hou㜳ŧ˦̬Ԣz$) "!!#"!#  c_xASsG_:IcBUqMefV^hglpVbgmRi"0B$.?)3B1D!!zBZxM^}DRsAOkHYuI]DXyJaWqt󠥭"giqMNZ"!;Qq'1@$/@(1@0=M?OgDYzXsg`|$$ "%]bi|{DSj!&-!! "    " mrvݓAQ^ ', "޼^xDVtWkEWxJ\}GXwIaG_TlTm58?]ew"!'##$i9Ll*4E)3A)2B1?QAQkH[|Rjh_z!# $ *-1}Rd|&/: ! "!!# "  !   :@E䔧Qe{",1   "׵YsL_UmKbPgEYyJcLfWoSjLSY58<^h}!hD[y%2F*3?-7H5BU?OjK_Ngga|pPTYk/:K ! ,28ИčǨRbx',3"   !##'ʾVrQjNgPeMgI`Jb[uOhjQYa"#%8=F#&*gmxlWp-=U'.:0;M9G\>NjI]Smgej$'-{y񐡴?P`#)/$!&'-3Ֆɔý=EX!#    !"$(PlQhMcNdQgOcMee}Oj~񖝭U[eEHQ醠fF[|)5B6DV9I`>PkKcWqefm "6;C{Vh*2< # !)05ܤ̦?JZ#%" "   TlMdKbPfRiPfTmghuYs7Jd6F\8IaBSoNf]ud~dm𓝬"&*ouz􀍟񈝲:FV %.$%% !"!!!  ,28ܼ=JZ!%&  !! VrLcOfQgTkSia{hg[r6Hb8HaEWtPh_vbz]wk󈓣&,1ـ]q*2># !"! #" #""####$$! """#$!#!"$""#+17⫽CN\!$( "! " !y{zYvOdQeRkWp\wq৿okE\9IeFWwSj]u\xYrv!*3:}}𛮾@Oc $)  "$$&""$   !!#! "   )/4ǹ>J[ $'! ! !!###$ """!!$cPhPgXqiі럸駽퇤֗斫㗮䤺운oueJ_BVxSl[s]yVo;AQ  3;D~|k~+5C # !  !# +17ȕԡ8FV $(  !!#""$!!" ! !%ںu}ɧꖴ㚴壺왳䆡ӓᎨےޞ饸糧⚴xƀex^tOi[s[vZs7RsEZ{FZI`NfSiYo^uYqNg_yRni۱!-"!$(0:ꄐ~i~/9D "" "    " "!!!!! !  ""#(),chm[kxXdrfsYj{dqAO_!&- "!"#!$#!$%#&&$'$$&#%'046포ރtjb{]u[uYtTnUpPiI_LcMdLdQhTpSlC\~E[z:KiGZyDVwI`XrZsWqRkE\]u[tSjSj]tʰ!$""$ "*17}cw+6>"#  !#!!#!!# !!# "! " "  ! #&28>Zfskw^m}aprͳ4?K"%*"#%" #!"#!$$#&##%#$&$'*鄢~rc~]uZrXq[tPjZuXqNeMdF^HaOgToPjG`D[zBSqDTwBX{RmYsUmUlGZ{L^{HZvOaReQeQgZrϨnu  "*/4{`s(2:!#% ! " "!" """$ !! !""$$$&##%""$ !!#""$  "'-sy~n~_lyZhvap|_mvz.4> !%" !  !!# #!"$#')|whWpSjRjWo\uRl[vUnOgNfBZ}KdH`MhOiLeBWwJ\zBV|JdRkWoVmM`~FUmBN\Ql9KeL^|VnOjWpRiMbQhI`JbDXzH]MfMfDXxJ^KdQhKcVnI\x@M`>GR=EM>FNAGREL[FO`HUgJYtQdpEIO')/iv(0 "##% "#" !!"$  !% %%$!!" #$"%" # "(04fuMW^QZf_grdnzzƛ.3<!%# # #')߃ta{Md>Ni%.>#'5DXMc~PkLaQbOfSgJ\|DTvBTwJaJdD[xNgOjK_QbIYv?J_AFHPLU_Vfy#"&cju|18@ !$$ $   !"!  %%($#%""$""$!!#!!#""$! $#"'"!&!$" ##$! % $! %27R7cRfI^yAOcYqJbEUrHWvETrETpEQm@Rj,Kb#,  %%&.42-4-061=A8FIKNWbP^tev请'"""%2;Dр~~_ej!#'!#%!!%" $!"! !##% " "!! %$#)! & %!" !!#! %""'/59߄Y[`\[_ORVIKPVYaV[g+3:!#' #(!!  "!$$&,曳ᘯ㞶拤r[vBXw.;O,.4=B8:8,OEqdE8DFJNWcWcwVhyir !$%$/6=|z)-2 #&"!&"!#!    " $#"' &$! (+.X_b܀W]fKMHGHGMNQPPUY]clu4X(,28<492,<4gL6F7D<3Rg>McKZ+7Dw#!R d<1s +#!01+36.?@?FELEKWLVf^igzȸꊗ&"#"+,4󉛭KQY##'"!#$$'!  !""#    !!#"!&! &!'!%" $&*:>CuRX^GIF=C=FJEPQTHINORVv{,03#'(#')$(* $' #)-0"#""""#넝yxoWp:Kd"*5-2+(1"(kAM90) "4=:H\:I[FXwASrANd=DS9?J37>"% + ST78g  ,,';>:HILLNVHP[HQaISl_qx͛&-2%%+gmxԅ,.6"!$(()$$& "  "!!#! "!!#""$#"$!   ! #! $! &! &!"' "&!%!"&%&*038zHPVPQPDF@;>9CEATUYGHLdiq).9&()"&'"&'$() $'.25%)!$'ފ}jdJa.:O !)R1$ Z*5L\{IYxHWuCRn?JY9DEAGGFLNSHOV%*.$()%**$))#'(#%%'(#)+BGNꇣ||wg]yYsI\|#.A6 +D +;J\PfCVqCQj;F\8@N7=I48@56::$7$35[ 031;?@:>DJP[LXbO]hHWhIXo^pД΄#,"((*Ŏ26<*++ " " !"!!"#$$$&##%""$!!" ! !  !"!$(%'*$',#'/69@msx«ÞspvR\cJLKDGCFHCLNIDFAEHBHIH|+07#()"''%++#))"'( %& !"-0:ބ~p_{dZuZsRj?Qn,T?QjOeYsSq\uZtVnUkQcN]{GUm6@P Lb) 169?EK;@I@EQBLUFPYHR]NZnP_yexҠ٤[f~'%%=@I߷ᇗ'+2! !# "!" """$$$&""$""$!!"!!! "#(*$+-%-.6?Dirzȹקƒ~`o}[iq]fkV\dPT]EIL::7HJEEGBBD?DFABE@V\a.2>!&)!(&"(($()$)) %&"$"',OWfw~yjf[yYt[uZuZu[v]v[v[x_z`zcz^u^s[r_vby_wYqQjOdH\t@Le1>P'1< '-&,329A=K^揦Յshed~[v]x`yf~hjhfb|]yZtZuYt\s^uZrTlSmOiN`~IZtCTi?M_;IY?KY@KZCO^EQ^=IU>HVGSdP_s_no}y|Σأ;BU$ $((&8;E̴詾t)2;$%!!#""$""$#"%$#$%$%&&'%%'$$&%%'%%&$$&##$"!$"!'yqpes}`luenw\elhqxPY`_hnR[c]hqQ\dblukt}s}\cjCED;<8>C?<=9?C=y,/8/.1-,1++0'*-$%'""'!IMU~@I]9AR줺禽雳qcha}`{djmlgdfZvYuXt]t^u`w_x^wWqUnQgM_~HVq?M_8ETEPcGUhHTfMXiKXgTbw^mhwl{rzàբ0:Q %%+t}ܥܢې}#+0#$&""$""$$$&&$'&$''%($$&%%'%%'$$&##%!!#! $#"(}vmnuZckRV[gov[dkfovZcj^iqxkwOYazU_hS\dJLP03/9<:/1,FLM49C+,2..2.-2.,1++/((+&&+%*1-7K:=P9?R祻ꝴ㕮܎xpjcoqqmgi[vYtUpZr_w`xf~c{\uVoRjPfG[zM^ySbzSb}Ve]k_l]kbqfucrixjyuĕǠkt!$24>ΧޔΚՇsv|%),%%''')&&(&$((&*%#&#"%##%##%##&$$'!!$"!&#"(s|l}qucnxMS[Yag_hnbkraioPX]]fmcmuajtV`i[fnX`iTV]>A=360=A=Z_j*-5&*.+14.15,-2''+*)+$%*?GTV`u%)659HBGY7AE]37P;?YT[lꢷ砶杴㝳㡷砶橾jplk[wWtVsXt\weec|eayؐӘއ{j|n}o}jzitfqdndmemjpozזՓɌku! " # #!!#"'-slu`tm{lt|9=F02:+/5&*/%)-%(+%&*'&+%&+('-)(,'(+((*NW^drwo~jvgt~cpw]hojt}pydoz]epSZbQZ_V`eMX^_jpZfkckrFJLHLL-4ANSb뮸ۈrzho@HW!(8#0(!$%+ CIRɼ홯አӁ}|ōա筿⡹梼zWpYqXnXp[uTkWrd~[sXpTlc{ӗّ֌~~zetkxj{oӪXcz?DU|mrinshvewjxAGSBEPNP^FHWPS\CGKRUaGHNVX\UXa[bj~ļ#((grLb}2>L")1!#&"#'%%)!!& #'!$)"&#)"(!$'(*RXevMXs6@W4=Q,3C$);%(<$*;%5"/"$Y`qir ':$2#1'  "(  FPa֭왯||zu}Ǖܬ㤻棼oLdMgNeQhNfJ`HbLgZrUmTmmۓՐӀvi~iyj~pakbhy"% .$/$/Z`qzԼ㒟\m[k[kEO\@COMQ\OS^JNXQU_IKUJJRJLTEJM]cnSTZ__cllrdflhlrfipx~!$'zF\z/=G"*'((('*'&)##& "&!$("'#( #&#'-^eqLSm=CU28K/4G(.?"(8 &6%5$0-+& ,cgu?DS#*!#  g|ɤ꛰⅚vwyrv{¦뫾h}^tLa=Ol1B\+G7;F&/"-"."0&3;BSW^s`mFTdGP_:@MFKVOUbLT`MS^UXcLS]TV`TT]UXa[]fZZbVVYWWZ[]cX[aUW\VY_VY^"&(n}G_{9FR'/Ꮬ()())*((*&()"%(!%)!$)#&)!'-dnyu~06H,1?03@+0C',=#(8!&6#1"/(%#2#&.gk|! 5ASmЧ茠{xxnhmչ៱ߐ~|y]i*1@  *7T_usٵnu^tczrԚ⥺"2-3B^e{nv:CQ5:E01:BEODJVJS]Y`kKQ\U[fSYdUYc_fs]bm^`j[]eXZa^`jbeo[^f\_g^`e"((ctNf:GV$.܎'(&#$$#%'!%&"&)#(+$),!&*U\gy09M+/<(,;%):$)9"(5!--!.)%  +! ! WZkKMa   Vg{Ȩ나zyxhlʣ囯ڔʊzwvuWf9DZO[qȟϝɵֿ馹i^t\niȔޑ܋לt|3;C$ "1 +%"3%0$3$5$705FFLZ27D!,!-IN]X_m27@9;AACNPWaIR[R[e\epSZfcmxgp{gsgp|`do_anX[eUX_SV]Z]b^`f``f%&k{TkETc *4Ջ""%"" ##'#()#(*:@F08M+1<$(:#(; &6 %2!-!--*)#   '$4 )  '!) &0;pޭ~{{uي~DRf7BT8CW?I]EPcHUhLZpPZqT\taoftdsNXo&-<$*3q{ZrP`y`qo|ƍԅq`o6>R0%(8 $'   . 2#."2&7V_rGMa"'6.1<  DJXkrdj{_eqjq{u~bmzdlxhru}p{wtwqzhpbjvZ`l^fm[ag[]fWYa!&'jxYr@P`$2>ޏ!&"' %$!$ $%!'-?H]*->,0<%*13=46B23?,.8//9jq(2C &vy|]qFZo9GT(4A፛"&!&)$' #"%!&(fm{,3F/1?(,;!&8%1#)4%0%0$/%3 &4"0,' %" +   #$#!'$/ + %% P_vхӉ։։Ս؃ΆK^ + +  + +irwjqpl[jRbL\:?e- 5 + , (8 '6#(;$);"3+% &MT`IP_W`pkv􁉒00:/06-.5,.8,/9.1;//9..6--3/-3t~.'*9#)< %5%/%/")5")5 '4%2$1 %3 %2!, &"#$"  +  # &!!$"-% !%)" cp~ςӃψ҃҅҄yNb"0 +   + "-}cyd~lexZfZ_zNYJT.  %  %%8 )8'5 2/,,&%,1=OUgqyirck4:J.3:,0:-09-/7.08,.6+-5+-4,,3xEUl$(0ߍ9;D  + uz %."((##!'' $%gn}.7K*-=$(:!&8!'6!'3%.!'4!'4#0$0#/!%1". ,&!! # " #"$(")%+$-'2 )gvsx˃чԃnTj,:R  +   +  9F[{[rbx]s^jbb}U\=Fk 6  +  +!,$5 1+/!1.-0+)DJYRZiQYlku]eyakͼ.3<.19.1:14=.18//711944<0/7q25=36>.1:02:CHRam2:I #'띴晰嗯ߛᨾ唣`l',6)+1yZb-7>*-?$3!-!0'3$0!)4 (4 (4&1#/#/!-"/ (! %!  +( $"!!)   DQm]uWpNgWoc|?Rt9F^1>S.CO!"/AN\27B24>03<25>25>45=88=^dnYf(/?&%%嗯ᔮߓޓސޒߛ᙭kux.9H*/>&);!-$%') '1 )2#+5 (4$0$0".!.!. ,"( #$$1#5/" )  8E[TiHdKeUnNe6Hd0?P.=M236?36@_eu;I`/8J#!%#"㖮ݒގړܒߒݑݐܜᢷeq#);!0(" $" %"+ (4!(4 &2%1%/ .+& )!.'3/,     ! .6HK_@[IeRmL`2@U-7J.4C+/<$'$*')2-/.,,,,BQdRhUaHL[               #!1+4F'/A#*:%3 + +"'1)-5! (! J.CU28P!!#ᒬݓޒޏېܑޒސܑݑޑڠt37J,%(#!&.%2%1%2!/!/&&-#4 0--$  !"    +  + &0Q)0>")6#+/%./#,)+27IWlUlQc/3A        +  + +  + + + + + ",$"6*!   '#! 2$       !"%ESa^swqܿ6:D7:B8;B:=B;>E59<   ╯ޑݑݑݑݒޓߍِێَ݆ؗ46@036  +  ♱◯ᔮߑݑݑݑݑݒޒݒݏڒܔߐݒao'  ""#(".!-!/$2"(6#0 +#/$*;(->#1%0!.!0-*" $  #  4>UFZ}DYLaASu7F[/Pl8F`BPi9G_$1  +  +  +  +     +! ' )"!0!/   +   + +  +1=GZl_wb{~eŋ.1>24@57C68D6=G $(   + ߔߒݒݑݏڐڐڏَ؏ّܔߕᐭ݋׃=Il $#%"/#2"'5!. . . - -$!") .*!.#)6 '4 '4%1(   + + + +   + + +  + + !)6.;Q!0 15;   +               +   + '/29IW]rYs\v~~/6>04?58B69@:?F  + @FVܐܐݒݏډՉԍ֏׎֌ՋՑېڒݒޒݐ݂Yj,,' $1#'9"&6,,,,"/$ #". .!-!- &2"(5$1%3'5 )4$ +  +  +  +  "  &-;'   +             +        +    +  !$7BKFXhWm]wqym69C7;F:EK=GMIS[LS]WbkJTa@KWHU`KYcYfvZhr8CG!(') * '!*#/ - ,!+  $#/"/ - 1 * $)#/*$/"*8&7(8&1$     +  + + +  !(0&7&*')"*!   !!"$&(.       +   '%!)+9DP?HXGWi^u]qPbyFVj)/;{S_|Wq\uezf|jikjlppmُڒےێ׋Ոztx€ɏؗau=BF9JR?DOBISHQZDNYEP\Ygt]jzTaqR`lER[08@'!)% +!- *#2#0#" #$#.#2!0#/"( "("* #"* (5$7'-&.)      +  + #)!(9#/$)&)&"  !""  $'#!"%    + +   + (22%)8BNBO];HWGViK]q4DQ,6?ls|Ub|Wk[tdyikknnmlimܓޓ܏؎׎׍Վ֎֒ڙ㇚FOR/27=BGIRZHR\-3=?DN8AJ@HOKT]YboQ^iUcnGTcJXhJWfJWfAKV%*$++"# # $* )!!#!!%"."0($#%*$(#%%%&-'"   +   +  !(0A%3!+2%+(* ! #&"&(0 ($'- -!!' !#  + +  +  +  + %./,6:$+0?IU3@N7AM.7D>JW#-4IOWs}Wf{Yi]udyhjjjijjmkڑڒۓ܌ՈЉѐؓܔޘᘯR^xADB/08HQXOYaADK25;>GP>FOEK+04!%#$& #'"%!,!0' !!"""   +  +    + +     $/<(/E%4#+6$(#&!"#&%.7'2(3$,7$.++6*&;'(3#$%(    '14&((),5>,49$)/9@M1;J-5@#+2 )0 ĂYe~\m_tawbwdyf|jlmmh}eyӌՍ։҈ф̈ЊҎ֓ߘpNWVABGFJSFMVS\`*.18;B8:@56;BKWAIP6;BBKTEOZHR_BN\EQ_Vbp]hv`jy^k{\k{WetJS[279" #$!%/3A',;%"!"   + +  +     + + $0*3F%,;)/9'0!)- (- (."*)0>(/@(/?07G (6 (0$'."!&! )%"7+); * $ "$%013=E-6D&06)27/6B8=J)/83;C(19(*! Z_k‚Zf_p`vcyf{h|ikkkh~e{f{ыԋԇЂˀȅ͋ӏ؏ۋKU`ABEIJOAHOMSX.25/3:=?F78>JPZDKT26>DMVHR\=GQ4>G>GR[epfp|bmz]kz^m|VguWjvR_nGP`:?F)//(-.!!# 58O?B_AE`59R/4F.2C*/A*"     + + +    +)1C$,?(/7*.:#)6#)3$*7-3E &7!(4*0A(/C*0D(0B#,;&-:#.#%1,/?('9&$/ # %-#.4&*,0+0 -2/;B8DQ&2<+4<6:H14C&/83:ELLT]39ACJR@JRZdm[eqYcpZdqXcpVer[p|UerN\kJ^lFTc;DQ:?K05<"'%-1?17I16J27L38N=AY>A[(.;+1?,1?'*9$%6*)7"%+#& '#%,$#% " !#& (,*59$07+7?6@K;CR/5C%-7&17$,3 ^dp\fw[g[m^s^wdzh|i~h}i~llmmvrqpqwȄϋ5@M24/?BA=AB164+..8:@;AJSYc]jwguVal_jweqWcqOZfAOYN]lShvQ_oR[hJR_=COCHRHMQ:@B.4@-2E-2G38M>BX59P9=V7;S8=P,1F;@W09M29L*,?"#2'   +""*8"+8/5C06G49M49J*1>(+!$)+,4'#*!&#"+!)'%1% + +  +  + "(*,5;*49&24 $'.ϗWan\gZl^q^udzg|h}knkjln/5>drz{jikv{x+)%,* @D>*.,9<7$))59A04>CJT;DL36?GNW8;D15F./6RV^kwboyISY_jr[gqT`j8AJ*0939FFQ]/5<69?R^iZeqZfuesbtZiyP^nKXe(.;EI\;A[EG`=AXJNkADa;>T7;M:>RQUjEIa05G6;O7CI(D).3:AKEMY*-1-25OYeISaFR]Wcq[gwO\kWbsXgwTet&. .1?CGZ89O/1C%)7(+7#(1+,:>@Oos6:F14A(+804C04G9>R49P=AY58N57L.1D.1B")211A(&5%"-$$&  + $ !" $        +       +;;>SYgW`mX_tZc[k]p^t^ucxhzg|f{dzdzbxELP )+)--&%$  &!!#(')/1&()krxYai:?DMSZXbkIQZ6:B-06,-4CJS,4;*+.OU\?HTQXdVamMYeEQ]JWdHSbTdsScs;EK$$ %"%1%)3,/=15B03@01<)+89=JCFT*.:&47H8;Q47N03K13H12F)*>.1E.3B! !()&7%#2+*1%$%"" + "$  #%("#       +     -,-IMWT[hV_oX^y[i]m_rczdzeycybzayayby  +  ;AH )$ ,%!-,&+(#9:4**&BFG`gk>ACAACJMTFNW39>'*-*+4:=G249:>AU`jCIV?CKBKTCOZ7BK>HPCNXS]jHWdCP^.7@05:)+. !'0!'2#, &,+0:*-7%'0&*906G8=O-1B$'3%-2=16F*,?./C&*=#&4'$-$",%#+%!,#'  # %".&&+##!"       + CFHILVU_o[c{\i^m_o_q_r_v`yaycycxcw  +  @HN 41.,'"1-' >>6" ]_\PRQ682BDDCT]eENXBGP@FPFNX8CK:CJ;AGBKSFOYHQ\N[fM\kJXg.:D $"(-7/3?,/>&+7.3A/4D16I16J38N7;R26H-2? &1$-" (/4@#$-,+7! .$#/$!%+%%( !802$)!!$  %            AE@EIOZbt_f]l^m]k\l`p`t`xcyewevbt   + 6:M49K8=Q:?T49N38M16J05G/5D&,6"'/-/;#$/!#.#- + ") # %! $#' *!$ "#          BCGX[g]fvbhal`m_n_rdsducvdveubr_n    +4KLB#&!(()/3$'(*./IQ[OXeRZaKT\^foIS^MVa;AGJQY89@<@IJS]9ER>JVOYd+/2 $!/:F*5D13A,/>35E38I27H/5D-0?./?*-9&)3),:#1"1#0,-4$"*'"0#".!%!&!+%%&!)$"&#  !         "VU_]_p^ftbidkcnbqasdtdsetesbqbnel  +  +?FK#!!## # +*#DA8<BPWaIPYX`eX]d\foT_j<@HKS\IQ[EFS;:F=AGLT^>GT:FSWdrEN[07>.59%,-&*0PiRk;Ie%'0-0:68J$'8-0>-0>!%0(,8+.;#'2),;&)9 &1(*<+,>'/'%2!!(#!'")"! #5/1# '6.-##              ]]d^ao`frbjzciajamapbpbnamaldlfmjo~ + +   8?E   $FA7:6,?<7%"!,)(23/CFIAEMY]aDIMW_hgp|BFODMQWal@FPBDK>@HW[fAIU7BNMZeP[e07?15=48B6:C9DSZqVmSkK_*4F&)254B-.A)-@&(:,/@%(9-0@'+7!,&+806G$2&.&%.$,,'8 ) $%)(!3,*#$    +     ZZaccrbfsdj{djdkckbjdkfkgl~hl{ilymq  +  + 6$ !/0+<@>9;EPVcAH7>F7DMIT`>FP).414>9>I8@=AD<>E=@F.4;9BK9AK,29).328B.5C9=B;GW]|^\yRnNiNgKgIdI_H[FVv;F^.4F(!"#-'62(>�! #$$,"!((! $(#$##""'"   +    $gkvt~al}MYfIR_nu?BL!    JMT;BN/5=29B %,!)"*@CL:=E47?6:E+08#""! "! ! "!!" !,'" -+%+*#<81=9183,=95@A>BCB?@?:=B/48?BF"&,9%)+ !  ACI7;D"*+0:!$.))&)3&$''('$"!""" # " ##!$ #! "$  *$:8383+5/%61'?95BB?CC>AD?HMS>CAADH"&,16<)/1 %*)06:/5>(.2[temh`\xVoTkPhLiJfIaK`J^{H[vEUoGTlHVhKWeKUeKRaKIWBEMAG!#&%%" $ #&&&&#  "!#!#!#!$! %"!#!$"#"$!  !3,"LJA31(6-$90'<5/JJE<<4;?5[aeADD=AD %(6;>#''"$".25)//:CQ_yktmg\zZuZpWmTkQkLfJbH`E^{E[wFYtEUoGTfITcJScOQ_MPZLPVHKRHKTMPXMQWJLRHJODHL@DH>BC?A@AA@EEEBCCBDDDFEEEFFEFIEEA<=1-- (""  -& $$ !  '&" GHNBEQ2:E/9C)4<(2;,4>6:E8=H3;E2;D3;F9?K8?I8;DBBH $&&&&%%''''%#!!!#!# #!$! % "!% "$"!%'%$PNE;8/5-%0)80'CA975*;>4W[^BDA)--$#=CB#&#*34"$!DTgb|qsokbXwVqUnTkRjQjMgHcKeKbI]|HZvEToFThIRcGN[EJSDHLKNRORVORXKNWMR[LQZHMRBGIHNLNQOVWVXXWOQURUXSVYTWZYY\b^`iafkcifaeSPR20-" +*"& $  &,$++*?DM@CN09B.8@*5;(1:-5?9=H2;D3?GAAG!$&&')((())(&%$# $"$!# !"" #$! !! %*$('VXX61*6/%0)>8/60&@@9NQN=@;&*&!6;7#'#&,+HWl]ynwxqjfba~]xWnRhOiHcG_H[~J[|J[wHVsGTmISfHQaLR_LQ\JMWMOUJNPHOQDKPDINBEFMQMNRLTWRVXWRSTPOUSSXTTYSU[ZZ^eaed]ejckfbggghgihOOM   "& + (" && 77=<@K=AK/8@.7?+5<(2;,5>7?H2>F6>H6?HBDM=BL.7@.7@,5>(2;(2;4>G7BJ;AK8=G6;EAAHFFLCGP@HT&&& )#,!&, %+!&, $,"+"+"+"+ $-!%-!&+ %)!&( $% ! !!# " $"#!"!#%"$'&*-!"#4/(#;4+TLC.%;5,43+*)% ,+'#!).4DVnVpYu`{pxyttqh^yXrYqUkSiPjOjPdJ]FXwDSjDRfLXjKWgHSbGUcFTcHSaLT\KOTNOQWYXSVSBFFHKPJMVPQ]TU`XZcX\cdejedkhenjhmded_`[+)& !( ! %546BBNADL?DO19C.6A,5?)3<'1:1;D6>F8@H9=FA@IDAHBDNDMZCQ^( )!)!$-"&/!&+!&,#(-"'.!&.!'.!&."&/"&/"&/!%.!%-"&+!%&"%(*-53964=WU^IGK)),"#$%&'%(*%+-#%"$"1120,"[UI0(;2*50'+&  !" .4;DWqQjTnXtZw`|ccfjqog^wYpOgLdIaMbPdObQ`P_yIVlGSeJVjDQb>KZGQaHN]PS`UV_RTVLOLFIKOQXOP[SV^Y\b\_e\^fgiphhpkjrhimdfd>>:    -&%!#$$" '"&!344EFJCDOBEL=BL4:CK9BK9@HHFMMHO@FPCR`DTdFUi!$,#&-"%,!$,!$-%. '0!(1#'0$(0#'/#(/$)/&+1%)1&)2#&. #***1ohs~w~vv{xCEL9;E&'4%'2"(33941,>6,B9.)   8=DGYrPj\x\xWsXrUoUoVp^zgjhfc}]uWoMfIaG^H]I\}BVuReFW{BRnJZvHYuK[uIVjIS`FLTORVQRUQTZQXaV_kXakagofhthhsggpiiqefjIII +   +  +$484GUajz !.9AKQZQQYILUHKTGJS9@J8AK44=9- +   6;@H[qUp_|^y[vXqUnTmZr\xZyYwZvXtQkHaKeJfJfLfOhJ_OgKcFZzJ]J]|FXrJYsHRfGO[FMVX\bVW]Y]fXalWao\eqejukkzkkuggqcdkHHK   +   ($CKL]l}\bq$%&*/9B4=FJMSADN?BK?BM5=G6@J3;H/7D.6B:BM:CJKHNNIOHLWHTfIYmGWkFUk#'0$)4"&0&)3!*2"*2$-7'2=$.6$,4"+5#)4"*2!+0*/'-$* $*#)$*#)#)#)"(#*3;CBLX/9E;DO+4?;CN*.8%&/''. " &(")%-')7-+.   +   7:>FXlRoXx^}c^zYuYtXtYuXsUoRkE^OiToRmQlVpZrQiHaPhMfLeRiOcJ\yJWwMXrKWdOXbXajU\eYbmYbo]_peguikxjlyllueelHIJ    !  +**&U^fbr -18/9E.7CDHQ@CL?AM;?K5?K6@L3=I08E2:F:BMADMLFKMNVCO_DSgK[pIYpHXn$(1&)4&+4)4>:KY:Og[thPn5Ne'2<#*3",6",4)2'/(.%+!&, %+#)$*$*"( )'"(!(%&=BK).9%'2++6**-4"'. (!%%2 +     57CLFFOIISDFQ6@L6@L5?K19F5=I:BM;?JJKRLTaEThCShHYpJ\sK\s'*3(,8EVektӐލہf6FW&4@!+6(2(2)0'-!&,!&,%+#)$*"(!) )!+"+ ) (5;D18C+.:!".**8 $##$+"/1B()7 +   +  238S]sZmVr[z]~hkha}YuYv\y[wVqRmRnTpUqUoWoXpYqTlJcKgHZ}L_I]}RhUiT`r[gsS^i[doZfq]htaevhi|oqlowSTX  %$)#93(.+ 21)-,%!!!#3:F4;E29C6;EHHPGGPBDO5?K4>J6@K19F3;H:BM:?KKR]IWiGWoFVmGYqJ^vL_w \ No newline at end of file diff --git a/wolf.hpp b/wolf.hpp new file mode 100644 index 0000000..6ba1f7a --- /dev/null +++ b/wolf.hpp @@ -0,0 +1,5 @@ +#include + +extern uint32_t _binary_wolf_data_start __asm("_binary_wolf_data_start"); +extern uint32_t _binary_wolf_data_end __asm("_binary_wolf_data_end"); +extern uint32_t _binary_wolf_data_size __asm("_binary_wolf_data_size"); diff --git a/wolf.png b/wolf.png new file mode 100644 index 0000000..8d6ff84 Binary files /dev/null and b/wolf.png differ