From 65f1349ce23be836118400528ceb1ab97f17c9e6 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sat, 19 Mar 2022 10:57:07 +0100 Subject: [PATCH] Update sample documentation in readme --- README.md | 102 ++++++++++++++++++++++++++++++-- samples/games/breakout.png | Bin 0 -> 4522 bytes samples/games/connectfour.png | Bin 0 -> 4071 bytes samples/games/hscrollshmup.png | Bin 0 -> 4744 bytes samples/games/lander.png | Bin 0 -> 1851 bytes samples/games/maze3d.png | Bin 0 -> 1326 bytes samples/games/missile.png | Bin 0 -> 1922 bytes samples/scrolling/bigfont.png | Bin 0 -> 1098 bytes samples/sprites/creditroll.png | Bin 0 -> 3851 bytes samples/sprites/multiplexer.png | Bin 0 -> 3775 bytes 10 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 samples/games/breakout.png create mode 100644 samples/games/connectfour.png create mode 100644 samples/games/hscrollshmup.png create mode 100644 samples/games/lander.png create mode 100644 samples/games/maze3d.png create mode 100644 samples/games/missile.png create mode 100644 samples/scrolling/bigfont.png create mode 100644 samples/sprites/creditroll.png create mode 100644 samples/sprites/multiplexer.png diff --git a/README.md b/README.md index 9c51172..7772484 100644 --- a/README.md +++ b/README.md @@ -472,22 +472,112 @@ Draws a scrolling line of text at the bottom of the screen. Draws a scrolling line of text at the bottom of the screen, using an interrupt to update the text. -#### movingbars.c +#### Chasing bars "movingbars.c" Changing the background and border color at varying vertical positions giving the impression of two chasing colored bars. -#### openborders.c +#### Freedom for sprites "openborders.c" -Open the vertical screen borders by switching the vertical size bit at the appropriate raster lines. +Open the vertical screen borders by switching the vertical size bit at the appropriate raster lines. The opened area is available for sprites only. -### scrolling -### sprites +### Expand the screen "scrolling" -### games +Scrolling is an important component of many games and editors, it extends the limited real estate of the screen to provide a small view to a larger world or document. Pixel accurate scrolling is an important feature of the C64's VIC chip. +#### Large scrolling text "bigfont.c" + +![Large text](samples/scrolling/bigfont.png) + +Expands a text to gigantic size, each pixel covering 2x2 character cells and scrolling from right to left. + +#### Fly through tunnel "tunnel.c" + +Scroll a dynamic generated tunnel with variable speed. + +#### Scroll text and color "colorram.c" + +Scrolls the screen text buffer and color buffer horizontally at the same time with one pixel per frame and no double buffering, relying on exact raster timing. + + +#### X/Y colored tile scrolling "cgrid8way.c" + +Expands coloured 4x4 character tiles and scrolls vertically and horizontally at two pixel per frame without double buffering. + +#### Free full speed tile expansion "grid2d.c" + +Expands a 2D 4x4 tile grid at any scroll speed. Uses a raster IRQ to limit the scrolled area. + + +### Moving image blocks "sprites" + +Sprites are independed image blocks, such as players, missiles or enemies that can be shown on top of the background. + +#### Control a sprite with a joy stick "joycontrol.c" + +Combines reading the joystick with the library and sprite movement with the library. + +#### Use raster IRQ to show 16 sprites "multiplexer.c" + +![Large text](samples/sprites/multiplexer.png) + +Shows 16 virtual sprites multiplexed from the phyiscal eight sprites with raster interrupts, using the oscar sprite multiplexer library. + + +#### Fill the screen with sprites "creditroll.c" + +![Many sprites](samples/sprites/creditroll.png) + +Uses sprite multiplexing and dynamic character to sprite copying to create a vertical scrolling text on top of any image or potentially moving background. + +### What you came for "games" + +The C64 games define much of the 8 bit area and oscar64 is intended as a of a proof that one can write great 8 bit games using C. + + +#### Don't bite your end "snake.c" + +One of the least complex computer game and more iconic for the smartphone area. Does not need sprites, scrolling or custom graphics. + +#### The eagle has landed "lander.c" + +![Landing the eagle](samples/games/lander.png) + +Controlling a sprite using floating point physics and checking for collision with the background. + +#### No way out "maze3d.c" + +![Move through the maze](samples/games/maze3d.png) + +A double buffered 3D maze rendering using intermediate positions for forward movement, and simulated rotation using scrolling. + +#### This one has balls "breakout.c" + +![Breakout](samples/games/breakout.png) + +Simplified ball physics using fixed point math. More complex collision checks with the blocks to determine the edge and thus reflection. + +#### Too smart for me "connectfour.c" + +![Connect Four](samples/games/connectfour.png) + +Simple turn based strategy game using tree search with alpha-beta pruning and an opening library to determine the computer moves. + +#### Defend your city "missile.c" + +![Defend your city](samples/games/missile.png) + +Classic computer game using the multicolor hires mode for circles and lines. The user sprite is controlled in an interrupt routine to cover up the multi frame variable rendering. + +#### Fast scroller "hscrollshmup.c" + +![Scroll and Shoot](samples/games/hscrollshmup.png) + +Fast horizontal scrolling shoot 'em up. The scroll code expands a 4x4 tile grid of chars in less than a frame time, so the scroll speed is "unlimited". A parallax level of stars in the background is implemented using an adapted star character. + +The shots usd dynamic created characters to overlay on the background. diff --git a/samples/games/breakout.png b/samples/games/breakout.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb2c59e24ea2ccf3f0992f0aea314c80350095c GIT binary patch literal 4522 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 literal 0 HcmV?d00001 diff --git a/samples/games/connectfour.png b/samples/games/connectfour.png new file mode 100644 index 0000000000000000000000000000000000000000..daab7e0e5bbe53eced227ac94c73787ecd7e46fc GIT binary patch literal 4071 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 literal 0 HcmV?d00001 diff --git a/samples/games/hscrollshmup.png b/samples/games/hscrollshmup.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8ea68a5f6b1df4418f49559529ce31abfb759e GIT binary patch literal 4744 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 literal 0 HcmV?d00001 diff --git a/samples/games/lander.png b/samples/games/lander.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1a8a8c36acccc1a15817c9670ae4fad86559bd GIT binary patch literal 1851 zcma)-drXsO6vof@A+%PxMVP3VVsV0y2x@LoEZKi2@0*;Q=Q-#6&PjU6 zMsw0a5&)P7Z3_Gn0KotdE20?y)D~Ty03e`2f$O#>KbQC2i|=LFVPZjf^>E*h=7An{ z!b?4;vGjG-4&Ri?%Ucy@-+Xm$FXH^9TQjiVdmrX+iCs%$dhf%~gO(pk!Gh(Q@rZ;wBl?M2 z9xtDV3lv`fIAfkikg`uI-4rOyy+cjvWw*&40n(ce035%GPE&*JD)x1X<-brn^+_rp z2nDu4D+(t7-Pv`zbh{02S&ackV`xKU9X0Vf3L>*`0z{ck*TSsomb_yXqjuFWJD|DcneoJO#gGp_Dlt zoelb!MiLgxpGZ(@8EBL#?Pvt&7W)luiezO`zt`>Sw`;{ia_lm!rod`* znlySh%cx^5{5^&*?Hw!-1~#gjRSBlF`x}k&%i5tEL-#Osw6$AFdKoI}DQlu#E8VPn zvu`+(*VbFjl}cW8Hf$4)wyux9_Eh?c@tCVvzFjKInaDS`?f~OqqikTX!Kf?QVL_1R z8LP7KL_deDZ6IRog8mwplP8;Le=#TR726<5dM7coC)xpG_q0p1#Z7$p9hW~)KG|hrDDCpX6tkM{1u9la zQtt2(SM>t%)~HpzS~BZ7Awptf)f09|yXS-@1Hw$#=m@TGYR&s<6=4zu{S`6%`eW2_ zdj{gi8Bu8012`X*0e^qTlnqBTO%@XARfl zt#uZSYFmI)qOGE%BY7;G8`6IOZdXEkdfjnU?e-g!L@cDEe=S90a(j>o3XP(0g1h5T zF@hwU2xrsZ%c^Cn@%O5;o+a2nNad9^Sj}C_yDb24=Tw-~EMZOD7D#ZlH8?-$5*E$% zkra%p7wKfORT`OdE{Zy5PHk5Pzn;}HbT^LtvH^e&(S-}%dY_2x>{ToEb7+hS4$`h2 zy)Z6Rc%>a=k%)hD(SbE|cikj|WU$6vVvYiH-p{xa*Ly83!GQGn)bgh{+xt2I%&iz( z*>zP=BiO6x5SyUxzgi^UizqlWp;RhgX##xu*&%C2d5S1$+7jYc3ZOpW;8M#qJCQRZwDmXM(rSS##Di_MKywuzj(qM91 zF}JfmF0FYhauK~0K5XVSFFIevHjuBQ%vtC4)=gcmSdkyO44{QSWyDA0ud)`y{L#En z^~8OqU*xA0!T{*S-Z|Koc4eyVl*TEnyStt>a^PQRoBIE70siw6%zPhacy$2Cd`&<` V*vZbvT;c!#g4TxwR`^F9{Syro$Rq#& literal 0 HcmV?d00001 diff --git a/samples/games/maze3d.png b/samples/games/maze3d.png new file mode 100644 index 0000000000000000000000000000000000000000..20e914e69601f0529ee4d1aa5490745d1aa61496 GIT binary patch literal 1326 zcmb`CT}V@59LAsb?B(pF4v&Ftnz&OKK_9lf6O^6FWUj)GNI@yKo1l=)Aagun$v2NA z_Ils4C!eexv$<(^cXWzV4e8eWuN8ZS5^-YY0#rZ-C_v&G*ILhR&t24gT%6g7l!3bZ zyuqq_I<)3!HGt>>k{W99?sRlu;rPfYPi9|#$rkmE!EF+4C`w`qq!kjF@;{VSIXFKT z@#JMZZyD}Ng?u)Uc18y6nP`F{iDn9$MN=U8dh`TM$pS<(Wm|W@{QS^0-ZecJ842X% zXc7*-Dp}g->v2HIl0-9Mt;)$m?@OEO>L~=2-8#DML51E6byy3e5DKBsMP*2tjVUS= zPoxlpO@xhv!WWmJl|*c&?9SQ67Y$ui)s<~e_x2jFzI&YlMfkJkKKPejZxLW7!4 zVqv}fZ=FKpn^vtW2$|Kj_&l)s&%Y@W6X};zmpH~7<8y8B%6IbZ@xlg-0#_ZK<$zs{ uLle51_KRavcs40Q0VF^GLtNuu*K6C19gX+enB34BqFN#aVg4jxfp&GOe#i#@YL4o86SjDPw z=@b-Yky^AZ3e+gJU;sAOXRxSpM(1t76lzRXW!A8K0bwkuaqjTK+2?OHI`qEz_N`Jz%m zJJS$(A4Vk<*xZc|NJ>;`uZBO`mnQSSHRavhS~ zg?dbvHkgID_U5*8_~rA1Y&eXJ&^0R!cJ|o8phe0)zgxQcN@@A>VSV53UE$vkD(OI* zmTtL{aYIt@q}sKq0>{Vw3dSb*o1;V$u6L(X3kzfSbctVI2mQvKE;j!}HmL%g|r& zgV=nWPFccigt_!PVJ(7%-AK^&U)N8Wq?w!iF?W^h4}IO_+;}TKSq(7z=lE9Mv=gLU{ z754`AvDX0mnu)m4OMp2XtT=EphX}O@h~1M`yqZb#hFE<3>!_}#c7xslk~SF=V6TTM zg)#bo_;xdv*{pUUNsZGw1w{$A%cU{LeoG&^Q>Dn-{8&1)aKXuCfYlOwg0gb0^aVW( zM!=9i0fDN@=AJpV99;+j6 z=wTX4Ss?E9fi#=xbv)fEp$`hlX)bPyI2*@$hzM?bMRdR)?<%Goyl>JF*|A2~K9E;! z6a}hUNqGSun+1~(tGu(fb)3$pO_Ri{rMiqD!qN_RXU%u zK)|~f;{{kzkZP-C+eOi3LghK-r4e6uc1g~KK^C85VzgmV8Fz=B>PDk^EYeY5G0Zs*c5=Iph1WtG30#OLhel646^ePulkb@NDAd zHSQ@L>X?H9x1&ZI85r*XSn4*yGC}vFq<=_2{M|OPan|^OBn zzNIf#^UYpqdur>BYr%ofHCn$T;t$IMx(5RCO!!Sx5ch$yjIknRpL6DI&b-s}A2zks zNS}_Rjp@n*E{$V2OAP$g!~Tlv*6I`UejQ+5d!*rQA`e&Y+{-XnDQ}M4Nzktvd@s>6 z4tg9TehO*fpAE}9C2;F(AKNoexH(grI#w4#qDHUyY*$vmspW%0{Ve6pk(31e8vAS@ z$A@Mzj!VM4wpa)Dbk=xQcnBLAh8n5%)MlrAi6C7T=%!Yud*|H_8ad+V#4yy%Rm+9d zB7?_;BU6+ITA01+vg+X8t=7j>o$`^X=)m?HB*jwFUP&|*S)y1j`bN)q&TMVPkXH%% lhQ;2V2>;z$e``1TH3J-s_uJiar9Kn@fVJG;_tH{s;$K1Z$aw$& literal 0 HcmV?d00001 diff --git a/samples/scrolling/bigfont.png b/samples/scrolling/bigfont.png new file mode 100644 index 0000000000000000000000000000000000000000..0208bdeb760d9dfe5db0a3f2c8e2296cf78c145f GIT binary patch literal 1098 zcmeAS@N?(olHy`uVBq!ia0y~yU~FJuU=-kBV_;y|xp46x1_l;EPZ!6Kid%2*8tSnG zN*wr@U%)m!;0@!Bwxs4`j4mhByd6Vkl`;#42fR0v676--zG%_dleGJ)q|y88&%b38 z%J-S;|9q}$JX1~S7DGb8H64%*3JeS!3=B*R|tQj#auV3@xJHx$Y?Sd13TRwQo^XJ}%`OMqv_pm=; z!Sw2y45dZ7Umw}+)3g46?Ab5RUy^6?>pnl9bDxuefsw(1fkA+Qfd$I^!R}hm|KQ;l zyT44=4Vr(R&975ONW#=DkZ|44{^7^JDRqt6GZuFLU7dLT{`bH3RvZ2oGC|ElnA>p5 zMDXIYs>1WvFQ41Lv9xAdUE7(@{IU1H*S~mE4>KHQvI7IdihzsvnRitF_1S;G^o+y3 z-}bZ5-eH*obtIBw7wEa}XE%`Qy`*2jYy9BfV=NvQS=`yN?MnCT?b|nAezP?0L1p#r z*Z)Yd^_s{X2Q)-`7}7UjtIgV1Xra wz$u*Ului}x3do5cDIXBeM9HQOvilfaL*kBeeK4NQz`(%Z>FVdQ&MBb@08_B*!2kdN literal 0 HcmV?d00001 diff --git a/samples/sprites/creditroll.png b/samples/sprites/creditroll.png new file mode 100644 index 0000000000000000000000000000000000000000..40df4e6857cea4fce3787641502ad7b24344f5d2 GIT binary patch literal 3851 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%0Ae_5@9y&$O_Bom z<9IIWgE9_K_hIQUGk5+`D~<`89xrEWne`752S zwZc6Pa6N2$Nd)f$MiIjr5EHofCJV8cOv}>CvW-Bp~`2Eo?}0d@g{fg?M0MJ5PoX0PRGWw|S@%i3(`gNBytCjXJL-m)!ep_u;_rz_1 zo30oXs9i_bUM+i{72H|_5;q}8!Mlh;3{&d{bVzT&iZO;9)cC*ILsVxoO_l#Ud782t zkZ_|C2B38+iuF6$@zX}qIX`Z6*n5^gTz`$i9CTS!14?22%N#ucUD|i`e-wE=7sE>* zTSx%q*B>!Wr&f4Ht4VEhWm*%6fTk9Nx{%k5ep#g+)41vomV5$0f@?{u<*e8hAnHr- zq*y%93yA~C8<7H|oqDS?PUq+I@-`)<6La4R%FcY$s~n(+@Qxk0h{%E?5zSNR_Cg$o*GPmOExH&BKP+7 zZI-sLMS}T}@1uL(L=k-R1J^`MUu}WF#Hf;z8a`q#YwD0~E zS>ca@0|9%sL>`7{Ipb3k8#)Y-DcU%F2sEq%~a@-7V?%U+@Ku{&_ z9g3cvhzHcD!q%Pe^61))s`J;$7RjVC_N$?z`sx7JRfH)46@LyiuU3da&~mGM|mWK1R}n{ zfaz*Ai9{g5di)K9zQ*i1mum^1ZJe=K-pf&Jh#S95H zuOGt}%^z))b1^bhMlyMq>)VkCySFCbcFJDHS&yIj2x6gHOiKJiG(gnDWRSDQmGrkX z^sh12Uo1x5unJD@4;^dKV9(#<*nfy^{|oYPpcV!YV9GD8`v}|Lh;^E IB~#=72{hG&)c^nh literal 0 HcmV?d00001