#include "../copyright" #include "seta.h" #include "memmap.h" ST018_Regs ST018; uint8_t S9xGetST018(uint32_t Address) { uint8_t t = 0; // Initialise to some value for the compiler uint16_t address = (uint16_t) Address & 0xFFFF; // these roles may be flipped // op output if (address == 0x3804) { if (ST018.out_count) { t = (uint8_t) ST018.output [ST018.out_index]; ST018.out_index++; if (ST018.out_count == ST018.out_index) ST018.out_count = 0; } else t = 0x81; } else if (address == 0x3800) // status register t = ST018.status; return t; } void S9xSetST018(uint8_t Byte, uint32_t Address) { uint16_t address = (uint16_t) Address & 0xFFFF; static bool reset = false; if (!reset) // bootup values { ST018.waiting4command = true; ST018.part_command = 0; reset = true; } Memory.SRAM[address] = Byte; ST018.status = 0x00; // default status for now if (address == 0x3804) // op data goes through this address { if (ST018.waiting4command && ST018.part_command == 2) // check for new commands: 3 bytes length { ST018.waiting4command = false; ST018.command <<= 8; ST018.command |= Byte; ST018.in_index = 0; ST018.out_index = 0; ST018.part_command = 0; // 3-byte commands ST018.pass = 0; // data streams into the chip switch (ST018.command & 0xFFFFFF) { case 0x0100: case 0xFF00: ST018.in_count = 0; break; default: ST018.waiting4command = true; break; } } else if (ST018.waiting4command) // 3-byte commands { ST018.part_command++; ST018.command <<= 8; ST018.command |= Byte; } } else if (address == 0x3802) // extra parameters { ST018.parameters[ST018.in_index] = Byte; ST018.in_index++; } if (ST018.in_count == ST018.in_index) // Actually execute the command { ST018.waiting4command = true; ST018.in_index = 0; ST018.out_index = 0; switch (ST018.command) { case 0x0100: case 0xFF00: // hardware check? ST018.waiting4command = false; ST018.pass++; if (ST018.pass == 1) { ST018.in_count = 1; ST018.out_count = 2; // Overload's research ST018.output[0x00] = 0x81; ST018.output[0x01] = 0x81; } else { ST018.out_count = 3; ST018.output[0x02] = 0x81; // done processing requests if (ST018.pass == 3) ST018.waiting4command = true; } break; } } }