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:
parent
1b3c09b7ae
commit
e0648c1048
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue