2 TOSHIBA PASOPIA Emulator 'EmuPIA'
4 Author : Takeda.Toshiya
13 #define SET_BANK(s, e, w, r) { \
14 int sb = (s) >> 12, eb = (e) >> 12; \
15 for(int i = sb; i <= eb; i++) { \
19 wbank[i] = (w) + 0x1000 * (i - sb); \
24 rbank[i] = (r) + 0x1000 * (i - sb); \
29 void PASOPIA_MEMORY::initialize()
32 memset(rdmy, 0xff, sizeof(rdmy));
36 SET_BANK(0x0000, 0x7fff, ram + 0x0000, rom + 0x0000);
37 SET_BANK(0x8000, 0xffff, ram + 0x8000, ram + 0x8000);
39 vram_data = mem_map = 0;
42 void PASOPIA_MEMORY::load_ipl()
45 memset(rom, 0xff, sizeof(rom));
47 const _TCHAR *file_path = NULL;
48 FILEIO* fio = new FILEIO();
50 switch(config.boot_mode) {
51 case MODE_TBASIC_V1_0:
52 file_path = create_local_path(_T("TBASIC10.ROM"));
54 case MODE_TBASIC_V1_1:
55 file_path = create_local_path(_T("TBASIC11.ROM"));
58 case MODE_OABASIC_NO_DISK:
59 file_path = create_local_path(_T("OABASIC.ROM"));
61 case MODE_MINI_PASCAL:
62 file_path = create_local_path(_T("PASCAL.ROM"));
65 if(file_path != NULL && fio->Fopen(file_path, FILEIO_READ_BINARY)) {
66 fio->Fread(rom, sizeof(rom), 1);
70 if(fio->Fopen(create_local_path(_T("TBASIC.ROM")), FILEIO_READ_BINARY)) {
71 fio->Fread(rom, sizeof(rom), 1);
79 void PASOPIA_MEMORY::reset()
81 memset(vram, 0, sizeof(vram));
84 void PASOPIA_MEMORY::write_data8(uint32_t addr, uint32_t data)
87 wbank[addr >> 12][addr & 0xfff] = data;
90 uint32_t PASOPIA_MEMORY::read_data8(uint32_t addr)
93 return rbank[addr >> 12][addr & 0xfff];
96 void PASOPIA_MEMORY::write_io8(uint32_t addr, uint32_t data)
104 SET_BANK(0x0000, 0x7fff, ram, ram);
106 SET_BANK(0x0000, 0x7fff, ram, rom);
108 // to 8255-2 port-c, bit2
109 d_pio2->write_signal(SIG_I8255_PORT_C, (mem_map & 2) ? 4 : 0, 4);
112 void PASOPIA_MEMORY::write_signal(int id, uint32_t data, uint32_t mask)
115 if(id == SIG_MEMORY_I8255_0_A) {
116 // bit6 of high byte: 0=write, 1=read
117 vram_ptr = (vram_ptr & 0xff00) | (data & 0xff);
118 if(!(vram_ptr & 0x4000)) {
119 vram[vram_ptr & 0x3fff] = vram_data;
120 attr[vram_ptr & 0x3fff] = (vram_ptr & 0x8000) ? 1 : 0;
123 d_pio0->write_signal(SIG_I8255_PORT_C, vram[vram_ptr & 0x3fff], 0xff);
124 // to 8255-1 port-b, bit7
125 d_pio1->write_signal(SIG_I8255_PORT_B, attr[vram_ptr & 0x3fff] ? 0x80 : 0, 0x80);
126 } else if(id == SIG_MEMORY_I8255_0_B) {
127 vram_data = data & 0xff;
128 } else if(id == SIG_MEMORY_I8255_1_C) {
129 // bit6 of high byte: 0=write, 1=read
130 vram_ptr = (vram_ptr & 0x00ff) | ((data & 0xff) << 8);
131 if(!(vram_ptr & 0x4000)) {
132 vram[vram_ptr & 0x3fff] = vram_data;
133 attr[vram_ptr & 0x3fff] = (vram_ptr & 0x8000) ? 1 : 0;
136 d_pio0->write_signal(SIG_I8255_PORT_C, vram[vram_ptr & 0x3fff], 0xff);
137 // to 8255-1 port-b, bit7
138 d_pio1->write_signal(SIG_I8255_PORT_B, attr[vram_ptr & 0x3fff] ? 0x80 : 0, 0x80);
142 #define STATE_VERSION 1
144 bool PASOPIA_MEMORY::process_state(FILEIO* state_fio, bool loading)
146 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
149 if(!state_fio->StateCheckInt32(this_device_id)) {
152 state_fio->StateBuffer(ram, sizeof(ram), 1);
153 state_fio->StateBuffer(vram, sizeof(vram), 1);
154 state_fio->StateBuffer(attr, sizeof(attr), 1);
155 state_fio->StateUint16(vram_ptr);
156 state_fio->StateUint8(vram_data);
157 state_fio->StateUint8(mem_map);
162 SET_BANK(0x0000, 0x7fff, ram, ram);
164 SET_BANK(0x0000, 0x7fff, ram, rom);