Skip to content

Commit

Permalink
I2C: defer machine reset until after i2c_step() returns (#145)
Browse files Browse the repository at this point in the history
  • Loading branch information
mooinglemur authored Jul 20, 2023
1 parent e1ca1ff commit fa6279e
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 2 deletions.
8 changes: 8 additions & 0 deletions src/i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ uint8_t kbd_buffer[KBD_SIZE]; //Ring buffer for key codes
#define MSE_SIZE 8
uint8_t mse_buffer[MSE_SIZE]; //Ring buffer for mouse movement data

void i2c_reset_state() {
state = STATE_STOP;
read_mode = false;
value = 0;
count = 0;
smc_requested_reset = false;
}

uint8_t
i2c_read(uint8_t device, uint8_t offset) {
uint8_t value;
Expand Down
1 change: 1 addition & 0 deletions src/i2c.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ typedef struct {

extern i2c_port_t i2c_port;

void i2c_reset_state();
void i2c_step();

void i2c_kbd_buffer_add(uint8_t value);
Expand Down
3 changes: 3 additions & 0 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "serial.h"
#include "i2c.h"
#include "rtc.h"
#include "smc.h"
#include "vera_spi.h"
#include "sdcard.h"
#include "ieee.h"
Expand Down Expand Up @@ -291,6 +292,7 @@ void mouse_state_init(void)
void
machine_reset()
{
i2c_reset_state();
ieee_init();
memory_reset();
vera_spi_init();
Expand Down Expand Up @@ -1254,6 +1256,7 @@ emulator_loop(void *param)
{
uint32_t old_clockticks6502 = clockticks6502;
for (;;) {
if (smc_requested_reset) machine_reset();

if (testbench && pc == 0xfffd){
testbench_init();
Expand Down
5 changes: 3 additions & 2 deletions src/smc.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

uint8_t activity_led;
uint8_t mse_count = 0;
bool smc_requested_reset = false;

uint8_t
smc_read(uint8_t a) {
Expand Down Expand Up @@ -65,12 +66,12 @@ smc_write(uint8_t a, uint8_t v) {
#endif
exit(0);
} else if (v == 1) {
machine_reset();
smc_requested_reset = true;
}
break;
case 2:
if (v == 0) {
machine_reset();
smc_requested_reset = true;
}
break;
case 3:
Expand Down
2 changes: 2 additions & 0 deletions src/smc.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ extern void nmi6502();
uint8_t smc_read(uint8_t offset);
void smc_write(uint8_t offset, uint8_t value);

extern bool smc_requested_reset;

#endif

0 comments on commit fa6279e

Please sign in to comment.