ぴゅう太/Jr/mk2のカートリッジスロットに、16KB RAM(CXK58257P-10L) と 24KB ROM(27C256)をつなぐ方法を考えてみました。
Address A0 A1 A2 | /CE RAM /CE2 A14 A13 ROM >0000 0 0 0 | 1 1 - - >2000 0 0 1 | 1 1 - - >4000 0 1 0 | 1 0 1 0 >4000 >6000 0 1 1 | 0 >6000 1 - - >8000 1 0 0 | 1 0 0 0 >0000 >A000 1 0 1 | 1 0 0 1 >2000 >C000 1 1 0 | 0 >4000 1 - - >E000 1 1 1 | 1 1 - -
ePyutaの改造方法は以下になります。市販されていない24KBカートリッジのみ拡張16KB RAMが有効になります。
CTRLの機能を切り替えることで、日本語G-BASICをテキストファイルから貼り付けできるようにしました。^で英数モード、[でカナモード。
^10 [カケ^1,"[ヌヌヌ" ^20 [オワリ
TINY野郎さんのVRAM DEBUGGERをマージしました。
http://www.geocities.jp/parallel_computer_inc/epyuta16d.zip
memory.h
uint8_t ipl[0x8000]; // ipl rom (32k) uint8_t basic[0x4000]; // basic rom (16k) uint8_t cart[0x8000]; // cartridge (32k) uint8_t extram[0x4000]; // extram (16k)
memory.cpp
#define ENABLE_CART() { \ if(ctype == 4) { \ SET_BANK(0x0000, 0x3fff, wdmy, ipl); \ SET_BANK(0x4000, 0xbfff, wdmy, cart); \ } else if(ctype == 3) { \ SET_BANK(0x0000, 0x3fff, wdmy, ipl); \ SET_BANK(0x4000, 0x5fff, wdmy, cart+0x4000); \ SET_BANK(0x6000, 0x7fff, extram, extram); \ SET_BANK(0x8000, 0xbfff, wdmy, cart); \ SET_BANK(0xc000, 0xdfff, extram+0x2000, extram+0x2000); \ } else { \ SET_BANK(0x0000, 0x7fff, wdmy, ipl); \ SET_BANK(0x8000, 0xbfff, wdmy, cart); \ } \ cart_enabled = true; \ } (省略) uint32_t MEMORY::read_io8(uint32_t addr) { static bool flag = false; (省略) // if(key[0xbd] ) val |= 0x02; // - if(key[0xbd]) if (key[0x10]) val |= 0x01; else val |= 0x02; (省略) case 0xec6: // if(key[0x11]) val |= 0x02; // EISUU -> CTRL if (key[0x5b]) flag=false; // [ if (key[0x5e]) flag=true; // ^ if (flag) if(!key[0x11]) val |= 0x02; // EISUU -> CTRL else if(key[0x11]) val |= 0x02; // EISUU -> CTRL (省略) void MEMORY::open_cart(const _TCHAR* file_path) { // open cart FILEIO* fio = new FILEIO(); if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { // 8kb ctype = fio->Fread(cart, 0x2000, 1); memcpy(cart + 0x2000, cart, 0x2000); // 16kb ctype += fio->Fread(cart + 0x2000, 0x2000, 1); // 24kb ctype += fio->Fread(cart + 0x4000, 0x2000, 1); // 32kb ctype += fio->Fread(cart + 0x6000, 0x2000, 1); fio->Fclose(); ENABLE_CART(); } delete fio; }
emu.cpp
#ifdef AUTO_KEY_US {0x5b, 0x000 | 0xc0}, // '[' {0x5c, 0x000 | 0xe2}, // '\' {0x5d, 0x000 | 0xdb}, // ']' {0x5e, 0x100 | 0x36}, // '^' {0x5f, 0x100 | 0xbd}, // '_' {0x60, 0x000 | 0xdd}, // '`' #else // {0x5b, 0x000 | 0xdb}, // '[' {0x5b, 0x400 | 0x5b}, // '[' {0x5c, 0x000 | 0xdc}, // '\' {0x5d, 0x000 | 0xdd}, // ']' // {0x5e, 0x000 | 0xde}, // '^' {0x5e, 0x400 | 0x5e}, // '^' {0x5f, 0x100 | 0xe2}, // '_' {0x60, 0x100 | 0xc0}, // '`' #endif
osd_input.cpp
static const uint8_t vk_dik[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x79, 0x7b, 0x00, 0x00, 0x39, 0xc9, 0xd1, 0xcf, 0xc7, 0xcb, 0xc8, 0xcd, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xd2, 0xd3, 0x00, 0x0b, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x2e, 0x20, 0x12, 0x21, 0x22, 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, // 0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11, 0x2d, 0x15, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11, 0x2d, 0x15, 0x2c, 0x1A, 0x00, 0x00, 0x90, 0x00,