rlm@0: /* Communicates with SPC the way the SNES would. rlm@0: rlm@0: Note: You'll need an "spc_rom.h" file that contains the 64-byte IPL ROM contents */ rlm@0: rlm@0: #include "snes_spc/spc.h" rlm@0: rlm@0: #include "demo_util.h" rlm@0: #include rlm@0: #include rlm@0: rlm@0: static SNES_SPC* snes_spc; rlm@0: rlm@0: /* Make port access more convenient. Fakes time by simply incrementing it each call. */ rlm@0: static spc_time_t stime; rlm@0: static int pread ( int port ) { return spc_read_port( snes_spc, stime++, port ); } rlm@0: static void pwrite( int port, int data ) { spc_write_port( snes_spc, stime++, port, data ); } rlm@0: rlm@0: static unsigned char const spc_rom [spc_rom_size] = { rlm@0: /* ROM data not provided with emulator */ rlm@0: #include "spc_rom.h" rlm@0: }; rlm@0: rlm@0: int main() rlm@0: { rlm@0: int i; rlm@0: rlm@0: /* Data to upload */ rlm@0: static unsigned char const data [4] = "\xFA\xDE\xD1"; rlm@0: unsigned const data_addr = 0xF5; /* second I/O port */ rlm@0: rlm@0: snes_spc = spc_new(); rlm@0: if ( !snes_spc ) error( "Out of memory" ); rlm@0: spc_init_rom( snes_spc, spc_rom ); rlm@0: spc_reset( snes_spc ); rlm@0: rlm@0: /* Simulate reads and writes that SNES code would do */ rlm@0: rlm@0: /* Wait for SPC to be ready */ rlm@0: while ( pread( 0 ) != 0xAA || pread( 1 ) != 0xBB ) { } rlm@0: rlm@0: /* Start address */ rlm@0: pwrite( 2, data_addr & 0xFF ); rlm@0: pwrite( 3, data_addr >> 8 ); rlm@0: rlm@0: /* Tell SPC to start transfer and wait for acknowledgement */ rlm@0: pwrite( 0, 0xCC ); rlm@0: pwrite( 1, 0x01 ); rlm@0: while ( pread( 0 ) != 0xCC ) { } rlm@0: rlm@0: /* Send each byte and wait for acknowledgement */ rlm@0: for ( i = 0; i < 4; i++ ) rlm@0: { rlm@0: printf( "%02X ", data [i] ); rlm@0: pwrite( 1, data [i] ); rlm@0: pwrite( 0, i ); rlm@0: while ( pread( 0 ) != i ) { } rlm@0: } rlm@0: printf( "\n" ); rlm@0: rlm@0: /* Verify that data was transferred properly */ rlm@0: for ( i = 0; i < 3; i++ ) rlm@0: printf( "%02X ", pread( i + 1 ) ); rlm@0: printf( "\n" ); rlm@0: rlm@0: printf( "Cycles: %ld\n", (long) stime ); rlm@0: rlm@0: spc_delete( snes_spc ); rlm@0: rlm@0: return 0; rlm@0: }