Схема памяти 80Kb
+-----------------------------------+
| 80K RAM LAYOUT |
+-------+-------------------+-------+
| ADDR | INFO | SIZE |
+-------+-------------------+-------+
| 00000 | SCREEN | 16320 | 240x136 = 32640 4bit pixels
| 03FC0 | PALETTE | 48 | 16 x 24bit RGB color values
V 03FF0 | PALETTE MAP | 8 | 16 x 4bit color indexes
R 03FF8 | BORDER COLOR | 1 | 4bit color value
A 03FF9 | SCREEN OFFSET | 2 | horz/vert screen offset [-127...+127]
M 03FFB | GAMEPAD MASK | 1 |
| 03FFC | GAMEPAD STATE | 2 | x 2 gamepads, 1bit for UP DOWN LEFT RIGHT A B X Y
| 03FFE | ... | 2 |
+-------+-------------------+-------+
| 04000 | SPRITES | 16384 | 256 8x8 4bit sprites
| 06000 | TILES | 16384 | 256 8x8 4bit bg tiles
| 08000 | MAP | 32640 | 240x136 map cells
| 0FF80 | PERSISTENT MEMORY | 28 |
| 0FF9C | SOUND REGISTERS | 72 | ...
| 0FFE4 | WAVEFORMS | 256 | 16 waveforms, each 32 x 4bit values
| 100E4 | SFX | 4224 | ...
| 11164 | MUSIC PATTERNS | 11520 | ...
| 13E64 | MUSIC TRACKS | 408 | ...
| 13FFC | MUSIC POS | 4 | ...
| 14000 | ... | 0 |
+-------+-------------------+-------+
+-----------------------+
| SOUND REGISTER |
+-----------+-----------+
| frequency | 12bit | x 4 channels = 72 bytes
| volume | 4bit |
| waveform | 32 x 4bit |
+-----------+-----------+
+--------------------------+
| SFX |
+--------------------------+
| |
| +----------+------+ |
| | volume | 4bit | |
| | wave | 4bit | x 30 |
| | arpeggio | 4bit | |
| | pitch | 4bit | |
| +----------+------+ |
| |
| +----------+------+ |
| | octave | 3bit | | x 64 = 4224 bytes
| | pitch16x | 1bit | |
| | speed | 3bit | |
| | reverse | 1bit | |
| | note | 4bit | |
| | temp | 4bit | |
| +----------+------+ |
| |
| +--------------+ |
| | LOOP | |
| +-------+------+ x 4 |
| | start | 4bit | |
| | size | 4bit | |
| +-------+------+ |
| |
+--------------------------+
+------------------------+
| MUSIC PATTERN |
+------------------------+
| |
| +---------------+ |
| | PATTERN ROW | |
| +--------+------+ |
| | note | 4bit | |
| | volume | 4bit | |
| | param | 4bit | x 64 | x 60 = 11520 bytes
| | effect | 3bit | |
| | sfx | 6bit | |
| | octave | 3bit | |
| +--------+------+ |
| |
+------------------------+
+----------------------------+
| MUSIC TRACK |
+----------------------------+
| |
| +------------+------+ |
| | pattern #0 | 6bit | |
| | pattern #1 | 6bit | x 16 |
| | pattern #2 | 6bit | |
| | pattern #3 | 6bit | |
| +------------+------+ | x 8 = 408 bytes
| |
| +-------+------+ |
| | tempo | 8bit | |
| | rows | 8bit | |
| | speed | 8bit | |
| +-------+------+ |
| |
+----------------------------+
+-----------------+
| MUSIC POS |
+-------+---------+
| track | 8bit |
| frame | 8bit |
| row | 8bit |
+-------+---------+
| | = 4 bytes
| +-------------+ |
| | FLAGS | |
| +------+------+ |
| | loop | 1bit | |
| | ... | 7bit | |
| +------+------+ |
| |
+-----------------+
empty waveform generates noise by default
you can update Sound Registers every tick (60 times per second)
to read frequency and volume use the following code:
...
value = peek(0xFF9C+18*channel+1)<<8|peek(0xFF9C+18*channel)
frequency = (value&0x0fff)
volume = (value&0xf000)>>12
...