snes9xgx/source/snes9x/seta011.cpp

140 lines
2.9 KiB
C++
Raw Normal View History

/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
2008-09-10 07:57:37 +02:00
2009-11-30 09:14:38 +01:00
2010-01-27 23:08:56 +01:00
#include "snes9x.h"
2009-11-30 09:14:38 +01:00
#include "memmap.h"
2010-01-27 23:08:56 +01:00
#include "seta.h"
2010-01-27 23:08:56 +01:00
static uint8 board[9][9]; // shougi playboard
static int line = 0; // line counter
2009-11-30 09:14:38 +01:00
2010-01-27 23:08:56 +01:00
uint8 S9xGetST011 (uint32 Address)
{
2010-01-27 23:08:56 +01:00
uint8 t;
uint16 address = (uint16) Address & 0xFFFF;
line++;
// status check
if (address == 0x01)
2010-01-27 23:08:56 +01:00
t = 0xFF;
else
2010-01-27 23:08:56 +01:00
t = Memory.SRAM[address]; // read directly from s-ram
2008-09-10 07:57:37 +02:00
2010-01-27 23:08:56 +01:00
#ifdef DEBUGGER
if (address < 0x150)
printf("ST011 R: %06X %02X\n", Address, t);
#endif
2010-01-27 23:08:56 +01:00
return (t);
}
2010-01-27 23:08:56 +01:00
void S9xSetST011 (uint32 Address, uint8 Byte)
{
2010-01-27 23:08:56 +01:00
static bool reset = false;
uint16 address = (uint16) Address & 0xFFFF;
line++;
2010-01-27 23:08:56 +01:00
if (!reset)
{
// bootup values
ST011.waiting4command = true;
reset = true;
}
2010-01-27 23:08:56 +01:00
#ifdef DEBUGGER
if (address < 0x150)
printf("ST011 W: %06X %02X\n", Address, Byte);
#endif
2010-01-27 23:08:56 +01:00
Memory.SRAM[address] = Byte;
// op commands/data goes through this address
2010-01-27 23:08:56 +01:00
if (address == 0x00)
{
// check for new commands
if (ST011.waiting4command)
{
ST011.waiting4command = false;
2010-01-27 23:08:56 +01:00
ST011.command = Byte;
ST011.in_index = 0;
ST011.out_index = 0;
switch (ST011.command)
{
2010-01-27 23:08:56 +01:00
case 0x01: ST011.in_count = 12 * 10 + 8; break;
case 0x02: ST011.in_count = 4; break;
case 0x04: ST011.in_count = 0; break;
case 0x05: ST011.in_count = 0; break;
case 0x06: ST011.in_count = 0; break;
case 0x07: ST011.in_count = 0; break;
case 0x0E: ST011.in_count = 0; break;
default: ST011.waiting4command = true; break;
}
}
else
{
2010-01-27 23:08:56 +01:00
ST011.parameters[ST011.in_index] = Byte;
ST011.in_index++;
}
}
2010-01-27 23:08:56 +01:00
if (ST011.in_count == ST011.in_index)
{
2010-01-27 23:08:56 +01:00
// actually execute the command
ST011.waiting4command = true;
2010-01-27 23:08:56 +01:00
ST011.out_index = 0;
switch (ST011.command)
{
2010-01-27 23:08:56 +01:00
// unknown: download playboard
case 0x01:
// 9x9 board data: top to bottom, left to right
// Values represent piece types and ownership
2010-01-27 23:08:56 +01:00
for (int lcv = 0; lcv < 9; lcv++)
memcpy(board[lcv], ST011.parameters + lcv * 10, 9 * 1);
break;
2010-01-27 23:08:56 +01:00
// unknown
case 0x02:
break;
2010-01-27 23:08:56 +01:00
// unknown
case 0x04:
// outputs
Memory.SRAM[0x12C] = 0x00;
//Memory.SRAM[0x12D] = 0x00;
Memory.SRAM[0x12E] = 0x00;
2010-01-27 23:08:56 +01:00
break;
2010-01-27 23:08:56 +01:00
// unknown
case 0x05:
// outputs
Memory.SRAM[0x12C] = 0x00;
//Memory.SRAM[0x12D] = 0x00;
Memory.SRAM[0x12E] = 0x00;
2010-01-27 23:08:56 +01:00
break;
2010-01-27 23:08:56 +01:00
// unknown
case 0x06:
break;
2009-11-25 07:35:14 +01:00
2010-01-27 23:08:56 +01:00
case 0x07:
break;
// unknown
case 0x0E:
// outputs
Memory.SRAM[0x12C] = 0x00;
Memory.SRAM[0x12D] = 0x00;
2010-01-27 23:08:56 +01:00
break;
}
}
}