Virtual Machines

From SizeCoding
Revision as of 10:10, 2 January 2021 by Superogue (talk | contribs)

Jump to: navigation, search

Introduction

Welcome to the virtual machine section of the website, where we will cover virtual machine (VM) languages and platforms like the TIC-80 and Javascript.

TIC-80

TIC-80 is a fantasy computer for making, playing and sharing tiny games and demos.

There are built-in tools for development: code, sprites, maps, sound editors and the command line, which is enough to create a mini retro game. At the exit you will get a cartridge file, which can be stored and played on the website.

Also, the game can be packed into a player that works on all popular platforms and distribute as you wish. To make a retro styled game the whole process of creation takes place under some technical limitations: 240x136 pixels display, 16 color palette, 256 8x8 color sprites, 4 channel sound and etc.

Setting up

As the TIC-80 fantasy computer is an all-in-one creation and execution platform, setting up TIC-80 is very easy:

Just go to the https://github.com/nesbox/TIC-80/releases page

and download the package for your platform of choice (Windows, OSX, Linux and even Raspberry Pi).

Or if you are just curious you can just start doodling online at http://tic80.com/

Getting started

Most TIC-80 programs are coded using the LUA Scripting language. However it is possible to select different scripting language like javascript at the cost of a couple of bytes/characters like so:
//script: js

The main function used for updating the screen (and called 60 times a second) is the TIC() function, so this function is also a requirement for doing anything with graphics. Additionally you can also setup a sub=function SCN() that is called once per scanline at the costs of more bytes/characters.

Most animated effects will also need to use some kind of a timer, so you are likely to also use the built-in time() function or keep track of your time (t) yourself as well.. So a minimal setup would look something like this:

function TIC()t=time()
-- your effect code
end

Video display

The TIC-80 has a 240x136 pixel display with 16colors which can be accessed via a wide range of graphics functions or by writing directly to VRAM at memory address 0x0000 using the poke4 instruction.

Draw functions

There are a couple of built-in drawing functions you can use:

cls(color=0)
pix(x,y[color]) [-> color]
circ(x,y,r,color) -- filled circle
circb(x,y,r,color) -- border circle
rect(x,y,w,h,color) -- filled rect
rectb(x,y,w,h,color) -- border rect
line(x0,y0,x1,y1,color)
tri(x1,y1,x2,y2,x3,y3,color)
textri(x1,y1,x2,y2,x3,y3,u1,v1,u2,v2,u3,v3,
 use_map=false,colorkey=-1)
print(text,x=0,y=0,color=15,fixed=false,
 scale=1,smallfont=false) -> width

Getting something on screen

Here is a bit of code to get you started:

function TIC() 
t=time()/99
for y=0,136 do for x=0,240 do
pix(x,y,(x>>3~y>>3)+t)
end;end;end

Which will display an animated XOR pattern.

Setting colors

Unfortunately for us sizecoders, the pre v0.8 TIC-80 came with a different palette than the now standard (and much more friendly) sweety16 palette (https://lospec.com/palette-list/sweetie-16). And because of backwards compatibility, this old palette is also the default palette that is being used when now palette chunk is defined in the TIC cart.

The Default TIC-80 Palette supplied with an empty TIC-80 File

Sound

The TIC-80 has soundregisters and 32 byte waveforms to access

Make some noise

To be added soon.

Compression And Release

When you are happy with your intro and want to get it ready for release, it becomes time to look at squeezing those last bytes. As a goal-post, you should always aim to have your uncompressed effect around the target size, and work from there.

Final optimisation can be done by stringing as much code together on single lines and removing any extra spaces and whitelines. A rule of thumb for this is that of the first or last character of a variable or function isn't a valid hex number (i.e. A-F) you can omit whitespace (so that: x=0 y=0 z=0 can become x=0y=0z=0)

Now as a final step you can use a python script to convert your (LUA) Script to a empty TIC Cartridge with a single ZLIB compressed code block (https://gist.github.com/Gargaj/5bf66c128c6c6c47f4c78de630e56569)

However, creating a TIC cartridge file adds a 4 byte header and if your code is already pretty tight, you can expect to have only a 3-5% compression rate, so it sort of evens out.

Exporting Video as Animated GIF

The TIC80 environment has a neat feature that lets you export your intro directly as an animated GIF file to converted to video later, by Pressing the F9 key to start and stop recording. However, there is a default recording limit capped to a fixed number of frames or seconds. You can change this in the tic80 config to a bigger number to match your recording-size.

If your intro is taking up too many resources and starts chugging a bit on your machine, it can be wise to make a version that steps through time lineary by adding a number to your t variable yourself instead of using the time() function.

Online version: Metadata and Thumbnail image

When uploading the intro to the TIC80 website for an playable online version, you will need to build a new TIC file with some added some meta-data and Thumbnail image (You can take this snapshot using the F7 key) and use this as you online version.

The Meta data is added at the top of your intro as follows

-- title: My intro
-- author: scener
-- desc: my first sizecoded TIC-80 intro
-- script: lua (or moon/wren/js/fennel)

Additional Resources

Sizecoding on the TIC-80 is still in its infancy, but luckily there is already plenty of information to get you started!

Javascript

The Javascript sizecoding community has been quite active for years now.

Setting up

  • Tools: -
  • Execution environment(s): Browser, Dwitter

Video display

No information yet

Sound

No information yet

Additional Resources

Here are some additional links with source code:

Prod name (Pouet link) Source code
128b Palette Starfield by Gaston https://github.com/ggnkua/Atari_ST_Sources/blob/master/ASM/Gaston/starfield_128b_src/STARFLD.S
Fractal Landscape bootsector by Gaston https://github.com/ggnkua/Atari_ST_Sources/blob/master/ASM/Gaston/fractal_boot_src/FRACTAL.S