rainbow: fix 100% cpu usage

This commit is contained in:
Sylvain Gadrat 2022-01-20 16:07:31 +01:00 committed by contact@brokestudio.fr
parent 18a9a51a0e
commit 488fbd15b5
1 changed files with 29 additions and 34 deletions

View File

@ -26,8 +26,6 @@
#include "../ines.h"
#include "rainbow_esp.h"
#include <atomic>
#undef RAINBOW_DEBUG
//define RAINBOW_DEBUG
@ -130,20 +128,39 @@ static SFORMAT SStateRegs[] =
{ 0 }
};
// ESP interface
static EspFirmware *esp = NULL;
static std::atomic<bool> esp_running;
static bool esp_enable;
static bool esp_irq_enable;
static bool esp_message_received;
static bool has_esp_message_received;
static bool esp_message_sent;
std::thread esp_RX;
static void esp_check_new_message() {
// get new message if needed
if (esp_enable && esp->getDataReadyIO() && has_esp_message_received == false)
{
uint8 message_length = esp->tx();
FPGA_WRAM[rx_address << 8] = message_length;
for (uint8 i = 0; i < message_length; i++)
{
FPGA_WRAM[(rx_address << 8) + 1 + i] = esp->tx();
}
has_esp_message_received = true;
}
}
static bool esp_message_received() {
esp_check_new_message();
return has_esp_message_received;
}
static void clear_esp_message_received() {
has_esp_message_received = false;
}
static void Rainbow13EspMapIrq(int32) {
if (esp_irq_enable)
{
if (esp_message_received)
if (esp_message_received())
{
X6502_IRQBegin(FCEU_IQEXT);
}
@ -154,24 +171,6 @@ static void Rainbow13EspMapIrq(int32) {
}
}
// Mapper
void esp_check_new_message() {
while (esp_running) {
// get new message if needed
if (esp_enable && esp->getDataReadyIO() && esp_message_received == false)
{
uint8 message_length = esp->tx();
FPGA_WRAM[rx_address << 8] = message_length;
for (uint8 i = 0; i < message_length; i++)
{
FPGA_WRAM[(rx_address << 8) + 1 + i] = esp->tx();
}
esp_message_received = true;
}
}
}
static void Sync(void) {
static uint8 *address;
uint32 start;
@ -391,7 +390,7 @@ static DECLFR(Rainbow13Read) {
}
case 0x4101:
{
uint8 esp_message_received_flag = esp_message_received ? 0x80 : 0;
uint8 esp_message_received_flag = esp_message_received() ? 0x80 : 0;
uint8 esp_rts_flag = esp->getDataReadyIO() ? 0x40 : 0x00;
return esp_message_received_flag | esp_rts_flag;
}
@ -416,7 +415,7 @@ static DECLFW(Rainbow13Write) {
esp_irq_enable = V & 0x02;
break;
case 0x4101:
if (esp_enable) esp_message_received = false;
if (esp_enable) clear_esp_message_received();
else FCEU_printf("RAINBOW warning: $4100.0 is not set\n");
break;
case 0x4102:
@ -815,7 +814,7 @@ static void Rainbow13PPUWrite(uint32 A, uint8 V) {
static void Rainbow13Reset(void) {
esp_enable = false;
esp_message_received = false;
clear_esp_message_received();
esp_message_sent = true;
rx_address = 0;
tx_address = 0;
@ -888,10 +887,8 @@ static void Rainbow13Power(void) {
esp = new BrokeStudioFirmware;
esp_enable = false;
esp_irq_enable = false;
esp_message_received = false;
clear_esp_message_received();
esp_message_sent = true;
esp_running = true;
esp_RX = std::thread (esp_check_new_message);
}
static void Rainbow13Close(void)
@ -933,8 +930,6 @@ static void Rainbow13Close(void)
if (esp)
{
esp_enable = false;
esp_running = false;
esp_RX.join();
delete esp;
esp = NULL;
}