|0x23||Serial Pixel Control|
|0x24||Serial Pixel BaseColour|
|0x25||Serial Pixel Add|
|0x26||Serial Pixel Sub|
|0x27||Serial Pixel Mul|
|0x29||Display Shift X|
|0x2a||Display Shift Y|
|0x48||Blit Parameter area|
|0x49||Blit Parameter area|
|0x4a||Blit Parameter area|
|0x4b||Blit Parameter area|
|0x4c||Blit Parameter area|
|0x4e||Blit Parameter area|
|0x4f||Blit Parameter area|
|0x50||Voice Freq L|
|0x51||Voice Freq H|
|0x53||Voice Shape (wave:4 shift:3|
|0x54||Voice Bend (amplitude:5 phase:3)|
|0x55||Voice Bend duration|
|0x56||Voice Noise:4 Hold:4|
|0x57||Voice Play (attack:4 release:4)|
|0x5D||Stack Pointer SPL||SPL|
|0x5E||Stack Pointer SPH||SPH|
|0x5F||Status Register SREG||SREG|
|....||16 entries from a table of 256|
Display is a 512x392 write only buffer.
The visible region is a window(480x360 or 240x180) into FrameBuffer
Serial Pixel Mode
Pixels can be written to the buffer one at a time through a serial interface
0x20...0x22: The serial write address is a 24 bit offset into the display buffer 0x23: The Serial Pixel Control register contains flags indicating how the serial write operations behave.
The serial pixel pointer may be auto incremented on any of the serial write operations.
bit 0x10 increment serial write address after ADD operation bit 0x20 increment serial write address after SUB operation bit 0x40 increment serial write address after MUL operation
The value written from a serial write operation will be the value writeent to the operator port ADD,SUB or MUL combined with either the existing colour at that pixel location or a base colour holding a colour index into the 256 colour palette.
bit 0x01 if set ADD uses the baseColour bit 0x02 if set SUB uses the baseColour bit 0x04 if set MUL uses the baseColour 0x24: Serial Pixel Base colour. Index to the coloour in the fixed 256 colour palette
To set a serial pixel to a fixed colour, using the ADD operation combined with Black in the BaseColour will result in a simple SET operation ( x+0=x )
0x25: Serial write ADD When writing 8 bit value V to the port The pixel at the serial write address DEST will set by DEST = DEST + Palette256[V] or - if bit 0x01 is set in the Serial Pixel Control Register DEST = Palette256[BaseColour] + Palette256[V] Red, Green, Blue levels are added seperately and do not pass their max value. 0x26: Serial write SUB When writing 8 bit value V to the port The pixel at the serial write address DEST will set by DEST = DEST - Palette256[V] or - if bit 0x02 is set in the Serial Pixel Control Register DEST = Palette256[BaseColour] - Palette256[V] Red, Green, Blue levels are subtracted seperately and do not pass their min value. 0x26: Serial write MUL When writing 8 bit value V to the port The pixel at the serial write address DEST will set by DEST = DEST * Palette256[V] or - if bit 0x04 is set in the Serial Pixel Control Register DEST = Palette256[BaseColour] * Palette256[V] Red, Green, Blue levels are multiplied seperately and considered to be in the range from zero to one.
0x28: Display Control writing 0x00 places the buffer image on screen in lowres mode writing 0x01 places the buffer image on screen in hires mode 0x29: Display Shift X The position of the left edge of the screen within the display buffer 0x2A: Display Shift Y The position of the top edge of the screen within the display buffer
The display buffer can also be written to via the blitter. The Blitter reads from RAM and translates a variety of formats to screen writes. The top left corner of the blit operation is the pixel specified by the current serial pixel address.
Blit operations utilize up to 16 colours from a colour table at
0x60...0x6f each value in the colour table is an index into the fixed 256 colour palette.
The address range
0x40...0x4f holds the blitter parameter space which can be different for different blit formats.
Writing to Blit Control at
0x2b selects the format and triggers the blit operation. Blit formats
0x01...0x04 utilize micro palettes and can render some colours with additive blending (and by extension by addive blending black, transparancy).
0x2B: Blitter Control, starts the blit operation 0x01 8 pixels per byte. 2 colours 0x02 4 pixels per byte. 4 colours 0x03 3 pixels per byte. 16 colours with each set of 3 pixels limited to one of four sets of 4 colours 0x04 2 pixels per byte. 16 colours 0x10 Mode 0 3x3 cell mode. 2 bytes per cell. Cells have any 2 of 16 colours. 0x11 Mode 1 8x8 cell mode. 2 bytes per cell. Cell images from 256 four-colour tiles. NES mode. X and Y tile Flipping availabe
For Blit formats
0x01...0x04 the Blitter parameters are the same with the only differences being the size of the output image and the number of colours available.
0x40: ImageData_L 0x41: ImageData_H RAM location of the image data. 0x42: Width of the blit operation in bytes 0x43: height of the blit operation in pixels 0x44: Line increment. The distance in bytes between one line of image data and the next. 0x45: Palette_L 0x46: Palette_H RAM location of the MicroPalette 16 four bit entries totalling 8 bytes. Each MicroPalette entry is an index to the 16 entry colour table at `0x60...0x6f` If MicroPalette entry equals its position the colour is additive blended otherwise the blitter performs a straight overwrite of the destination pixel. This means a pointer to a MicroPalette containing 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF Would render all pixels with additive blending, whereas 0x01,0x23,0x45,0x67,0xEF,0xCD,0x89,0xAB refers to the same colours in a different order, causing only the first 8 to be blended. To achieve the traditional sprite colour zero transparancy set the first micropalette entry to zero and the first colour table entry to zero(black), for exampe, 0x0F,0xED,0xCB,0xA9,0x87,0x65,0x43,0x21 would provide colour zero transparancy and the remaining 16 colours in the reverse order but solid. 0x4f: Blit Flags bit 0x80 Blit is X flipped , right to left bit 0x40 Blit is Y flipped, updide down bit 0x20 Blit is scaled to double width bit 0x10 blit is scaled to double height bits 0x0f reserved for expansion
Blit Mode0 is a 3x3 cell mode where each cell is represented by two bytes. Cells may use any 2 colours of 16.
The bits in the first byte define the 8 pixels in the 3x3 cell in the following order
The second byte provides two 4 bit indexes into the colour table indicating which two colours to use for the cell. Consider these to be Colour A and Colour B. A clear bit in the first byte denotes Colour A and a set bit denotes colour B. The bottom right pixel in the cell is always Colour A.
While the Bottom right corner is not bit addressable, all combinations of pixels are available in this format. Swapping the values Of Colour A and Colour B, while inverting the first byte, results in a change to the bottom right pixel without changing the appearance of the rest of the cell.
For instance for a cell in yellow (in palette entry 14) and blue(in palette entry 15) with this pattern
Would be encoded as 0x9E, 0xEF
To change the image to
The image would be encoded as 0x61, 0xFE which is a logical not of the first byte and a swap of the top and bottom 4 bits of the second byte.
Mode 0 Parameters are
0x40 ImageData_L 0x41 ImageData_H Address in ram of the image data. 0x42 Width of the Blit operation in Cells 0x43 Height of the Blit operation in Cells 0x44 Line increment. The distance in Cells between one line of image data and the next. As cells are two bytes, the distance in bytes is this value doubled.
Mode 1 is a 8x8 cell - index tile mode. Each cell is two bytes, a 8 bit tile index followed by an attribute byte to specify colours, xflip and yflip.
The index can be one of 256 tiles. Tile data is 8x8 two bits per pixel making them 16 bytes per entry and providing 4 colours per tile. The attribute byte can specify one of 16 MicroPalettes for each cell.
The attribute byte is encoded as
XY..PPPP X (bit 0x80) flip cell X Y (bit 0x40) flip cell Y P (bits 0x0F) MicroPalette number. bits labeled . are unused at this time.
Mode 1 parameters are
0x40 MapData_L 0x41 MapData_H Address in RAM of the map cells 0x42 Blit Size the top 4 bits indicate the width in cells of the Blit the bottom 4 bits indicate the Height in cells of the blit. the size from each 4 bit value is decoded as if v==0 then 1 else v*2; conseqently the only odd size provided is 1 0x43 Line increment. The distance in Cells between one line of image data and the next. As cells are two bytes, the distance in bytes is this value doubled. 0x44 PaletteData_L 0x45 PaletteData_H Address in RAM of the 16 MicroPalettes totaling 32 bytes 0x46 TileData_L 0x47 TileData_H Address in RAM of the Tile Set. 256*16 bytes (4k in total)
There are 8 independant voice chennels available each with identical abilities. The voices provide a variety of base waveforms, Pitch Bend, an Attack/Hold/Release envelope and individual noise and volume control.
All voices share the same hardware registers at
0x50...0x57 writing 0...7 to
0x2c Selects which voice the register range controls. There is a Master volume at
The Attack/Hold/Release cycle is triggered by writing to
0x57 Thus it is possible to play a 'canned' sound effect by writing to the eight voice registers in turn and upon witing the last value the sound will play.
Voice registers are:
0x50 Freq_L 0x51 Freq_H Frequency is the Int16 value multiplied by 0.0596 Hz 0x52 Volume Int8 value ranging from 0:silent to 255:Max volume 0x53 Wave Shape Low 4 bits ....xxxx Wave Base: 0000 square, 1000 = Sine, 1111 = Triangle. intermediate values interpolate. square and triangle waves are scaled to have same area under curve as Sine preserving volume bits .xxx.... Wave shift: 000 = no shift, Applies a gamma curve in the time domain high bit x....... Modulate: if set, this voice is silent, instead the output is muultiplied with the next voice 0x54 Pitch Bend low 5 Bits: bend Amplitude Frequency range of the bend. A value of 0 indicates no bend A value of 31 will oscillate frequency between voice_freq - voice_freq/2 and voice_freq + voice_freq/2 high 3 bits: Bend phase 000=0 100=Pi 111=2*PI/8*7, 0x55 Bend duration Oscillation Frequency (((Uint8_Value+16)/(255+16))^4 ) * 128 Hz A value of 0 results in a bend of 0.0016 Hz ( 642 seconds for a full oscillation wave) A value of 1 results in a bend of 0.0079 Hz (127 seconds for a full oscillation wave) A value of 16 results in a bend of 0.025 Hz (40 seconds for a full oscillation wave) A value of 32 results in a bend of 0.126 Hz (8 seconds for a full oscillation wave) A value of 64 results in a bend of 0.97 Hz (1 second for a full oscillation wave) A value of 96 results in a bend of 3.73 Hz A value of 128 results in a bend of 10 Hz A value of 192 results in a bend of 44 Hz A value of 255 results in a bend of 128 Hz 0x56 Noise Level and Envelope Hold Duration low 4 bits: Noise level A value of 0 indicates no added noise A value of 15 indicates the wave will be all noise high 4 bits: HoldTime: Envelope Release starts at (Int4_Value / 8)² Seconds 0000 is Immediate release 0001 is release after 1/64th of a second 1000 is release after 1 second 1111 is release after 3.51625 seconds 0x57 Play, Attack and Release Envelope control low 4 bits for attack: high 4 bits for release: Duration for both is (Int4_Value / 8)² Seconds Writing to the this Register triggers the start of the Attack,Hold,Release Cycle.
0x30 Buttons_1 Left Up Right Down Enter Esc Ctrl Space 0x31 Buttons_2 A W D S Shift (Mouse1 || Z) (Mouse2 || X) (Mouse3 || BackSpace) 0x32 mouseX measured in LowRes pixels 0x33 mousey measured in LowRes pixels 0x34 increments on each frame of host device. 0x35 increments once per second 0x36 buffers a few chars. reads as zero when buffer is empty. reading the port removes the item from the buffer.