Library for communicating with a Gameduino shield. Provides colour VGA display, hardware sprites with collision detection and stero sound. See http://excamera.com/sphinx/gameduino/ for more details.

Dependents:   GameduinoTest SimpleGameduinoTest RobotRic

Note that to use this library you must also import the CommonTypes library because this library uses it.

To get an mbed talking to a Gameduino shield all you really have to do is connect the Gameduino to the SPI bus. I did it using an LPC11U24 mbed and wired it to the Gameduino as follows:

  • mbed pin...................Gameduino pin
  • 5 (MOSI)...................11 (MOSI)
  • 6 (MISO)...................12 (MISO)
  • 7 (SCK)....................13 (SCK)
  • 8..........................9 (SEL)
  • 40 (VOUT)..................5V and 3.3V
  • 1 (GND)....................GND

mbed pins 5, 6 and 7 make up the SPI datalink. mbed pin 8 should be configured as a digital output and is driven low to communicate with the Gameduino.

Probably best to run the whole lot off a regulated 5V supply rather than relying on the 5V supply from the USB cable. I have had problems with the mbed's 3.3V VOUT supply. If the USB voltage is very low (nearer 4V than 5V) then the mbed's 3.3V regulator won't work properly and can't provide much current. I struggled to draw 10 mA for an LED. These problems go away if you power everything off an external 5V supply. It also means you can unplug the mbed from your computer of course.

Mounting the Gameduino is a bit awkward. I put it on some stripboard using 3 SIL sockets designed for an Arduino. Then I mounted the mbed alongside using two 20 pin SIL sockets. Unfortunately Arduino shields like the Gameduino don't fit nicely on a 0.1 inch grid (like the mbed does) so some connections have to be made using flying wires.

Here are some screenshots:

/media/uploads/RichardE/_scaled_img_0055_compressed.jpg

/media/uploads/RichardE/_scaled_img_0057_compressed.jpg

The code for generating this last display is found here:

Import programGameduinoTest

More complicated test program that generates text, coloured sprites and sound.

Here's the games console:

/media/uploads/RichardE/_scaled_img_0058_compressed.jpg

and the insides. Don't worry about the cables and the 8 pin chips. You don't need them if all you want is a display. They are an RS485 chip and a serial EEPROM.

/media/uploads/RichardE/_scaled_img_0059_compressed.jpg

