OSDN Git Service

[VM][FMTOWNS][MEMORY] Fix setup around memory banks by I/O 0404h and 0480h.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2500 / mz1m01.cpp
1 /*
2         SHARP MZ-2200 Emulator 'EmuZ-2200'
3
4         Author : Takeda.Toshiya
5         Date   : 2013.03.30-
6
7         [ MZ-1M01 (16bit Board) ]
8 */
9
10 #include "mz1m01.h"
11 #include "../z80pio.h"
12
13 namespace MZ80B {
14
15 #define SET_BANK(s, e, w, r) { \
16         int sb = (s) >> 13, eb = (e) >> 13; \
17         for(int i = sb; i <= eb; i++) { \
18                 if(((uintptr_t)w) == ((uintptr_t)wdmy)) {       \
19                         wbank[i] = wdmy; \
20                 } else { \
21                         wbank[i] = (w) + 0x2000 * (i - sb); \
22                 } \
23                 if(((uintptr_t)r) == ((uintptr_t)rdmy)) {       \
24                         rbank[i] = rdmy; \
25                 } else { \
26                         rbank[i] = (r) + 0x2000 * (i - sb); \
27                 } \
28         } \
29 }
30
31 void MZ1M01::initialize()
32 {
33         memset(ram, 0, sizeof(ram));
34         memset(ipl, 0xff, sizeof(ipl));
35         memset(kanji, 0xff, sizeof(kanji));
36         memset(rdmy, 0xff, sizeof(rdmy));
37         
38         FILEIO* fio = new FILEIO();
39         if(fio->Fopen(create_local_path(_T("MZ-1M01.ROM")), FILEIO_READ_BINARY)) {
40                 fio->Fread(ipl, sizeof(ipl), 1);
41                 fio->Fclose();
42         } else {
43                 d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
44         }
45         if(fio->Fopen(create_local_path(_T("MZ-1R08.ROM")), FILEIO_READ_BINARY)) {
46                 fio->Fread(kanji, sizeof(kanji), 1);
47                 fio->Fclose();
48         }
49         delete fio;
50         
51         SET_BANK(0x00000, 0x1ffff, ram, ram);
52         SET_BANK(0x20000, 0x3ffff, wdmy, rdmy);
53         SET_BANK(0x40000, 0x5ffff, wdmy, kanji);
54         SET_BANK(0x60000, 0xfdfff, wdmy, rdmy);
55         SET_BANK(0xfe000, 0xfffff, wdmy, ipl);
56 }
57
58 void MZ1M01::reset()
59 {
60         port[0] = port[1] = 0xff;
61 }
62
63 void MZ1M01::write_data8(uint32_t addr, uint32_t data)
64 {
65         addr &= 0xfffff;
66         wbank[addr >> 13][addr & 0x1fff] = data;
67 }
68
69 uint32_t MZ1M01::read_data8(uint32_t addr)
70 {
71         addr &= 0xfffff;
72         return rbank[addr >> 13][addr & 0x1fff];
73 }
74
75 void MZ1M01::write_io8(uint32_t addr, uint32_t data)
76 {
77         switch(addr & 0xff) {
78         case 0x7c:
79         case 0x7d:
80                 d_pic->write_io8(addr, data);
81                 break;
82         case 0x7e:
83                 d_pio->write_signal(SIG_Z80PIO_PORT_A, data, 0xff);
84                 d_pio->write_signal(SIG_Z80PIO_STROBE_B, 1, 1);
85                 break;
86         case 0x7f:
87                 d_pio->write_signal(SIG_Z80PIO_PORT_B, data, 0x7f);
88                 port[1] = (port[1] & 0x80) | (data & 0x7f);
89                 break;
90         }
91 }
92
93 uint32_t MZ1M01::read_io8(uint32_t addr)
94 {
95         switch(addr & 0xff) {
96         case 0x7c:
97         case 0x7d:
98                 return d_pic->read_io8(addr);
99         case 0x7e:
100                 d_pio->write_signal(SIG_Z80PIO_STROBE_A, 1, 1);
101         case 0x7f:
102                 return port[addr & 1];
103         }
104         return 0xff;
105 }
106
107 void MZ1M01::write_signal(int id, uint32_t data, uint32_t mask)
108 {
109         if(id == SIG_MZ1M01_PORT_A) {
110                 port[0] = (port[0] & ~mask) | (data & mask);
111         } else if(id == SIG_MZ1M01_PORT_B) {
112                 port[1] = (port[1] & ~mask) | (data & mask);
113         }
114 }
115
116 #define STATE_VERSION   1
117
118 bool MZ1M01::process_state(FILEIO* state_fio, bool loading)
119 {
120         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
121                 return false;
122         }
123         if(!state_fio->StateCheckInt32(this_device_id)) {
124                 return false;
125         }
126         state_fio->StateArray(ram, sizeof(ram), 1);
127         state_fio->StateArray(port, sizeof(port), 1);
128         return true;
129 }
130
131 }