Previous 199869 Revisions Next

r22045 Saturday 23rd March, 2013 at 17:30:53 UTC by Angelo Salese
Check-point
[src/mess/drivers]mz3500.c

trunk/src/mess/drivers/mz3500.c
r22044r22045
2828   UINT8 *m_work_ram;
2929   UINT8 *m_shared_ram;
3030
31   UINT8 m_ma,m_mo,m_ms,m_me2,m_me1;
32
3133   DECLARE_READ8_MEMBER(mz3500_master_mem_r);
3234   DECLARE_WRITE8_MEMBER(mz3500_master_mem_w);
3335   DECLARE_READ8_MEMBER(mz3500_ipl_r);
r22044r22045
3638   DECLARE_WRITE8_MEMBER(mz3500_work_ram_w);
3739   DECLARE_READ8_MEMBER(mz3500_shared_ram_r);
3840   DECLARE_WRITE8_MEMBER(mz3500_shared_ram_w);
41   DECLARE_READ8_MEMBER(mz3500_io_r);
42   DECLARE_WRITE8_MEMBER(mz3500_io_w);
3943
4044   // screen updates
4145   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
r22044r22045
8185
8286READ8_MEMBER(mz3500_state::mz3500_master_mem_r)
8387{
84   if((offset & 0xe000) == 0x0000) { return mz3500_ipl_r(space,(offset & 0xfff) | 0x1000); }
85   if((offset & 0xe000) == 0x2000) { return mz3500_basic_r(space,offset & 0x1fff); }
86   if((offset & 0xe000) == 0x4000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0x4000); }
87   if((offset & 0xe000) == 0x6000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0x6000); }
88   if((offset & 0xe000) == 0x8000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0x8000); }
89   if((offset & 0xe000) == 0xa000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0xa000); }
90   if((offset & 0xe000) == 0xc000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0xc000); }
91   if((offset & 0xe000) == 0xe000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0xe000); }
88   if(m_ms == 0)
89   {
90      if((offset & 0xe000) == 0x0000) { return mz3500_ipl_r(space,(offset & 0xfff) | 0x1000); }
91      if((offset & 0xe000) == 0x2000) { return mz3500_basic_r(space,(offset & 0x1fff) | 0x2000); }
92      if((offset & 0xc000) == 0x4000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x4000); }
93      if((offset & 0xc000) == 0x8000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x8000); }
94      if((offset & 0xc000) == 0xc000)
95      {
96         if(m_ma == 0x0) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0xc000); }
97         if(m_ma == 0x1) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x0000); }
98         if(m_ma == 0xf) { return mz3500_shared_ram_r(space,(offset & 0x7ff)); }
99      }
92100
101      printf("Error: read with unmapped memory bank offset %04x MS %02x MA %02x\n",offset,m_ms,m_ma);
102   }
103   else if(m_ms == 1)
104   {
105      return ((offset & 0xf800) == 0xf800) ? mz3500_shared_ram_r(space,(offset & 0x7ff)) : mz3500_work_ram_r(space,offset);
106   }
107   else if(m_ms == 2) // ROM based BASIC
108   {
109      if((offset & 0xe000) == 0x0000) { return mz3500_basic_r(space,offset & 0x1fff); }
110      if((offset & 0xe000) == 0x2000)
111      {
112         switch(m_mo)
113         {
114            case 0x0: return mz3500_basic_r(space,(offset & 0x1fff) | 0x2000);
115            case 0x1: return mz3500_basic_r(space,(offset & 0x1fff) | 0x4000);
116            case 0x2: return mz3500_basic_r(space,(offset & 0x1fff) | 0x6000);
117         }
118
119         printf("Error: read with unmapped memory bank offset %04x MS %02x MO %02x\n",offset,m_ms,m_mo);
120      }
121      if((offset & 0xc000) == 0x4000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x4000); }
122      if((offset & 0xc000) == 0x8000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x8000); }
123      if((offset & 0xc000) == 0xc000)
124      {
125         switch(m_ma)
126         {
127            case 0x0: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x0c000);
128            case 0x1: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x00000);
129            case 0x2: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x10000);
130            case 0x3: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x14000);
131            case 0x4: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x18000);
132            case 0x5: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x1c000);
133            case 0x6: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x20000);
134            case 0x7: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x24000);
135            case 0x8: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x28000);
136            case 0x9: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x2c000);
137            case 0xa: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x30000);
138            case 0xb: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x34000);
139            case 0xc: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x38000);
140            case 0xd: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x3c000);
141            case 0xf: return mz3500_shared_ram_r(space,(offset & 0x7ff));
142         }
143      }
144
145      printf("Error: read with unmapped memory bank offset %04x MS %02x MA %02x\n",offset,m_ms,m_ma);
146   }
147
93148   return 0xff;
94149}
95150
96151WRITE8_MEMBER(mz3500_state::mz3500_master_mem_w)
97152{
98   if((offset & 0xe000) == 0x4000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0x4000,data); return; }
99   if((offset & 0xe000) == 0x6000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0x6000,data); return; }
100   if((offset & 0xe000) == 0x8000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0x8000,data); return; }
101   if((offset & 0xe000) == 0xa000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0xa000,data); return; }
102   if((offset & 0xe000) == 0xc000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0xc000,data); return; }
103   if((offset & 0xe000) == 0xe000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0xe000,data); return; }
153   if(m_ms == 0) // Initialize State
154   {
155      if((offset & 0xc000) == 0x4000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x4000,data); return; }
156      if((offset & 0xc000) == 0x8000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x8000,data); return; }
157      if((offset & 0xc000) == 0xc000)
158      {
159         if(m_ma == 0x0) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0xc000,data); return; }
160         if(m_ma == 0x1) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x0000,data); return; }
161         if(m_ma == 0xf) { mz3500_shared_ram_w(space,(offset & 0x7ff),data); return; }
162      }
104163
164      printf("Error: write with unmapped memory bank offset %04x data %02x MS %02x MA %02x\n",offset,data,m_ms,m_ma);
165   }
166   else if(m_ms == 1) // System Loading & CP/M
167   {
168      if((offset & 0xf800) == 0xf800)
169         mz3500_shared_ram_w(space,(offset & 0x7ff),data);
170      else
171         mz3500_work_ram_w(space,offset,data);
172
173      return;
174   }
175   else if(m_ms == 2) // ROM based BASIC
176   {
177      if((offset & 0xc000) == 0x4000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x4000,data); return; }
178      if((offset & 0xc000) == 0x8000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x8000,data); return; }
179      if((offset & 0xc000) == 0xc000)
180      {
181         switch(m_ma)
182         {
183            case 0x0: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x0c000,data); return;
184            case 0x1: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x00000,data); return;
185            case 0x2: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x10000,data); return;
186            case 0x3: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x14000,data); return;
187            case 0x4: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x18000,data); return;
188            case 0x5: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x1c000,data); return;
189            case 0x6: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x20000,data); return;
190            case 0x7: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x24000,data); return;
191            case 0x8: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x28000,data); return;
192            case 0x9: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x2c000,data); return;
193            case 0xa: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x30000,data); return;
194            case 0xb: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x34000,data); return;
195            case 0xc: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x38000,data); return;
196            case 0xd: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x3c000,data); return;
197            case 0xf: mz3500_shared_ram_w(space,(offset & 0x7ff),data); return;
198         }
199      }
200
201      printf("Error: write with unmapped memory bank offset %04x data %02x MS %02x MA %02x\n",offset,data,m_ms,m_ma);
202   }
203
105204}
106205
107206READ8_MEMBER(mz3500_state::mz3500_shared_ram_r)
r22044r22045
114213   m_shared_ram[offset] = data;
115214}
116215
216READ8_MEMBER(mz3500_state::mz3500_io_r)
217{
218   /*
219   [2]
220   ---x xxx- system assign switch
221   ---- ---x "SEC" FD assign
222   [3]
223   xxx- ---- FD assign
224   ---x ---- slave CPU Ready signal
225   ---- x--- slave CPU ack signal
226   ---- -xxx interrupt status
227   */
228
229   return 0;
230}
231
232WRITE8_MEMBER(mz3500_state::mz3500_io_w)
233{
234   /*
235   [0]
236   ---- --x- SRQ bus request from master to slave
237   ---- ---x E1
238   [1]
239   x--- ---- slave reset signal
240   ---- --xx memory system define
241   [2]
242   xxxx ---- ma bank (memory 0xc000-0xffff)
243   ---- -xxx mo bank (memory 0x2000-0x3fff)
244   [3]
245   x--- ---- me2 bank (memory 0x8000-0xbfff)
246   -x-- ---- me1 bank (memory 0x4000-0x7fff)
247   */
248
249   switch(offset)
250   {
251      case 1:
252         m_ms = data & 3;
253         break;
254      case 2:
255         m_ma = (data & 0xf0) >> 4;
256         m_mo = (data & 0x07);
257         break;
258      case 3:
259         m_me2 = (data & 0x80) >> 7;
260         m_me1 = (data & 0x40) >> 6;
261         break;
262   }
263}
264
117265static ADDRESS_MAP_START( mz3500_master_map, AS_PROGRAM, 8, mz3500_state )
118266   AM_RANGE(0x0000, 0xffff) AM_READWRITE(mz3500_master_mem_r,mz3500_master_mem_w)
119267ADDRESS_MAP_END
r22044r22045
125273//   AM_RANGE(0xec, 0xef) irq signal from slave to master CPU
126274//   AM_RANGE(0xf4, 0xf7) MFD upd765
127275//   AM_RANGE(0xf8, 0xfb) MFD I/O port
128//   AM_RANGE(0xfc, 0xff) memory mapper
276   AM_RANGE(0xfc, 0xff) AM_READWRITE(mz3500_io_r,mz3500_io_w) // memory mapper
129277ADDRESS_MAP_END
130278
131279static ADDRESS_MAP_START( mz3500_slave_map, AS_PROGRAM, 8, mz3500_state )
r22044r22045
228376
229377void mz3500_state::machine_reset()
230378{
379   /* init memory bank states */
380   m_ms = 0;
381   m_ma = 0;
382   m_mo = 0;
383   m_me1 = 0;
384   m_me2 = 0;
385   m_slave->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
231386}
232387
233388

Previous 199869 Revisions Next


© 1997-2024 The MAME Team