Committer:
RichardE
Date:
Wed Jun 05 22:03:35 2013 +0000
Revision:
5:d614b857b940
Parent:
4:f6a33c5f0f7f
Made the spr variable in the Gameduino class public.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 0:d199d2362859 1 /*
RichardE 0:d199d2362859 2 * SOURCE FILE : Gameduino.cpp
RichardE 0:d199d2362859 3 *
RichardE 0:d199d2362859 4 * Definition of class Gameduino.
RichardE 0:d199d2362859 5 * Each instance of this class allows communication with
RichardE 0:d199d2362859 6 * a Gameduino shield over an SPI communications link.
RichardE 0:d199d2362859 7 *
RichardE 0:d199d2362859 8 */
RichardE 0:d199d2362859 9
RichardE 0:d199d2362859 10 #include "Gameduino.h" // this module's prototypes
RichardE 0:d199d2362859 11 #include "font8x8.h" // default font
RichardE 0:d199d2362859 12
RichardE 0:d199d2362859 13 /***************/
RichardE 0:d199d2362859 14 /* CONSTRUCTOR */
RichardE 0:d199d2362859 15 /***************/
RichardE 0:d199d2362859 16 // Pass pointer to SPI datalink in spi.
RichardE 0:d199d2362859 17 // Pass pointer to chip select in cs.
RichardE 0:d199d2362859 18 Gameduino::Gameduino( SPI *spi, DigitalOut *cs ) :
RichardE 5:d614b857b940 19 spr( 0 ),
RichardE 0:d199d2362859 20 spi( spi ),
RichardE 5:d614b857b940 21 cs( cs )
RichardE 0:d199d2362859 22 {
RichardE 0:d199d2362859 23 }
RichardE 0:d199d2362859 24
RichardE 0:d199d2362859 25 /**************/
RichardE 0:d199d2362859 26 /* DESTRUCTOR */
RichardE 0:d199d2362859 27 /**************/
RichardE 0:d199d2362859 28 Gameduino::~Gameduino() {
RichardE 0:d199d2362859 29 }
RichardE 0:d199d2362859 30
RichardE 0:d199d2362859 31 /*****************************************************/
RichardE 0:d199d2362859 32 /* INITIALISE CONNECTION TO ADAPTER AND RESET THINGS */
RichardE 0:d199d2362859 33 /*****************************************************/
RichardE 0:d199d2362859 34 void Gameduino::begin( void ) {
RichardE 0:d199d2362859 35 // Wait a bit to allow Gameduino to boot.
RichardE 0:d199d2362859 36 wait_ms( 250 );
RichardE 0:d199d2362859 37 // Deselect the Gameduino.
RichardE 0:d199d2362859 38 *cs = 1;
RichardE 0:d199d2362859 39 wr( J1_RESET, 1 ); // HALT coprocessor
RichardE 0:d199d2362859 40 wr( VIDEO_MODE, MODE_800x600_72 );
RichardE 3:a1c856358996 41 HideAllSprites();
RichardE 0:d199d2362859 42 fill( RAM_PIC, 0, 1024 * 10 ); // Zero all character RAM
RichardE 0:d199d2362859 43 fill( RAM_SPRPAL, 0, 2048 ); // Sprite palletes black
RichardE 0:d199d2362859 44 fill( RAM_SPRIMG, 0, 64 * 256 );// Clear all sprite data
RichardE 0:d199d2362859 45 fill( VOICES, 0, 256 ); // Silence
RichardE 0:d199d2362859 46 fill( PALETTE16A, 0, 128 ); // Black 16-, 4-palletes and COMM
RichardE 0:d199d2362859 47 wr16( SCROLL_X, 0 );
RichardE 0:d199d2362859 48 wr16( SCROLL_Y, 0 );
RichardE 0:d199d2362859 49 wr( JK_MODE, 0 );
RichardE 0:d199d2362859 50 wr( SPR_DISABLE, 0 );
RichardE 0:d199d2362859 51 wr( SPR_PAGE, 0 );
RichardE 0:d199d2362859 52 wr( IOMODE, 0 );
RichardE 0:d199d2362859 53 wr16( BG_COLOR, 0 );
RichardE 0:d199d2362859 54 wr16( SAMPLE_L, 0 );
RichardE 0:d199d2362859 55 wr16( SAMPLE_R, 0 );
RichardE 0:d199d2362859 56 wr16( SCREENSHOT_Y, 0 );
RichardE 0:d199d2362859 57 wr( MODULATOR, 64 );
RichardE 0:d199d2362859 58 }
RichardE 0:d199d2362859 59
RichardE 0:d199d2362859 60 static const UInt8 stretch[16] = {
RichardE 0:d199d2362859 61 0x00, 0x03, 0x0c, 0x0f,
RichardE 0:d199d2362859 62 0x30, 0x33, 0x3c, 0x3f,
RichardE 0:d199d2362859 63 0xc0, 0xc3, 0xcc, 0xcf,
RichardE 0:d199d2362859 64 0xf0, 0xf3, 0xfc, 0xff
RichardE 0:d199d2362859 65 };
RichardE 0:d199d2362859 66
RichardE 0:d199d2362859 67 /***********************************************/
RichardE 0:d199d2362859 68 /* SET DEFAULT ASCII CHARACTER SET AND PALETTE */
RichardE 0:d199d2362859 69 /***********************************************/
RichardE 0:d199d2362859 70 void Gameduino::ascii( void ) {
RichardE 0:d199d2362859 71 UInt8 b, h, l;
RichardE 0:d199d2362859 72 UInt16 address;
RichardE 0:d199d2362859 73 const UInt8 *ptr = font8x8;
RichardE 0:d199d2362859 74 for( UInt16 i = 0; i < 768; ++i ) {
RichardE 0:d199d2362859 75 b = *ptr++;
RichardE 0:d199d2362859 76 h = stretch[ b >> 4 ];
RichardE 0:d199d2362859 77 l = stretch[ b & 0xf ];
RichardE 0:d199d2362859 78 address = RAM_CHR + ( ' ' << 4 ) + ( i << 1 );
RichardE 0:d199d2362859 79 wr( address++, h );
RichardE 0:d199d2362859 80 wr( address, l );
RichardE 0:d199d2362859 81 }
RichardE 0:d199d2362859 82 for( UInt16 i = 0x20; i < 0x80; ++ i) {
RichardE 0:d199d2362859 83 setpal( 4 * i + 0, TRANSPARENT );
RichardE 0:d199d2362859 84 setpal( 4 * i + 3, RGB (255, 255, 255 ) );
RichardE 0:d199d2362859 85 }
RichardE 0:d199d2362859 86 fill( RAM_PIC, ' ', 4096 );
RichardE 0:d199d2362859 87 }
RichardE 0:d199d2362859 88
RichardE 0:d199d2362859 89 /****************************/
RichardE 0:d199d2362859 90 /* START AN SPI TRANSACTION */
RichardE 0:d199d2362859 91 /****************************/
RichardE 0:d199d2362859 92 // Pass address to read or write to in address.
RichardE 0:d199d2362859 93 // Bit 15 must be set for a write.
RichardE 0:d199d2362859 94 void Gameduino::__start( UInt16 address ) {
RichardE 0:d199d2362859 95 *cs = 0; // select Gameduino
RichardE 0:d199d2362859 96 spi->write( ( address >> 8 ) & 0xFF ); // send bits 8 to 15 of address
RichardE 0:d199d2362859 97 spi->write( address & 0xFF ); // send bits 0 to 7 of address
RichardE 0:d199d2362859 98 }
RichardE 0:d199d2362859 99
RichardE 0:d199d2362859 100 /**********************************/
RichardE 0:d199d2362859 101 /* START AN SPI WRITE TRANSACTION */
RichardE 0:d199d2362859 102 /**********************************/
RichardE 0:d199d2362859 103 // Pass address write to in address.
RichardE 0:d199d2362859 104 void Gameduino::__wstart( UInt16 address ) {
RichardE 0:d199d2362859 105 __start( 0x8000 | address );
RichardE 0:d199d2362859 106 }
RichardE 0:d199d2362859 107
RichardE 0:d199d2362859 108 /******************************/
RichardE 0:d199d2362859 109 /* START A SPRITE TRANSACTION */
RichardE 0:d199d2362859 110 /******************************/
RichardE 0:d199d2362859 111 // Use this before calling xhide, xsprite or TransferSprite.
RichardE 0:d199d2362859 112 // Pass sprite number to start at in sprnum.
RichardE 0:d199d2362859 113 void Gameduino::__wstartspr( UInt8 sprnum ) {
RichardE 0:d199d2362859 114 __wstart( RAM_SPR + ( sprnum << 2 ) );
RichardE 0:d199d2362859 115 spr = 0;
RichardE 0:d199d2362859 116 }
RichardE 0:d199d2362859 117
RichardE 0:d199d2362859 118 /*************************/
RichardE 0:d199d2362859 119 /* TRANSFER BYTE VIA SPI */
RichardE 0:d199d2362859 120 /*************************/
RichardE 0:d199d2362859 121 // Use only after a call to __start or __wstart.
RichardE 0:d199d2362859 122 // Pass data to send in data.
RichardE 0:d199d2362859 123 UInt8 Gameduino::__tr8( UInt8 data ) {
RichardE 0:d199d2362859 124 return (UInt8)spi->write( data );
RichardE 0:d199d2362859 125 }
RichardE 0:d199d2362859 126
RichardE 0:d199d2362859 127 /********************************/
RichardE 0:d199d2362859 128 /* TRANSFER 16 BIT WORD VIA SPI */
RichardE 0:d199d2362859 129 /********************************/
RichardE 0:d199d2362859 130 // Use only after a call to __start or __wstart.
RichardE 0:d199d2362859 131 // Pass data to send in data.
RichardE 0:d199d2362859 132 UInt8 Gameduino::__tr16( UInt16 data ) {
RichardE 0:d199d2362859 133 UInt16 result;
RichardE 0:d199d2362859 134 result = spi->write( data & 0xFF ); // send and get bits 0 to 7
RichardE 0:d199d2362859 135 result |= ( spi->write( ( data >> 8 ) & 0xFF ) << 8 ); // send and get bits 8 to 15
RichardE 0:d199d2362859 136 return result; // return word read
RichardE 0:d199d2362859 137 }
RichardE 0:d199d2362859 138
RichardE 0:d199d2362859 139 /**************************/
RichardE 0:d199d2362859 140 /* END AN SPI TRANSACTION */
RichardE 0:d199d2362859 141 /**************************/
RichardE 0:d199d2362859 142 void Gameduino::__end( void ) {
RichardE 0:d199d2362859 143 *cs = 1; // deselect Gameduino
RichardE 0:d199d2362859 144 }
RichardE 0:d199d2362859 145
RichardE 0:d199d2362859 146 /***************/
RichardE 0:d199d2362859 147 /* READ A BYTE */
RichardE 0:d199d2362859 148 /***************/
RichardE 0:d199d2362859 149 // Pass address in Gameduino memory to read from.
RichardE 0:d199d2362859 150 // Returns byte at that address.
RichardE 0:d199d2362859 151 UInt8 Gameduino::rd( UInt16 address ) {
RichardE 0:d199d2362859 152 __start( address ); // start SPI read operation
RichardE 0:d199d2362859 153 UInt8 data = __tr8( 0 ); // read byte from Gameduino
RichardE 0:d199d2362859 154 __end(); // end of SPI operation
RichardE 0:d199d2362859 155 return data; // return byte read
RichardE 0:d199d2362859 156 }
RichardE 0:d199d2362859 157
RichardE 0:d199d2362859 158 /**********************/
RichardE 0:d199d2362859 159 /* READ A 16 BIT WORD */
RichardE 0:d199d2362859 160 /**********************/
RichardE 0:d199d2362859 161 // Pass address in Gameduino memory to read from.
RichardE 0:d199d2362859 162 // Returns byte at that address.
RichardE 0:d199d2362859 163 UInt16 Gameduino::rd16( UInt16 address ) {
RichardE 0:d199d2362859 164 __start( address ); // start SPI read operation
RichardE 0:d199d2362859 165 UInt16 data = __tr16( 0 );
RichardE 0:d199d2362859 166 __end(); // end of SPI operation
RichardE 0:d199d2362859 167 return data; // return word read
RichardE 0:d199d2362859 168 }
RichardE 0:d199d2362859 169
RichardE 0:d199d2362859 170 /****************/
RichardE 0:d199d2362859 171 /* WRITE A BYTE */
RichardE 0:d199d2362859 172 /****************/
RichardE 0:d199d2362859 173 // Pass address to write to in address.
RichardE 0:d199d2362859 174 // Pass data to write in data.
RichardE 0:d199d2362859 175 void Gameduino::wr( UInt16 address, UInt8 data ) {
RichardE 0:d199d2362859 176 __wstart( address ); // start SPI write operation
RichardE 0:d199d2362859 177 __tr8( data );
RichardE 0:d199d2362859 178 __end(); // end of SPI operation
RichardE 0:d199d2362859 179 }
RichardE 0:d199d2362859 180
RichardE 0:d199d2362859 181 /***********************/
RichardE 0:d199d2362859 182 /* WRITE A 16 BIT WORD */
RichardE 0:d199d2362859 183 /***********************/
RichardE 0:d199d2362859 184 // Pass address to write to in address.
RichardE 0:d199d2362859 185 // Pass data to write in data.
RichardE 0:d199d2362859 186 void Gameduino::wr16( UInt16 address, UInt16 data ) {
RichardE 0:d199d2362859 187 __wstart( address );
RichardE 0:d199d2362859 188 __tr16( data );
RichardE 0:d199d2362859 189 __end();
RichardE 0:d199d2362859 190 }
RichardE 0:d199d2362859 191
RichardE 0:d199d2362859 192 /*********************************/
RichardE 0:d199d2362859 193 /* FILL AREA OF GAMEDUINO MEMORY */
RichardE 0:d199d2362859 194 /*********************************/
RichardE 0:d199d2362859 195 // Pass address to write to in address.
RichardE 0:d199d2362859 196 // Pass data to write to entire area in data.
RichardE 0:d199d2362859 197 // Pass number of bytes to write in count.
RichardE 0:d199d2362859 198 void Gameduino::fill( UInt16 address, UInt8 data, UInt16 count ) {
RichardE 0:d199d2362859 199 __wstart( address );
RichardE 0:d199d2362859 200 while( count-- ) {
RichardE 0:d199d2362859 201 __tr8( data );
RichardE 0:d199d2362859 202 }
RichardE 0:d199d2362859 203 __end();
RichardE 0:d199d2362859 204 }
RichardE 0:d199d2362859 205
RichardE 0:d199d2362859 206 /***********************************/
RichardE 0:d199d2362859 207 /* COPY DATA INTO GAMEDUINO MEMORY */
RichardE 0:d199d2362859 208 /***********************************/
RichardE 0:d199d2362859 209 // Pass address to write to in address.
RichardE 0:d199d2362859 210 // Pass pointer to source of data in src.
RichardE 0:d199d2362859 211 // Pass number of bytes to copy in count.
RichardE 0:d199d2362859 212 void Gameduino::copy( UInt16 address, const UInt8 *src, UInt16 count ) {
RichardE 0:d199d2362859 213 __wstart( address );
RichardE 0:d199d2362859 214 while( count-- ) {
RichardE 0:d199d2362859 215 __tr8( *src++ );
RichardE 0:d199d2362859 216 }
RichardE 0:d199d2362859 217 __end();
RichardE 0:d199d2362859 218 }
RichardE 0:d199d2362859 219
RichardE 0:d199d2362859 220 /*****************/
RichardE 0:d199d2362859 221 /* HIDE A SPRITE */
RichardE 0:d199d2362859 222 /*****************/
RichardE 0:d199d2362859 223 // Use only after specifying address to write to.
RichardE 0:d199d2362859 224 // Basically just writes 400 twice to SPI.
RichardE 0:d199d2362859 225 void Gameduino::xhide( void ) {
RichardE 0:d199d2362859 226 __tr16( 400 );
RichardE 0:d199d2362859 227 __tr16( 400 );
RichardE 0:d199d2362859 228 spr++;
RichardE 0:d199d2362859 229 }
RichardE 0:d199d2362859 230
RichardE 0:d199d2362859 231 /****************************************/
RichardE 0:d199d2362859 232 /* SEND SPRITE INFORMATION TO GAMEDUINO */
RichardE 0:d199d2362859 233 /****************************************/
RichardE 0:d199d2362859 234 // Use only after specifying address to write to.
RichardE 0:d199d2362859 235 // Pass coordinates in x and y.
RichardE 0:d199d2362859 236 // Pass sprite image number in image.
RichardE 0:d199d2362859 237 // Pass palette selection information in palette (use 0 for 256 colour palette).
RichardE 0:d199d2362859 238 // Pass rotation and flip setting in rot.
RichardE 0:d199d2362859 239 // Pass JK collision information in jk (0 or 1).
RichardE 0:d199d2362859 240 void Gameduino::TransferSprite( Int16 x, Int16 y, UInt8 image, UInt8 palette, Rotation rot, UInt8 jk ) {
RichardE 0:d199d2362859 241 __tr8( x & 0xFF );
RichardE 0:d199d2362859 242 __tr8( ( palette << 4 ) | ( rot << 1 ) | ( ( x >> 8 ) & 1 ) );
RichardE 0:d199d2362859 243 __tr8( y & 0xFF );
RichardE 0:d199d2362859 244 __tr8( ( jk << 7 ) | ( image << 1 ) | ( ( y >> 8 ) & 1 ) );
RichardE 0:d199d2362859 245 }
RichardE 0:d199d2362859 246
RichardE 0:d199d2362859 247 /**************************************************************************/
RichardE 0:d199d2362859 248 /* DRAW A SPRITE AT AN OFFSET FROM AN ORIGIN TAKING INTO ACCOUNT ROTATION */
RichardE 0:d199d2362859 249 /**************************************************************************/
RichardE 0:d199d2362859 250 // Use only after specifying address to write to.
RichardE 0:d199d2362859 251 // Pass origin coordinates in ox and oy.
RichardE 0:d199d2362859 252 // Pass offset from origin in x and y.
RichardE 0:d199d2362859 253 // Pass sprite image number in image.
RichardE 0:d199d2362859 254 // Pass palette selection information in palette (use 0 for 256 colour palette).
RichardE 0:d199d2362859 255 // Pass rotation and flip setting in rot.
RichardE 0:d199d2362859 256 // Pass JK collision information in jk (0 or 1).
RichardE 0:d199d2362859 257 void Gameduino::xsprite( Int16 ox, Int16 oy, Int8 x, Int8 y, UInt8 image, UInt8 palette, Rotation rot, UInt8 jk ) {
RichardE 0:d199d2362859 258 if( rot & 2 ) {
RichardE 0:d199d2362859 259 // Flip X.
RichardE 0:d199d2362859 260 x = -16 - x;
RichardE 0:d199d2362859 261 }
RichardE 0:d199d2362859 262 if( rot & 4 ) {
RichardE 0:d199d2362859 263 // Flip Y.
RichardE 0:d199d2362859 264 y = -16 - y;
RichardE 0:d199d2362859 265 }
RichardE 0:d199d2362859 266 if( rot & 1 ) {
RichardE 0:d199d2362859 267 // Swap X and Y.
RichardE 0:d199d2362859 268 int s;
RichardE 0:d199d2362859 269 s = x; x = y; y = s;
RichardE 0:d199d2362859 270 }
RichardE 0:d199d2362859 271 ox += x;
RichardE 0:d199d2362859 272 oy += y;
RichardE 0:d199d2362859 273 TransferSprite( ox, oy, image, palette, rot, jk );
RichardE 0:d199d2362859 274 spr++;
RichardE 0:d199d2362859 275 }
RichardE 0:d199d2362859 276
RichardE 0:d199d2362859 277 /***********************/
RichardE 0:d199d2362859 278 /* CONSTRUCT RGB VALUE */
RichardE 0:d199d2362859 279 /***********************/
RichardE 0:d199d2362859 280 // Pass red level in r.
RichardE 0:d199d2362859 281 // Pass green level in g.
RichardE 0:d199d2362859 282 // Pass blue level in b.
RichardE 0:d199d2362859 283 // Returns RGB value.
RichardE 0:d199d2362859 284 UInt16 Gameduino::RGB( UInt8 r, UInt8 g, UInt8 b ) {
RichardE 0:d199d2362859 285 return ((((r) >> 3) << 10) | (((g) >> 3) << 5) | ((b) >> 3));
RichardE 0:d199d2362859 286 }
RichardE 0:d199d2362859 287
RichardE 0:d199d2362859 288 /*********************/
RichardE 0:d199d2362859 289 /* SET PALETTE ENTRY */
RichardE 0:d199d2362859 290 /*********************/
RichardE 0:d199d2362859 291 // Pass pallete entry to set in pal.
RichardE 0:d199d2362859 292 // Pass RGB value to store in rgb.
RichardE 0:d199d2362859 293 void Gameduino::setpal( UInt16 pal, UInt16 rgb ) {
RichardE 0:d199d2362859 294 wr16( RAM_PAL + ( pal << 1 ), rgb );
RichardE 0:d199d2362859 295 }
RichardE 0:d199d2362859 296
RichardE 4:f6a33c5f0f7f 297 /***********************************************/
RichardE 4:f6a33c5f0f7f 298 /* WRITE SINGLE CHARACTER AT GIVEN COORDINATES */
RichardE 4:f6a33c5f0f7f 299 /***********************************************/
RichardE 4:f6a33c5f0f7f 300 // Pass X coordinate in x.
RichardE 4:f6a33c5f0f7f 301 // Pass Y coordinate in y.
RichardE 4:f6a33c5f0f7f 302 // Pass pointer to zero terminated text in s.
RichardE 4:f6a33c5f0f7f 303 void Gameduino::putchar( UInt8 x, UInt8 y, char c ) {
RichardE 4:f6a33c5f0f7f 304 __wstart( RAM_PIC + ( y << 6 ) + x );
RichardE 4:f6a33c5f0f7f 305 __tr8( c );
RichardE 4:f6a33c5f0f7f 306 __end();
RichardE 4:f6a33c5f0f7f 307 }
RichardE 4:f6a33c5f0f7f 308
RichardE 0:d199d2362859 309 /***********************************/
RichardE 0:d199d2362859 310 /* WRITE TEXT AT GIVEN COORDINATES */
RichardE 0:d199d2362859 311 /***********************************/
RichardE 0:d199d2362859 312 // Pass X coordinate in x.
RichardE 0:d199d2362859 313 // Pass Y coordinate in y.
RichardE 0:d199d2362859 314 // Pass pointer to zero terminated text in s.
RichardE 0:d199d2362859 315 void Gameduino::putstr( UInt8 x, UInt8 y, const char *s ) {
RichardE 0:d199d2362859 316 __wstart( RAM_PIC + ( y << 6 ) + x );
RichardE 0:d199d2362859 317 while( *s ) {
RichardE 0:d199d2362859 318 __tr8( *s++ );
RichardE 0:d199d2362859 319 }
RichardE 0:d199d2362859 320 __end();
RichardE 0:d199d2362859 321 }
RichardE 0:d199d2362859 322
RichardE 0:d199d2362859 323 /*********************/
RichardE 0:d199d2362859 324 /* POSITION A SPRITE */
RichardE 0:d199d2362859 325 /*********************/
RichardE 0:d199d2362859 326 // Pass sprite number in spr.
RichardE 0:d199d2362859 327 // Pass X and Y coordinates in x and y.
RichardE 0:d199d2362859 328 // Pass sprite image number in image.
RichardE 0:d199d2362859 329 // Pass palette selection information in palette (use 0 for 256 colour palette).
RichardE 0:d199d2362859 330 // Pass rotation and flip setting in rot.
RichardE 0:d199d2362859 331 // Pass JK collision information in jk (0 or 1).
RichardE 0:d199d2362859 332 void Gameduino::sprite( UInt8 spr, Int16 x, Int16 y, UInt8 image, UInt8 palette, Rotation rot, UInt8 jk ) {
RichardE 0:d199d2362859 333 __wstart( RAM_SPR + ( spr << 2 ) );
RichardE 0:d199d2362859 334 TransferSprite( x, y, image, palette, rot, jk );
RichardE 0:d199d2362859 335 __end();
RichardE 0:d199d2362859 336 }
RichardE 0:d199d2362859 337
RichardE 0:d199d2362859 338 /***********************************/
RichardE 0:d199d2362859 339 /* DRAW 4 SPRITES AS A 2 X 2 BLOCK */
RichardE 0:d199d2362859 340 /***********************************/
RichardE 0:d199d2362859 341 // Pass sprite number for first sprite in spr.
RichardE 0:d199d2362859 342 // Pass X and Y coordinates in x and y. These are coordinates of centre of group.
RichardE 0:d199d2362859 343 // Pass sprite image number for first image in image.
RichardE 0:d199d2362859 344 // Pass palette selection information in palette (use 0 for 256 colour palette).
RichardE 0:d199d2362859 345 // Pass rotation and flip setting in rot.
RichardE 0:d199d2362859 346 // Pass JK collision information in jk (0 or 1).
RichardE 0:d199d2362859 347 void Gameduino::sprite2x2( UInt8 spr, Int16 x, Int16 y, UInt8 image, UInt8 palette, Rotation rot, UInt8 jk ) {
RichardE 0:d199d2362859 348 __wstart( RAM_SPR + ( spr << 2 ) );
RichardE 0:d199d2362859 349 xsprite( x, y, -16, -16, image + 0, palette, rot, jk );
RichardE 0:d199d2362859 350 xsprite( x, y, 0, -16, image + 1, palette, rot, jk );
RichardE 0:d199d2362859 351 xsprite( x, y, -16, 0, image + 2, palette, rot, jk );
RichardE 0:d199d2362859 352 xsprite( x, y, 0, 0, image + 3, palette, rot, jk );
RichardE 0:d199d2362859 353 __end();
RichardE 0:d199d2362859 354 }
RichardE 0:d199d2362859 355
RichardE 0:d199d2362859 356 /**************************************************/
RichardE 0:d199d2362859 357 /* PLOT A NUMBER OF SPRITES RELATIVE TO AN ORIGIN */
RichardE 0:d199d2362859 358 /**************************************************/
RichardE 0:d199d2362859 359 // Use only after calling __wstartspr.
RichardE 0:d199d2362859 360 // Pass X and Y coordinates of origin in ox and oy.
RichardE 0:d199d2362859 361 // Pass pointer to an array of sprplot structures in psp.
RichardE 0:d199d2362859 362 // Pass number of structures in array in count.
RichardE 0:d199d2362859 363 // Pass rotation and flip setting in rot.
RichardE 0:d199d2362859 364 // Pass JK collision information in jk (0 or 1).
RichardE 0:d199d2362859 365 void Gameduino::plots( Int16 ox, Int16 oy, const sprplot *psp, UInt8 count, Rotation rot, UInt8 jk ) {
RichardE 0:d199d2362859 366 while( count-- ) {
RichardE 0:d199d2362859 367 xsprite( ox, oy, psp->x, psp->y, psp->image, psp->palette, rot, jk );
RichardE 0:d199d2362859 368 psp++;
RichardE 0:d199d2362859 369 }
RichardE 0:d199d2362859 370 }
RichardE 0:d199d2362859 371
RichardE 0:d199d2362859 372 /******************************/
RichardE 0:d199d2362859 373 /* WAIT FOR VERTICAL BLANKING */
RichardE 0:d199d2362859 374 /******************************/
RichardE 0:d199d2362859 375 void Gameduino::waitvblank( void ) {
RichardE 0:d199d2362859 376 // Wait until VBLANK register is zero.
RichardE 0:d199d2362859 377 while( rd( VBLANK ) ) {
RichardE 0:d199d2362859 378 // do nothing.
RichardE 0:d199d2362859 379 }
RichardE 0:d199d2362859 380 // Wait until VBLANK register is non-zero.
RichardE 0:d199d2362859 381 while( ! rd( VBLANK ) ) {
RichardE 0:d199d2362859 382 // do nothing.
RichardE 0:d199d2362859 383 }
RichardE 0:d199d2362859 384 // Exit just at the moment VBLANK goes from zero to non-zero.
RichardE 0:d199d2362859 385 }
RichardE 0:d199d2362859 386
RichardE 0:d199d2362859 387 /****************/
RichardE 0:d199d2362859 388 /* MAKE A NOISE */
RichardE 0:d199d2362859 389 /****************/
RichardE 0:d199d2362859 390 // Pass voice number in v.
RichardE 0:d199d2362859 391 // Pass waveform type in wave.
RichardE 0:d199d2362859 392 // Pass frequency in quarter Hz (so 100 Hz is 400) in freq.
RichardE 0:d199d2362859 393 // Pass amplitude for left channel in lamp.
RichardE 0:d199d2362859 394 // Pass amplitude for right channel in ramp.
RichardE 0:d199d2362859 395 void Gameduino::voice( UInt8 v, WaveForm wave, UInt16 freq, UInt8 lamp, UInt8 ramp ) {
RichardE 0:d199d2362859 396 __wstart( VOICES + ( v << 2 ) );
RichardE 0:d199d2362859 397 __tr8( freq & 0xFF );
RichardE 0:d199d2362859 398 __tr8( ( ( freq >> 8 ) & 0xFF ) | ( wave << 7 ) );
RichardE 0:d199d2362859 399 __tr8( lamp );
RichardE 0:d199d2362859 400 __tr8( ramp );
RichardE 0:d199d2362859 401 __end();
RichardE 0:d199d2362859 402 }
RichardE 3:a1c856358996 403
RichardE 3:a1c856358996 404 /********************/
RichardE 3:a1c856358996 405 /* HIDE ALL SPRITES */
RichardE 3:a1c856358996 406 /********************/
RichardE 3:a1c856358996 407 void Gameduino::HideAllSprites( void ) {
RichardE 3:a1c856358996 408 __wstart( RAM_SPR ); // Hide all sprites
RichardE 3:a1c856358996 409 for( int i = 0; i < 512; i++ ) {
RichardE 3:a1c856358996 410 xhide();
RichardE 3:a1c856358996 411 }
RichardE 3:a1c856358996 412 __end();
RichardE 3:a1c856358996 413 }
RichardE 5:d614b857b940 414