At this point, nothing at all is done on an A2 reset. This can likely be improved. However, Apple2-IO-RPi doesn't seem to handle A2 reset exactly gracefully anyhow.

In general, it seems desirable to introduce some simple framing protocol - like SLIP - that allows to recover from an A2 reset in the middle of an Apple2-IO-RPi command execution.

Such a framing protocol would allow to introduce different frame types. One frame type could then be an A2 reset frame sent by the A2retroNET firmware.
This commit is contained in:
Oliver Schmidt 2022-09-11 23:15:27 +02:00 committed by Terence Boldt
parent 1b3c09b7ae
commit e0648c1048
3 changed files with 18 additions and 12 deletions

View File

@ -32,9 +32,9 @@ SOFTWARE.
extern const __attribute__((aligned(4))) uint8_t firmware[];
static uint32_t __not_in_flash("page") page;
static uint32_t page;
void __not_in_flash_func(board)(void) {
void __time_critical_func(board)(void) {
for (uint gpio = gpio_addr; gpio < gpio_addr + size_addr; gpio++) {
gpio_init(gpio);
gpio_set_pulls(gpio, false, false); // floating
@ -46,13 +46,7 @@ void __not_in_flash_func(board)(void) {
}
gpio_init(gpio_enbl);
gpio_pull_up(gpio_enbl);
gpio_init(gpio_irq);
gpio_pull_up(gpio_irq);
gpio_init(gpio_nmi);
gpio_pull_up(gpio_nmi);
gpio_set_pulls(gpio_enbl, false, false); // floating
uint offset;
@ -65,6 +59,8 @@ void __not_in_flash_func(board)(void) {
offset = pio_add_program(pio0, &read_program);
read_program_init(offset);
page = 0;
while (true) {
uint32_t enbl = pio_sm_get_blocking(pio0, sm_enbl);
uint32_t addr = enbl & 0x0FFF;
@ -73,7 +69,7 @@ void __not_in_flash_func(board)(void) {
uint32_t read = enbl & 0x1000; // R/W
if (read) {
if (!io) {
if (!io) { // DEVSEL
switch (addr & 0x7) {
case 0x3:
pio_sm_put(pio0, sm_read, !multicore_fifo_rvalid() << 7 |
@ -90,7 +86,7 @@ void __not_in_flash_func(board)(void) {
}
} else {
uint32_t data = pio_sm_get_blocking(pio0, sm_write);
if (!io) {
if (!io) { // DEVSEL
switch (addr & 0x7) {
case 0x5:
sio_hw->fifo_wr = data;

View File

@ -33,7 +33,7 @@ SOFTWARE.
.define public gpio_data 15 // 8 pins
.define public gpio_enbl 26 // DEVSEL | IOSEL | IOSTRB
.define public gpio_irq 27
.define public gpio_nmi 28
.define public gpio_res 28
.define public size_addr 13 // incl. R/W
.define public size_data 8

View File

@ -32,6 +32,7 @@ SOFTWARE.
#include "pico/cyw43_arch.h"
#endif
#include "bus.pio.h"
#include "board.h"
#ifdef TRACE
@ -48,6 +49,9 @@ void uart_printf(uart_inst_t *uart, const char *format, ...) {
}
#endif
void res_callback(uint gpio, uint32_t events) {
}
void main(void) {
multicore_launch_core1(board);
@ -58,6 +62,12 @@ void main(void) {
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
#endif
gpio_init(gpio_irq);
gpio_pull_up(gpio_irq);
gpio_init(gpio_res);
gpio_set_irq_enabled_with_callback(gpio_res, GPIO_IRQ_EDGE_RISE, true, &res_callback);
stdio_init_all();
stdio_set_translate_crlf(&stdio_usb, false);