2018-12-03 12:26:02 +01:00
|
|
|
/*****************************************************************************\
|
|
|
|
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
|
|
|
|
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"
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
static uint8 board[9][9]; // shougi playboard
|
|
|
|
static int line = 0; // line counter
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2009-11-30 09:14:38 +01:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
uint8 S9xGetST011 (uint32 Address)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
uint8 t;
|
|
|
|
uint16 address = (uint16) Address & 0xFFFF;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
|
|
|
line++;
|
|
|
|
|
|
|
|
// status check
|
|
|
|
if (address == 0x01)
|
2010-01-27 23:08:56 +01:00
|
|
|
t = 0xFF;
|
2008-08-06 03:09:59 +02:00
|
|
|
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
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
return (t);
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
void S9xSetST011 (uint32 Address, uint8 Byte)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
static bool reset = false;
|
|
|
|
uint16 address = (uint16) Address & 0xFFFF;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
|
|
|
line++;
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
if (!reset)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
|
|
|
// 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
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
Memory.SRAM[address] = Byte;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
|
|
|
// op commands/data goes through this address
|
2010-01-27 23:08:56 +01:00
|
|
|
if (address == 0x00)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
|
|
|
// 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)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
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;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
ST011.parameters[ST011.in_index] = Byte;
|
2008-08-06 03:09:59 +02:00
|
|
|
ST011.in_index++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
if (ST011.in_count == ST011.in_index)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
// actually execute the command
|
2008-08-06 03:09:59 +02:00
|
|
|
ST011.waiting4command = true;
|
2010-01-27 23:08:56 +01:00
|
|
|
ST011.out_index = 0;
|
|
|
|
|
2008-08-06 03:09:59 +02:00
|
|
|
switch (ST011.command)
|
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
// unknown: download playboard
|
|
|
|
case 0x01:
|
2008-08-06 03:09:59 +02:00
|
|
|
// 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;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
// unknown
|
|
|
|
case 0x02:
|
|
|
|
break;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
// unknown
|
|
|
|
case 0x04:
|
2008-08-06 03:09:59 +02:00
|
|
|
// outputs
|
|
|
|
Memory.SRAM[0x12C] = 0x00;
|
|
|
|
//Memory.SRAM[0x12D] = 0x00;
|
|
|
|
Memory.SRAM[0x12E] = 0x00;
|
2010-01-27 23:08:56 +01:00
|
|
|
break;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
// unknown
|
|
|
|
case 0x05:
|
2008-08-06 03:09:59 +02:00
|
|
|
// outputs
|
|
|
|
Memory.SRAM[0x12C] = 0x00;
|
|
|
|
//Memory.SRAM[0x12D] = 0x00;
|
|
|
|
Memory.SRAM[0x12E] = 0x00;
|
2010-01-27 23:08:56 +01:00
|
|
|
break;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
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:
|
2008-08-06 03:09:59 +02:00
|
|
|
// outputs
|
|
|
|
Memory.SRAM[0x12C] = 0x00;
|
|
|
|
Memory.SRAM[0x12D] = 0x00;
|
2010-01-27 23:08:56 +01:00
|
|
|
break;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|