From e4100d07a1b74bd459d9ebab6a90a551d09f2fe6 Mon Sep 17 00:00:00 2001 From: ifilot Date: Sun, 1 Sep 2024 21:34:21 +0200 Subject: [PATCH] Polishing artwork --- assets/tiles/cx16-kakuro-tiles.pyxel | Bin 2846 -> 3524 bytes assets/tiles/menu-tiles.png | Bin 2286 -> 2491 bytes assets/tiles/menu-tiles.pyxel | Bin 4632 -> 4848 bytes assets/tiles/tiles.png | Bin 725 -> 1258 bytes src/Makefile | 2 +- src/constants.h | 12 ++-- src/main.c | 1 + src/puzzle.c | 89 +++++++++++++++++++++------ src/puzzle.h | 22 +++++++ src/run.sh | 2 +- src/tile.c | 4 +- src/video.c | 21 ++++++- src/video.h | 9 ++- 13 files changed, 129 insertions(+), 33 deletions(-) diff --git a/assets/tiles/cx16-kakuro-tiles.pyxel b/assets/tiles/cx16-kakuro-tiles.pyxel index 951005c3f6a466fc10deebd42ae6c733f218f872..afd041c94d798cb84a82f967325f7d4529795ca2 100644 GIT binary patch literal 3524 zcmZ`+XHXN$8V${Wf`~LjZ_<>|6ai_{q(h{HfI%R13>^amX-X5MH|d663`GHf&{05< zNH05w8lusZ!-%rNQbsQ;+KHN{%=8UsWLs4f=yc|3u$gGeR&b4 zL}bj2L-IinE^vO}-Q-*$SHpk^@c@h7UPCrT&PQ=Ri{W+AneE6C z!)d+MlRIirR`A2asI<@ZsD>(7^MP%l#K{!JI_GkrnIbZ`-Yv@iC>-%q{eWKlv?5$- zXj3$0fpC0Dq|vk6Z2bhcl-1k?2WP*(7=vES3)Ft}^K!FLmw5L3&0#?loW<=l41cng z&F5OKZ4tZtaPM}tw_}Cr?O0G$eWan9H98E@U9rxXJ>-)5w*3o@)y+(Ynky4KNipHx z|h?c@c5njE+fC_^oUMf zXJ_GQPneVNv@Ua<>f>nEJ!@T@IcvpQ#hwwAgY}~&`;YjYv9wGwxoN_xpHHD1Vg6CgupxSdt&<)mvhqvP|jhIGFM?#>l zmkHEsqGr?X5a{6c9=R{G*r92rv7cC=PcC8=I`WFi>X_MAFg!g-BS(87)c=9w13$Z5 zrmRlOzN`U9%bM9zgvd0tVY?WCaep}NRF_kC!TuZ*WYP17$o-3loj|{|V+?kxHW&g$ z`ky@z8V)K@2q{ZlrRjQ+Z&fT*S*V)cZc;Zwt8jl*Yw%r^-g2SKaT!un+15i_k((G}ER&;y$6O6juvPN{T zXw=n2Q>N>D6=o^a+IIY;3r!o{TG2Ms)ipQ;fRxa;z}JTzDmpsB#r9=5C`hp4xLw(R}|oBR9||hm}9l=b3_MqFc&+ z@DTEYCHV~*M|Bo+e}13P)CODnkW^?3r+Ll2OQBrwfX+TwDS^QXs7@h!AsNq1FWK1b zA*4M$`HT@C>hj73{w&6oh@l0+N>wq&cF|k4qamgqQlXVErko>JqInp5%O~ozsXkQc z`&^GeVs3ao9$6%+*Zfr>C+bk!DdCqS1xxW-QI`^~5}_AUWj(9Wm?vwV0T|haXl!?r zzNqjl^1(ex_vDK&&{-x%8{Z1UzRw9VGf~`EG%!plVcVBgWLRcqhB4De0u9X+I7oZQ zU)AP1R6aUQkt5Y?xNc*i^qq%M7gwADclJniBtM??e%vC@jIg+z#}OY_oJEMz_3|Zi zin!F+L~pvy6EU=Gz|#;4fddcXS^nI^n`l`beh%iE$bzBHR|z|OvW4tRBNVHeatG~* zYO?{wZH~&MXY{?;+g`h5lXYf3RF#j#c0)72X&OL6Q+>Te!zytcF)B}x3Em97Kj#;E7wFIB+o^C;*RkOHkeBL?Yk3g)FPCsFFLg)|Kyu6?~6JF%_Q;zkS10rPQ zJE6_!zdGX8FtC~dsT0PNaFK+^HvaZr5?~KE$939mZ^ClYcUx=g`F)}X4QZv60&&Pr zge;9uq@IMBWR%1pv_8CP0Mgy_iew4g$1g`cYF7dISr5$P+gDnU5#mvV)ipxxfXHha zz<;a0)i`LbrUU@iNcfMcq z^`@n~2z#Gj${g+0!N(&jVQ$@|^_|+FAVnje?2QL7u?|UI%XEdNE=mic!mH=3T7~2e z+*!_+K0nXdBjWp#HfZ17YLEs3KF{+givU#Pcbhr1%N457xgwu0vo7Udv| z6zoL6EOELfc*&eF2hZm8WlusR#|!gimV@wOuU8gZ`Fl_FNys_Sn6{Uf(&E4Y)(Bf3%#ewM=7z*spR7OZWtuNQ8gK)1T^>RR_+VBwG=D+~#*gyD+K~k+szoY;g>l~B@ZBC9h{NQ|^ zbe&i-ApTb55+uv1>~cLFF5F!VQrEoQg;n<##OMI4>j0Of33890`)a;?qOSwI8l$}- zjBL?CUu1+7B~h|>W(2In$u;2e!v*U)!QU%Cr|4n32a4%BS_M9`ium#I74lr}=89Z3 zP~Qg%>$pkiR=j4p>Tvmy?Xz&I_YWAY%Sz`39^gP>Z3*Y|apOmTuOL}w=6RQnd?|mz zR`tu7dJs1gjaZpVM#noU=b~;ux9D4)S#L^Pt{m>@w;dfgl((_ z8!Q1uR%x+e0RyhnQmRXk#jeK>-qHQF;6Nl_vLJCoz;ZomMQKyk+a|28!9TJ z0y7O=c$KO!uCnt3e3Qc z6h8ocOUJyr3a;1AlYa`eD^G+e=f<&z*X@mt7r3#7H_qW4b(}Wbx2bKsLt_Ob=0<(? z(X6g&T?{wvT&Yho{i|$GU+S0bXwB*uSr!Yl=#5G4_$%DPUmr?4ZF4}4k$aD~ZXLF~ zFO`nS^3Q4AWoYk8glqJ8S1Eac&OS*N@ZHfsi!X(v4%3DjUsxsITJ8OQI@bAXOj6(f z(;Fz)i)@J$t<}l9kbSnNQ-cciKSt`cC&dt}8}osh;9${)J@ciZl0}330-OH3R}2|6 z4?pf5Ht^TDOd>HJGUrZD=ydlXypA_vljgEub{$l!HU0U$oCDtz<6j8Z2suv~btT9N zi&SW>A)kD+mQ(Nt<&b`NoXNf1()wj?rk!HV0k7wd=?bsfM&DK!MgSEsvew1*b$2tp zpT?%cTxiEJ_r!BloSq@@U%M!7&CEM--`Kxz84Tk)Ovi>`&!m=>vc1^K^5QTb2`mCZHfu-1sN{fFuQr%mRRb)enZ9aoXGNF{lvH+QA!V zm?LVLpR-(?Hi3Je!cI}gsWHpW=fC+Hx-hOzljNehB+!uH^w~iAzNsNq~3Gn~p z3`y}H003Trp3rN-*VIsV0?{chHfiG)g3p;MW)SthxlrumnM5~d zc}~Hk#=G&ck&liZTYL>o;Nm>_|D{GNO zVFK1W3;T5Y!{&Z`Z~MxUQ;S>f9*ry4dhUlFe`^S=v^`j>ejk@ZIUA`#c@@_oUUpEu zNe>7+crUg0B|YqLWlnEF;2C^Sn|bGZnCrEzfcABgxdb-axSqMk3^BaaR3u1Yx+hC? zqC>(;cFij>nU;qi@P13%F>`Z+lJx=^;!3Jx=)0NU*4ALaD;Oy?2|-KfZf(RHiiQBa zhBj-}CUaT`sWV$7EWR`^!&A8;O>ccW|LI)W;i8&Y@zuP^=UZ@Uxq4XK41rz*o87DK zkHSBk!3NR9OuTz<1UL+i1?aY@baINcPy5&05@Ayv;4$F8zs8d)M5>1eSr*s~0naOj zH=*(;Ej?&0SL+IoO&`h30v%P<6_5knr}H35o)bxpiqi*`_k)yE6+zDv^FGwlN;j28 z1bwE67S9pk-5)(CzG^zuBIve%iqwk7brEi?VRc0e9?m42EIM?c!8I_^Pxo;dXQ~_C=3a6{2B>Aq`u!^yrL2F@fsO}zNe9A=DUef493XGOxpNmX~5r}-MdL)t*BEw8sy-)<- zh$RdW_PdU4${xUIOJ%DUURXt89mckB_U`tDT`8NR7h|#yfXMzRwm>f``#KBAZ(0mx zP&Bfn-uR&T{9`GMYC`q8iKFFH?O)goO#u;2V%S9ddqN#eXE$k zi)RyJA(J_WNfcB+GgmKfPjZRPy3QJY!U?piseesDlme=(sqlFZsWD5eH1$$ebR35V zI7BEFMEe&gTNu0uyKE;6>@7nn$X&{sXr4H&eH0D67~V z-G5@$yf^CsjoShDx zi%#df7c9r+JY~_6t4w&3W}b4R&ec$6k?tvFVzYTY_JiHiJho@OfWNRZ(PN@fj3BnxL5Y zuA25G;lr#CMR-MrSQ6gi!tttO5UYGkq7x{Ubm>TY9#?7O8?FUqi9AT=hqtmEU0 z#iVdu6x+9~sz;vux=xyAL+2VdT2>c7@3I|DpY9$#h>5<_u)25#n-X-nM>^H=h_7*P z())CDx`RNuI+Dli+{);Gm^W7lUPX zDCmlxvcbEnS703HbJV*25cjIC@UF*^mbE^m_m#Cb_ ztAA|3sWme~TX=|X2z685HO6#Vx-)gyv((scFrn}9M(9ABQ|BEzBi#9F23l>n$DuQ# zUmRBWBYi#pY(oP%W2T{b8CyIHVeDhpOzZP9ihi60_=&=c*4{lL=LN|<^Bq{wTq<%X zfN&L5K0d_tn_o5(_B^mXMT{~NqBcgHb{vS!8k2u1t2(l)+*m1Xa!?9+(nVBy1*7JR z5}wFSIKWJWRLfKzC{>)7l2F_X$d(BU(J}8xp*~#X)8O~%e|&^4aEO)~w#X&fec%q%q)3lGbmTy58|5k7 zt1NW^<`3ZD+tGKY9kwrP=Q9kAx#5!ByeF@*!^x2cdYBM-M0p_mI{>z&%w0$6#EZfUXVn!n%V+AjuB636OthfM&U+nu3T4hlglRHR z_E;pBuqORSzS~!NSiGJUUMzp^-nid{E}|LpxL;nQ7k8ec;%ml_{vCT>fxtLXTtewIgQiHCP!16B?NN6UKRBZbasPij3Tly*nKba8WlV~T{xcI=8eUz zuQcBn5kv4(-NLQa@Jqv_itKDXo^m~}tO3y2x%Jqe0pHsM@eJ39w4R)fhpCTHmbOP> ze7%mBQb2<_q=etsv71)O9{nN|sdyV)-300_Ugh*8>CD?=)LlxnhPHgYhCo!)!ekx( zW*Yjrjy+gT7$u~9<0J?5_lMa diff --git a/assets/tiles/menu-tiles.png b/assets/tiles/menu-tiles.png index 4db3ed55236a39c8113335343c17b9b3f125fa23..93341ffd4f381cebf92bf6bd7f1e9a41405d1acb 100644 GIT binary patch literal 2491 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 W|GNhX>E9&cKeqD6pZ^I00RIE4hJXA3 delta 3710 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 IqWy2-Kg)L*u>b%7 diff --git a/assets/tiles/tiles.png b/assets/tiles/tiles.png index 0578e13255c759758fdc8b301c5269c66225a57c..acea21a8e54197ddf29f8094326e816ca6a705ac 100644 GIT binary patch literal 1258 zcmZ{iSx{346o${eSs_59(tv<)V?m@OpdwBbIwl!btr$`*$d;6fg1Dfl6^U{|5pWq8 zEHGUpVOXY7$|BH!R=9>iXN#sUQ++5s{*RLYUHo-YyTm_;Svf|9s~>eL0elKudEw za{#am4)T)%Amj)_CY`Kv(duRZYHhHeXxFL1scS<=ht{$EA7w;JSf;KP`;M$NtIAvl zS~-0g5fawrQ8NcyL^Vtc%F{P_`4q;9z$sNRlV72hYK9i2E4H3By>J{DInw=C4`)Z? zhSd1fLyD-@I>rl2DEjze_KHW+Cn(NF8>Z4yQq~7va&C^P?lztcTe28=daQ}3F&MN9 z#vYH(owA458%=S=yAe1^h3)7sW{i?E)ttH8vmRXDC{p9Q?~_x|SXS?R(>*ak<2iZN z^8!(q#Ez%oHD@773}xRED-pSRD{u1ZT0?{~{ANC~6vk_G$fUN~^n3rF`Mp$dqXkF5}ka$dDN9pKS+EbW_DxD3P|5?WG$FoS6e za+Mb6{Q#FTBpJfV1R&S z8f#cj#+{HibT91oSNo|9`EcNLgZ09Wd9UKtkL_T_n!8f50V-J5iAks4bBOyMyynKEGVA3%Vw5W<@Pm(o{026!;Cv*>8< zwa2c*Upi)0=cZ}zguV3c-BLbR-EWen99q2FUO3-Arm0H1@!C^yIRYip`gTv$zCoXL zwT-!)*fuG4RBwj7MNfgfJAHG!2 zQhij&8B0~R6pqV=GM&%a!+%h>edFGA{+P=!C&7luCmP;DCQ$ZqL}wQbov-=(kok=l ztH~F2w*37f-qgrxj_~x-I_9rUEG(t@9*-yvm}zM5jpdY%@v_T}kyMtY@8FT_+$_jlw2SB#(Q!<2loJxjwa}p z>iGe+h93*>wDX9*6wmu@F#r-T^QgoUL;c&~Eue~Q^olbGhYmvl3Z8<^x0oTWKmj+FV;s1vi#1!pa$BsikGEhOg!`=Z~5Z zC6x~lQ`0moA8F}KQ;94ytWeNGMJl#@B!)KEq~HBH?%=q)AE%YYL@*f~1^{NHL?j0Y z3kBDPWUOsYtJbHj*JY|g;~?W$zt3Z#LTSy3 z$e8bT%(+&+bK~lGSX_~AF3-eMzIn?TPMrRb?wT;Mv9gidv9{)(+&Sv^eCfn<3Am4q&RNe^#Fo5;j*@ChP!3KE##KO#1kIMOiAnB%@Jozf%M`jDh)ssA)N0wED<;*i kDA}HBd%AuxG$gJu4}G=Y)vcdvk8Zs-QXC^{5h@G*0!oeui2wiq diff --git a/src/Makefile b/src/Makefile index 1d796d5..93f2834 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,7 +8,7 @@ KAKURO.PRG: *.c *.h *.s TILES.DAT MTILES.DAT PUZZLE.DAT SDIGITS.DAT FONTMAP.DAT $(CC) -O -o KAKURO.PRG -t cx16 -C kakuro.cfg *.c *.s *.lib TILES.DAT: ../assets/tiles/tiles.png ../assets/scripts/convert_tilemap.py - $(PYTHON) ../assets/scripts/convert_tilemap.py tiles.png TILES.DAT 2 + $(PYTHON) ../assets/scripts/convert_tilemap.py tiles.png TILES.DAT 4 MTILES.DAT: ../assets/tiles/menu-tiles.png ../assets/scripts/convert_tilemap.py $(PYTHON) ../assets/scripts/convert_tilemap.py menu-tiles.png MTILES.DAT 6 diff --git a/src/constants.h b/src/constants.h index 4f07548..a335d49 100644 --- a/src/constants.h +++ b/src/constants.h @@ -22,12 +22,12 @@ #define _CONSTANTS_H // graphics positioning in VRAM -#define TILEBASE_MENU 0x0000 // 6*16 tiles at 8bpp -#define TILEBASE_GAME 0x6000 // 2*16 tiles at 8bpp -#define TILEBASE_CUSTOM 0x8000 // 2*16 tiles at 8bpp -#define TILEBASE_FONT 0xA000 // 8 * 16 tiles at 1bpp -#define MAPBASE0 0xC000 // 64 x 64 tiles -#define MAPBASE1 0xD000 // 64 x 64 tiles +#define TILEBASE_MENU 0x00000 // 6*16 tiles at 8bpp +#define TILEBASE_GAME 0x06000 // 2*16 tiles at 8bpp +#define TILEBASE_CUSTOM 0x0A000 // 4*16 tiles at 8bpp +#define MAPBASE0 0x0D000 // 64 x 64 tiles +#define TILEBASE_FONT 0x14000 // 8 * 16 tiles at 1bpp +#define MAPBASE1 0x16000 // 64 x 64 tiles #define PALETTEBASE 0x1FA20 #define PALETTEBYTE 0x00 #define BANKED_RAM 0xA000 diff --git a/src/main.c b/src/main.c index b9e1d23..7612cb8 100644 --- a/src/main.c +++ b/src/main.c @@ -39,6 +39,7 @@ void main() { // enable mouse init_mouse(); + set_mouse_pointer(0x30); // load sound engine init_sound(); diff --git a/src/puzzle.c b/src/puzzle.c index d02b2c3..4d01f5e 100644 --- a/src/puzzle.c +++ b/src/puzzle.c @@ -193,6 +193,7 @@ void build_puzzle(uint8_t puzzle_id) { set_puzzle_status(current_puzzle_id+1, idx, 0, 0, 0); // keep track of time + print_clock_border(28, 31); game_start_time = clock(); prevtotal = -1; } @@ -283,7 +284,7 @@ void puzzle_handle_mouse() { asm("jsr $FF6B"); asm("sta %v", mouse_buttons); } - gamestate |= GAME_QUIT; + puzzle_quit(); } } else { set_tile(1, 38, 0x08, 0x00, LAYER0); @@ -371,22 +372,7 @@ void puzzle_handle_keyboard() { } } } else if(keycode == KEYCODE_ESCAPE) { - - save_screen_state(); - build_window(12,5,2,30); - printtext("Are you sure you want to quit?", 12, 5, 0x12); - printtext("YES (Y) / NO (N)", 13, 5, 0x12); - - while(keycode != 'Y' && keycode != 'N') { - asm("jsr $FFE4"); - asm("sta %v", keycode); - sound_fill_buffers(); - } - if(keycode == 'Y') { - gamestate |= GAME_QUIT; - } else { - restore_screen_state(); - } + puzzle_quit(); } } @@ -411,7 +397,8 @@ void puzzle_generate_clues() { idx++; } build_clue_tile_right(vrampos, c); - set_tile(offset_y + i*2, offset_x + j*2+1, 0x20+vrampos, 0x00, 0); + set_tile(offset_y + i*2, offset_x + j*2+1, + ((TILEBASE_CUSTOM - TILEBASE_GAME) >> 8)+vrampos, 0x00, 0); vrampos++; } @@ -425,7 +412,8 @@ void puzzle_generate_clues() { idx += puzzlecols; } build_clue_tile_down(vrampos, c); - set_tile(offset_y + i*2+1, offset_x + j*2, 0x20+vrampos, 0x00, 0); + set_tile(offset_y + i*2+1, offset_x + j*2, + ((TILEBASE_CUSTOM - TILEBASE_GAME) >> 8)+vrampos, 0x00, 0); vrampos++; } } @@ -499,7 +487,7 @@ void puzzle_color_numbers() { */ void show_game_time() { calculate_game_time(); - printtext(game_timebuffer, 29, 32, 0x15); + print_clock(game_timebuffer, 28, 31); } /** @@ -632,6 +620,35 @@ void puzzle_complete() { gamestate |= GAME_COMPLETE; } +/** + * @brief Routine to invoke when user wants to quit the puzzle + * + */ +void puzzle_quit() { + static uint8_t keycode = 0xFF; + save_screen_state(); + build_window(12,5,2,30); + printtext("Are you sure you want to quit?", 12, 5, 0x12); + printtext("YES (Y) / NO (N)", 13, 5, 0x12); + + // consume previous keycode + while(keycode != 0) { + asm("jsr $FFE4"); + asm("sta %v", keycode); + } + + while(keycode != 'Y' && keycode != 'N') { + asm("jsr $FFE4"); + asm("sta %v", keycode); + sound_fill_buffers(); + } + if(keycode == 'Y') { + gamestate |= GAME_QUIT; + } else { + restore_screen_state(); + } +} + /** * @brief Auxiliary function that computes the game time and stores it in buffer * @@ -746,4 +763,36 @@ void build_window(uint8_t y, uint8_t x, uint8_t h, uint8_t w) { set_tile(y+i-1, x+j-1, 0x00, 0x00, LAYER1); } } +} + +/** + * @brief Print the border around the clock + * + * @param y y-position + * @param x x-position + */ +void print_clock_border(uint8_t y, uint8_t x) { + uint8_t i; + set_tile(y-1, x-1, 0x22, 0x00, LAYER0); // top left + set_tile(y, x-1, 0x21, 0x00, LAYER0); // mid left + set_tile(y+1, x-1, 0x22, MIRROR_Y, LAYER0); // bottom left + for(i=0; i<8; i++) { + set_tile(y-1, x+i, 0x20, 0x00, LAYER0); + set_tile(y+1, x+i, 0x20, MIRROR_Y, LAYER0); + } + set_tile(y-1, x+8, 0x22, MIRROR_X, LAYER0); // top right + set_tile(y, x+8, 0x21, MIRROR_X, LAYER0); // mid right + set_tile(y+1, x+8, 0x22, MIRROR_XY, LAYER0); // bottom right +} + +void print_clock(const char* s, uint8_t y, uint8_t x) { + while(*s != 0) { + if(*s == ':') { + set_tile(y, x, 0x3A, 0x00, LAYER0); + } else { + set_tile(y, x, *s - '0' + 0x30, 0x00, LAYER0); + } + x++; + s++; + } } \ No newline at end of file diff --git a/src/puzzle.h b/src/puzzle.h index 0ccf82f..5bfb070 100644 --- a/src/puzzle.h +++ b/src/puzzle.h @@ -149,6 +149,12 @@ uint8_t get_nr_incorrect_tiles(); */ void puzzle_complete(); +/** + * @brief Routine to invoke when user wants to quit the puzzle + * + */ +void puzzle_quit(); + /** * @brief Auxiliary function that computes the game time * @@ -179,4 +185,20 @@ void wait_for_key(uint8_t key); */ void build_window(uint8_t y, uint8_t x, uint8_t h, uint8_t w); +/** + * @brief Print the border around the clock + * + * @param y y-position + * @param x x-position + */ +void print_clock_border(uint8_t y, uint8_t x); + +/** + * @brief Print clock + * + * @param y y-position on screen + * @param x x-position on screen + */ +void print_clock(const char* s, uint8_t y, uint8_t x); + #endif // _PUZZLE_H \ No newline at end of file diff --git a/src/run.sh b/src/run.sh index 1f80982..e81499c 100644 --- a/src/run.sh +++ b/src/run.sh @@ -2,4 +2,4 @@ # # This BASH file is made for MINGW64 BASH # -../../emulator-win/x16emu.exe -c02 -prg KAKURO.PRG -run -debug -capture -dump RB +../../emulator-win/x16emu.exe -c02 -prg KAKURO.PRG -run -scale 2 -debug -capture diff --git a/src/tile.c b/src/tile.c index 9f65a89..18d3ddc 100644 --- a/src/tile.c +++ b/src/tile.c @@ -105,7 +105,7 @@ void build_clue_tile_right(uint16_t vrampos, uint8_t value) { // reset pointer and copy to VRAM - ptr_des = (uint8_t*)(0xA000 + 8 * 4 * 10 + 256); + ptr_des = (uint8_t*)(BANKED_RAM + 8 * 4 * 10 + 256); map_base_addr = TILEBASE_CUSTOM + 256 * vrampos; VERA.address = map_base_addr; VERA.address_hi = map_base_addr >> 16; @@ -164,7 +164,7 @@ void build_clue_tile_down(uint16_t vrampos, uint8_t value) { } // reset pointer and copy to VRAM - ptr_des = (uint8_t*)(0xA000 + 8 * 4 * 10 + 256); + ptr_des = (uint8_t*)(BANKED_RAM + 8 * 4 * 10 + 256); map_base_addr = TILEBASE_CUSTOM + 256 * vrampos; VERA.address = map_base_addr; VERA.address_hi = map_base_addr >> 16; diff --git a/src/video.c b/src/video.c index 0d07a5e..6761d2d 100644 --- a/src/video.c +++ b/src/video.c @@ -70,10 +70,10 @@ void set_tilebase_layer0(uint16_t addr) { * @brief Load the tiles from file into video memory * */ -void load_tiles(const char* filename, uint16_t addr) { +void load_tiles(const char* filename, uint32_t addr) { cbm_k_setnam(filename); cbm_k_setlfs(0, 8, 2); - cbm_k_load(2, addr); + cbm_k_load(2 + (addr >> 16), addr); } /** @@ -284,4 +284,21 @@ void restore_screen_state() { asm("lda 0"); asm("sta 0"); +} + +/** + * @brief Set the mouse pointer + * + * @param tile_id which tile to use + */ +void set_mouse_pointer(uint8_t tile_id) { + unsigned long sprite_addr = 0x1FC00; + uint32_t graph_addr = TILEBASE_MENU + (tile_id << 8); + + VERA.address = sprite_addr; + VERA.address_hi = sprite_addr >> 16; + VERA.address_hi |= 0b10000; + + VERA.data0 = graph_addr >> 5; + VERA.data0 = (graph_addr >> 13) | (1 << 7); } \ No newline at end of file diff --git a/src/video.h b/src/video.h index 0527896..be44c9b 100644 --- a/src/video.h +++ b/src/video.h @@ -38,7 +38,7 @@ void init_screen(); * @brief Load the tiles from file into memory * */ -void load_tiles(const char* filename, uint16_t addr); +void load_tiles(const char* filename, uint32_t addr); /** * @brief Set the tilebase offset for layer0 @@ -119,4 +119,11 @@ void save_screen_state(); */ void restore_screen_state(); +/** + * @brief Set the mouse pointer + * + * @param tile_id which tile to use + */ +void set_mouse_pointer(uint8_t tile_id); + #endif // _VIDEO_H \ No newline at end of file