101 lines
3.8 KiB
Markdown
101 lines
3.8 KiB
Markdown
# snake6502
|
||
|
||
![Intro screenshot](scrot/intro.png)
|
||
![Gameplay screenshot](scrot/gameplay.png)
|
||
|
||
*snake6502* is a snake-like game clone for Commodore home computers, written for fun because «I always wanted to code something for a computer of my retrocomputers collection – actually, this is the main reason I collect them: to write programs».
|
||
|
||
Current development status [here](https://git.giomba.it/giomba/snake6502).
|
||
|
||
## Download
|
||
* [.d64](dist/snake6502.d64) for floppy disks
|
||
* [.bin](dist/snake6502.bin) for 8KiB cartridges
|
||
|
||
## Compile
|
||
You need the GNU compiler collection and the [dasm](https://dasm-assembler.github.io/) macro assembler, then:
|
||
```
|
||
$ git submodule init
|
||
$ git submodule update
|
||
$ make
|
||
```
|
||
Interesting targets:
|
||
|
||
* ```make bin/snake6502.bin``` produces .bin, ready to be burnt on an 8K EEPROM for making a cartridge
|
||
* ```make bin/snake6502.d64``` produces .d64, ready to be used for floppy disks
|
||
|
||
You can also define the following environment variables:
|
||
|
||
```$ DEBUG=1 make``` build with debugging artifacts
|
||
|
||
## Tape
|
||
Copy ```loader.prg``` and ```packlz``` from disk to tape.
|
||
On a physical machine, you can use [disk2tape](https://git.giomba.it/giomba/cbmutil).
|
||
|
||
## Developer docs
|
||
### Package
|
||
The whole program is assembled into a ```snake.pack``` binary blob with the following structure.
|
||
|
||
Absolute | Offset | Description
|
||
------------|-------------|------------
|
||
```$1000``` | ```$0000``` | load address
|
||
```$2800``` | ```$1800``` | entry point (start address)
|
||
|
||
### Memory map
|
||
Address | PRG | Description
|
||
----------------------|-------|------------
|
||
```$0000 - $0001``` | no | hardware
|
||
```$0002 - $00FF``` | no | zero page pointers
|
||
```$0100 - $01FF``` | no | stack page
|
||
```$0200 - $03FF``` | no | operating system variables
|
||
```$0400 - $07FF``` | no | video memory
|
||
```$1000 - $1FFF``` | yes | SID tune, may overlap charset
|
||
```$2000 - $23FF``` | yes | custom char, unused, allow SID overlap
|
||
```$2400 - $27FF``` | yes | custom char (actual 0x80+)
|
||
```$2800 - $xxxx``` | yes | Program segment (only needed part used)
|
||
```$xxxx - $CCFF``` | no | *free ram*
|
||
```$CD00 - $CFFF``` | no | data segment (not-initialized vars)
|
||
```$D000 - $DFFF``` | no | I/O
|
||
```$E000 - $FFFF``` | no | Kernal
|
||
|
||
### Compression
|
||
```snake.pack``` is compressed into ```snake.pack.lz``` using [liblzg](https://github.com/mbitsnbites/liblzg), to save space, mainly in order to fit the game in a *PROM.
|
||
Decompression occurs with one of the following loaders.
|
||
|
||
### Loader
|
||
#### Cartridge
|
||
```cart.asm``` is located at ```$8000``` (standard org address for C64 cartridges), and contains the decompression routine and the ```snake.pack.lz```. It decompresses ```snake.pack.lz``` back to ```$1000```, and jumps to its entry point at ```$2800```.
|
||
#### Disk
|
||
```loader.asm``` loads at ```$801```, like any other BASIC automatic runner, and contains the decompression routine.
|
||
```snake.pack.lz``` is loaded at ```$8000``` from disk drive, then decompressed back to ```$1000```, and finally the loader jumps to the program entry point at ```$2800```.
|
||
|
||
### Miscellanea
|
||
#### Custom charset
|
||
Index | Description
|
||
----------------|-------------
|
||
```$00 - $7F``` | unused (space for SID)
|
||
```$80 - $9F``` | A-Z (space first)
|
||
```$A0 - $BF``` | A-Z, reversed (space first)
|
||
```$C0 - $CF``` | hex digits
|
||
```$D0 - $DF``` | hex digits, reversed
|
||
```$E0 - $EF``` | game tiles
|
||
```$F0 - $FF``` | semigraphic tiles
|
||
|
||
##### Semigrahic Tiles
|
||
Char | Output
|
||
----------|--------
|
||
```$F0``` | ```◜```
|
||
```$F1``` | ```◝```
|
||
```$F2``` | ```◟```
|
||
```$F3``` | ```◞```
|
||
```$F4``` | ```-```
|
||
```$F5``` | ```|```
|
||
```$F6``` | ```◢```
|
||
```$F7``` | ```◣```
|
||
```$F8``` | ```◥```
|
||
```$F9``` | ```◤```
|
||
```$FA``` | ```┴```
|
||
```$FB``` | ```┬```
|
||
```$FC``` | ```┤```
|
||
```$FD``` | ```├```
|
||
|