2 TOSHIBA PASOPIA Emulator 'EmuPIA'
4 Author : Takeda.Toshiya
15 #define SET_BANK(s, e, w, r) { \
16 int sb = (s) >> 12, eb = (e) >> 12; \
17 for(int i = sb; i <= eb; i++) { \
21 wbank[i] = (w) + 0x1000 * (i - sb); \
26 rbank[i] = (r) + 0x1000 * (i - sb); \
31 void MEMORY::initialize()
34 memset(rdmy, 0xff, sizeof(rdmy));
38 SET_BANK(0x0000, 0x7fff, ram + 0x0000, rom + 0x0000);
39 SET_BANK(0x8000, 0xffff, ram + 0x8000, ram + 0x8000);
41 vram_data = mem_map = 0;
44 void MEMORY::load_ipl()
47 memset(rom, 0xff, sizeof(rom));
49 const _TCHAR *file_path = NULL;
50 FILEIO* fio = new FILEIO();
52 switch(config.boot_mode) {
53 case MODE_TBASIC_V1_0:
54 file_path = create_local_path(_T("TBASIC10.ROM"));
56 case MODE_TBASIC_V1_1:
57 file_path = create_local_path(_T("TBASIC11.ROM"));
60 case MODE_OABASIC_NO_DISK:
61 file_path = create_local_path(_T("OABASIC.ROM"));
63 case MODE_MINI_PASCAL:
64 file_path = create_local_path(_T("PASCAL.ROM"));
67 if(file_path != NULL && fio->Fopen(file_path, FILEIO_READ_BINARY)) {
68 fio->Fread(rom, sizeof(rom), 1);
72 if(fio->Fopen(create_local_path(_T("TBASIC.ROM")), FILEIO_READ_BINARY)) {
73 fio->Fread(rom, sizeof(rom), 1);
83 memset(vram, 0, sizeof(vram));
86 void MEMORY::write_data8(uint32_t addr, uint32_t data)
89 wbank[addr >> 12][addr & 0xfff] = data;
92 uint32_t MEMORY::read_data8(uint32_t addr)
95 return rbank[addr >> 12][addr & 0xfff];
98 void MEMORY::write_io8(uint32_t addr, uint32_t data)
106 SET_BANK(0x0000, 0x7fff, ram, ram);
108 SET_BANK(0x0000, 0x7fff, ram, rom);
110 // to 8255-2 port-c, bit2
111 d_pio2->write_signal(SIG_I8255_PORT_C, (mem_map & 2) ? 4 : 0, 4);
114 void MEMORY::write_signal(int id, uint32_t data, uint32_t mask)
117 if(id == SIG_MEMORY_I8255_0_A) {
118 // bit6 of high byte: 0=write, 1=read
119 vram_ptr = (vram_ptr & 0xff00) | (data & 0xff);
120 if(!(vram_ptr & 0x4000)) {
121 vram[vram_ptr & 0x3fff] = vram_data;
122 attr[vram_ptr & 0x3fff] = (vram_ptr & 0x8000) ? 1 : 0;
125 d_pio0->write_signal(SIG_I8255_PORT_C, vram[vram_ptr & 0x3fff], 0xff);
126 // to 8255-1 port-b, bit7
127 d_pio1->write_signal(SIG_I8255_PORT_B, attr[vram_ptr & 0x3fff] ? 0x80 : 0, 0x80);
128 } else if(id == SIG_MEMORY_I8255_0_B) {
129 vram_data = data & 0xff;
130 } else if(id == SIG_MEMORY_I8255_1_C) {
131 // bit6 of high byte: 0=write, 1=read
132 vram_ptr = (vram_ptr & 0x00ff) | ((data & 0xff) << 8);
133 if(!(vram_ptr & 0x4000)) {
134 vram[vram_ptr & 0x3fff] = vram_data;
135 attr[vram_ptr & 0x3fff] = (vram_ptr & 0x8000) ? 1 : 0;
138 d_pio0->write_signal(SIG_I8255_PORT_C, vram[vram_ptr & 0x3fff], 0xff);
139 // to 8255-1 port-b, bit7
140 d_pio1->write_signal(SIG_I8255_PORT_B, attr[vram_ptr & 0x3fff] ? 0x80 : 0, 0x80);
144 #define STATE_VERSION 1
146 bool MEMORY::process_state(FILEIO* state_fio, bool loading)
148 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
151 if(!state_fio->StateCheckInt32(this_device_id)) {
154 state_fio->StateBuffer(ram, sizeof(ram), 1);
155 state_fio->StateBuffer(vram, sizeof(vram), 1);
156 state_fio->StateBuffer(attr, sizeof(attr), 1);
157 state_fio->StateUint16(vram_ptr);
158 state_fio->StateUint8(vram_data);
159 state_fio->StateUint8(mem_map);
164 SET_BANK(0x0000, 0x7fff, ram, ram);
166 SET_BANK(0x0000, 0x7fff, ram, rom);