tag:blogger.com,1999:blog-85296847588358081252024-03-05T20:22:08.620+01:00The Bitbox ConsoleThe DIY single Chip console.
This is a blog about its conceptionmakapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.comBlogger60125tag:blogger.com,1999:blog-8529684758835808125.post-71857591552737591332017-10-02T18:06:00.003+02:002017-10-03T09:59:18.600+02:00Sprite blitting and Compression for Bitbox <br />
Here are how and why the future sprite format is defined for bitbox sprites.<br />
<br />
Here are the sprite format properties, why they are needed and what impacts it had on the format<br />
<br />
<ul>
<li>binary based format</li>
</ul>
Since all of our data is generally compiled we could express the image as C code. This would be easier than to serialize a binary file and deserialize when loading from flash memory. However, we don't do that, in order to allow sprite data to be put to SD card, or be compressed in flash and the uncompressed to RAM. <br />
<br />
<ul>
<li>line-based blitting</li>
</ul>
As the bitbox is issuing pixels line by line, objects in the bitbox blitter are defined by two methods : what to do each frame and what to do each line (on top of misc values as x,y position, height of blits ...). Thus it will be much better to think of sprites as RUNs of pixels instead of small squares by example.<br />
<br />
<ul>
<li>no transparent color</li>
</ul>
Setting encoding of transparent pixels is not really the way to go for software blitters, because you'll need to check for that color for every pixel. Generally, on a give image the blanks go on strides (borders, by example) and then it's opaque strides. So it's better to encode a RUN of transparent pixels (which you just skip) and then a RUN of pixels you will blit.<br />
<br />
<ul>
<li>run-length encoding and packbits algorithm</li>
</ul>
<br />
Coding same color ranges into one (color, number of pixels) pair is named RLE. It's the first useful compression one can use, it's fast and straightforward. It's also good for bitbox, since it's coherent with line-based blitting. It's also very fast because you just have one read and N writes for 2*N pixels if you're blitting 16bpp. <br />
<br />
We can also group single pixels, since you generally have many similar pixels then a bunch of single pixels. In that case you can avoid transmitting (1,color) (1,color2) (1,color3). <br />
<br />
<ul>
<li>back references</li>
</ul>
<br />
Another way to improve compression for "free" (on decompression side) is to avoid coding twice the same run of pixels. If you can retrieve a past group of pixels already encoded, it's not very expensive to blit from this address instead of the current address. Of course, this is only interesting if you're going to encode less than the size you'd need for encoding the address itself. This is in fact how deflate, gzip and other LZ77 encoders work; but with a modification : in lz77 you can reference the past blit (ie data already extracted). Here we're blitting sprites but once a line has been written, another object can have written over it for the next line, so you can't reference past blitted lines. You have to reference the source data, worsening a bit you ratio. You could reference the same line but generally the interesting parts - non handled by RLE- are in previous lines.<br />
<br />
<ul>
<li>explicit EOL encoding</li>
</ul>
Adding a bit for explicit end of line uses a bit that could be used for length encoding, but it allows avoiding a byte or more to add the blank space. This is generally a net gain, because blits are generally smaller than 32 (sprites) or more than 64 (large background images)<br />
<br />
<ul>
<li>extensible size encoding.</li>
</ul>
Sometimes, and in the majority of sprites by example, you have to encode blits with no more than 32 pixels wide, so having more than 5 bits by example would be wasteful.<br />
But then you have to cut large blits into smaller ones, which can be slower to blit and decode the header, and bigger at the same time.<br />
What's used here is a variable length encoding similar to LZ4 :you use 5 bits for the base and then if the len you want to encode is more than that, you add a byte of data (and another while you don't have to).<br />
<br />
By example,<br />
15 is encoded as 15,<br />
<br />
30 as 30,<br />
<br />
200 as 31 + another byte with 200-31 = 169 <br />
31 as 31 + another zero byte yes it's a useless zero byte but that's rare.<br />
<br />
<br />
All of this leads to a 'blits' encoding, where we store blits with a header and some data. <br />
Header is :<br />
<span style="font-family: "courier new" , "courier" , monospace;"> 2 bits for the type of blit, </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 1 bit for end of line</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 5 bits for length </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> + N bytes extra for length as needed</span><br />
<br />
Data is : <br />
<span style="font-family: "courier new" , "courier" , monospace;"> blit "Skip" : nothing </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> blit "Fill" : color to blit with </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> blit "data" : "length" pixels encoding</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> blit "back reference" : 2 bytes as back reference in bytes since the current bytes. This sliding window allows for more than 64k resources</span><br />
<br />
For encoding pixels, you can of course use raw u16 pixels which are quite big.<br />
<ul>
<li>pixel palette can be slow but dense, but there is a better way.</li>
</ul>
<br />
In order to reduce the storage of individual pixels, you can use less colors and thus less bits per pixel. using 256 colors you can reduce your storage by two comarped to raw 15bpp, when using 16 colors you can reduce by four(but this will have an impact on what you can provide). A global 8bpp encoding is available for either the bitbox micro or the a global 8bpp palette reduction.<br />
<br />
Pixel palette is not a panacea however, since it needs much longer to blit. While we can memcpy (setting aside alignment operations) one word at a time (i.e. one u32 word read and one write per couple of pixels), now need one read for 4 u8 pixels, but four reads (one of each palette lookup), adding to the contention of memory buses. What can be done is making a table for multiple pixels lookup but for 256 colors you'd need 65536 entries. Better to limit that number. <br />
<br />
What's interesting is that generally you don't use the whole number of different couples for a given set of colors. Not every couple is used, and it's generally much better to limit oneself to 256 couples than 16 individual colors. And in that case, we have 8 pixels for 32 bits of data + one read + one write for 2 pixels, which is very close to the raw pixel encoding speed. <br />
<br />
Couples also adds the possibility to allow run-length encoding of dithered patterns which in pixel art and limited color can be useful.<br />
<br />
To encode such a picture, I made a small encoder which can extract common couples like you do with the same algorithms for color quantization, except it's now couples quantization.<br />
<br />
Frame encoding : <br />
<ul>
<li>multi-frame format & skiplist </li>
</ul>
<br />
Our format should be used to encode not a single image, but multiple frames animations. <br />
First, it's generally simpler to manage one file per animation than one file per image. <br />
Then you generally produce the content that way.<br />
And then an animation generally contains many slightly different frames but not entirely different frames and colors, so you gain in not having to repeat the palette and the blits. <br />
<br />
We do this by specifying a frame size and putting all the frames vertically. <br />
<br />
What you need is then an index of each frame start since each frame is not the same size, in order to be able to skip directly to this and not having to unroll the whole sprite from frame zero. So we add a table with skip frame indices. We use a simple u32 list to allow big files, and direct access - we could use a delta encoded u16 since no frame is larger than 64k generally but the next paragraph will explain why - it's not very heavy generally.<br />
<ul>
<li>frame deduplication</li>
</ul>
Often, an animation can repeat the same frames. for example, you can have an A-B-C-B-A-B... type animation (ping pong) which can be a looping ABCB animation. Why repeat the frame B when you just have to replace the fourth entry of the frame lookup table by the same pointer as the second ? Therefore the encoder can detect similar frames.<br />
Also, your frame step can be the same length and you can repeat a want a frame to be longer.<br />
That means that frames are no longer unique or the frame index monotonous and cannot be delta-encoded efficiently. <br />
<br />
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com2tag:blogger.com,1999:blog-8529684758835808125.post-62917556144639145292017-06-15T16:40:00.003+02:002017-06-15T16:40:43.140+02:00An editor for 0xFF0xFF is a simple game engine using a 256x256 pixels image as the only source for a whole game.<br />
While you can make a whole game with gimp, the player also integrates an editor (under construction, but usable)<br />
<br />
Here is a small video of me demoing it to make a tiny game. The editor runs on the bitbox, using a mouse or a gamepad.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/pvNeoGg61k8/0.jpg" src="https://www.youtube.com/embed/pvNeoGg61k8?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-24559176196057845582017-05-12T01:03:00.001+02:002017-05-12T01:03:13.522+02:00Small video : soldering of the MCU of a bitbox<div class="separator" style="clear: both; text-align: center;">
<br /><iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/WF_zuHHmUSY/0.jpg" src="https://www.youtube.com/embed/WF_zuHHmUSY?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
While I was soldering some bitboxes I thought some may be interested to
see how they are done. Nothing too special - I certainly don't pretend
to be good at it , there are way better videos. Footage is sped up 4x (No sound)makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-68822023181111921132016-12-03T09:58:00.002+01:002016-12-03T09:58:25.952+01:00Bdash updatedBoulder Dash was one of the first games to arrive on the Bitbox, but wasn't really advanced enough. I took some time and it's now getting some attention. A new release has been done, with some new features:<br />
<br />
<ul>
<li>using chiptracker and not sound samples (reducing the game size greatly) ! The original soundtrack was provided nicely by Pulkomandy</li>
<li>levels ! at last there are more than one level ! now the 1st boulder dash games are available, from a levels.h file describing levels with const strings.</li>
<li>butterflies / fireflies : those deadly enemies are now available to kill you. Implementing those were a little tricky since the game was purely tile based (i.e. the whole game state was an array with tile indices) , and the animals need a direction state, I now have a "sprite in tiles" system.</li>
<li>last level restart : up to now you had basically one life. (which was very annoying). Now, you restart at the last level you started on. Which means you have basically infinite lives. </li>
<li>many small fixes </li>
</ul>
<br />
<br />
WIP (non available but shall be available some time)<br />
<br />
<ul>
<li>proper lives </li>
<li>title screens with a little text. This will need a smaller tilemap which will share the tileset and vram of the existing one.</li>
<li>cool transition effects</li>
<li>amoeba & magic wall ! </li>
<li>score / highscore</li>
</ul>
See it here : https://github.com/makapuf/bitbox-bdash makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com1tag:blogger.com,1999:blog-8529684758835808125.post-32236837213051013942016-11-01T20:04:00.001+01:002016-11-02T16:56:07.283+01:00New Game : Mario Watch ! Hi ! It's been a long time since real content has been put on this blog.<br />
<br />
Now is a good time to fix that, by announcing a new game on the bitbox !<br />
<br />
Being a kid while the game & watch lcd games were all the rage, I like to reimplement them.<br />
This one is a nice one because it has mario ! Released in 1983, this little will be playable o the bitbox and the micro. A few missing features (sound & scores by example) for now, but the gameplay is starting to take shape !<br />
<br />
stay tuned for next updates, you can still begin to play it now !<br />
<br />
Game is hosted at : <a href="https://github.com/makapuf/bitbox-mariowatch">https://github.com/makapuf/bitbox-mariowatch</a><br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/makapuf/bitbox-mariowatch/raw/master/screenshot.png?raw=true" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="https://github.com/makapuf/bitbox-mariowatch/raw/master/screenshot.png?raw=true" width="320" /></a></div>
<br />
<br />
makapufmakapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-91249475931929755072016-05-31T18:32:00.002+02:002016-06-01T18:45:18.217+02:00Ideas of games to writeSome of us are looking for game ideas to code (just before they've way too many projects ongoing :) )<br />
<br />
Of course, you can contribute to one of the WIP projects on the bitbox wiki page (<a href="https://github.com/makapuf/bitbox/wiki/Software-Index">https://github.com/makapuf/bitbox/wiki/Software-Index</a>) - frankly, many of those games need attention and could use some polish.<br />
<br />
But hat if you can to create a simple project in a weekend (of course it will run on the bitbox, where else ?), here are some ideas of simple games to try !<br />
<br />
<a href="http://www.asahi-net.or.jp/~cs8k-cyu/blog/2014/12/12/games-in-2014/">http://www.asahi-net.or.jp/~cs8k-cyu/blog/2014/12/12/games-in-2014/</a><br />
<br />
<br />
Examples :<br />
<ul>
<li><strike>bomberman</strike> </li>
<li><strike>snake</strike> <a href="https://github.com/lowagner/bitbox-snake">https://github.com/lowagner/bitbox-snake</a></li>
<li>tron (which is a multiplayer snake)</li>
<li>blackjack </li>
<li>bejeweled</li>
<li>connect four</li>
<li>flood it</li>
<li>katamari damaci (!)</li>
<li>tetris</li>
<li>memory</li>
<li>grid lock</li>
<li>missile command</li>
<li>arkanoid</li>
<li>scortched earth</li>
<li>dr mario</li>
<li>diner dash</li>
<li><strike>doodle jump</strike>(jumper :) <a href="https://github.com/makapuf/bitbox-jump">https://github.com/makapuf/bitbox-jump</a> )</li>
<li>2048 !</li>
<li>...</li>
</ul>
<br />
<b>And here is someone who coded 50 games last year ! Can you do better ? (I don't :) )</b><br />
<a href="http://www.asahi-net.or.jp/~cs8k-cyu/blog/2014/12/12/games-in-2014/">http://www.asahi-net.or.jp/~cs8k-cyu/blog/2014/12/12/games-in-2014/</a><b> </b>makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com6tag:blogger.com,1999:blog-8529684758835808125.post-5835005005137173012016-04-21T23:59:00.001+02:002016-04-21T23:59:20.314+02:00Micromo : a Thomson MO5 emulator !<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
Hi all, I made a port of the dcmo5 emulator for the bitbox micro.</div>
<div class="" style="clear: both; text-align: left;">
</div>
<div class="" style="clear: both; text-align: left;">
The MO5 was a famous (in France, completely unknown everywhere else) computer, not so bad after all, and on par with a Spectrum. </div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
Its specs : </div>
<ul>
<li>320x200 fixed palette 16-colors (16k RAM) with 2 colors by row of 8 pixels</li>
<li>CPU : a motorola 6809E @ 1MHz</li>
<li>48kB of RAM / 16kB of ROM</li>
</ul>
<div class="" style="clear: both; text-align: left;">
This first version can run Basic, load programs from cassette (embedded on the binary), use a keyboard. It can play some games and runs on Bitbox (should run on micro also). It's a first release, missing selecting cassettes from the (existing) menu, gamepad support or sound.</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
The repo is here : <a href="https://github.com/makapuf/bitbox-micromo">https://github.com/makapuf/bitbox-micromo</a> </div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
Thanks a lot to Pulkomandy who is a real MO5 programmer - lots of cool stuff about those micros and democoding on these old clunkers on his site: <a href="http://pulkomandy.tk/projects/thomson/wiki">http://pulkomandy.tk/projects/thomson/wiki</a> </div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://raw.githubusercontent.com/makapuf/bitbox-micromo/master/screen.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://raw.githubusercontent.com/makapuf/bitbox-micromo/master/screen.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">shinra demo</td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://raw.githubusercontent.com/makapuf/bitbox-micromo/master/screen2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://raw.githubusercontent.com/makapuf/bitbox-micromo/master/screen2.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">my (much better) demo. </td></tr>
</tbody></table>
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-43347226886386561882016-03-06T18:18:00.000+01:002016-03-06T23:24:44.768+01:00Answer to preceding post ... ByteBeatAs you may have tried yourself, the tiny binaries produced by the preceding code create long tunes directly coded by a function of time !<br />
<br />
So you basically have s=f(t) where s is the output sample, t the sample id and f a simple expression as the one I put on the title.<br />
<br />
The thing is you can actually build quite complex song with it ! <br />
<br />
This technique has been called <b>bytebeat</b> and the main article describing it was made by someone named "viznut".<br />
<br />
See the original article here <a href="http://countercomplex.blogspot.fr/2011/10/algorithmic-symphonies-from-one-line-of.html">http://countercomplex.blogspot.fr/2011/10/algorithmic-symphonies-from-one-line-of.html</a> or here <a href="http://canonical.org/~kragen/bytebeat/">http://canonical.org/~kragen/bytebeat/</a><br />
<br />
<br />
<a name='more'></a><br /><br />
and and example with trippy visualizations :<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/tCRPUv8V22o/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/tCRPUv8V22o?feature=player_embedded" width="320"></iframe></div>
<br />
<br />
I surely will include one or two of them in a test audio program on the sdk ..
In the meantime here is the code :
<script src="https://gist.github.com/makapuf/8d290bffa39ae0f2f13a.js"></script>makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com8tag:blogger.com,1999:blog-8529684758835808125.post-78448539638306245092016-02-28T00:36:00.001+01:002016-02-28T17:31:04.490+01:00u=t*((t>>13)&31&t>>9)-((t>>7)&23&t>>3)What is this ?? Well it's a very interesting thing I found on the web the other day.<br />
<br />
If you have a bitbox please download and run <a href="http://s000.tinyupload.com/download.php?file_id=20609703827957610540&t=2060970382795761054072278" target="_blank">this small (3.1kB) program</a> - it needs sound, not display. (I'll provide the code - which is really not much more than what is in the title .. and some background info soon).<br />
<br />
Controls : plug in sound output, also try to press the bitbox button. I really like the 8th one ..<br />
<br />
(edit) for those with a linux computer, <a href="http://s000.tinyupload.com/index.php?file_id=17998128568327846881" target="_blank">here is a sdl backend compilation</a> of the same code ... ans a big hint <br />
makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-32353876665399020022016-02-24T15:05:00.000+01:002016-02-24T15:06:31.978+01:00new game : Dragon's Lair !<br />
<article class="markdown-body entry-content" itemprop="text">
Ah .. such a nice game to play on the Bitbox ! (see Angry Video Game Nerd or Joueur du Grenier reviews ;) ... )<br />
<br />
The game is open source and the release is here : <a href="https://github.com/makapuf/bitbox-fmv" target="_blank">https://github.com/makapuf/bitbox-fmv </a><br />
<br />
For more info about the game see : <a href="http://www.dragons-lair-project.com/games/pages/dl.asp">http://www.dragons-lair-project.com/games/pages/dl.asp</a><br />
for Bitbox itself see main repo / wiki : <a href="https://github.com/makapuf/bitbox/">https://github.com/makapuf/bitbox/</a><br />
<br />
<br />
<br />
<a href="https://github.com/makapuf/bitbox-fmv/blob/master/dlair.jpeg?raw=true" target="_blank"><img alt="dragons lair!" src="https://github.com/makapuf/bitbox-fmv/raw/master/dlair.jpeg?raw=true" style="max-width: 100%;" /> </a><br />
<br />
<br />
This game / engine is aimed at reproducing the dragons lair game on
the Bitbox. It's only compatible with the standard bitbox since the data
is streamed from SD card.<br />
<br />
<br />
<a name='more'></a><br />
<h2>
Play it</h2>
The game should be playable almost like the original game, however
only the video file has been used, not the program or the
Put the frames.ani animation on your SD card and load the fmv.bin file,
then press the buttons just when needed .. or you'll die (often)<br />
</article><br />
<h2>
Authoring levels </h2>
<br />
<article class="markdown-body entry-content" itemprop="text">Levels are typically build using blender, by inserting markers on the timeline and coding game logic as python.<br />
Blender animation takes the video and encodes it to the neede framerate, resolution.
Render audio to mixdown.wav
and frames as is
Blender script post_render.py then exports a makefile which needs to be run, then run<br />
<br />
<pre><code>make -j4 -f frames/Makefile
# .. wait "a bit" while video gets encoded
run final script ```build_final.py ``` from blender to pack everything to frames.ani</code></pre>
<pre><code> </code></pre>
The original data used for this has been saved from : <a href="https://www.youtube.com/watch?v=znO_m00s8II">https://www.youtube.com/watch?v=znO_m00s8II</a> (save it locally to dragons_lair_arcade_game_laserdisc.mp4)<br />
<br /><h2>
Frame binary format / player logic</h2>
Most of the logic is encoded in the export script, the player executes each frame data and is actually quite simple.<br />
Each frame is coded independently - allowing jump to any frame - , and gets encoded as :<br />
<pre><code>- u32 event_id, frame_id
- u32 width, height
- palette of 256 u16
- btc frame as 1 u32 for each 4x4 block (ie size=w*h/4) -- see blog entry for btc4
- u8 sound[1066]
- padding up to next 512B
</code></pre>
event_id is button_A, up,down,leftright, nothing(no action), or always.
frame_id is the number of the frame in case the event has been found to be true this frame. If not, continue to next frame.<br />
<br />
that's it !<br />
</article>makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-2980292900222236542016-02-09T17:14:00.002+01:002016-02-09T17:14:43.518+01:00Back from FOSDEMI got back from the FOSDEM a week and but didn't have the time to write about : here are some small notes about it.<br />
<br />
<br />
<a name='more'></a><br />
<br />
FOSDEM was quite again a formidable event with alsmost 600 presentations !<br />
<br />
I've shown the bitbox and the bitbox micro (which I need to blog about a little) to a great audience and was able after that to demonstrate a few games, such as alter ego and ... <b>dragon's lair </b>! (yes, I ported this horrendeous game on the bitbox :) -see screenshots on the presentation text itself, in fact the code is the FMV project on github, to which I shall add the binaries and the blender file / scripts that generated it.<br />
<br />
There were also a few reports on twitter / blogs about it, and more importantly I was able to talk about it later to some real people who are interested about the project ! <br />
<br />
Makery also did a article about the game track@fosdem (in french) : <a href="http://www.makery.info/2016/02/05/a-bruxelles-le-fosdem-joue-le-jeu-open-source-en-communaute/">http://www.makery.info/2016/02/05/a-bruxelles-le-fosdem-joue-le-jeu-open-source-en-communaute/</a><br />
<br />
Apart from that, many great talks about FPGAs, EDA and kicad, a game that people draw ( a kind of real-life single picture platformer project). how to design APIs for the linux kernel, great waffles and beer :), ability to test oculus rift and Arduboy and its online IDE (neat on the browser coding+flashing experience) and very interesting talk with people from the Embedded Linux world.<br />
<br />
You'll find the slides of the presentation <a href="https://drive.google.com/file/d/0B0jmHqk4wXSaVlBETmlKTlFfZFE/view?usp=sharing" target="_blank">here</a>, and this has given me a great boost and new ideas to work on bitbox projects (as if we were missing some)<br />
<br />
Happy hacking and on to next year @fosdem, at which we thought about the idea of making a fosgame event (code a game in 24hours ?)<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com3tag:blogger.com,1999:blog-8529684758835808125.post-43863444914851939082016-01-26T13:23:00.002+01:002016-01-26T13:23:38.661+01:00Meet you @ FOSDEM 16 ! Just a quick note to say that I'll be presenting the Bitbox and what was done this year at fosdem this weekend (thanks to all contributors past year !) <a href="https://fosdem.org/2016/schedule/event/bitbox/" target="_blank">Link to the presentation</a>makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-3196945431396865242016-01-20T00:35:00.001+01:002016-02-24T15:06:40.938+01:00New game : Alter EgoHi all !<br />
<br />
A new game has been published ! It's a port from the Alter Ego NES game (with reused graphics but the code is entirely new). It runs on the <b>bitbox micro</b> as well as the <b>bitbox</b> (as every micro game).<br />
<br />
<br />
<span style="background-color: white;"></span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://github.com/makapuf/bitbox-alterego/raw/master/screencast.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://github.com/makapuf/bitbox-alterego/raw/master/screencast.gif" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">have a look at its gamepl<span style="background-color: white;">ay </span></td></tr>
</tbody></table>
<span style="background-color: yellow;"><br /></span>
<br />
<ul>
<li>The original (non-opensource) game is featured here :<cite class="_Rm"> <a href="http://www.retrosouls.net/?page_id=614">www.retrosouls.net/?page_id=614</a></cite></li>
<li>The page for the opensource NES port, upon which this project art is based, can be found here : <a href="http://shiru.untergrund.net/software.shtml#nes">http://shiru.untergrund.net/software.shtml#nes</a></li>
<li>Of course the game is opensource :<a href="https://github.com/makapuf/bitbox-alterego" target="_blank"> https://github.com/makapuf/bitbox-alterego</a></li>
</ul>
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/OLNn7vlYZLc/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/OLNn7vlYZLc?feature=player_embedded" width="320"></iframe> </div>
<br />
<br />
<br />
<div style="text-align: center;">
<span style="background-color: white;">A longer is also available on youtube</span> </div>
(The game has currently no sound but that shall be improved upon soon !)<br />
<br />
<br />
<br />
<a name='more'></a><br />
To port it, the steps have been the following :<br />
<ul>
<li>Make a script to export the PNG tileset from the palette files and the character data to a png</li>
<li>Make a script to export the tilemaps of every levels</li>
<li>Export sprites from the tilemap and integrate them as separate animations on the tiled tmx files</li>
<li>Build a new project from exports of those data, create a simple tmx export makefile </li>
</ul>
and then start writing code in more or less that order :<br />
<br />
<ul>
<li>displaying tilemaps / tilesets in a VRAM, setup main objects</li>
<li>making a small intro steps</li>
<li>load the initial positions of monsters from the in a tilemap with specific tiles from the TMX file</li>
<li>mak the skulls move and animate sprites</li>
<li>define character movement and interaction with tilemap</li>
<li>define sprite collisions </li>
</ul>
Total port time is difficult to estimate since I worked on the export scripts, looked at the original source code, then this project has been dormant for a long time then I decided to write the code in about a week end but without adapting the first one - not that it's not a good one, but I was feeling like re-doing it since it's quite optimized for the NES.<br />
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-39904853251619850332016-01-04T11:26:00.000+01:002016-01-04T11:34:38.697+01:00Happy new yearHi ! I wish you an happy new year, which will be hopefully a nice year for bitbox again.<br />
<br />
I will be presenting past year at fosdem 2016 (again) and 2016 will hopefully be the year we issue many great new games.<br />
<br />
<br />
Development hasn't stopped, however !<br />
<a name='more'></a>because on the contrary it was quite busy last months reorganizing the library and allowing the kernel and build system to adapt itself to a new target : the bitbox micro ! There is also a big patch waiting for inclusion with 15kHz modes for outputting signals to a Scart / Peritel RGB TV output !<br />
See here : <a href="https://github.com/makapuf/bitbox/wiki/15KHz-Video-generation" target="_blank">https://github.com/makapuf/bitbox/wiki/15KHz-Video-generation</a><br />
<br />
<br />
As this is a wild new reorganization, we branched the development of a semi-stable branch named <b>v0.8.</b> You can develop games using this branch before we release the new, better streamlined branch.<br />
<br />
<br />
<br />
The bitbox micro has been detailed in its own wiki page, feel free to give a look at it ! The idea is to have a smaller sister to the bitbox (which will roughly stay the same in the future, maybe modulo some small hardware updates, nothing too complex). It's a smaller platform, almost half a bitbox on ever count, including price. See more on : <a href="https://github.com/makapuf/bitbox/wiki/Bitbox-Micro">https://github.com/makapuf/bitbox/wiki/Bitbox-Micro</a><br />
<br />
<br />
<br />
Several games are still ongoing but most of the work now is on the kernel (more on the mailing list as usual) makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-54193203673424911742015-11-25T12:13:00.002+01:002015-11-25T12:13:48.894+01:00A bitbox Laptop !Pulkomandy, a known hacker of the bitbox mailing list, has been busy recently and created a <b>laptop with his Bitbox</b> !<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://pulkomandy.tk/images/bitboxlaptop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQv27tcoSNPnCCqdGJV86mFxRMix3qg0t6H_tlOAIQrEdb8C4Fm5htujuYKanYwNCaX4v0KaZsmJSr0uU8O6aSt-ytTe1gvUaPc7zOfEv5hFc2oGivWu-z0QcD7uu1fd9ZQQgmdv8dxDTa/s1600/bitbox_laptop.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQv27tcoSNPnCCqdGJV86mFxRMix3qg0t6H_tlOAIQrEdb8C4Fm5htujuYKanYwNCaX4v0KaZsmJSr0uU8O6aSt-ytTe1gvUaPc7zOfEv5hFc2oGivWu-z0QcD7uu1fd9ZQQgmdv8dxDTa/s1600/bitbox_laptop.jpg" /></a></div>
<br />
Some people have done this with their raspi, but this one is way cooler ;)<br />
This is really a neat hack which will give me neat ideas for my santa list this year :)<br />
<br />
You can read more about his build (and more cool articles) and discuss about it on his blog: <a href="http://pulkomandy.tk/_/_Hacks%20and%20stuff/_Bitbox%20laptop">http://pulkomandy.tk/_/_Hacks%20and%20stuff/_Bitbox%20laptop</a><br />
<br />
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-60137037299144298422015-09-03T13:33:00.000+02:002015-09-03T13:35:34.779+02:003D is coming ...Hi !<br />
Not one, but TWO programs that are dealing with 3D have been published !<br />
<br />
<a name='more'></a><br />
<ul>
</ul>
<h3>
<b>BBgunner</b> </h3>
<br />
BBgunner, by Lucas O. Wagner (who also created bbmatrix and an avid developer on bitbox) , is an opensource, two player, split screen, 3Dcombat game where you chase each other - and try to kill your opponent : the first 3D game on bitbox and also the first two player game ! Now get your engines started and kill this enemy - amicably of course. <br />
<ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/lowagner/lowagner.github.io/raw/master/i/bbgunner.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://github.com/lowagner/lowagner.github.io/raw/master/i/bbgunner.png" width="320" /></a><a href="https://raw.githubusercontent.com/makapuf/bitbox-bitcaster/master/screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div>
The game source is hosted <a href="https://github.com/lowagner/bitbox-bbgunner" target="_blank">on github</a></ul>
<ul><br />
</ul>
<h3>
<b>Bitcaster</b></h3>
<br />
Bitcaster, also available <a href="https://github.com/makapuf/bitbox-bitcaster" target="_blank">on github</a>, is a demo of raycasting algorithm, tailored for the bitbox. For now it's just a demo, not a game, you just wander in a maze of colored walls. Note that this 3D is filled faces / no textures. The next step would be to make a game out of it. The obvious idea being wolfentbit 3D but maybe you have another gameplay idea ?<br />
<ul>
</ul>
<div style="text-align: center;">
<a href="https://raw.githubusercontent.com/makapuf/bitbox-bitcaster/master/screenshot.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://raw.githubusercontent.com/makapuf/bitbox-bitcaster/master/screenshot.png" width="320" /></a></div>
<ul><br />
</ul>
makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-7449940479494774672015-06-19T07:00:00.000+02:002016-02-24T15:06:52.108+01:00New game : rapid ball !Hi, you may be remembering rapid ball on old nokia phones, here is a simple version for the Bitbox ! You just guide a ball falling platform to platform (not the spiky ones) get new lives and avoid touching ceiling or floor ! What score will you do ?<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/makapuf/bitbox-rapidball/blob/master/screen.png?raw=true" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="https://github.com/makapuf/bitbox-rapidball/blob/master/screen.png?raw=true" width="200" /></a></div>
<br />
makapufmakapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com2tag:blogger.com,1999:blog-8529684758835808125.post-43663292001535946662015-06-11T21:48:00.000+02:002015-06-12T07:54:31.762+02:00Developing Memory MatrixHello, my name is Lucas (not makapuf) and I wanted to walk you through my experience developing a game for the bitbox console.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4ApThw6LDFGMjgxrfNkoZY7fpI0oiVPSK7S0LteeHgldmsWdtSaJf1TO7EJL59YlGsWcqfVm70jF5VTY3B6IaJxY6961W1NtTKFGbIbWqbohOjMqJ2JgO1FniatS4I4-sRmb3pi2lVUU/s1600/mmat.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4ApThw6LDFGMjgxrfNkoZY7fpI0oiVPSK7S0LteeHgldmsWdtSaJf1TO7EJL59YlGsWcqfVm70jF5VTY3B6IaJxY6961W1NtTKFGbIbWqbohOjMqJ2JgO1FniatS4I4-sRmb3pi2lVUU/s400/mmat.gif" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Intro screen. Prepare to memorize!</td></tr>
</tbody></table>
<br />
Let's get started!<br />
<a name='more'></a><br />
I learned about the bitbox on Tindie, and got in touch with makapuf via e-mail. After checking out the SDK, downloading and testing a few games (the emulated versions), I liked just how easy it was to get started with development (on linux). I am delighted by the bitbox's open-source nature, and I liked the idea of making retro games (without cartridges, with modern code). So I set about making a game. To be honest, I wanted to make sure that the bitbox was capable of playing the games I would create, before I got one :D.<br />
<br />
I wanted to code something simple, because it's good to start small. I had a pyglet version of Memory Matrix lying around, and realized this game would work very well with a tile-based engine. (In turn, I think I originally got the game idea from Lumosity's Memory Matrix, but mine is better since it has color ;).) I used <a href="https://github.com/makapuf/bitbox-polar">bitbox-polar</a> as a starting point, because that's a perfect simple example of a tile-engine for the bitbox, with an extra sprite that moves around. Perfect, that's exactly what we need to make a game about moving colored squares around!
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj63QBG7xB5qlYXXJMRzHkkYeEBXwA8tFEF3Gk6XZhPG6OW8gFhOmNMylqBhn68Q0onFdUWTv5ECGMbKSKzh-zxjsBsmLyhbcqGM5VfcriDvfvK7JxtFQZKq8wIUDAzVpFkwBjpjSOhjGE/s1600/FirstMemorize.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj63QBG7xB5qlYXXJMRzHkkYeEBXwA8tFEF3Gk6XZhPG6OW8gFhOmNMylqBhn68Q0onFdUWTv5ECGMbKSKzh-zxjsBsmLyhbcqGM5VfcriDvfvK7JxtFQZKq8wIUDAzVpFkwBjpjSOhjGE/s400/FirstMemorize.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Simple layout you have to memorize.</td></tr>
</tbody></table>
<br />
There's simplicity in developing for the bitbox. A lot of the hard work is done for you in makapuf's bitbox SDK. This means you can focus on the code of your game, as well as the art style. C is an interesting language (I'm more used to C++, and I'm told you can also code in C++ with the SDK), but the imperative programming style makes it easy to see what is going on. In a simple game, you have a few state variables (usually global), which allow you to control what happens in each game frame. I also made my own sprites/tiles and "music" for the game, using Gimp (with a wacom pad) and bitbox-chiptracker (from pulkomandy, but I modified it a bit for my own purposes). I did just a simple song, because I wanted to finish the game quickly, though I hope to make more music for the bitbox in the future. (I like writing electronic stuff, and if you like that genre, shameless plug: <a href="http://ible.bandcamp.com/">http://ible.bandcamp.com/</a>.)<br />
<br />
As for the code: In each frame, the bitbox checks whether it needs to jumble the blocks or create a new set of blocks for the next level. These things are done in advance, hidden in a variable next_blocks, because it is important to randomize these things and make sure the difficulty is hard enough (but not too hard), based on your current score. Each frame the code might jumble the current set of blocks, check the jumble, create a new set of blocks, or check the new set of blocks. (Separating these out was an effort to avoid the bitbox hanging in some evil loop of bad jumbling.) It took a little coordination to get this working. At one point, the player was actually getting the score of the next board, which could be significantly higher than the current.
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSlnKnz__KA0BGhwR1vsP05ndXR-4d3OeW3ZIqV2MFc0EQisqhyMDHf5Z1eUcnLtsJkNuauAbxt9h747U-WfbBZNXhnYR-X-wqqFI0eBhtOa-I5322Q2zZ-OObzIpyx-qq-hRYFw6-dLc/s1600/FirstJumble.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSlnKnz__KA0BGhwR1vsP05ndXR-4d3OeW3ZIqV2MFc0EQisqhyMDHf5Z1eUcnLtsJkNuauAbxt9h747U-WfbBZNXhnYR-X-wqqFI0eBhtOa-I5322Q2zZ-OObzIpyx-qq-hRYFw6-dLc/s400/FirstJumble.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">To jumble a matrix, the code makes sure to make a different one than you start with.</td></tr>
</tbody></table>
<br />
Deciding the score of the layout is quite important, since it's easy to grasp patterns with our minds, even if the board has lots of tiles. You start with a base score, based (roughly) on the number of possible boards with those colors, but then subtract points if the code spots patterns (like lots of colors next to each other). You also need to deal with an edge case: for a layout where each square has the same color, the base score is zero, because it is dumb to play the game with that layout.
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCRY8SX7GHU3-r0ftGCgYGd16dbifcayPpWrVuGziXQD4XTCHO9xQB3O1jAfVQ7NfAgIKrTi5B8bDLYPZEfqao-WSMr2PqO-qhRPzCOYJaGOS1GPeFI8NnoQsXHfsXDinnzFjtGxdFmME/s1600/LatertMemorize.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCRY8SX7GHU3-r0ftGCgYGd16dbifcayPpWrVuGziXQD4XTCHO9xQB3O1jAfVQ7NfAgIKrTi5B8bDLYPZEfqao-WSMr2PqO-qhRPzCOYJaGOS1GPeFI8NnoQsXHfsXDinnzFjtGxdFmME/s400/LatertMemorize.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Things are getting tough.</td></tr>
</tbody></table>
<br />
For more detail on the specific base score equation: Say you have N total blocks and C[i] blocks with color i (i=0 to 3, so that sum_i C[i] = N); the specific layout has been chosen randomly. You can find the edge case if C[i] = N for any i. In my original pyglet implementation, I used something like this to determine a rough idea of the total number of possible boards (factorials, yay!):<br />
N! / (C[0]! * C[1]! * C[2]! * C[3]!)<br />
(I don't think that's exact, but I'm not a combinatorics major...). I wanted to simplify this for the bitbox, because I didn't want to have to deal with factorials. I decided on this:<br />
product_i [ C[i] * (N - C[i]) if (C[i] > 0) otherwise 1 ]<br />
This also has the nice feature of giving zero if any C[i] = N. The max base score you can get has C[i] = N/4 for all i and N = 4*8 is the largest matrix in the code: in other words, 1358954496. That might not be as big as what the pyglet base score would be (99561092450391000), but it still motivates using 64 bit integers to store scores!<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizGsnnXiOOCfYLJYDMCnZZOZKNX8Q2AT5HWRM6bJrE23dvN3_EGbEowZPdr3plSZrJemGzlujdfHqay6FlM7h_5CDwIXuhlVT14x0OXZuVDx7XZWIx49kxCIqVeO7zrBUS-xu9UwVC_RY/s1600/SuperMemorize.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizGsnnXiOOCfYLJYDMCnZZOZKNX8Q2AT5HWRM6bJrE23dvN3_EGbEowZPdr3plSZrJemGzlujdfHqay6FlM7h_5CDwIXuhlVT14x0OXZuVDx7XZWIx49kxCIqVeO7zrBUS-xu9UwVC_RY/s400/SuperMemorize.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The largest matrix, with all possible colors... pure evil. What just 20 seconds to memorize?!</td></tr>
</tbody></table>
<br />
Well, there are some other code details, like keeping track of what's the max possible incorrect you can get wrong, in order to make sure the blocks are jumbled enough -- though again my equation might be just a heuristic and not completely sound mathematically... (Oh, but it is a hint for how to memorize boards a bit easier.) Feel free to ask questions on the bitbox google mailing list (<a href="https://groups.google.com/forum/#!forum/bitbox-console">https://groups.google.com/forum/#!forum/bitbox-console</a>) or raise issues on the github if you encounter errors/bugs in the game (<a href="https://github.com/lowagner/bitbox-mmat">https://github.com/lowagner/bitbox-mmat</a>).<br />
<br />
As for the future, I am thinking of adding some more sounds to the game, in case of losing or winning a level, but besides that I don't have any many other plans. The code could give you a better score for beating a level in a shorter time, but I didn't want the focus to be on time, but on careful precision. I do want to double check my "subtract points" algorithm, to make sure that a board that is half one color and half the other isn't that high of a score ;). Who knows, maybe the whole scoring system will become completely reworked. But at any rate, my eyes are looking to the next game...<br />
<br />
So, after I did my developing, makapuf helped with some logistics (testing it on a real bitbox, advising good button press/unpress logic in the code). I think the story has a good ending, because soon I will be the happy owner of a bitbox console. Thanks makapuf for all your hard work!
<br />
<br />
<b>TL;DR: </b>
I really enjoyed developing a game for the bitbox; its openness, excellent examples, and simplicity makes it easy to be efficient and finish projects.iblehttp://www.blogger.com/profile/03765298376437658114noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-63046477561243907752015-05-13T10:15:00.003+02:002015-05-21T14:24:05.592+02:00ZX Spectrum emulator !<h2>
BitboZx </h2>
Hi, here is the first release of the BitBoxZx, a 48k ZX <span style="color: red;">Sp</span><span style="color: orange;">ec</span><span style="color: lime;">tr</span><span style="color: blue;">um</span> emulator !<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ijqDnNizZn1-rLV2jipG__Xb-bsmsUsop0FRNvBpxFu5mSgyZVFNBfHDO59ViehErNJD52nRBZ_NrIw-3psElSMpN6zzpfz121SEl5Abhi83LQ5_NmPnb1vxyCLdYEgZw5arMlVaBUQB/s1600/title.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ijqDnNizZn1-rLV2jipG__Xb-bsmsUsop0FRNvBpxFu5mSgyZVFNBfHDO59ViehErNJD52nRBZ_NrIw-3psElSMpN6zzpfz121SEl5Abhi83LQ5_NmPnb1vxyCLdYEgZw5arMlVaBUQB/s1600/title.png" /></a></div>
<br />
<a name='more'></a><br />
<br />
Made of a few hundreds of C lines and inspired by the work of "UD" ( <a href="http://mikrocontroller.bplaced.net/wordpress/?page_id=3424">http://mikrocontroller.bplaced.net/wordpress/?page_id=3424</a> ) heavily modified to fit the Bitbox, itself based on Marat Fayzullin Z80 emulator. ZX80 file Loading routines from UB.<br />
<br />
The emulator is running from a USB keyboard. BASIC programs as well as several games are included.<br />
<br />
<h3>
Modifications : </h3>
<br />
<ul>
<li>STM32f429 -> stm32f405 (no DMA2D)</li>
<li>No LCD screen -> bitbox VGA out. This has been replaced by a direct rendering scanline function.</li>
<li>using bitbox USB (keyboard & joystick) & uSD drivers (future loading)</li>
<li>Integration to Bitbox conventions, build process</li>
<li>Externalization of roms as z80 files </li>
<li>Future extensions (almost ready) : sound , gamepad, SD game loading</li>
</ul>
<br />
<a href="https://github.com/makapuf/bitbox-spectrum" target="_blank">Source code + binaries are available on github, of course</a><br />
<br />
shortly as well as a demo movie I hope.makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com5tag:blogger.com,1999:blog-8529684758835808125.post-56663859176133422422015-02-21T20:03:00.001+01:002015-02-21T20:03:14.201+01:00New game : Polar ! Polar is a small game written in ~ half a day.<br />
<br />
<span style="font-size: large;"><a href="https://github.com/makapuf/bitbox-polar" target="_blank">Here is the link to the github project</a></span><br />
<br />
Here are some screenshots - a very simple game indeed, <200 lines of C and a few sprites.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="data:;base64,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" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" border="0" height="240" src="data:;base64,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" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="data:;base64,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" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" border="0" src="data:;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAADwCAYAAABxLb1rAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wIVEjYKRND/4gAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAABitSURBVHja7d19kBz1fefxd3fP9MzOw85qV6sVkkAPSAo2Z0FssAMcOMYJTuXhrq5yVfdUhDv7LsX5XByyz7kDY1yWfQmJK6Yc6oivCnLFmbJIGZwCY4PjBBthKwabk6wgY570uFq0D9qdndmd3Xno/t0fs7toH2Z7JO14W9OfV9UWtXy3n36/33y7fz1fdVtXXXWtAbCILtuxcWwHLKiUK1jWO61hjMFNuGDe+XvP9/A9v6nlRSR8Zj/OsUKhGumGcF2XrVs28qGbb6KrK8c99/wxmUx6Lj4xMckXv3g3ExOT9eTneTz33A85evQ4lUolcHkRCS9ry5arTZQb4OTAMLXyq9TG8sTWXEoqtZG+vnVz8cHBYUqlfoqFQr3BLMhkO3Hd9WzceEng8iIS4tlf1Btg86Z1dK69jj9+8ImZKe/8uIcDDJK13yZrv03G6gfAcZymlheR8IpFvQF837C+O0U6GV8yvm3zJVz9/o/y4ZtvIOY4jBcm+OoDX2h6eRFRAgwtYwyuG8dx6hfDrhvHdeOUZ77MeOutY1QqP4axQ4Azc4l3Bh+nqeVFRAkwtCYnS3zm7ju54oodgOGTu29n/fp13PPZ+8hk0nNT3dvv/Qa5zgwAHakUXZ0dTS0vIuEV+S9B3h4aZXpyH4yMg+NApQJ93STTN3HJum4GBkcpl34Mg6fr34AArFszFw9aXkSUAEPLti0GRiax7Xemq75v2LA2je+bC46LiBKgiEj4LoDUBCKiBCgiogQoIqIEKCKiBCgiogQoIqIEKCKiBCgiogQoIqIEKCKiBCgiogQoIqIEKCKiBCgiEgK/lCdCO45DrVZr+Ih4x7GxbWfud8ti3iPlZx8373k+xhgSCRfP8/Bm3s0bvPzy2w/e//r6F673XJdf7vjOjvv+O8d2PvGg9Z8dn23Ps1/mtJLrbya+nNXYv7PX/8vYvrRxAnTdOO95z5U899w+crnOJeNbt27m5ptvnHv8fCaTnnu/ruPYXH31LgAOHjzE+HiRP/qjO3j++R/x8ssHcRxn2eWDth+8/y5bt2zi5ptvInce7/1d6vhyuU4+/vFPs2HDehIJd168/t7hF2beO1xdtHxQPGj9C9tncrLEXf/jDiYmSmBZ1KoVvv/9H3L0WP/Me4/jge17IfEgk5Ml7rrrzgXvZV7++C9k/xauv9Xbl9XV8geinjr1NpXKaVKpTfT19TaMTxQLc2fZbGfn3N/H43Fuu+1fA/DII4/R33+KUukUf/ZnD/DQQ1/j2LETyy4ftP0gzb73t36lkKBcLs87s88d38QExvcBw3S5ypNPPsOXvvQAR4/O33/LtslkMnPvHV7YPg3jTa5/YfvUH+n/AtUxmHJ76Zw4DH07iSXezaUbeudtH8vB+DWynblF7RvU/o3iQQYHhyiVTlEsjAPWsu0TtH/N7P/C9Z/L9oOOf6ntS5vfA5w965kGL8ydOyta/fV375pTwNsz7+N9Z4oxOw2eXc3s70HLB20/SLPv/Z2cLHHvPbuZnCwtfXwUyXonydaOkUhlGB+vf2Dm7/9pMs7kvOWajje1/vq7jWEEz9Tbb+P6HjrX/jZ/8uA36Ux3YK3/DTpy17J5Uz3JW7EE8DaZ6lHsRJps7diS7RvU/o22HzwFnkkq9qkljz9o/85t/xevP2j7c8tXj9bb3zt5TtuXCNwDbMbtd+0lk0nx8suHeOknB9l0Sc/cOzWM7zNemCCRcM9r+QvR7Ht/i6Uy/+7W3+Fjt//3Jac2e77y19z/lYfJD5/EmPyS+9+9JsdNN1zDb32kDzDnFG9m/bNvtUtlsnNvtVt4fMlkmvXdqbm223RJDx25X2e6MIgxeayeD5Ls7FvUvkHt32j75zI+utfkuOmfXstv3dI39/+D9u9c9r+7p5ubrn/vzPpNU9ufm0r1fJBU1/q5Nj3X7UubJ0DXjROPxxveBP7q5/8l1OAvH/EZHjjOxEQJy7KwMHRZee66bw8/eP5HDe+bNFq+2e0vdxO+mff+XrZxHZbVx44dV1Kt1hatpzOdYENvJ365a+n9/8w/AzsOxnDw2w/R1dN7TvFG66+/v/gMX/38v6ofuKlB91X86Rf+J6lUKvD4ZhPk6Up6yQQZ1P5B229W/fhd/ETPkieoRvvX9P7f/dsUMrtI+2Mcevb/0NWzrqntz7V/Zxd9vZ2Lxlez25e2TYD1jv7k7tvnkleqcw33fubzZDKZufjtn3ucXC5LOtHBJ/7Lx/jsvX9KJpOmXK3x6S89zgev3siP/+G77L7zLozvnTUXXX754O0H34Rv5r2/x4+dwJgSCbePDRs3LDr+9713F+Zj/5ZCoQh+Dd+Oz4tbl9xCqqsPC8imXBJx+5zijda/Jpvkc3/yBNMTecAwXpjgqw9cNdd8F/5e4+XbP2j7Td+svuQWuno3sfuOj3LvPbtXfHxaG67HmGM8/exx/uqhfXQknJl7qkHbXzy+Mpm03gutBFjX1dPLz77zMJ/9w9/AjsUwNY+fvPgS8WR6XvzBu/45dmxmd9at4c7/todMJo0FrO10ue7Wv+BHj8b580//PtbIKyRqY/Wrw4Dlg7YfpFgq85/+8EP19/6O/ZzP/eePQF83//VTn583wHM9vfzvz/xHcguuzLp6ejn47Ye48Zr3ceMVN9QTtz/As4/9FZ5Xo6unl6GffhPHTbOuq2PJ9guKL7d+O5Hid67wuPYDH8aKOTMnjrfxrdg5HV/978tzyy3s30btH7T9wFsQM9t1OzpZ15WkOzYBnFy0fKP9a2b/h376TdzkJizrvRhzgCMvb+bwoVeo+H7g9heOr9njb7b9ZHW1/FtgYwzlqk+xVMHAvCuY2Tq0s+Oz05aF79U9++8AUskYqWR9Srjc8kHbD/yWqMn3/hogEXcoVz2sZY4f6vWMl/V1Uq15GGOYKntkU3G8JaZFzcSD1r9c+zR7fLZtcXJogkvXZRr2SzPt32j9y7X/7HY931CarlIsVZvev2b2f7Z9DTAwMkk2FSeVjGM1sf1mjy9o/6RNE6CISFjpn8KJiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiIgSoIiIEqCIiBKgiERcrNUbsGwb27KWjBlj6n+juOIRjPvGYHxfWahdE6ATi9HT28P2K3Zi2fMvNn3PY3BwhFKhwLadlyuueOTiA6dOc/LIEXxPSXC1WFu2XG1atfLxsTwPPfUYb7z4Eyxn/gBIJFM88+iD3Lbnfk4cOKC44pGL7//2Xl44OEDCjSkTteMVoG3bVKtVSkODOPH4vFgt7hLvSFOr1RRXPJLxWCJJg9mxtMs9QCwLY8zc/ZC5+yNn3ftQXPEox2X16FtgEVECFBHRFHiFGd9fegow8/tsTHHFoxiXNk6AnudRLo4zXhxbVAtl2w5xx6GUH2UsP4Jt2dgWgIVnfCzbwbEsSvlRRvMjSy6veHjith2DmVIP43vYlqXjty2mC/mG4z/huigPrq6WlsG4rktfXze/dsO1ODFnfnKs1fj5L45z9NWfk83EuTLXzfXdvcRsh2f73+SY7zBRnKJWKbO2J7doABkD48Upqoqvbrw8TXc2S/fmd7PmXTdhxWxG/uF75IuvU5ioUqtUInv8pWlDZ66TD1x/zZLj/5XDR3jj1deo1TxlonZMgONjeR7+1mO88dJPsOz5AyCR7GD/03v5mx+/wXO/+x+wjz/P4eF+4o5DNp5k2DPcnTd02mDRqFZgdtcVX5W4MZTHR7jxK39P8shGpo/0g23hZLJMT/Tz4nd/HzfRQ+Naj/Y+/u/u/TBf+973lh3/+1QH2L5TYNu2qVSqTJ5eXAdVjbukOtJ88ldv4djPvkHccRmyklyXzTFcKtKB4daU4dvTFrXAeYLiqxG33SQ7b7sTsw/KiTNYqSQAfq2CE8uw86pPcez1r2P8SiSP/12/+mmqntVw/DuqA1x1rf8W+Kw6wHk/vs/xqSl2p0tYWGTxOFozbM2uYY0DjgWpmEvV102SsCoNHeFd134Ky44Td9cQT3bVfzq6sW2XdOZyvNpkZI8/la0ff6PxL21+BRiYfS0YKIySxPBy5w5uTp7hiZEzTGW3s2P0F7hoahDq+yeWQ2UQHKeD4amnsHBnrpcqdHETlh2jnS9xgo/fQZVmSoANecaQdmx8O8764Vd4smxzz5Yt/PT0YbJxl6enEnhUlQZDyhiPWBKMVaWzdO07yc4YYrk0g0eexPg1cGKRPP6hI09i/I9qoER5Cnx2HeDCn83JJF888iaTvk8mnmBXIsZwqUgslqDft6jVysR1kyS0Umu38Ytv3EetMoHdkcBOuthJF1yLqeIJpkv9OLF0ZI9/qtSP46Qajn9p8yvAoDpA4nEen3K4LgtpCy6NWZjpcQ7V4vxdJcaZ6hQxJcDQ8mvTvPHqg3Rf9mFibg6vViKZvoShY99h6OhTjBXfxHGSkT3+M/nXmS6Mqg4wzLcxVrMO8JXDR3j91dco1zy2OXBl3PBUxaWHGnnf6O7JxTERxPdrdHVdQW799Qy++ThOPElp+gyWZUf6+BOJZOD4Vx1gG18BDg8Ocd9Df9GwDurEoZcolcok3Bj9Hgx4FnGqFNGt44voHIptxykWj1KcOFG/51eejkjyW/74mxn/kzPjX9owAQbVAZ5dB+XP/NTPqXLRXQcZH4yv4z/P8S9tmADrJ0hLz0OTCF8ga/yHmWaaIqIEKCKiKfAKC3oeoEg70/iPcAIMqgNUHZS0M43/8Fv1OkDVQUm70viP+BWg6qAkyjT+I54AVQclUabxH/EEWJ9kqw5KIkzjP9wnKTWBiCgBiohoCryyVAclUabxH+EEqDooiTKN//BTHaCIxr+uAFtBdVASZRr/EU+AqoOSKNP4j3gCrE+yVQclEabxH+6TlJpARJQARUQ0BV5ZqoOSKNP4j3ACVB2URJnGf/ipDlBE419XgK2gOiiJMo3/iCdA1UFJlGn8RzwB1ifZqoOSCNP4D/dJSk0gIkqAIiKaAq8s1UFJlGn8RzgBBtZBJVywbBzHWXrwzAwSq8GdYsWjHfeNCfW9NNUBht+q1gG++toJRkfOsGX7Nix7/mzc9zwGB0coFQps23m54oovig+cOs3JI0fwvXAmQdUBRvwKMKgO6h+f/1s+sefLnDhwAMuxF8RTPPPog9yx537FFV8yvn9oL69PVUJbR6c6wIgnwKA6qFhHilqtRmlocbwWd4l3pBVXvGE8FvI6OtUBRjwBztzACayDUlzxC4mH+yaT6gDDTGUwIqIEKCKiKfAKC6qDmo0prvj5xMNOdYARToCe5zFVGGM0P7JkHZRjWZTyo4orvnTctpgu5C/aOjrVAYZfS+sAHccmZhl61+YWDQBjYLw4RbVSZm2P4oovjk9MVenMZfnA9ddclHV0qgOMeAIEZr7mb/Rd/+ymFVd8sfzoGA9/67GGdXT7n97LvoMDoa2jGx/LX9T7rynwStwDMWcPdAI+CIorfvY08eKuo1MdoBKgyAVPIVQHKC07SakJREQJUEREU2CR8LjY6+hUB6gEKHJeLvY6OtUBhl/Ly2BEztfFXkenOkBdAYqct4v9eXp6HqASoMh5Ux2gKAFKtKkOUFp5klITiIgSoIiIpsAi4aE6QFEClEhSHaC0muoAJbRUByi6ApTIUh2gKAFKZKkOUJQAJdpUByitPEmpCURECVBERFNgkfBQHaAoAUokqQ5QWk11gBJaqgMUXQFKZKkOUJQAJbJUByhKgBJtqgOUVp6k1AQiogQoIqIpsEh4qA5QlAAlklQHKK2mOkAJLdUBiq4AJbJUByhKgBJZqgMUJUCJNtUBSitPUmoCEVECFBHRFFgkPFQHKEqAEkmqA5RWUx2ghJbqAEVXgBJZqgMUJUCJLNUBihKgRJvqAKWVJyk1gYgoAYqIaAosEh6qAxQlQImktq8DTLhg2TiOs3TynDk4q8E3Je0e941p+b1S1QFKaLV7HeCrr51gdOQMW7Zvw7Ln343yPY/BwRFKhQLbdl4eyfjAqdOcPHIE32tdEtQVoIRWu9cB/uPzf8sn9nyZEwcOYDn2gniKZx59kDv23B/Z+P6hvbw+VWlp/yoBSmi1ex1grCNFrVajNLQ4Xou7xDvSkY7Hfgn9qwQo4RaBOkDFV69/VQYjItGdZagJRCSqNAWWUGv3OsDZmOKr079KgBJa7VAHOFUYYzQ/suT+O5ZFKT8a3bhtMV3Ir2r/qg5QQutirwN0HJuYZehdm1v0ATcGxotTVCtl1vZEMz4xVaUzl+UD11+zav2rBCihNT6W5+FvPdawjm7/03vZd3Ag1M/Tq3/uG9VyzH70ohnPj46tev9qCiyh1Q7P06tP4YKuMaIZD0P/KgFKuOl5eurfVp5k1QMiEtlZhppARKJKU2AJNT1PT/2rBCiRpPfqqn9VByiRpffqqn9b3b+6ApTQ0nt11b+t7l+NHAktvVdX/as6QIk21QGqf1uZhNUDIhLZq1A1gYhElabAEmqqA1T/KgFKJKkOUP2rOkCJLNUBqn9VByiRpTpA9a/qACWyVAeo/lUdoESb6gDVv61MwuoBEYnsVaiaQESiSlNgCTXVAap/lQAlklayTsy2LGzq7yfzjEF3EFvDsm3smb7yZ5LbL6N/z3t/VQcoYbUSdWIGQ61W5t3ZNVzfvZaYE+PZk29y3Dg4NH6ho5zjlZwxVCrTbN66jR27rsR2HA69sJ8z+XEsy17y21zVAYos40LrxAwwOl3iO795K/bxH3B4+DXitsPuriTDnuHuPOQicBfcGMP0dJFCsRtjangebN0ClcrKxDGG8bFRvvzIo5w5/gqjbx7FsmH7793CeKHI//3rJ0mlOla8f1eCvgSR0Dq7TmxqeHjez8Tp04F1YknHYffVv8nxQ9+gf2KcYbuDzblePAMpC/4gbYi1+SWgMYbBwQF+tO/rlCbHmSrZVMrQu8EiHrvwOICbSHDbx+/kjR9+l4nTw/g2TFen8DyPhOty43XX4jjOivevEqBE4KbSO3Vi836aqBM7PlVid7qEhUUWj6M1w9bsGtY44FiQirlU/fa+A5RIJHjggaeJ53+Np36vwmffX2D/C0V+eNcU/ZP2BccBhk8PcsOvvxfXiTE1OcG6XbtIZLKku3uIxWNcflk3U9OVFe9fJUCRZQe3xUBxlCSGlzt3cHPPWp4YOcOL2e3EfA+X9r/9bUyZ/OC/YUP+XfyLF9fy+HgXP/1//4vpynEc68LjUP/iI3/6dP2/o0PYU2XGR4ZI5nKAwRhr0Zcc4RkjIm3KN4a04+DbcdYPv8KTQ4N8ZE2OTSOHyToOT1cTtP9jFCw800lsh4U/nOcXrx/kgzc6QM/MF0AXGq9/25tMJsGySGdzjA8PMVkrMzE8hBtPMDBwBD+k/3JHCVDCfQVzVp3Ywp8glyWTfPGtN5n0fTLxBLsSMYZLRWKxBP2+Ra1WJt7m/5jY9+H7+4CtKYz5XYx5hkvfcysHX0qSiZkLjgOsXdfLE498nUqlQq6rh1Q6y6/s3MX0xATFYoFjp8bpSMZXvH9Xgr4FltAKrBNLuGDZS95gB6gaw99U4rw/bdHpwBYH7OoEh3H5u0qMMa+EY9s4DZLg7IfQuojjxsCpUxYf2lbhuo1/j239gGwsx31vddLleBhjXVDcnrmH9+LPDnPFr2zHTceZyo/RkUozODbM0WNvceLtcdx4jIXdZHxfdYAijQTVib362glGR86wZfs2LHv+ZMb3PAYHRygVCly643K2uzb/JG54quLSTY3RSpXhoTOUCgW27bx82eXbIR5zbGzrnY/6dMVnaGjl4pZl4RtDb083mzdt4OjR1zh5apTTA4Ns27kd21m8f8PDo1Qn8rz/uvetWh2gEqCE1vhYnoe/9VjDOrFnvvaX/MGeL3PiwAGsBR+wRDLFM48+yG177ufEgQM4jo0Nc/f83AXxoOUVby5uWfUvPNxEsqn++fdfuJ8TBw8s2b/7n97LvoMDeh6gRFPQ8+JiHSlqtRqlocXxWtwl3pFuGK8GxGuKX1C80mT/VKs1PQ9QpPEcJfh5cYq3d7ylJ1l9wkQksrMMNYGIRJWmwBJqQc+La1Q3pnh7xJUAJbI8z2OqMMZofmTJOjHHsijlRxVv03g8HlcdoESX49jELEPv2tyiD4gxMF6colops7ZH8XaMj45PMj1dxW9hFlQClFCrfy4a1ULMDl3F2zXe6itATYEl3PcAzdkfFAI+SIq3Z7x19C2wiESWEqCIKAGKiCgBiogoAYqIKAGKiCgBiogoAYqIKAGKiCgBiogoAYqIKAGKiCgBiogoAYqIKAGKiCgBiogoAYqIKAGKiCgBiogoAYqIKAGKiKys/w+yTdNrYWLcHQAAAABJRU5ErkJggg==" /></a></div>
<a href="data:;base64,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" imageanchor="1"><img alt="" border="0" src="data:;base64,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" /></a><br />
<br />
The game is still missing sound, music and more levels .. but the few levels are perfectly playable !<br />
<br />
This game has been inspired by <em>Polarity</em>, a game written for ludum dare 23 by nornagon (<br />
<a href="http://nornagon.net/games/polarity/">http://nornagon.net/games/polarity/</a>
<a href="https://github.com/nornagon/polarity">https://github.com/nornagon/polarity</a>. ) but the code and GFX are original.<br />
<br />
<br /><br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-29653481310839620592014-12-18T09:14:00.002+01:002014-12-18T09:15:29.509+01:00Recent commits : a month in bitboxHi all !<br />
<br />
Here are some news about the recent commits of the bitbox engines, kernels and other bits since last month. You can look at the <a href="https://github.com/makapuf/bitbox/commits/master" target="_blank">git history </a>to find them <br />
<br />
<a name='more'></a><br /><br />
- graph_frame and graph_lines names are used in API (to be able to disconnect graph_frame, which is hard realtime, and game_frame, which is not)<br />
-<a href="http://bitboxconsole.blogspot.com/2014/11/simple-modes.html" target="_blank"> simple modes</a> have been added : those are text and graphical modes based on framebuffers. <br />
- USB HID devices (gamepads) are now parsed so there is fewer need to include gamepads in kernel, some might often even work as is.<br />
- A simple sound mode with samples, and its accompanying small sample demo program .<br />
- A new dedicated app to test USB devices (by pulkomandy)<br />
- Emulator has better device input and can work with gamepads, keyboards<br />
- A <a href="https://github.com/pulkomandy/beamracer_btbx" target="_blank">beam racer outrunnesque game </a>has been started (by pulkomandy) ! <br />
- 320x200 and 400x300 kernel mode have been added which leave much more CPU time<br />
- sawteeh audio player has been introduced, but has been temporarily removed while working on implementation issues<br />
- a chiptune player has been added. Its engine will be merged into main library as a in parallel with the sampler sound engine.<br />
- color simple textmodes have been added <br />
- a Boulder Dash remake has been introduced<br />
- support for RLE encoded sprites in sprite engine (as well as a small change in API)<br />
- small improvements & bugfixes<br />
<br />
.. and that's it !<br />
<br />
Here is a screenshot from the new color textmode :<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/AyoPJeY.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/AyoPJeY.png" height="240" width="320" /></a></div>
<br />
<br />
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com5tag:blogger.com,1999:blog-8529684758835808125.post-6504783769074347022014-12-03T22:54:00.003+01:002015-02-20T14:29:17.243+01:00New Game : Boulder Dash cloneWhy, yes a clone of boulder dash was one of the simple games I wanted to implement.<br />
<br />
It's not completely finished (missing new sounds, levels, and ennemies), but the main elements are here in their 640x480 glory, inc. sound&music, basic gameplay, intro screen<br />
<br />
<a href="https://github.com/makapuf/bitbox-bdash" target="_blank">Here is the repository (including a binary release for eager testers :) </a><br />
<br />
Everything in the game is tile-based, and the whole game data is in fact just a uint8_t[] array of tile references, with its small finite state machine. The main and only .c file is 380 lines- not that I am so proud of it, it grew quite organically, but eh : now is better than never.<br />
<br />
Demo (click on it to see fullscreen)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/makapuf/bitbox-bdash/raw/master/web/bdash_demo.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://github.com/makapuf/bitbox-bdash/raw/master/web/bdash_demo.gif" width="400" /></a></div>
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com1tag:blogger.com,1999:blog-8529684758835808125.post-83643482415578329942014-11-17T12:03:00.001+01:002014-11-17T12:03:31.929+01:00Presenting bitbox at "le capitole du libre" in ToulouseI was kindly invited to present the bitbox as part of the <a href="http://2014.capitoledulibre.org/" target="_blank">"Capitole du libre" meeting</a>, where <a href="http://2014.capitoledulibre.org/schedule/presentation/20/" target="_blank">I presented the hardware and software conception </a>during a nealy one hour talk with many interesting questions after. The project has found a few very welcome new enthusiasts !<br />
<br />
It really was a pleasure to discuss with everyone there, working on <a href="http://geekygoblin.org/ned-et-les-maki/" target="_blank">free / opensource </a>games, awesome <a href="https://www.haiku-os.org/" target="_blank">operating systems</a> or <a href="https://github.com/MCMic/freesiege" target="_blank">nice little games</a> that <i>beg </i>to be implemented on the bitbox ...<br />
<br />
That, and many interesting more general conferences about opensource or blender (yay). The slides are in french, but I plan to include them <br />
<br />
The big problem is that it entails so many new ideas and directions that my sleep deprivation will not be much better for another year I guess ...makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-307016004730404892014-11-11T18:41:00.001+01:002015-06-06T19:43:32.096+02:00Simple modesSome have expressed the interest for simple modes for the Bitbox. An recent commit is providing such mode , on top of the standard kernel.<br />
<br />
The so-called simple modes are called like this because they provide a frame buffer interface, so the application programmer will only have to write bits and bytes to the video memory - much like it's done on PC. So the interface is a vram buch of memory and a color palette (because the tradeoff is a reduced palette or resolution)<br />
<br />
There are two examples in the bitbox SDK (one of them below), but generally you'll need to define a simple makefile variable VGA_SIMPLE_MODE=X with the given mode and include the bitbox.mk standard makefile.<br />
<br />
(Yes it's currently defined at compile time - if your program needs to switch between two modes at runtime, it might be time to switch to a standard kernel / engine - it's not difficult !)<br />
<br />
<a name='more'></a><br />
<h2>
The Modes</h2>
The modes are the following:<br />
<div>
<div>
<div>
<table>
<tbody>
<tr><th>mode</th> <th>type</th> <th>colors</th> <th>resolution</th> <th>VRAM</th> <th>kernel mode</th></tr>
<tr><td>0</td> <td>text</td> <td>2</td> <td>80x25</td><td>2k+2k</td> <td>640x480</td></tr>
<tr><td>1</td> <td>text</td> <td>2*</td> <td>132x75</td><td>10k+10k</td> <td>800x600</td></tr>
<tr><td>2</td> <td>graphical</td> <td>2</td> <td>800x600</td><td>59k</td> <td>800x600</td></tr>
<tr><td>3</td> <td>graphical</td> <td>4</td> <td>640x400</td><td>64k</td> <td>640x480</td></tr>
<tr><td>4</td> <td>graphical</td> <td>16</td> <td>400x300</td><td>64k</td> <td>800x600</td></tr>
<tr><td>5</td> <td>graphical</td> <td>256</td> <td>320x200</td><td>64k</td> <td>640x480</td></tr>
<tr><td>10</td> <td>text</td><td>256*</td><td>80x30</td><td><10k</td><td>640x480</td></tr>
<tr><td>11</td> <td>text</td><td>256*</td><td>120x75</td><td><10k</td><td>800x600</td></tr>
</tbody></table>
</div>
</div>
<br />
<span style="font-weight: normal;">*text modes 0 and 1 are only B&W (well, whatever you define as palette 0 and 1)</span>. Modes 10 and 11 use a 256 entry palette of u16 fg / u16 bg attributes. Beware that using mode 11 (really stretching the harwdare) with too much color changes per line might create dark lines.<br />
<h3>
Palette</h3>
All modes use a palette of u16. Set the color by setting a 0rrrrrgggggbbbbb 15- bit word entry in the palette array. By example, to assign a bright red color to color index 4 (zero-based), just set<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">extern uint16_t palette[16]; </span><br />
<span style="font-family: "Courier New",Courier,monospace;">palette[4]=0b0111110000000000; // binary literal or use RGB(x,y,z)</span><br />
<br />
<h4>
Default palettes </h4>
<ul>
<li>2-color palettes : 0 : black, 1:white</li>
<li>4-color palette: 0 : black, 1 : cyan, 2 : red, 3:light grey</li>
<li>16-color palette : standard CGA 16 color palette (<a href="http://en.wikipedia.org/wiki/Color_Graphics_Adapter">http://en.wikipedia.org/wiki/Color_Graphics_Adapter</a>)</li>
<li>256-color palette : unsurprisingly, this default palette is VGA mode 0x13 standard palette. <a href="http://fr.wikipedia.org/wiki/Mode_13h">http://fr.wikipedia.org/wiki/Mode_13h</a></li>
</ul>
<h3>
Text modes : 0,1</h3>
</div>
<div>
Text modes 0 and 1 define text modes with color attributes.<br />
<div>
Mode 0 is 80 columns by 25 lines, Mode 1 is 132 columns by 75 lines.</div>
</div>
<div>
Video Memory has one array of characters (vram)</div>
<div>
</div>
<div>
<br />
<span style="font-family: inherit;">Example to draw the ASCII table :</span></div>
<div>
</div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"> #define SCREEN_W 132</span></div>
<span style="font-family: "Courier New",Courier,monospace;"> for (int i=0;i<256;i++)</span><br />
<div>
<span style="font-family: "Courier New",Courier,monospace;"> vram[(i/16)*SCREEN_W + i%16]=i; </span></div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"></span></div>
<div>
</div>
<div>
<br />
<span style="font-family: inherit;">Feel free to use memcpy / memset also (strcpy writes a zero character after the string)</span></div>
<div>
</div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"> char *my_str = "Bitbox rules";</span></div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"> memcpy(&vram[4*132+13], my_str,strlen(my_str));</span></div>
<div>
<div>
<h3>
</h3>
</div>
<div>
<h3>
Graphical modes : 2-5</h3>
</div>
<div>
Graphical mode map linearly pixels (color indexes) to bits in memory, ie to set a pixel as color 1 (defined in the palette) on coordinates 100,50 with mode 2, use</div>
<div>
</div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"> extern uint32_t vram;</span></div>
<div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"> // set a bit on the bit array of pixels, made of 32bit words</span></div>
</div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"> vram[(50*800+100)/32] |= 1<<(100%32); </span></div>
<div>
</div>
<div>
<br />
<span style="font-family: inherit;">or just use the <span style="font-family: inherit;">draw</span>_pixel or draw_line functions (of course to fill/copy a bunch of pixels, you'd better use memory access)</span></div>
<div>
<span style="font-family: "Courier New",Courier,monospace;"> draw_pixel(100,100,1);</span><br />
<br />
<h3>
<span style="font-family: "Courier New",Courier,monospace;">Example program </span></h3>
<span style="font-family: inherit;">The program can be found in the SDK examples. </span><br />
<br />
<span style="font-family: inherit;">Here is it in its entirety: </span><br />
<h4>
<span style="font-family: inherit;">Makefile </span></h4>
<script src="https://gist.github.com/makapuf/f20b9553f1d931c5fd34.js"></script>
<br />
<h4>
test_simple_graph.c</h4>
<script src="https://gist.github.com/makapuf/3a67d294d69b9560ea1b.js"></script>
<br />
<h4>
Result </h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB1s34NKr8ltfSDOuDzz6bxb_JohL-cv26kF2nDe_8AT9cPRi3weS1s243M3QGNW0AEVOwWjBX8dJ1_ojEUbpbER6WO1v5mvu2zf8KfDmlQUIysK2fMFDyhjtfGLAs4feUAA3KUwnQo5kT/s1600/screenshot_simple.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB1s34NKr8ltfSDOuDzz6bxb_JohL-cv26kF2nDe_8AT9cPRi3weS1s243M3QGNW0AEVOwWjBX8dJ1_ojEUbpbER6WO1v5mvu2zf8KfDmlQUIysK2fMFDyhjtfGLAs4feUAA3KUwnQo5kT/s320/screenshot_simple.png" width="320" /></a></div>
<span id="goog_1243026450"></span><span id="goog_1243026451"></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span><span style="font-family: inherit;">
<b>Simple, no ?</b></span></div>
<div>
<div>
<h3>
Simple Scrolling tilemap + sprites mode</h3>
</div>
<div>
<br />
Well, I cheated there is no such mode :) </div>
<div>
<b>However</b>, there is a simple example project using the engine that you can use very simply, just take the test_engine project in the SDK and tweak it !</div>
<div>
</div>
</div>
</div>
makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com0tag:blogger.com,1999:blog-8529684758835808125.post-8836330848196855782014-10-06T10:05:00.002+02:002014-10-06T10:05:25.132+02:00New kernel modes (including 800x600@56Hz !)Since a recent commit, developers now have a better way to set modes.<br />
<br />
The kconf.h kernel configuration file allows now several modes, selectable through your project Makefile config options.<br />
<br />
Current defined timings include :<br />
<br />
- 640x480, 60Hz @ 168MHz clock (default one), 7 clocks per pixel<br />
- 320x480, 60Hz @ 168MHz clock (repeat each line twice to use as 320x240 display)<br />
- 640x480, 60Hz, overclocked at 192 MHZ, 7 clocks per pixel (longer vsync time)<br />
- <b>800x600, 56Hz</b> ! overclocked a bit at 180MHz. Yes the bitbox can do 800x600, 56fps.<br />
You only have 5 clocks per pixels here however, so you'd better optimize that blit loop.<br />
<br />
other modes can be created by adding config lines to the kconf.h file, all timing computation is based on number of pixels for Porch begin/end/sync and display sizes in pixels ; however be sure to get the right clock ratios to run USB/SDIO clocks at 48MHz !<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE-lzSjlXy-5XgRCvga-D4o1h8hYsLEOscT1ek3XDPoOfb8_YzPg4XTWDLSLEAvYvaMWuDqwz6IGVjyr2LjZlVZ_W7Y3ZfYNgUk8z9CuQTcG4H1nep1505wzB4gPCmiQIO66OJuVXmj7dY/s1600/screenshot_800.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE-lzSjlXy-5XgRCvga-D4o1h8hYsLEOscT1ek3XDPoOfb8_YzPg4XTWDLSLEAvYvaMWuDqwz6IGVjyr2LjZlVZ_W7Y3ZfYNgUk8z9CuQTcG4H1nep1505wzB4gPCmiQIO66OJuVXmj7dY/s1600/screenshot_800.jpg" height="238" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">yes, testkernel can work at 800x600 (sorry bad pic)</td></tr>
</tbody></table>
<br />
<span id="goog_1447260618"></span><span id="goog_1447260619"></span><br />
<br />
<br />
<br />makapufhttp://www.blogger.com/profile/10256474260644209479noreply@blogger.com2