ぴゅう太の拡張スロットにRAM&ROMカートリッジをつないでみる その7

ぴゅう太/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,