Previous 199869 Revisions Next

r18035 Thursday 20th September, 2012 at 08:36:19 UTC by Miodrag Milanović
Modernized archimedes (no whatsnew)
[src/mame/drivers]aristmk5.c ertictac.c
[src/mame/includes]archimds.h
[src/mame/machine]archimds.c
[src/mame/video]archimds.c
[src/mess/drivers]a310.c

trunk/src/mame/machine/archimds.c
r18034r18035
3535#include "machine/wd17xx.h"
3636
3737static const int page_sizes[4] = { 4096, 8192, 16384, 32768 };
38static const UINT32 pixel_rate[4] = { 8000000, 12000000, 16000000, 24000000};
3839
3940#define IOC_LOG 0
4041
41static UINT32 *archimedes_memc_physmem;
42static UINT32 memc_pagesize;
43static int memc_latchrom;
44static UINT32 ioc_timercnt[4], ioc_timerout[4];
45static UINT32 vidc_vidstart, vidc_vidend, vidc_vidinit,vidc_vidcur;
46static UINT32 vidc_sndstart, vidc_sndend, vidc_sndcur;
47static UINT8 video_dma_on,audio_dma_on;
48UINT8 i2c_clk;
49INT16 memc_pages[0x2000];   // the logical RAM area is 32 megs, and the smallest page size is 4k
50UINT32 vidc_regs[256];
51UINT8 ioc_regs[0x80/4];
52UINT8 vidc_bpp_mode;
53UINT8 vidc_interlace;
54static UINT8 vidc_pixel_clk;
55static const UINT32 pixel_rate[4] = { 8000000, 12000000, 16000000, 24000000};
56static UINT8 vidc_stereo_reg[8];
57
58static emu_timer *timer[4], *snd_timer, *vid_timer;
59static emu_timer *vbl_timer;
60
61void archimedes_request_irq_a(running_machine &machine, int mask)
42void archimedes_state::archimedes_request_irq_a(int mask)
6243{
63   ioc_regs[IRQ_STATUS_A] |= mask;
44   m_ioc_regs[IRQ_STATUS_A] |= mask;
6445
65   if (ioc_regs[IRQ_MASK_A] & mask)
46   if (m_ioc_regs[IRQ_MASK_A] & mask)
6647   {
67      machine.device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, ASSERT_LINE);
48      machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, ASSERT_LINE);
6849   }
6950}
7051
71void archimedes_request_irq_b(running_machine &machine, int mask)
52void archimedes_state::archimedes_request_irq_b(int mask)
7253{
73   ioc_regs[IRQ_STATUS_B] |= mask;
54   m_ioc_regs[IRQ_STATUS_B] |= mask;
7455
75   if (ioc_regs[IRQ_MASK_B] & mask)
56   if (m_ioc_regs[IRQ_MASK_B] & mask)
7657   {
77      generic_pulse_irq_line(machine.device("maincpu"), ARM_IRQ_LINE, 1);
58      generic_pulse_irq_line(machine().device("maincpu")->execute(), ARM_IRQ_LINE, 1);
7859   }
7960}
8061
81void archimedes_request_fiq(running_machine &machine, int mask)
62void archimedes_state::archimedes_request_fiq(int mask)
8263{
83   ioc_regs[FIQ_STATUS] |= mask;
64   m_ioc_regs[FIQ_STATUS] |= mask;
8465
85   if (ioc_regs[FIQ_MASK] & mask)
66   if (m_ioc_regs[FIQ_MASK] & mask)
8667   {
87      generic_pulse_irq_line(machine.device("maincpu"), ARM_FIRQ_LINE, 1);
68      generic_pulse_irq_line(machine().device("maincpu")->execute(), ARM_FIRQ_LINE, 1);
8869   }
8970}
9071
91void archimedes_clear_irq_a(running_machine &machine, int mask)
72void archimedes_state::archimedes_clear_irq_a(int mask)
9273{
93   ioc_regs[IRQ_STATUS_A] &= ~mask;
74   m_ioc_regs[IRQ_STATUS_A] &= ~mask;
9475}
9576
96void archimedes_clear_irq_b(running_machine &machine, int mask)
77void archimedes_state::archimedes_clear_irq_b(int mask)
9778{
98   ioc_regs[IRQ_STATUS_B] &= ~mask;
79   m_ioc_regs[IRQ_STATUS_B] &= ~mask;
9980}
10081
101void archimedes_clear_fiq(running_machine &machine, int mask)
82void archimedes_state::archimedes_clear_fiq(int mask)
10283{
103   ioc_regs[FIQ_STATUS] &= ~mask;
84   m_ioc_regs[FIQ_STATUS] &= ~mask;
10485}
10586
106static TIMER_CALLBACK( vidc_vblank )
87void archimedes_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
10788{
108   archimedes_request_irq_a(machine, ARCHIMEDES_IRQA_VBL);
89   switch (id)
90   {
91      case TIMER_VBLANK: vidc_vblank();break;
92      case TIMER_VIDEO: vidc_video_tick(); break;
93      case TIMER_AUDIO: vidc_audio_tick(); break;
94      case TIMER_IOC: ioc_timer(param); break;
95   }
96}
10997
98
99void archimedes_state::vidc_vblank()
100{
101   archimedes_request_irq_a(ARCHIMEDES_IRQA_VBL);
102
110103   // set up for next vbl
111   vbl_timer->adjust(machine.primary_screen->time_until_pos(vidc_regs[0xb4]));
104   m_vbl_timer->adjust(machine().primary_screen->time_until_pos(m_vidc_regs[0xb4]));
112105}
113106
114107/* video DMA */
115108/* TODO: what type of DMA this is, burst or cycle steal? Docs doesn't explain it (4 usec is the DRAM refresh). */
116static TIMER_CALLBACK( vidc_video_tick )
109void archimedes_state::vidc_video_tick()
117110{
118   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
119   static UINT8 *vram = machine.root_device().memregion("vram")->base();
111   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
112   static UINT8 *vram = machine().root_device().memregion("vram")->base();
120113   UINT32 size;
121114
122   size = vidc_vidend-vidc_vidstart+0x10;
115   size = m_vidc_vidend-m_vidc_vidstart+0x10;
123116
124   for(vidc_vidcur = 0;vidc_vidcur < size;vidc_vidcur++)
125      vram[vidc_vidcur] = (space.read_byte(vidc_vidstart+vidc_vidcur));
117   for(m_vidc_vidcur = 0;m_vidc_vidcur < size;m_vidc_vidcur++)
118      vram[m_vidc_vidcur] = (space.read_byte(m_vidc_vidstart+m_vidc_vidcur));
126119
127   if(video_dma_on)
128      vid_timer->adjust(space.machine().primary_screen->time_until_pos(vidc_regs[0xb4]));
120   if(m_video_dma_on)
121      m_vid_timer->adjust(machine().primary_screen->time_until_pos(m_vidc_regs[0xb4]));
129122   else
130      vid_timer->adjust(attotime::never);
123      m_vid_timer->adjust(attotime::never);
131124}
132125
133126/* audio DMA */
134static TIMER_CALLBACK( vidc_audio_tick )
127void archimedes_state::vidc_audio_tick()
135128{
136   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
129   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
137130   UINT8 ulaw_comp;
138131   INT16 res;
139132   UINT8 ch;
r18034r18035
176169
177170   for(ch=0;ch<8;ch++)
178171   {
179      UINT8 ulaw_temp = (space.read_byte(vidc_sndstart+vidc_sndcur + ch)) ^ 0xff;
172      UINT8 ulaw_temp = (space.read_byte(m_vidc_sndstart+m_vidc_sndcur + ch)) ^ 0xff;
180173
181174      ulaw_comp = (ulaw_temp>>1) | ((ulaw_temp&1)<<7);
182175
183176      res = mulawTable[ulaw_comp];
184177
185      space.machine().device<dac_device>(dac_port[ch & 7])->write_signed16(res^0x8000);
178      machine().device<dac_device>(dac_port[ch & 7])->write_signed16(res^0x8000);
186179   }
187180
188   vidc_sndcur+=8;
181   m_vidc_sndcur+=8;
189182
190   if (vidc_sndcur >= (vidc_sndend-vidc_sndstart)+0x10)
183   if (m_vidc_sndcur >= (m_vidc_sndend-m_vidc_sndstart)+0x10)
191184   {
192      vidc_sndcur = 0;
193      archimedes_request_irq_b(machine, ARCHIMEDES_IRQB_SOUND_EMPTY);
185      m_vidc_sndcur = 0;
186      archimedes_request_irq_b(ARCHIMEDES_IRQB_SOUND_EMPTY);
194187
195      if(!audio_dma_on)
188      if(!m_audio_dma_on)
196189      {
197         snd_timer->adjust(attotime::never);
190         m_snd_timer->adjust(attotime::never);
198191         for(ch=0;ch<8;ch++)
199            space.machine().device<dac_device>(dac_port[ch & 7])->write_signed16(0x8000);
192            machine().device<dac_device>(dac_port[ch & 7])->write_signed16(0x8000);
200193      }
201194   }
202195}
203196
204static void a310_set_timer(int tmr)
197void archimedes_state::a310_set_timer(int tmr)
205198{
206199   double freq;
207200
r18034r18035
209202   {
210203      case 0:
211204      case 1:
212            timer[tmr]->adjust(attotime::from_usec(ioc_timercnt[tmr]/8), tmr); // TODO: ARM timings are quite off there, it should be latch and not latch/8
205            m_timer[tmr]->adjust(attotime::from_usec(m_ioc_timercnt[tmr]/8), tmr); // TODO: ARM timings are quite off there, it should be latch and not latch/8
213206         break;
214207      case 2:
215         freq = 1000000.0 / (double)(ioc_timercnt[tmr]+1);
216         timer[tmr]->adjust(attotime::from_hz(freq), tmr);
208         freq = 1000000.0 / (double)(m_ioc_timercnt[tmr]+1);
209         m_timer[tmr]->adjust(attotime::from_hz(freq), tmr);
217210         break;
218211      case 3:
219         freq = 1000000.0 / (double)((ioc_timercnt[tmr]+1)*16);
220         timer[tmr]->adjust(attotime::from_hz(freq), tmr);
212         freq = 1000000.0 / (double)((m_ioc_timercnt[tmr]+1)*16);
213         m_timer[tmr]->adjust(attotime::from_hz(freq), tmr);
221214         break;
222215   }
223216}
224217
225218// param
226static TIMER_CALLBACK( ioc_timer )
219void archimedes_state::ioc_timer(int param)
227220{
228221   // all timers always run
229222   a310_set_timer(param);
r18034r18035
232225   switch (param)
233226   {
234227      case 0:
235         archimedes_request_irq_a(machine, ARCHIMEDES_IRQA_TIMER0);
228         archimedes_request_irq_a(ARCHIMEDES_IRQA_TIMER0);
236229         break;
237230
238231      case 1:
239         archimedes_request_irq_a(machine, ARCHIMEDES_IRQA_TIMER1);
232         archimedes_request_irq_a(ARCHIMEDES_IRQA_TIMER1);
240233         break;
241234   }
242235}
243236
244void archimedes_reset(running_machine &machine)
237void archimedes_state::archimedes_reset()
245238{
246239   int i;
247240
248   memc_latchrom = 1;         // map in the boot ROM
241   m_memc_latchrom = 1;         // map in the boot ROM
249242
250243   // kill all memc mappings
251244   for (i = 0; i < (32*1024*1024)/(4096); i++)
252245   {
253      memc_pages[i] = -1;      // indicate unmapped
246      m_memc_pages[i] = -1;      // indicate unmapped
254247   }
255248
256   ioc_regs[IRQ_STATUS_A] = 0x10 | 0x80; //set up POR (Power On Reset) and Force IRQ at start-up
257   ioc_regs[IRQ_STATUS_B] = 0x02; //set up IL[1] On
258   ioc_regs[FIQ_STATUS] = 0x80;   //set up Force FIQ
259   ioc_regs[CONTROL] = 0xff;
249   m_ioc_regs[IRQ_STATUS_A] = 0x10 | 0x80; //set up POR (Power On Reset) and Force IRQ at start-up
250   m_ioc_regs[IRQ_STATUS_B] = 0x02; //set up IL[1] On
251   m_ioc_regs[FIQ_STATUS] = 0x80;   //set up Force FIQ
252   m_ioc_regs[CONTROL] = 0xff;
260253}
261254
262void archimedes_init(running_machine &machine)
255void archimedes_state::archimedes_init()
263256{
264   memc_pagesize = 0;
257   m_memc_pagesize = 0;
265258
266   vbl_timer = machine.scheduler().timer_alloc(FUNC(vidc_vblank));
267   vbl_timer->adjust(attotime::never);
259   m_vbl_timer = timer_alloc(TIMER_VBLANK);
260   m_vbl_timer->adjust(attotime::never);
268261
269   timer[0] = machine.scheduler().timer_alloc(FUNC(ioc_timer));
270   timer[1] = machine.scheduler().timer_alloc(FUNC(ioc_timer));
271   timer[2] = machine.scheduler().timer_alloc(FUNC(ioc_timer));
272   timer[3] = machine.scheduler().timer_alloc(FUNC(ioc_timer));
273   timer[0]->adjust(attotime::never);
274   timer[1]->adjust(attotime::never);
275   timer[2]->adjust(attotime::never);
276   timer[3]->adjust(attotime::never);
262   m_timer[0] = timer_alloc(TIMER_IOC);
263   m_timer[1] = timer_alloc(TIMER_IOC);
264   m_timer[2] = timer_alloc(TIMER_IOC);
265   m_timer[3] = timer_alloc(TIMER_IOC);
266   m_timer[0]->adjust(attotime::never);
267   m_timer[1]->adjust(attotime::never);
268   m_timer[2]->adjust(attotime::never);
269   m_timer[3]->adjust(attotime::never);
277270
278   vid_timer = machine.scheduler().timer_alloc(FUNC(vidc_video_tick));
279   snd_timer = machine.scheduler().timer_alloc(FUNC(vidc_audio_tick));
280   snd_timer->adjust(attotime::never);
271   m_vid_timer = timer_alloc(TIMER_VIDEO);
272   m_snd_timer = timer_alloc(TIMER_AUDIO);
273   m_snd_timer->adjust(attotime::never);
281274}
282275
283READ32_HANDLER(archimedes_memc_logical_r)
276READ32_MEMBER(archimedes_state::archimedes_memc_logical_r)
284277{
285278   UINT32 page, poffs;
286279
287280   // are we mapping in the boot ROM?
288   if (memc_latchrom)
281   if (m_memc_latchrom)
289282   {
290283      UINT32 *rom;
291284
292      rom = (UINT32 *)space.machine().root_device().memregion("maincpu")->base();
285      rom = (UINT32 *)machine().root_device().memregion("maincpu")->base();
293286
294287      return rom[offset & 0x1fffff];
295288   }
296289   else
297290   {
298291      // figure out the page number and offset in the page
299      page = (offset<<2) / page_sizes[memc_pagesize];
300      poffs = (offset<<2) % page_sizes[memc_pagesize];
292      page = (offset<<2) / page_sizes[m_memc_pagesize];
293      poffs = (offset<<2) % page_sizes[m_memc_pagesize];
301294
302295//      printf("Reading offset %x (addr %x): page %x (size %d %d) offset %x ==> %x %x\n", offset, offset<<2, page, memc_pagesize, page_sizes[memc_pagesize], poffs, memc_pages[page], memc_pages[page]*page_sizes[memc_pagesize]);
303296
304      if (memc_pages[page] != -1)
297      if (m_memc_pages[page] != -1)
305298      {
306         return archimedes_memc_physmem[((memc_pages[page] * page_sizes[memc_pagesize]) + poffs)>>2];
299         return m_archimedes_memc_physmem[((m_memc_pages[page] * page_sizes[m_memc_pagesize]) + poffs)>>2];
307300      }
308301      else
309302      {
r18034r18035
317310
318311
319312
320WRITE32_HANDLER(archimedes_memc_logical_w)
313WRITE32_MEMBER(archimedes_state::archimedes_memc_logical_w)
321314{
322315   UINT32 page, poffs;
323316
324317   // if the boot ROM is mapped, ignore writes
325   if (memc_latchrom)
318   if (m_memc_latchrom)
326319   {
327320      return;
328321   }
329322   else
330323   {
331324      // figure out the page number and offset in the page
332      page = (offset<<2) / page_sizes[memc_pagesize];
333      poffs = (offset<<2) % page_sizes[memc_pagesize];
325      page = (offset<<2) / page_sizes[m_memc_pagesize];
326      poffs = (offset<<2) % page_sizes[m_memc_pagesize];
334327
335328//      printf("Writing offset %x (addr %x): page %x (size %d %d) offset %x ==> %x %x\n", offset, offset<<2, page, memc_pagesize, page_sizes[memc_pagesize], poffs, memc_pages[page], memc_pages[page]*page_sizes[memc_pagesize]);
336329
337      if (memc_pages[page] != -1)
330      if (m_memc_pages[page] != -1)
338331      {
339         COMBINE_DATA(&archimedes_memc_physmem[((memc_pages[page] * page_sizes[memc_pagesize]) + poffs)>>2]);
332         COMBINE_DATA(&m_archimedes_memc_physmem[((m_memc_pages[page] * page_sizes[m_memc_pagesize]) + poffs)>>2]);
340333      }
341334      else
342335      {
r18034r18035
346339}
347340
348341/* Aristocrat Mark 5 - same as normal AA except with Dram emulator */
349READ32_HANDLER(aristmk5_drame_memc_logical_r)
342READ32_MEMBER(archimedes_state::aristmk5_drame_memc_logical_r)
350343{
351344   UINT32 page, poffs;
352345
353346   // are we mapping in the boot ROM?
354   if (memc_latchrom)
347   if (m_memc_latchrom)
355348   {
356349      UINT32 *rom;
357350
358      rom = (UINT32 *)space.machine().root_device().memregion("maincpu")->base();
351      rom = (UINT32 *)machine().root_device().memregion("maincpu")->base();
359352
360353      return rom[offset & 0x1fffff];
361354   }
362355   else
363356   {
364357      // figure out the page number and offset in the page
365      page = (offset<<2) / page_sizes[memc_pagesize];
366      poffs = (offset<<2) % page_sizes[memc_pagesize];
358      page = (offset<<2) / page_sizes[m_memc_pagesize];
359      poffs = (offset<<2) % page_sizes[m_memc_pagesize];
367360
368361
369362
370      if (memc_pages[page] != -1)
363      if (m_memc_pages[page] != -1)
371364      {
372365            /******************* DRAM Emulator - gal20v - Aristocrat Mark 5 ************************
373366            A Dynamic RAM emulator is provided which avoids the need to execute code
r18034r18035
380373            In this state, DRAM memory space is disabled.
381374
382375            ****************************************************************************************/
383            if(!(memc_pages[page] & 0x10)  && (offset <= 0x3ff))
376            if(!(m_memc_pages[page] & 0x10)  && (offset <= 0x3ff))
384377                return 0xEAD0000A;
385            return archimedes_memc_physmem[((memc_pages[page] * page_sizes[memc_pagesize]) + poffs)>>2];
378            return m_archimedes_memc_physmem[((m_memc_pages[page] * page_sizes[m_memc_pagesize]) + poffs)>>2];
386379      }
387380      else
388381      {
r18034r18035
394387   return 0;
395388}
396389
397#if 0
398DIRECT_UPDATE_HANDLER( a310_setopbase )
390void archimedes_state::archimedes_driver_init()
399391{
400   // if we're not in logical memory, MAME can do the right thing
401   if (address > 0x1ffffff)
402   {
403      return address;
404   }
405
406   // if the boot ROM is mapped in, do some trickery to make it show up
407   if (memc_latchrom)
408   {
409      direct.explicit_configure(0x000000, 0x1fffff, 0x1fffff, *direct.space().machine().root_device().memregion("maincpu"));
410   }
411   else   // executing from logical memory
412   {
413      offs_t pagesize = page_sizes[memc_pagesize];
414      UINT32 page = address / pagesize;
415
416      direct.explicit_configure(page * pagesize, page * pagesize - 1, pagesize - 1, &archimedes_memc_physmem[(memc_pages[page] * pagesize)>>2]);
417   }
418
419   return ~0;
420}
421#endif
422
423void archimedes_driver_init(running_machine &machine)
424{
425   archimedes_memc_physmem = reinterpret_cast<UINT32 *>(machine.root_device().memshare("physicalram")->ptr());
392   m_archimedes_memc_physmem = reinterpret_cast<UINT32 *>(machine().root_device().memshare("physicalram")->ptr());
426393//  address_space &space = machine.device<arm_device>("maincpu")->space(AS_PROGRAM);
427394//  space.set_direct_update_handler(direct_update_delegate(FUNC(a310_setopbase), &machine));
428395}
r18034r18035
463430   "(write) Timer 3 latch command"               // 31
464431};
465432
466static void latch_timer_cnt(int tmr)
433void archimedes_state::latch_timer_cnt(int tmr)
467434{
468   double time = timer[tmr]->elapsed().as_double();
435   double time = m_timer[tmr]->elapsed().as_double();
469436   time *= 2000000.0;   // find out how many 2 MHz ticks have gone by
470   ioc_timerout[tmr] = ioc_timercnt[tmr] - (UINT32)time;
437   m_ioc_timerout[tmr] = m_ioc_timercnt[tmr] - (UINT32)time;
471438}
472439
473440/* TODO: should be a 8-bit handler */
474static READ32_HANDLER( ioc_ctrl_r )
441READ32_MEMBER( archimedes_state::ioc_ctrl_r )
475442{
476443   if(IOC_LOG)
477   logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], ioc_regs[offset&0x1f], space.device() .safe_pc( ),offset & 0x1f);
444   logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], m_ioc_regs[offset&0x1f], space.device() .safe_pc( ),offset & 0x1f);
478445
479446   switch (offset & 0x1f)
480447   {
r18034r18035
484451         static UINT8 flyback; //internal name for vblank here
485452         int vert_pos;
486453
487         vert_pos = space.machine().primary_screen->vpos();
488         flyback = (vert_pos <= vidc_regs[VIDC_VDSR] || vert_pos >= vidc_regs[VIDC_VDER]) ? 0x80 : 0x00;
454         vert_pos = machine().primary_screen->vpos();
455         flyback = (vert_pos <= m_vidc_regs[VIDC_VDSR] || vert_pos >= m_vidc_regs[VIDC_VDER]) ? 0x80 : 0x00;
489456
490457         i2c_data = (i2cmem_sda_read(space.machine().device("i2cmem")) & 1);
491458
492         return (flyback) | (ioc_regs[CONTROL] & 0x7c) | (i2c_clk<<1) | i2c_data;
459         return (flyback) | (m_ioc_regs[CONTROL] & 0x7c) | (m_i2c_clk<<1) | i2c_data;
493460      }
494461
495462      case KART:   // keyboard read
496         archimedes_request_irq_b(space.machine(), ARCHIMEDES_IRQB_KBD_XMIT_EMPTY);
463         archimedes_request_irq_b(ARCHIMEDES_IRQB_KBD_XMIT_EMPTY);
497464         break;
498465
499466      case IRQ_STATUS_A:
500         return (ioc_regs[IRQ_STATUS_A] & 0x7f) | 0x80; // Force IRQ is always '1'
467         return (m_ioc_regs[IRQ_STATUS_A] & 0x7f) | 0x80; // Force IRQ is always '1'
501468
502469      case IRQ_REQUEST_A:
503         return (ioc_regs[IRQ_STATUS_A] & ioc_regs[IRQ_MASK_A]);
470         return (m_ioc_regs[IRQ_STATUS_A] & m_ioc_regs[IRQ_MASK_A]);
504471
505472      case IRQ_MASK_A:
506         return (ioc_regs[IRQ_MASK_A]);
473         return (m_ioc_regs[IRQ_MASK_A]);
507474
508475      case IRQ_STATUS_B:
509         return (ioc_regs[IRQ_STATUS_B]);
476         return (m_ioc_regs[IRQ_STATUS_B]);
510477
511478      case IRQ_REQUEST_B:
512         return (ioc_regs[IRQ_STATUS_B] & ioc_regs[IRQ_MASK_B]);
479         return (m_ioc_regs[IRQ_STATUS_B] & m_ioc_regs[IRQ_MASK_B]);
513480
514481      case IRQ_MASK_B:
515         return (ioc_regs[IRQ_MASK_B]);
482         return (m_ioc_regs[IRQ_MASK_B]);
516483
517484      case FIQ_STATUS:
518         return (ioc_regs[FIQ_STATUS] & 0x7f) | 0x80; // Force FIQ is always '1'
485         return (m_ioc_regs[FIQ_STATUS] & 0x7f) | 0x80; // Force FIQ is always '1'
519486
520487      case FIQ_REQUEST:
521         return (ioc_regs[FIQ_STATUS] & ioc_regs[FIQ_MASK]);
488         return (m_ioc_regs[FIQ_STATUS] & m_ioc_regs[FIQ_MASK]);
522489
523490      case FIQ_MASK:
524         return (ioc_regs[FIQ_MASK]);
491         return (m_ioc_regs[FIQ_MASK]);
525492
526      case T0_LATCH_LO: return ioc_timerout[0]&0xff;
527      case T0_LATCH_HI: return (ioc_timerout[0]>>8)&0xff;
493      case T0_LATCH_LO: return m_ioc_timerout[0]&0xff;
494      case T0_LATCH_HI: return (m_ioc_timerout[0]>>8)&0xff;
528495
529      case T1_LATCH_LO: return ioc_timerout[1]&0xff;
530      case T1_LATCH_HI: return (ioc_timerout[1]>>8)&0xff;
496      case T1_LATCH_LO: return m_ioc_timerout[1]&0xff;
497      case T1_LATCH_HI: return (m_ioc_timerout[1]>>8)&0xff;
531498
532      case T2_LATCH_LO: return ioc_timerout[2]&0xff;
533      case T2_LATCH_HI: return (ioc_timerout[2]>>8)&0xff;
499      case T2_LATCH_LO: return m_ioc_timerout[2]&0xff;
500      case T2_LATCH_HI: return (m_ioc_timerout[2]>>8)&0xff;
534501
535      case T3_LATCH_LO: return ioc_timerout[3]&0xff;
536      case T3_LATCH_HI: return (ioc_timerout[3]>>8)&0xff;
502      case T3_LATCH_LO: return m_ioc_timerout[3]&0xff;
503      case T3_LATCH_HI: return (m_ioc_timerout[3]>>8)&0xff;
537504      default:
538505         if(!IOC_LOG)
539            logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], ioc_regs[offset&0x1f], space.device() .safe_pc( ),offset & 0x1f);
506            logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], m_ioc_regs[offset&0x1f], space.device() .safe_pc( ),offset & 0x1f);
540507         break;
541508   }
542509
543   return ioc_regs[offset&0x1f];
510   return m_ioc_regs[offset&0x1f];
544511}
545512
546513/* TODO: should be a 8-bit handler */
547static WRITE32_HANDLER( ioc_ctrl_w )
514WRITE32_MEMBER( archimedes_state::ioc_ctrl_w )
548515{
549516   if(IOC_LOG)
550517   logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], space.device() .safe_pc( ));
r18034r18035
553520   {
554521      case CONTROL:   // I2C bus control
555522         //logerror("IOC I2C: CLK %d DAT %d\n", (data>>1)&1, data&1);
556         i2cmem_sda_write(space.machine().device("i2cmem"), data & 0x01);
557         i2cmem_scl_write(space.machine().device("i2cmem"), (data & 0x02) >> 1);
558         i2c_clk = (data & 2) >> 1;
523         i2cmem_sda_write(machine().device("i2cmem"), data & 0x01);
524         i2cmem_scl_write(machine().device("i2cmem"), (data & 0x02) >> 1);
525         m_i2c_clk = (data & 2) >> 1;
559526         break;
560527
561528      case KART:
r18034r18035
568535         break;
569536
570537      case IRQ_MASK_A:
571         ioc_regs[IRQ_MASK_A] = data & 0xff;
538         m_ioc_regs[IRQ_MASK_A] = data & 0xff;
572539
573540         if(data & 0x80) //force an IRQ
574            archimedes_request_irq_a(space.machine(),ARCHIMEDES_IRQA_FORCE);
541            archimedes_request_irq_a(ARCHIMEDES_IRQA_FORCE);
575542
576543         if(data & 0x08) //set up the VBLANK timer
577            vbl_timer->adjust(space.machine().primary_screen->time_until_pos(vidc_regs[0xb4]));
544            m_vbl_timer->adjust(machine().primary_screen->time_until_pos(m_vidc_regs[0xb4]));
578545
579546         break;
580547
581548      case FIQ_MASK:
582         ioc_regs[FIQ_MASK] = data & 0xff;
549         m_ioc_regs[FIQ_MASK] = data & 0xff;
583550
584551         if(data & 0x80) //force a FIRQ
585            archimedes_request_fiq(space.machine(),ARCHIMEDES_FIQ_FORCE);
552            archimedes_request_fiq(ARCHIMEDES_FIQ_FORCE);
586553
587554         break;
588555
589556      case IRQ_REQUEST_A:    // IRQ clear A
590         ioc_regs[IRQ_STATUS_A] &= ~(data&0xff);
557         m_ioc_regs[IRQ_STATUS_A] &= ~(data&0xff);
591558
592559         // if that did it, clear the IRQ
593560         //if (ioc_regs[IRQ_STATUS_A] == 0)
594561         {
595562            //printf("IRQ clear A\n");
596            space.machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
563            machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
597564         }
598565         break;
599566
600567      case T0_LATCH_LO:
601568      case T0_LATCH_HI:
602         ioc_regs[offset&0x1f] = data & 0xff;
569         m_ioc_regs[offset&0x1f] = data & 0xff;
603570         break;
604571
605572      case T1_LATCH_LO:
606573      case T1_LATCH_HI:
607         ioc_regs[offset&0x1f] = data & 0xff;
574         m_ioc_regs[offset&0x1f] = data & 0xff;
608575         break;
609576
610577      case T2_LATCH_LO:
611578      case T2_LATCH_HI:
612         ioc_regs[offset&0x1f] = data & 0xff;
579         m_ioc_regs[offset&0x1f] = data & 0xff;
613580         break;
614581
615582      case T3_LATCH_LO:
616583      case T3_LATCH_HI:
617         ioc_regs[offset&0x1f] = data & 0xff;
584         m_ioc_regs[offset&0x1f] = data & 0xff;
618585         break;
619586
620587      case T0_LATCH:   // Timer 0 latch
r18034r18035
634601         break;
635602
636603      case T0_GO:   // Timer 0 start
637         ioc_timercnt[0] = ioc_regs[T0_LATCH_HI]<<8 | ioc_regs[T0_LATCH_LO];
604         m_ioc_timercnt[0] = m_ioc_regs[T0_LATCH_HI]<<8 | m_ioc_regs[T0_LATCH_LO];
638605         a310_set_timer(0);
639606         break;
640607
641608      case T1_GO:   // Timer 1 start
642         ioc_timercnt[1] = ioc_regs[T1_LATCH_HI]<<8 | ioc_regs[T1_LATCH_LO];
609         m_ioc_timercnt[1] = m_ioc_regs[T1_LATCH_HI]<<8 | m_ioc_regs[T1_LATCH_LO];
643610         a310_set_timer(1);
644611         break;
645612
646613      case T2_GO:   // Timer 2 start
647         ioc_timercnt[2] = ioc_regs[T2_LATCH_HI]<<8 | ioc_regs[T2_LATCH_LO];
614         m_ioc_timercnt[2] = m_ioc_regs[T2_LATCH_HI]<<8 | m_ioc_regs[T2_LATCH_LO];
648615         a310_set_timer(2);
649616         break;
650617
651618      case T3_GO:   // Timer 3 start
652         ioc_timercnt[3] = ioc_regs[T3_LATCH_HI]<<8 | ioc_regs[T3_LATCH_LO];
619         m_ioc_timercnt[3] = m_ioc_regs[T3_LATCH_HI]<<8 | m_ioc_regs[T3_LATCH_LO];
653620         a310_set_timer(3);
654621         break;
655622
r18034r18035
657624         if(!IOC_LOG)
658625            logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], space.device() .safe_pc( ));
659626
660         ioc_regs[offset&0x1f] = data & 0xff;
627         m_ioc_regs[offset&0x1f] = data & 0xff;
661628         break;
662629   }
663630}
664631
665READ32_HANDLER(archimedes_ioc_r)
632READ32_MEMBER(archimedes_state::archimedes_ioc_r)
666633{
667634   UINT32 ioc_addr;
668635   device_t *fdc = (device_t *)space.machine().device("wd1772");
r18034r18035
718685   return 0;
719686}
720687
721WRITE32_HANDLER(archimedes_ioc_w)
688WRITE32_MEMBER(archimedes_state::archimedes_ioc_w)
722689{
723690   UINT32 ioc_addr;
724691   device_t *fdc = (device_t *)space.machine().device("wd1772");
r18034r18035
782749   logerror("(PC=%08x) I/O: W %x @ %x (mask %08x)\n", space.device().safe_pc(), data, (offset*4)+0x3000000, mem_mask);
783750}
784751
785READ32_HANDLER(archimedes_vidc_r)
752READ32_MEMBER(archimedes_state::archimedes_vidc_r)
786753{
787754   return 0;
788755}
789756
790static void vidc_dynamic_res_change(running_machine &machine)
757void archimedes_state::vidc_dynamic_res_change()
791758{
792759   /* sanity checks - first pass */
793760   /*
794761        total cycles + border end
795762    */
796   if(vidc_regs[VIDC_HCR] && vidc_regs[VIDC_HBER] &&
797      vidc_regs[VIDC_VCR] && vidc_regs[VIDC_VBER])
763   if(m_vidc_regs[VIDC_HCR] && m_vidc_regs[VIDC_HBER] &&
764      m_vidc_regs[VIDC_VCR] && m_vidc_regs[VIDC_VBER])
798765   {
799766      /* sanity checks - second pass */
800767      /*
801768        total cycles >= border end >= border start
802769        */
803      if((vidc_regs[VIDC_HCR] >= vidc_regs[VIDC_HBER]) &&
804         (vidc_regs[VIDC_HBER] >= vidc_regs[VIDC_HBSR]) &&
805         (vidc_regs[VIDC_VCR] >= vidc_regs[VIDC_VBER]) &&
806         (vidc_regs[VIDC_VBER] >= vidc_regs[VIDC_VBSR]))
770      if((m_vidc_regs[VIDC_HCR] >= m_vidc_regs[VIDC_HBER]) &&
771         (m_vidc_regs[VIDC_HBER] >= m_vidc_regs[VIDC_HBSR]) &&
772         (m_vidc_regs[VIDC_VCR] >= m_vidc_regs[VIDC_VBER]) &&
773         (m_vidc_regs[VIDC_VBER] >= m_vidc_regs[VIDC_VBSR]))
807774      {
808775         rectangle visarea;
809776         attoseconds_t refresh;
810777
811778         visarea.min_x = 0;
812779         visarea.min_y = 0;
813         visarea.max_x = vidc_regs[VIDC_HBER] - vidc_regs[VIDC_HBSR] - 1;
814         visarea.max_y = vidc_regs[VIDC_VBER] - vidc_regs[VIDC_VBSR];
780         visarea.max_x = m_vidc_regs[VIDC_HBER] - m_vidc_regs[VIDC_HBSR] - 1;
781         visarea.max_y = m_vidc_regs[VIDC_VBER] - m_vidc_regs[VIDC_VBSR];
815782
816783         logerror("Configuring: htotal %d vtotal %d border %d x %d display %d x %d\n",
817            vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR],
784            m_vidc_regs[VIDC_HCR], m_vidc_regs[VIDC_VCR],
818785            visarea.max_x, visarea.max_y,
819            vidc_regs[VIDC_HDER]-vidc_regs[VIDC_HDSR],vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR]+1);
786            m_vidc_regs[VIDC_HDER]-m_vidc_regs[VIDC_HDSR],m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR]+1);
820787
821788         /* FIXME: pixel clock */
822         refresh = HZ_TO_ATTOSECONDS(pixel_rate[vidc_pixel_clk]*2) * vidc_regs[VIDC_HCR] * vidc_regs[VIDC_VCR];
789         refresh = HZ_TO_ATTOSECONDS(pixel_rate[m_vidc_pixel_clk]*2) * m_vidc_regs[VIDC_HCR] * m_vidc_regs[VIDC_VCR];
823790
824         machine.primary_screen->configure(vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], visarea, refresh);
791         machine().primary_screen->configure(m_vidc_regs[VIDC_HCR], m_vidc_regs[VIDC_VCR], visarea, refresh);
825792      }
826793   }
827794}
828795
829WRITE32_HANDLER(archimedes_vidc_w)
796WRITE32_MEMBER(archimedes_state::archimedes_vidc_w)
830797{
831798   UINT32 reg = data>>24;
832799   UINT32 val = data & 0xffffff;
r18034r18035
868835      if(reg == 0x40 && val & 0xfff)
869836         logerror("WARNING: border color write here (PC=%08x)!\n",space.device().safe_pc());
870837
871      palette_set_color_rgb(space.machine(), reg >> 2, pal4bit(r), pal4bit(g), pal4bit(b) );
838      palette_set_color_rgb(machine(), reg >> 2, pal4bit(r), pal4bit(g), pal4bit(b) );
872839
873840      /* handle 8bpp colors here */
874841      if(reg <= 0x3c)
r18034r18035
881848            g = ((val & 0x030) >> 4) | ((i & 0x20) >> 3) | ((i & 0x40) >> 3);
882849            r = ((val & 0x007) >> 0) | ((i & 0x10) >> 1);
883850
884            palette_set_color_rgb(space.machine(), (reg >> 2) + 0x100 + i, pal4bit(r), pal4bit(g), pal4bit(b) );
851            palette_set_color_rgb(machine(), (reg >> 2) + 0x100 + i, pal4bit(r), pal4bit(g), pal4bit(b) );
885852         }
886853      }
887854
888855   }
889856   else if (reg >= 0x60 && reg <= 0x7c)
890857   {
891      vidc_stereo_reg[(reg >> 2) & 7] = val & 0x07;
858      m_vidc_stereo_reg[(reg >> 2) & 7] = val & 0x07;
892859
893860//      popmessage("%02x %02x %02x %02x %02x %02x %02x %02x",vidc_stereo_reg[0],vidc_stereo_reg[1],vidc_stereo_reg[2],vidc_stereo_reg[3]
894861//      ,vidc_stereo_reg[4],vidc_stereo_reg[5],vidc_stereo_reg[6],vidc_stereo_reg[7]);
r18034r18035
897864   {
898865      switch(reg)
899866      {
900         case VIDC_HCR:  vidc_regs[VIDC_HCR] =  ((val >> 14)<<1)+1;   break;
901//          case VIDC_HSWR: vidc_regs[VIDC_HSWR] = (val >> 14)+1;   break;
902         case VIDC_HBSR: vidc_regs[VIDC_HBSR] = ((val >> 14)<<1)+1;   break;
903         case VIDC_HDSR: vidc_regs[VIDC_HDSR] = (val >> 14);    break;
904         case VIDC_HDER: vidc_regs[VIDC_HDER] = (val >> 14);    break;
905         case VIDC_HBER: vidc_regs[VIDC_HBER] = ((val >> 14)<<1)+1;   break;
867         case VIDC_HCR:  m_vidc_regs[VIDC_HCR] =  ((val >> 14)<<1)+1;   break;
868//          case VIDC_HSWR: m_vidc_regs[VIDC_HSWR] = (val >> 14)+1;   break;
869         case VIDC_HBSR: m_vidc_regs[VIDC_HBSR] = ((val >> 14)<<1)+1;   break;
870         case VIDC_HDSR: m_vidc_regs[VIDC_HDSR] = (val >> 14);    break;
871         case VIDC_HDER: m_vidc_regs[VIDC_HDER] = (val >> 14);    break;
872         case VIDC_HBER: m_vidc_regs[VIDC_HBER] = ((val >> 14)<<1)+1;   break;
906873//          #define VIDC_HCSR       0x98
907874//          #define VIDC_HIR        0x9c
908875
909         case VIDC_VCR:  vidc_regs[VIDC_VCR] = ((val >> 14)<<1)+1;   break;
876         case VIDC_VCR:  m_vidc_regs[VIDC_VCR] = ((val >> 14)<<1)+1;   break;
910877//          #define VIDC_VSWR       0xa4
911         case VIDC_VBSR: vidc_regs[VIDC_VBSR] = (val >> 14)+1;   break;
912         case VIDC_VDSR: vidc_regs[VIDC_VDSR] = (val >> 14)+1;   break;
913         case VIDC_VDER: vidc_regs[VIDC_VDER] = (val >> 14)+1;   break;
914         case VIDC_VBER: vidc_regs[VIDC_VBER] = (val >> 14)+1;   break;
878         case VIDC_VBSR: m_vidc_regs[VIDC_VBSR] = (val >> 14)+1;   break;
879         case VIDC_VDSR: m_vidc_regs[VIDC_VDSR] = (val >> 14)+1;   break;
880         case VIDC_VDER: m_vidc_regs[VIDC_VDER] = (val >> 14)+1;   break;
881         case VIDC_VBER: m_vidc_regs[VIDC_VBER] = (val >> 14)+1;   break;
915882//          #define VIDC_VCSR       0xb8
916883//          #define VIDC_VCER       0xbc
917884      }
918885
919886
920887      //#ifdef DEBUG
921      logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], vidc_regs[reg]);
888      logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], m_vidc_regs[reg]);
922889      //#endif
923890
924      vidc_dynamic_res_change(space.machine());
891      vidc_dynamic_res_change();
925892   }
926893   else if(reg == 0xe0)
927894   {
928      vidc_bpp_mode = ((val & 0x0c) >> 2);
929      vidc_interlace = ((val & 0x40) >> 6);
930      vidc_pixel_clk = (val & 0x03);
931      vidc_dynamic_res_change(space.machine());
895      m_vidc_bpp_mode = ((val & 0x0c) >> 2);
896      m_vidc_interlace = ((val & 0x40) >> 6);
897      m_vidc_pixel_clk = (val & 0x03);
898      vidc_dynamic_res_change();
932899   }
933900   else
934901   {
935902      logerror("VIDC: %x to register %x\n", val, reg);
936      vidc_regs[reg] = val&0xffff;
903      m_vidc_regs[reg] = val&0xffff;
937904   }
938905}
939906
940READ32_HANDLER(archimedes_memc_r)
907READ32_MEMBER(archimedes_state::archimedes_memc_r)
941908{
942909   return 0;
943910}
944911
945WRITE32_HANDLER(archimedes_memc_w)
912WRITE32_MEMBER(archimedes_state::archimedes_memc_w)
946913{
947914   // is it a register?
948915   if ((data & 0x0fe00000) == 0x03600000)
r18034r18035
950917      switch ((data >> 17) & 7)
951918      {
952919         case 0: /* video init */
953            vidc_vidinit = ((data>>2)&0x7fff)*16;
920            m_vidc_vidinit = ((data>>2)&0x7fff)*16;
954921            //logerror("MEMC: VIDINIT %08x\n",vidc_vidinit);
955922            break;
956923
957924         case 1: /* video start */
958            vidc_vidstart = 0x2000000 | (((data>>2)&0x7fff)*16);
925            m_vidc_vidstart = 0x2000000 | (((data>>2)&0x7fff)*16);
959926            //logerror("MEMC: VIDSTART %08x\n",vidc_vidstart);
960927            break;
961928
962929         case 2: /* video end */
963            vidc_vidend = 0x2000000 | (((data>>2)&0x7fff)*16);
930            m_vidc_vidend = 0x2000000 | (((data>>2)&0x7fff)*16);
964931            //logerror("MEMC: VIDEND %08x\n",vidc_vidend);
965932            break;
966933
967934         case 4:   /* sound start */
968935            //logerror("MEMC: SNDSTART %08x\n",data);
969            vidc_sndstart = 0x2000000 | ((data>>2)&0x7fff)*16;
970            ioc_regs[IRQ_STATUS_B] &= ~ARCHIMEDES_IRQB_SOUND_EMPTY;
936            m_vidc_sndstart = 0x2000000 | ((data>>2)&0x7fff)*16;
937            m_ioc_regs[IRQ_STATUS_B] &= ~ARCHIMEDES_IRQB_SOUND_EMPTY;
971938            break;
972939
973940         case 5: /* sound end */
974941            //logerror("MEMC: SNDEND %08x\n",data);
975            vidc_sndend = 0x2000000 | ((data>>2)&0x7fff)*16;
942            m_vidc_sndend = 0x2000000 | ((data>>2)&0x7fff)*16;
976943            break;
977944
978945         case 6:
979            vidc_sndcur = 0;
980            archimedes_request_irq_b(space.machine(), ARCHIMEDES_IRQB_SOUND_EMPTY);
946            m_vidc_sndcur = 0;
947            archimedes_request_irq_b(ARCHIMEDES_IRQB_SOUND_EMPTY);
981948            break;
982949
983950         case 7:   /* Control */
984            memc_pagesize = ((data>>2) & 3);
951            m_memc_pagesize = ((data>>2) & 3);
985952
986            logerror("(PC = %08x) MEMC: %x to Control (page size %d, %s, %s)\n", space.device().safe_pc(), data & 0x1ffc, page_sizes[memc_pagesize], ((data>>10)&1) ? "Video DMA on" : "Video DMA off", ((data>>11)&1) ? "Sound DMA on" : "Sound DMA off");
953            logerror("(PC = %08x) MEMC: %x to Control (page size %d, %s, %s)\n", space.device().safe_pc(), data & 0x1ffc, page_sizes[m_memc_pagesize], ((data>>10)&1) ? "Video DMA on" : "Video DMA off", ((data>>11)&1) ? "Sound DMA on" : "Sound DMA off");
987954
988            video_dma_on = ((data>>10)&1);
989            audio_dma_on = ((data>>11)&1);
955            m_video_dma_on = ((data>>10)&1);
956            m_audio_dma_on = ((data>>11)&1);
990957
991958            if ((data>>10)&1)
992959            {
993               vidc_vidcur = 0;
994               vid_timer->adjust(space.machine().primary_screen->time_until_pos(vidc_regs[0xb4]));
960               m_vidc_vidcur = 0;
961               m_vid_timer->adjust(machine().primary_screen->time_until_pos(m_vidc_regs[0xb4]));
995962            }
996963
997964            if ((data>>11)&1)
r18034r18035
999966               double sndhz;
1000967
1001968               /* FIXME: is the frequency correct? */
1002               sndhz = (250000.0 / 2) / (double)((vidc_regs[0xc0]&0xff)+2);
969               sndhz = (250000.0 / 2) / (double)((m_vidc_regs[0xc0]&0xff)+2);
1003970
1004               printf("MEMC: Starting audio DMA at %f Hz, buffer from %x to %x\n", sndhz, vidc_sndstart, vidc_sndend);
971               printf("MEMC: Starting audio DMA at %f Hz, buffer from %x to %x\n", sndhz, m_vidc_sndstart, m_vidc_sndend);
1005972
1006               snd_timer->adjust(attotime::zero, 0, attotime::from_hz(sndhz));
973               m_snd_timer->adjust(attotime::zero, 0, attotime::from_hz(sndhz));
1007974            }
1008975
1009976            break;
r18034r18035
10451012            1 being bit 6
10461013*/
10471014
1048WRITE32_HANDLER(archimedes_memc_page_w)
1015WRITE32_MEMBER(archimedes_state::archimedes_memc_page_w)
10491016{
10501017   UINT32 log, phys, memc;
10511018
10521019//  perms = (data & 0x300)>>8;
10531020   log = phys = memc = 0;
10541021
1055   switch (memc_pagesize)
1022   switch (m_memc_pagesize)
10561023   {
10571024      case 0:
10581025         phys = data & 0x7f;
r18034r18035
10831050//  log >>= (12 + memc_pagesize);
10841051
10851052   // always make sure ROM mode is disconnected when this occurs
1086   memc_latchrom = 0;
1053   m_memc_latchrom = 0;
10871054
10881055   // now go ahead and set the mapping in the page table
1089   memc_pages[log] = phys + (memc*0x80);
1056   m_memc_pages[log] = phys + (memc*0x80);
10901057
10911058//  printf("PC=%08x = MEMC_PAGE(%d): W %08x: log %x to phys %x, MEMC %d, perms %d\n", space.device().safe_pc(),memc_pagesize, data, log, phys, memc, perms);
10921059}
trunk/src/mame/includes/archimds.h
r18034r18035
3434#define ARCHIMEDES_FIQ_PODULE        (0x40)
3535#define ARCHIMEDES_FIQ_FORCE         (0x80)
3636
37/*----------- defined in machine/archimds.c -----------*/
37class archimedes_state : public driver_device
38{
39public:
40   archimedes_state(const machine_config &mconfig, device_type type, const char *tag)
41      : driver_device(mconfig, type, tag) { }
3842
39void archimedes_init(running_machine &machine);         // call at MACHINE_INIT
40void archimedes_reset(running_machine &machine);      // call at MACHINE_RESET
41void archimedes_driver_init(running_machine &machine);      // call at DRIVER_INIT
43   void archimedes_init();
44   void archimedes_reset();
45   void archimedes_driver_init();
4246
43void archimedes_request_irq_a(running_machine &machine, int mask);
44void archimedes_request_irq_b(running_machine &machine, int mask);
45void archimedes_request_fiq(running_machine &machine, int mask);
46void archimedes_clear_irq_a(running_machine &machine, int mask);
47void archimedes_clear_irq_b(running_machine &machine, int mask);
48void archimedes_clear_fiq(running_machine &machine, int mask);
47   void archimedes_request_irq_a(int mask);
48   void archimedes_request_irq_b(int mask);
49   void archimedes_request_fiq(int mask);
50   void archimedes_clear_irq_a(int mask);
51   void archimedes_clear_irq_b(int mask);
52   void archimedes_clear_fiq(int mask);
4953
50extern DECLARE_READ32_HANDLER(aristmk5_drame_memc_logical_r);
51extern DECLARE_READ32_HANDLER(archimedes_memc_logical_r);
52extern DECLARE_WRITE32_HANDLER(archimedes_memc_logical_w);
53extern DECLARE_READ32_HANDLER(archimedes_memc_r);
54extern DECLARE_WRITE32_HANDLER(archimedes_memc_w);
55extern DECLARE_WRITE32_HANDLER(archimedes_memc_page_w);
56extern DECLARE_READ32_HANDLER(archimedes_ioc_r);
57extern DECLARE_WRITE32_HANDLER(archimedes_ioc_w);
58extern DECLARE_READ32_HANDLER(archimedes_vidc_r);
59extern DECLARE_WRITE32_HANDLER(archimedes_vidc_w);
54   DECLARE_READ32_MEMBER(aristmk5_drame_memc_logical_r);
55   DECLARE_READ32_MEMBER(archimedes_memc_logical_r);
56   DECLARE_WRITE32_MEMBER(archimedes_memc_logical_w);
57   DECLARE_READ32_MEMBER(archimedes_memc_r);
58   DECLARE_WRITE32_MEMBER(archimedes_memc_w);
59   DECLARE_WRITE32_MEMBER(archimedes_memc_page_w);
60   DECLARE_READ32_MEMBER(archimedes_ioc_r);
61   DECLARE_WRITE32_MEMBER(archimedes_ioc_w);
62   DECLARE_READ32_MEMBER(archimedes_vidc_r);
63   DECLARE_WRITE32_MEMBER(archimedes_vidc_w);
6064
61extern UINT8 i2c_clk;
62extern INT16 memc_pages[0x2000];   // the logical RAM area is 32 megs, and the smallest page size is 4k
63extern UINT32 vidc_regs[256];
64extern UINT8 ioc_regs[0x80/4];
65extern UINT8 vidc_bpp_mode;
66extern UINT8 vidc_interlace;
65   UINT8 m_i2c_clk;
66   INT16 m_memc_pages[0x2000];   // the logical RAM area is 32 megs, and the smallest page size is 4k
67   UINT32 m_vidc_regs[256];
68   UINT8 m_ioc_regs[0x80/4];
69   UINT8 m_vidc_bpp_mode;
70   UINT8 m_vidc_interlace;
71     
72   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
73   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
74private:
6775
76   static const device_timer_id TIMER_VBLANK = 0;
77   static const device_timer_id TIMER_VIDEO = 1;
78   static const device_timer_id TIMER_AUDIO = 2;
79   static const device_timer_id TIMER_IOC = 3;
80   
81   void vidc_vblank();
82   void vidc_video_tick();
83   void vidc_audio_tick();
84   void ioc_timer(int param);
85   
86   void vidc_dynamic_res_change();   
87   void latch_timer_cnt(int tmr);
88   void a310_set_timer(int tmr);
89   READ32_MEMBER(ioc_ctrl_r);
90   WRITE32_MEMBER(ioc_ctrl_w);
91
92   UINT32 *m_archimedes_memc_physmem;
93   UINT32 m_memc_pagesize;
94   int m_memc_latchrom;
95   UINT32 m_ioc_timercnt[4], m_ioc_timerout[4];
96   UINT32 m_vidc_vidstart, m_vidc_vidend, m_vidc_vidinit, m_vidc_vidcur;
97   UINT32 m_vidc_sndstart, m_vidc_sndend, m_vidc_sndcur;
98   UINT8 m_video_dma_on,m_audio_dma_on;
99   UINT8 m_vidc_pixel_clk;
100   UINT8 m_vidc_stereo_reg[8];
101   emu_timer *m_timer[4], *m_snd_timer, *m_vid_timer;
102   emu_timer *m_vbl_timer;   
103};
104
68105/* IOC registers */
69106
70107#define CONTROL         0x00/4
r18034r18035
101138#define T3_GO      0x78/4
102139#define T3_LATCH   0x7c/4
103140
104
105/*----------- defined in video/archimds.c -----------*/
106
107extern VIDEO_START( archimds_vidc );
108extern SCREEN_UPDATE_RGB32( archimds_vidc );
109
110141#define VIDC_HCR      0x80
111142#define VIDC_HSWR      0x84
112143#define VIDC_HBSR      0x88
trunk/src/mame/video/archimds.c
r18034r18035
77#include "emu.h"
88#include "includes/archimds.h"
99
10VIDEO_START( archimds_vidc )
10UINT32 archimedes_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
1111{
12}
13
14SCREEN_UPDATE_RGB32( archimds_vidc )
15{
1612   int xstart,ystart,xend,yend;
1713   int res_x,res_y;
1814   int xsize,ysize;
r18034r18035
2016   const UINT8 x_step[4] = { 5, 7, 11, 19 };
2117
2218   /* border color */
23   bitmap.fill(screen.machine().pens[0x10], cliprect);
19   bitmap.fill(machine().pens[0x10], cliprect);
2420
2521   /* define X display area through BPP mode register */
26   calc_dxs = (vidc_regs[VIDC_HDSR]*2)+x_step[vidc_bpp_mode & 3];
27   calc_dxe = (vidc_regs[VIDC_HDER]*2)+x_step[vidc_bpp_mode & 3];
22   calc_dxs = (m_vidc_regs[VIDC_HDSR]*2)+x_step[m_vidc_bpp_mode & 3];
23   calc_dxe = (m_vidc_regs[VIDC_HDER]*2)+x_step[m_vidc_bpp_mode & 3];
2824
2925   /* now calculate display clip rectangle start/end areas */
30   xstart = (calc_dxs)-vidc_regs[VIDC_HBSR];
31   ystart = (vidc_regs[VIDC_VDSR])-vidc_regs[VIDC_VBSR];
26   xstart = (calc_dxs)-m_vidc_regs[VIDC_HBSR];
27   ystart = (m_vidc_regs[VIDC_VDSR])-m_vidc_regs[VIDC_VBSR];
3228   xend = (calc_dxe)+xstart;
33   yend = vidc_regs[VIDC_VDER]+ystart;
29   yend = m_vidc_regs[VIDC_VDER]+ystart;
3430
3531   /* disable the screen if display params are invalid */
3632   if(xstart > xend || ystart > yend)
3733      return 0;
3834
3935   xsize = calc_dxe-calc_dxs;
40   ysize = vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR];
36   ysize = m_vidc_regs[VIDC_VDER]-m_vidc_regs[VIDC_VDSR];
4137
4238   {
4339      int count;
4440      int x,y,xi;
4541      UINT8 pen;
46      static UINT8 *vram = screen.machine().root_device().memregion("vram")->base();
42      static UINT8 *vram = machine().root_device().memregion("vram")->base();
4743
4844      count = (0);
4945
50      switch(vidc_bpp_mode)
46      switch(m_vidc_bpp_mode)
5147      {
5248         case 0: //1 bpp
5349         {
r18034r18035
6056                  for(xi=0;xi<8;xi++)
6157                  {
6258                     res_x = x+xi+xstart;
63                     res_y = (y+ystart)*(vidc_interlace+1);
59                     res_y = (y+ystart)*(m_vidc_interlace+1);
6460
65                     if(vidc_interlace)
61                     if(m_vidc_interlace)
6662                     {
6763                        if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend)
68                           bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen>>(xi))&0x1];
64                           bitmap.pix32(res_y, res_x) = machine().pens[(pen>>(xi))&0x1];
6965                        if (cliprect.contains(res_x, res_y+1) && (res_x) <= xend && (res_y+1) <= yend)
70                           bitmap.pix32(res_y+1, res_x) = screen.machine().pens[(pen>>(xi))&0x1];
66                           bitmap.pix32(res_y+1, res_x) = machine().pens[(pen>>(xi))&0x1];
7167                     }
7268                     else
7369                     {
7470                        if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend)
75                           bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen>>(xi))&0x1];
71                           bitmap.pix32(res_y, res_x) = machine().pens[(pen>>(xi))&0x1];
7672                     }
7773                  }
7874
r18034r18035
9086                  pen = vram[count];
9187
9288                  res_x = x+xstart;
93                  res_y = (y+ystart)*(vidc_interlace+1);
89                  res_y = (y+ystart)*(m_vidc_interlace+1);
9490
95                  if(vidc_interlace)
91                  if(m_vidc_interlace)
9692                  {
9793                     if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend)
98                        bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen&0xff)+0x100];
94                        bitmap.pix32(res_y, res_x) = machine().pens[(pen&0xff)+0x100];
9995                     if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y+1) <= yend)
100                        bitmap.pix32(res_y+1, res_x) = screen.machine().pens[(pen&0xff)+0x100];
96                        bitmap.pix32(res_y+1, res_x) = machine().pens[(pen&0xff)+0x100];
10197                  }
10298                  else
10399                  {
104100                     if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend)
105                        bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen&0xff)+0x100];
101                        bitmap.pix32(res_y, res_x) = machine().pens[(pen&0xff)+0x100];
106102                  }
107103
108104                  count++;
trunk/src/mame/drivers/ertictac.c
r18034r18035
2828#include "machine/i2cmem.h"
2929
3030
31class ertictac_state : public driver_device
31class ertictac_state : public archimedes_state
3232{
3333public:
3434   ertictac_state(const machine_config &mconfig, device_type type, const char *tag)
35      : driver_device(mconfig, type, tag) { }
35      : archimedes_state(mconfig, type, tag) { }
3636
3737   DECLARE_READ32_MEMBER(ertictac_podule_r);
3838   DECLARE_DRIVER_INIT(ertictac);
r18034r18035
4444
4545READ32_MEMBER(ertictac_state::ertictac_podule_r)
4646{
47   ioc_regs[IRQ_STATUS_B] &= ~ARCHIMEDES_IRQB_PODULE_IRQ;
47   m_ioc_regs[IRQ_STATUS_B] &= ~ARCHIMEDES_IRQB_PODULE_IRQ;
4848
4949   switch(offset)
5050   {
r18034r18035
5959}
6060
6161static ADDRESS_MAP_START( ertictac_map, AS_PROGRAM, 32, ertictac_state )
62   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE_LEGACY(archimedes_memc_logical_r, archimedes_memc_logical_w)
62   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE(archimedes_memc_logical_r, archimedes_memc_logical_w)
6363   AM_RANGE(0x02000000, 0x02ffffff) AM_RAM AM_SHARE("physicalram") /* physical RAM - 16 MB for now, should be 512k for the A310 */
6464
6565   AM_RANGE(0x03340000, 0x0334001f) AM_READ(ertictac_podule_r)
6666   AM_RANGE(0x033c0000, 0x033c001f) AM_READ(ertictac_podule_r)
6767
68   AM_RANGE(0x03000000, 0x033fffff) AM_READWRITE_LEGACY(archimedes_ioc_r, archimedes_ioc_w)
69   AM_RANGE(0x03400000, 0x035fffff) AM_READWRITE_LEGACY(archimedes_vidc_r, archimedes_vidc_w)
70   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE_LEGACY(archimedes_memc_r, archimedes_memc_w)
71   AM_RANGE(0x03800000, 0x03ffffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE_LEGACY(archimedes_memc_page_w)
68   AM_RANGE(0x03000000, 0x033fffff) AM_READWRITE(archimedes_ioc_r, archimedes_ioc_w)
69   AM_RANGE(0x03400000, 0x035fffff) AM_READWRITE(archimedes_vidc_r, archimedes_vidc_w)
70   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE(archimedes_memc_r, archimedes_memc_w)
71   AM_RANGE(0x03800000, 0x03ffffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE(archimedes_memc_page_w)
7272ADDRESS_MAP_END
7373
7474static INPUT_PORTS_START( ertictac )
r18034r18035
193193
194194DRIVER_INIT_MEMBER(ertictac_state,ertictac)
195195{
196   archimedes_driver_init(machine());
196   archimedes_driver_init();
197197}
198198
199199void ertictac_state::machine_start()
200200{
201   archimedes_init(machine());
201   archimedes_init();
202202
203203   // reset the DAC to centerline
204204   //machine().device<dac_device>("dac")->write_signed8(0x80);
r18034r18035
206206
207207void ertictac_state::machine_reset()
208208{
209   archimedes_reset(machine());
209   archimedes_reset();
210210}
211211
212212INTERRUPT_GEN_MEMBER(ertictac_state::ertictac_podule_irq)
213213{
214   archimedes_request_irq_b(machine(), ARCHIMEDES_IRQB_PODULE_IRQ);
214   archimedes_request_irq_b(ARCHIMEDES_IRQB_PODULE_IRQ);
215215}
216216
217217/* TODO: Are we sure that this HW have I2C device? */
r18034r18035
237237   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
238238   MCFG_SCREEN_SIZE(1280, 1024)
239239   MCFG_SCREEN_VISIBLE_AREA(0, 1280-1, 0, 1024-1)
240   MCFG_SCREEN_UPDATE_STATIC(archimds_vidc)
240   MCFG_SCREEN_UPDATE_DRIVER(archimedes_state, screen_update)
241241
242242   MCFG_PALETTE_LENGTH(0x200)
243243
244   MCFG_VIDEO_START(archimds_vidc)
245
246244   MCFG_SPEAKER_STANDARD_MONO("mono")
247245   MCFG_DAC_ADD("dac0")
248246   MCFG_SOUND_ROUTE(0, "mono", 0.05)
trunk/src/mame/drivers/aristmk5.c
r18034r18035
6464//#include "machine/i2cmem.h"
6565
6666
67class aristmk5_state : public driver_device
67class aristmk5_state : public archimedes_state
6868{
6969public:
7070   aristmk5_state(const machine_config &mconfig, device_type type, const char *tag)
71      : driver_device(mconfig, type, tag) { }
71      : archimedes_state(mconfig, type, tag) { }
7272
7373   emu_timer *m_mk5_2KHz_timer;
7474   emu_timer *m_mk5_VSYNC_timer;
r18034r18035
8989static TIMER_CALLBACK( mk5_VSYNC_callback )
9090{
9191   aristmk5_state *state = machine.driver_data<aristmk5_state>();
92    ioc_regs[IRQ_STATUS_A] |= 0x08; //turn vsync bit on
92    state->m_ioc_regs[IRQ_STATUS_A] |= 0x08; //turn vsync bit on
9393   state->m_mk5_VSYNC_timer->adjust(attotime::never);
9494}
9595
r18034r18035
131131    */
132132
133133
134   ioc_regs[IRQ_STATUS_A] &= ~0x08;
134   m_ioc_regs[IRQ_STATUS_A] &= ~0x08;
135135
136136   /*          bit 1              bit 0 */
137137   if((data &~(0x02)) && (data & (0x01))) // external video crystal is enabled. 25 mhz
r18034r18035
155155static TIMER_CALLBACK( mk5_2KHz_callback )
156156{
157157   aristmk5_state *state = machine.driver_data<aristmk5_state>();
158   ioc_regs[IRQ_STATUS_A] |= 0x01;
158   state->m_ioc_regs[IRQ_STATUS_A] |= 0x01;
159159   state->m_mk5_2KHz_timer->adjust(attotime::never);
160160
161161}
r18034r18035
183183
184184   // reset 2KHz timer
185185    m_mk5_2KHz_timer->adjust(attotime::from_hz(1953.125));
186    ioc_regs[IRQ_STATUS_A] &= ~0x01;
186    m_ioc_regs[IRQ_STATUS_A] &= ~0x01;
187187    machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
188188   return 0xffffffff;
189189}
r18034r18035
202202      int vert_pos;
203203
204204      vert_pos = machine().primary_screen->vpos();
205      m_flyback = (vert_pos <= vidc_regs[VIDC_VDSR] || vert_pos >= vidc_regs[VIDC_VDER]) ? 0x80 : 0x00;
205      m_flyback = (vert_pos <= m_vidc_regs[VIDC_VDSR] || vert_pos >= m_vidc_regs[VIDC_VDER]) ? 0x80 : 0x00;
206206
207207      //i2c_data = (i2cmem_sda_read(machine().device("i2cmem")) & 1);
208208
209      return (m_flyback) | (ioc_regs[CONTROL] & 0x7c) | (1<<1) | 1;
209      return (m_flyback) | (m_ioc_regs[CONTROL] & 0x7c) | (1<<1) | 1;
210210   }
211211
212212   return archimedes_ioc_r(space,offset,mem_mask);
r18034r18035
224224   {
225225      if(((ioc_addr == 0x20) || (ioc_addr == 0x30)) && (offset & 0x1f) == 0)
226226      {
227         ioc_regs[CONTROL] = data & 0x7c;
227         m_ioc_regs[CONTROL] = data & 0x7c;
228228         return;
229229      }
230230      else
r18034r18035
298298
299299/* U.S games have no dram emulator enabled */
300300static ADDRESS_MAP_START( aristmk5_map, AS_PROGRAM, 32, aristmk5_state )
301   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE_LEGACY(archimedes_memc_logical_r, archimedes_memc_logical_w)
301   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE(archimedes_memc_logical_r, archimedes_memc_logical_w)
302302   AM_RANGE(0x02000000, 0x02ffffff) AM_RAM AM_SHARE("physicalram") /* physical RAM - 16 MB for now, should be 512k for the A310 */
303303
304304   /* MK-5 overrides */
r18034r18035
317317
318318   AM_RANGE(0x03000000, 0x0331ffff) AM_READWRITE(mk5_ioc_r, mk5_ioc_w)
319319   AM_RANGE(0x03320000, 0x0333ffff) AM_RAMBANK("sram_bank_nz") // AM_BASE_SIZE_GENERIC(nvram) // nvram 32kbytes x 3 NZ
320   AM_RANGE(0x03400000, 0x035fffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE_LEGACY(archimedes_vidc_w)
321   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE_LEGACY(archimedes_memc_r, archimedes_memc_w)
322   AM_RANGE(0x03800000, 0x039fffff) AM_WRITE_LEGACY(archimedes_memc_page_w)
320   AM_RANGE(0x03400000, 0x035fffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE(archimedes_vidc_w)
321   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE(archimedes_memc_r, archimedes_memc_w)
322   AM_RANGE(0x03800000, 0x039fffff) AM_WRITE(archimedes_memc_page_w)
323323ADDRESS_MAP_END
324324
325325/* with dram emulator enabled */
326326static ADDRESS_MAP_START( aristmk5_drame_map, AS_PROGRAM, 32, aristmk5_state )
327   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE_LEGACY(aristmk5_drame_memc_logical_r, archimedes_memc_logical_w)
327   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE(aristmk5_drame_memc_logical_r, archimedes_memc_logical_w)
328328   AM_RANGE(0x02000000, 0x02ffffff) AM_RAM AM_SHARE("physicalram") /* physical RAM - 16 MB for now, should be 512k for the A310 */
329329
330330   /* MK-5 overrides */
r18034r18035
344344
345345   AM_RANGE(0x03000000, 0x0331ffff) AM_READWRITE(mk5_ioc_r, mk5_ioc_w)
346346   AM_RANGE(0x03320000, 0x0333ffff) AM_RAMBANK("sram_bank_nz") // AM_BASE_SIZE_GENERIC(nvram) // nvram 32kbytes x 3 NZ
347   AM_RANGE(0x03400000, 0x035fffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE_LEGACY(archimedes_vidc_w)
348   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE_LEGACY(archimedes_memc_r, archimedes_memc_w)
349   AM_RANGE(0x03800000, 0x039fffff) AM_WRITE_LEGACY(archimedes_memc_page_w)
347   AM_RANGE(0x03400000, 0x035fffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE(archimedes_vidc_w)
348   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE(archimedes_memc_r, archimedes_memc_w)
349   AM_RANGE(0x03800000, 0x039fffff) AM_WRITE(archimedes_memc_page_w)
350350ADDRESS_MAP_END
351351
352352
r18034r18035
365365   UINT8 *SRAM    = machine().root_device().memregion("sram")->base();
366366   UINT8 *SRAM_NZ = machine().root_device().memregion("sram")->base();
367367
368   archimedes_driver_init(machine());
368   archimedes_driver_init();
369369
370370   machine().root_device().membank("sram_bank")->configure_entries(0, 4,    &SRAM[0],    0x20000);
371371   machine().root_device().membank("sram_bank_nz")->configure_entries(0, 4, &SRAM_NZ[0], 0x20000);
r18034r18035
374374
375375void aristmk5_state::machine_start()
376376{
377   archimedes_init(machine());
377   archimedes_init();
378378
379379   // reset the DAC to centerline
380380   //machine().device<dac_device>("dac")->write_signed8(0x80);
r18034r18035
385385
386386void aristmk5_state::machine_reset()
387387{
388   archimedes_reset(machine());
388   archimedes_reset();
389389   m_mk5_2KHz_timer->adjust(attotime::from_hz(1953.125)); // 8MHz / 4096
390390   m_mk5_VSYNC_timer->adjust(attotime::from_hz(50000)); // default bit 1 & bit 2 == 0
391391
392   ioc_regs[IRQ_STATUS_B] |= 0x40; //hack, set keyboard irq empty to be ON
392   m_ioc_regs[IRQ_STATUS_B] |= 0x40; //hack, set keyboard irq empty to be ON
393393
394394   /* load the roms according to what the operator wants */
395395   {
r18034r18035
435435
436436   MCFG_PALETTE_LENGTH(0x200)
437437
438   MCFG_SCREEN_UPDATE_STATIC(archimds_vidc)
438   MCFG_SCREEN_UPDATE_DRIVER(archimedes_state, screen_update)
439439
440440   MCFG_SPEAKER_STANDARD_MONO("mono")
441441   MCFG_DAC_ADD("dac0")
r18034r18035
478478
479479   MCFG_PALETTE_LENGTH(0x200)
480480
481   MCFG_VIDEO_START(archimds_vidc)
482   MCFG_SCREEN_UPDATE_STATIC(archimds_vidc)
481   MCFG_SCREEN_UPDATE_DRIVER(archimedes_state, screen_update)
483482
484483   MCFG_SPEAKER_STANDARD_MONO("mono")
485484   MCFG_DAC_ADD("dac0")
trunk/src/mess/drivers/a310.c
r18034r18035
6565#include "machine/ram.h"
6666
6767
68class a310_state : public driver_device
68class a310_state : public archimedes_state
6969{
7070public:
7171   a310_state(const machine_config &mconfig, device_type type, const char *tag)
72      : driver_device(mconfig, type, tag),
72      : archimedes_state(mconfig, type, tag),
7373        m_physram(*this, "physicalram") { }
7474
7575   required_shared_ptr<UINT32> m_physram;
7676
7777   DECLARE_READ32_MEMBER(a310_psy_wram_r);
7878   DECLARE_WRITE32_MEMBER(a310_psy_wram_w);
79   DECLARE_WRITE_LINE_MEMBER(a310_wd177x_intrq_w);
80   DECLARE_WRITE_LINE_MEMBER(a310_wd177x_drq_w);
7981   DECLARE_DRIVER_INIT(a310);
8082   virtual void machine_start();
8183   virtual void machine_reset();
8284};
8385
8486
85static WRITE_LINE_DEVICE_HANDLER( a310_wd177x_intrq_w )
87WRITE_LINE_MEMBER(a310_state::a310_wd177x_intrq_w)
8688{
8789   if (state)
88      archimedes_request_fiq(device->machine(), ARCHIMEDES_FIQ_FLOPPY);
90      archimedes_request_fiq(ARCHIMEDES_FIQ_FLOPPY);
8991   else
90      archimedes_clear_fiq(device->machine(), ARCHIMEDES_FIQ_FLOPPY);
92      archimedes_clear_fiq(ARCHIMEDES_FIQ_FLOPPY);
9193}
9294
93static WRITE_LINE_DEVICE_HANDLER( a310_wd177x_drq_w )
95WRITE_LINE_MEMBER(a310_state::a310_wd177x_drq_w)
9496{
9597   if (state)
96      archimedes_request_fiq(device->machine(), ARCHIMEDES_FIQ_FLOPPY_DRQ);
98      archimedes_request_fiq(ARCHIMEDES_FIQ_FLOPPY_DRQ);
9799   else
98      archimedes_clear_fiq(device->machine(), ARCHIMEDES_FIQ_FLOPPY_DRQ);
100      archimedes_clear_fiq(ARCHIMEDES_FIQ_FLOPPY_DRQ);
99101}
100102
101103READ32_MEMBER(a310_state::a310_psy_wram_r)
r18034r18035
115117
116118   machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler( 0x02000000, 0x02000000+(ram_size-1), read32_delegate(FUNC(a310_state::a310_psy_wram_r), this), write32_delegate(FUNC(a310_state::a310_psy_wram_w), this));
117119
118   archimedes_driver_init(machine());
120   archimedes_driver_init();
119121}
120122
121123void a310_state::machine_start()
122124{
123   archimedes_init(machine());
125   archimedes_init();
124126
125127   // reset the DAC to centerline
126128   //machine().device<dac_device>("dac")->write_signed8(0x80);
r18034r18035
128130
129131void a310_state::machine_reset()
130132{
131   archimedes_reset(machine());
133   archimedes_reset();
132134}
133135
134136static ADDRESS_MAP_START( a310_mem, AS_PROGRAM, 32, a310_state )
135   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE_LEGACY(archimedes_memc_logical_r, archimedes_memc_logical_w)
137   AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE(archimedes_memc_logical_r, archimedes_memc_logical_w)
136138   AM_RANGE(0x02000000, 0x02ffffff) AM_RAM AM_SHARE("physicalram") /* physical RAM - 16 MB for now, should be 512k for the A310 */
137   AM_RANGE(0x03000000, 0x033fffff) AM_READWRITE_LEGACY(archimedes_ioc_r, archimedes_ioc_w)
138   AM_RANGE(0x03400000, 0x035fffff) AM_READWRITE_LEGACY(archimedes_vidc_r, archimedes_vidc_w)
139   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE_LEGACY(archimedes_memc_r, archimedes_memc_w)
140   AM_RANGE(0x03800000, 0x03ffffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE_LEGACY(archimedes_memc_page_w)
139   AM_RANGE(0x03000000, 0x033fffff) AM_READWRITE(archimedes_ioc_r, archimedes_ioc_w)
140   AM_RANGE(0x03400000, 0x035fffff) AM_READWRITE(archimedes_vidc_r, archimedes_vidc_w)
141   AM_RANGE(0x03600000, 0x037fffff) AM_READWRITE(archimedes_memc_r, archimedes_memc_w)
142   AM_RANGE(0x03800000, 0x03ffffff) AM_ROM AM_REGION("maincpu", 0) AM_WRITE(archimedes_memc_page_w)
141143ADDRESS_MAP_END
142144
143145
r18034r18035
255257static const wd17xx_interface a310_wd17xx_interface =
256258{
257259   DEVCB_NULL,
258   DEVCB_LINE(a310_wd177x_intrq_w),
259   DEVCB_LINE(a310_wd177x_drq_w),
260   DEVCB_DRIVER_LINE_MEMBER(a310_state, a310_wd177x_intrq_w),
261   DEVCB_DRIVER_LINE_MEMBER(a310_state, a310_wd177x_drq_w),
260262   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
261263};
262264
r18034r18035
279281   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
280282   MCFG_SCREEN_SIZE(1280, 1024) //TODO: default screen size
281283   MCFG_SCREEN_VISIBLE_AREA(0*8, 1280 - 1, 0*16, 1024 - 1)
282   MCFG_SCREEN_UPDATE_STATIC(archimds_vidc)
284   MCFG_SCREEN_UPDATE_DRIVER(archimedes_state, screen_update)
283285
284286   MCFG_PALETTE_LENGTH(32768)
285287
286   MCFG_VIDEO_START(archimds_vidc)
287
288288   MCFG_RAM_ADD(RAM_TAG)
289289   MCFG_RAM_DEFAULT_SIZE("2M")
290290   MCFG_RAM_EXTRA_OPTIONS("512K, 1M, 4M, 8M, 16M")

Previous 199869 Revisions Next


© 1997-2024 The MAME Team