+// -- 8bit+adapter+nocart --
+
+static void set_addr8an(int fd, uint32_t a)
+{
+ set_addr8(fd, do_flipflops(fd, a) | 0x200000);
+}
+
+static uint16_t read_bus8an(int fd, uint32_t a)
+{
+ return read_bus8(fd, do_flipflops(fd, a) | 0x200000);
+}
+
+static void write_bus8an(int fd, uint32_t a, uint16_t d)
+{
+ write_bus8(fd, do_flipflops(fd, a) | 0x200000, d);
+}
+
+static void flash_seq_write8an(int fd, uint32_t a, const uint8_t *d)
+{
+}
+
+#define N0 ""
+#define N1 "8bit"
+#define N2 "8bit+LoROM"
+#define N3 "8bit+LoROM+adapter"
+#define N4 "8bit+LoROM+adapter+sram"
+#define N5 "8bit+adapter (use '-a 0x400000' for HiROM)"
+#define N6 "8bit+adapter+nocart"
+static const struct iof
+{
+ const char *name;
+ int addrs_remapped;
+ void (*set_addr)(int fd, uint32_t addr);
+ uint16_t (*read_bus)(int fd, uint32_t addr);
+ void (*write_bus)(int fd, uint32_t addr, uint16_t d);
+ void (*read_block)(int fd, void *dst, uint32_t size);
+ void (*flash_seq_write)(int fd, uint32_t addr, const uint8_t *d);
+}
+io_ops[] =
+{
+ { N0, 0, set_addr16, read_bus16, write_bus16, read_block16, flash_seq_write16 },
+ { N1, 0, set_addr8, read_bus8, write_bus8, read_block8, flash_seq_write8 },
+ { N2, 1, set_addr8l, read_bus8l, write_bus8l, read_block8, flash_seq_write8l },
+ { N3, 1, set_addr8la, read_bus8la, write_bus8la, read_block8, flash_seq_write8la },
+ { N4, 0, set_addr8las, read_bus8las, write_bus8las, read_block8, flash_seq_write8las },
+ { N5, 0, set_addr8a, read_bus8a, write_bus8a, read_block8, flash_seq_write8a },
+ { N6, 0, set_addr8an, read_bus8an, write_bus8an, read_block8, flash_seq_write8an },
+};
+
+static const struct iof *io = &io_ops[0];
+
+static uint16_t flash_seq_r(int fd, uint8_t cmd, uint32_t addr)
+{
+ // unlock
+ assert(info.prog_addr);
+ io->write_bus(fd, info.prog_addr >> 0, 0xaa);
+ io->write_bus(fd, info.prog_addr >> 1, 0x55);
+
+ io->write_bus(fd, info.prog_addr >> 0, cmd);
+ return io->read_bus(fd, addr);
+}
+
+static void flash_seq_erase_d(int fd, uint32_t addr, uint8_t d)
+{
+ // printf("erase %06x\n", addr);
+ assert(info.prog_addr);
+ io->write_bus(fd, info.prog_addr >> 0, 0xaa);
+ io->write_bus(fd, info.prog_addr >> 1, 0x55);
+ io->write_bus(fd, info.prog_addr >> 0, 0x80);
+
+ io->write_bus(fd, info.prog_addr >> 0, 0xaa);
+ io->write_bus(fd, info.prog_addr >> 1, 0x55);
+ io->write_bus(fd, addr, d);
+}
+
+static void flash_seq_erase(int fd, uint32_t addr)
+{
+ flash_seq_erase_d(fd, addr, 0x30);
+}
+
+static void flash_seq_erase_full(int fd)
+{
+ flash_seq_erase_d(fd, info.prog_addr, 0x10);
+}
+