/* * mii_ssc.c * * Copyright (C) 2023 Michel Pollet * * SPDX-License-Identifier: MIT * */ /* THIS IS A PLACEHOLDER DO NOT USE */ #include "mii.h" #include #include #include #include #include #include #include "mii.h" #include "mii_bank.h" #include "mii_sw.h" #define INCBIN_STYLE INCBIN_STYLE_SNAKE #define INCBIN_PREFIX mii_ #include "incbin.h" INCBIN(ssc_rom, "roms/mii_rom_scc_3410065a.bin"); typedef struct mii_card_ssc_t { struct mii_slot_t * slot; struct mii_bank_t * rom; mii_t * mii; uint8_t slot_offset; } mii_card_ssc_t; static bool _mii_ssc_select( struct mii_bank_t *bank, void *param, uint16_t addr, uint8_t * byte, bool write) { mii_card_ssc_t *c = param; printf("%s selected:%d\n", __func__, c->slot->aux_rom_selected); if (c->slot->aux_rom_selected) return false; mii_bank_write(c->rom, 0xc800, mii_ssc_rom_data, 2048); c->slot->aux_rom_selected = true; SW_SETSTATE(c->mii, SLOTAUXROM, 1); c->mii->mem_dirty = true; return false; } static int _mii_ssc_init( mii_t * mii, struct mii_slot_t *slot ) { mii_card_ssc_t *c = calloc(1, sizeof(*c)); c->slot = slot; slot->drv_priv = c; c->mii = mii; printf("%s: THIS IS A PLACEHOLDER DO NOT USE\n", __func__); printf("%s loading in slot %d\n", __func__, slot->id + 1); c->slot_offset = slot->id + 1 + 0xc0; uint16_t addr = 0xc100 + (slot->id * 0x100); c->rom = &mii->bank[MII_BANK_CARD_ROM]; mii_bank_write(c->rom, addr, mii_ssc_rom_data + 7*256, 256); /* * install a callback that will be called for every access to the * ROM area, we need this to re-install the secondary part of the ROM * when the card 'slot' rom is accessed. */ mii_bank_install_access_cb(c->rom, _mii_ssc_select, c, addr >> 8, addr >> 8); return 0; } static void _mii_ssc_dispose( mii_t * mii, struct mii_slot_t *slot ) { mii_card_ssc_t *c = slot->drv_priv; free(c); slot->drv_priv = NULL; } static uint8_t _mii_ssc_access( mii_t * mii, struct mii_slot_t *slot, uint16_t addr, uint8_t byte, bool write) { // mii_card_ssc_t *c = slot->drv_priv; int psw = addr & 0x0F; // mii_bank_t * main = &mii->bank[MII_BANK_MAIN]; switch (psw) { default: printf("%s PC:%04x addr %04x %02x wr:%d\n", __func__, mii->cpu.PC, addr, byte, write); break; } return 0; } static int _mii_ssc_command( mii_t * mii, struct mii_slot_t *slot, uint8_t cmd, void * param) { // mii_card_ssc_t *c = slot->drv_priv; switch (cmd) { case MII_SLOT_SSC_SET_TTY: { const char * tty = param; printf("%s: set tty %s\n", __func__, tty); } break; } return -1; } static mii_slot_drv_t _driver = { .name = "ssc", .desc = "Super Serial card", .init = _mii_ssc_init, .dispose = _mii_ssc_dispose, .access = _mii_ssc_access, .command = _mii_ssc_command, }; MI_DRIVER_REGISTER(_driver);