Previous 15994 Revisions Next

r14845 Tuesday 3rd April, 2012 at 11:21:16 UTC by Miodrag Milanović
MESS going modern (no whatsnew)
[src/mess/drivers]a310.c atm.c dectalk.c ex800.c fp6000.c ip20.c jr100.c jr200.c juicebox.c mmodular.c multi8.c mz2000.c mz2500.c osbexec.c paso1600.c pc6001.c pc8801.c pc88va.c pc9801.c pk8000.c pockstat.c px4.c pyl601.c rt1715.c rvoice.c sgi_ip2.c sgi_ip6.c smc777.c socrates.c spc1000.c ti990_4.c ti99_2.c tvc.c vtech1.c

src/mess/drivers/dectalk.c
r14844r14845
179179   UINT8 m_hack_self_test; // temp variable for hack below
180180
181181   required_device<generic_terminal_device> m_terminal;
182   DECLARE_READ8_MEMBER(nvram_read);
183   DECLARE_WRITE8_MEMBER(led_write);
184   DECLARE_WRITE8_MEMBER(nvram_write);
185   DECLARE_WRITE16_MEMBER(m68k_infifo_w);
186   DECLARE_READ16_MEMBER(m68k_spcflags_r);
187   DECLARE_WRITE16_MEMBER(m68k_spcflags_w);
188   DECLARE_READ16_MEMBER(m68k_tlcflags_r);
189   DECLARE_WRITE16_MEMBER(m68k_tlcflags_w);
190   DECLARE_READ16_MEMBER(m68k_tlc_dtmf_r);
191   DECLARE_WRITE16_MEMBER(spc_latch_outfifo_error_stats);
192   DECLARE_READ16_MEMBER(spc_infifo_data_r);
193   DECLARE_WRITE16_MEMBER(spc_outfifo_data_w);
194   DECLARE_READ16_MEMBER(spc_semaphore_r);
182195};
183196
184197
r14844r14845
337350}
338351
339352/* Begin 68k i/o handlers */
340static READ8_HANDLER( nvram_read ) // read from x2212 nvram chip and possibly do recall
353READ8_MEMBER(dectalk_state::nvram_read)// read from x2212 nvram chip and possibly do recall
341354{
342   dectalk_state *state = space->machine().driver_data<dectalk_state>();
343355   UINT8 data = 0xFF;
344   data = state->m_x2214_sram[offset&0xff]; // TODO: should this be before or after a possible /RECALL? I'm guessing before.
356   data = m_x2214_sram[offset&0xff]; // TODO: should this be before or after a possible /RECALL? I'm guessing before.
345357#ifdef NVRAM_LOG
346358      logerror("m68k: nvram read at %08X: %02X\n", offset, data);
347359#endif
348360   if (offset&0x200) // if a9 is set, do a /RECALL
349   dectalk_x2212_recall(space->machine());
361   dectalk_x2212_recall(machine());
350362   return data;
351363}
352364
353static WRITE8_HANDLER( led_write )
365WRITE8_MEMBER(dectalk_state::led_write)
354366{
355   dectalk_state *state = space->machine().driver_data<dectalk_state>();
356   state->m_statusLED = data&0xFF;
367   m_statusLED = data&0xFF;
357368   popmessage("LED status: %02X\n", data&0xFF);
358369#ifdef VERBOSE
359370   logerror("m68k: LED status: %02X\n", data&0xFF);
r14844r14845
361372   //popmessage("LED status: %x %x %x %x %x %x %x %x\n", data&0x80, data&0x40, data&0x20, data&0x10, data&0x8, data&0x4, data&0x2, data&0x1);
362373}
363374
364static WRITE8_HANDLER( nvram_write ) // write to X2212 NVRAM chip and possibly do store
375WRITE8_MEMBER(dectalk_state::nvram_write)// write to X2212 NVRAM chip and possibly do store
365376{
366   dectalk_state *state = space->machine().driver_data<dectalk_state>();
367377#ifdef NVRAM_LOG
368378   logerror("m68k: nvram write at %08X: %02X\n", offset, data&0x0f);
369379#endif
370   state->m_x2214_sram[offset&0xff] = (UINT8)data&0x0f; // TODO: should this be before or after a possible /STORE? I'm guessing before.
380   m_x2214_sram[offset&0xff] = (UINT8)data&0x0f; // TODO: should this be before or after a possible /STORE? I'm guessing before.
371381   if (offset&0x200) // if a9 is set, do a /STORE
372   dectalk_x2212_store(space->machine());
382   dectalk_x2212_store(machine());
373383}
374384
375static WRITE16_HANDLER( m68k_infifo_w ) // 68k write to the speech input fifo
385WRITE16_MEMBER(dectalk_state::m68k_infifo_w)// 68k write to the speech input fifo
376386{
377   dectalk_state *state = space->machine().driver_data<dectalk_state>();
378387#ifdef USE_LOOSE_TIMING
379   space->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(25));
388   machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(25));
380389#endif
381390#ifdef SPC_LOG_68K
382   logerror("m68k: SPC infifo written with data = %04X, fifo head was: %02X; fifo tail: %02X\n",data, state->m_infifo_head_ptr, state->m_infifo_tail_ptr);
391   logerror("m68k: SPC infifo written with data = %04X, fifo head was: %02X; fifo tail: %02X\n",data, m_infifo_head_ptr, m_infifo_tail_ptr);
383392#endif
384393   // if fifo is full (head ptr = tail ptr-1), do not increment the head ptr and do not store the data
385   if (((state->m_infifo_tail_ptr-1)&0x1F) == state->m_infifo_head_ptr)
394   if (((m_infifo_tail_ptr-1)&0x1F) == m_infifo_head_ptr)
386395   {
387396#ifdef SPC_LOG_68K
388397      logerror("infifo was full, write ignored!\n");
389398#endif
390399      return;
391400   }
392   state->m_infifo[state->m_infifo_head_ptr] = data;
393   state->m_infifo_head_ptr++;
394   state->m_infifo_head_ptr&=0x1F;
401   m_infifo[m_infifo_head_ptr] = data;
402   m_infifo_head_ptr++;
403   m_infifo_head_ptr&=0x1F;
395404}
396405
397static READ16_HANDLER( m68k_spcflags_r ) // 68k read from the speech flags
406READ16_MEMBER(dectalk_state::m68k_spcflags_r)// 68k read from the speech flags
398407{
399   dectalk_state *state = space->machine().driver_data<dectalk_state>();
400408   UINT8 data = 0;
401   data |= state->m_m68k_spcflags_latch; // bits 0 and 6
402   data |= state->m_spc_error_latch<<5; // bit 5
403   data |= state->m_infifo_semaphore<<7; // bit 7
409   data |= m_m68k_spcflags_latch; // bits 0 and 6
410   data |= m_spc_error_latch<<5; // bit 5
411   data |= m_infifo_semaphore<<7; // bit 7
404412#ifdef SPC_LOG_68K
405413   logerror("m68k: SPC flags read, returning data = %04X\n",data);
406414#endif
407415   return data;
408416}
409417
410static WRITE16_HANDLER( m68k_spcflags_w ) // 68k write to the speech flags (only 3 bits do anything)
418WRITE16_MEMBER(dectalk_state::m68k_spcflags_w)// 68k write to the speech flags (only 3 bits do anything)
411419{
412   dectalk_state *state = space->machine().driver_data<dectalk_state>();
413420#ifdef USE_LOOSE_TIMING
414   space->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(25));
421   machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(25));
415422#endif
416423#ifdef SPC_LOG_68K
417424   logerror("m68k: SPC flags written with %04X, only storing %04X\n",data, data&0x41);
418425#endif
419   state->m_m68k_spcflags_latch = data&0x41; // ONLY store bits 6 and 0!
426   m_m68k_spcflags_latch = data&0x41; // ONLY store bits 6 and 0!
420427   // d0: initialize speech flag (reset tms32010 and clear infifo and outfifo if high)
421428   if ((data&0x1) == 0x1) // bit 0
422429   {
423430#ifdef SPC_LOG_68K
424431      logerror(" | 0x01: initialize speech: fifos reset, clear error+semaphore latches and dsp reset\n");
425432#endif
426      dectalk_clear_all_fifos(space->machine());
427      cputag_set_input_line(space->machine(), "dsp", INPUT_LINE_RESET, ASSERT_LINE); // speech reset forces the CLR line active on the tms32010
433      dectalk_clear_all_fifos(machine());
434      cputag_set_input_line(machine(), "dsp", INPUT_LINE_RESET, ASSERT_LINE); // speech reset forces the CLR line active on the tms32010
428435      // clear the two speech side latches
429      state->m_spc_error_latch = 0;
430      dectalk_semaphore_w(space->machine(), 0);
436      m_spc_error_latch = 0;
437      dectalk_semaphore_w(machine(), 0);
431438   }
432439   else // (data&0x1) == 0
433440   {
434441#ifdef SPC_LOG_68K
435442      logerror(" | 0x01 = 0: initialize speech off, dsp running\n");
436443#endif
437      cputag_set_input_line(space->machine(), "dsp", INPUT_LINE_RESET, CLEAR_LINE); // speech reset deassert clears the CLR line on the tms32010
444      cputag_set_input_line(machine(), "dsp", INPUT_LINE_RESET, CLEAR_LINE); // speech reset deassert clears the CLR line on the tms32010
438445   }
439446   if ((data&0x2) == 0x2) // bit 1 - clear error and semaphore latches
440447   {
r14844r14845
442449      logerror(" | 0x02: clear error+semaphore latches\n");
443450#endif
444451      // clear the two speech side latches
445      state->m_spc_error_latch = 0;
446      dectalk_semaphore_w(space->machine(), 0);
452      m_spc_error_latch = 0;
453      dectalk_semaphore_w(machine(), 0);
447454   }
448455   if ((data&0x40) == 0x40) // bit 6 - spc irq enable
449456   {
450457#ifdef SPC_LOG_68K
451458      logerror(" | 0x40: speech int enabled\n");
452459#endif
453      if (state->m_infifo_semaphore == 1)
460      if (m_infifo_semaphore == 1)
454461      {
455462#ifdef SPC_LOG_68K
456463         logerror("    speech int fired!\n");
457464#endif
458         cputag_set_input_line_and_vector(space->machine(), "maincpu", M68K_IRQ_5, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); // set int because semaphore was set
465         cputag_set_input_line_and_vector(machine(), "maincpu", M68K_IRQ_5, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); // set int because semaphore was set
459466      }
460467   }
461468   else // data&0x40 == 0
r14844r14845
463470#ifdef SPC_LOG_68K
464471      logerror(" | 0x40 = 0: speech int disabled\n");
465472#endif
466      cputag_set_input_line_and_vector(space->machine(), "maincpu", M68K_IRQ_5, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR); // clear int because int is now disabled
473      cputag_set_input_line_and_vector(machine(), "maincpu", M68K_IRQ_5, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR); // clear int because int is now disabled
467474   }
468475}
469476
470static READ16_HANDLER( m68k_tlcflags_r ) // dtmf flags read
477READ16_MEMBER(dectalk_state::m68k_tlcflags_r)// dtmf flags read
471478{
472   dectalk_state *state = space->machine().driver_data<dectalk_state>();
473479   UINT16 data = 0;
474   data |= state->m_m68k_tlcflags_latch; // bits 6, 8, 14;
475   data |= state->m_tlc_tonedetect<<7; // bit 7 is tone detect
476   data |= state->m_tlc_ringdetect<<14; // bit 15 is ring detect
480   data |= m_m68k_tlcflags_latch; // bits 6, 8, 14;
481   data |= m_tlc_tonedetect<<7; // bit 7 is tone detect
482   data |= m_tlc_ringdetect<<14; // bit 15 is ring detect
477483#ifdef TLC_LOG
478484   logerror("m68k: TLC flags read, returning data = %04X\n",data);
479485#endif
480486   return data;
481487}
482488
483static WRITE16_HANDLER( m68k_tlcflags_w ) // dtmf flags write
489WRITE16_MEMBER(dectalk_state::m68k_tlcflags_w)// dtmf flags write
484490{
485   dectalk_state *state = space->machine().driver_data<dectalk_state>();
486491#ifdef TLC_LOG
487492   logerror("m68k: TLC flags written with %04X, only storing %04X\n",data, data&0x4140);
488493#endif
489   state->m_m68k_tlcflags_latch = data&0x4140; // ONLY store bits 6 8 and 14!
494   m_m68k_tlcflags_latch = data&0x4140; // ONLY store bits 6 8 and 14!
490495   if ((data&0x40) == 0x40) // bit 6: tone detect interrupt enable
491496   {
492497#ifdef TLC_LOG
493498      logerror(" | 0x40: tone detect int enabled\n");
494499#endif
495      if (state->m_tlc_tonedetect == 1)
500      if (m_tlc_tonedetect == 1)
496501      {
497502#ifdef TLC_LOG
498503         logerror("    TLC int fired!\n");
499504#endif
500         cputag_set_input_line_and_vector(space->machine(), "maincpu", M68K_IRQ_4, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); // set int because tone detect was set
505         cputag_set_input_line_and_vector(machine(), "maincpu", M68K_IRQ_4, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); // set int because tone detect was set
501506      }
502507   }
503508   else // data&0x40 == 0
r14844r14845
505510#ifdef TLC_LOG
506511      logerror(" | 0x40 = 0: tone detect int disabled\n");
507512#endif
508   if (((data&0x4000)!=0x4000) || (state->m_tlc_ringdetect == 0)) // check to be sure we don't disable int if both ints fired at once
509      cputag_set_input_line_and_vector(space->machine(), "maincpu", M68K_IRQ_4, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR); // clear int because int is now disabled
513   if (((data&0x4000)!=0x4000) || (m_tlc_ringdetect == 0)) // check to be sure we don't disable int if both ints fired at once
514      cputag_set_input_line_and_vector(machine(), "maincpu", M68K_IRQ_4, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR); // clear int because int is now disabled
510515   }
511516   if ((data&0x100) == 0x100) // bit 8: answer phone relay enable
512517   {
r14844r14845
525530#ifdef TLC_LOG
526531      logerror(" | 0x4000: ring detect int enabled\n");
527532#endif
528      if (state->m_tlc_ringdetect == 1)
533      if (m_tlc_ringdetect == 1)
529534      {
530535#ifdef TLC_LOG
531536         logerror("    TLC int fired!\n");
532537#endif
533         cputag_set_input_line_and_vector(space->machine(), "maincpu", M68K_IRQ_4, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); // set int because tone detect was set
538         cputag_set_input_line_and_vector(machine(), "maincpu", M68K_IRQ_4, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); // set int because tone detect was set
534539      }
535540   }
536541   else // data&0x4000 == 0
r14844r14845
538543#ifdef TLC_LOG
539544      logerror(" | 0x4000 = 0: ring detect int disabled\n");
540545#endif
541   if (((data&0x40)!=0x40) || (state->m_tlc_tonedetect == 0)) // check to be sure we don't disable int if both ints fired at once
542      cputag_set_input_line_and_vector(space->machine(), "maincpu", M68K_IRQ_4, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR); // clear int because int is now disabled
546   if (((data&0x40)!=0x40) || (m_tlc_tonedetect == 0)) // check to be sure we don't disable int if both ints fired at once
547      cputag_set_input_line_and_vector(machine(), "maincpu", M68K_IRQ_4, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR); // clear int because int is now disabled
543548   }
544549}
545550
546static READ16_HANDLER( m68k_tlc_dtmf_r ) // dtmf chip read
551READ16_MEMBER(dectalk_state::m68k_tlc_dtmf_r)// dtmf chip read
547552{
548553#ifdef TLC_LOG
549   dectalk_state *state = space->machine().driver_data<dectalk_state>();
550554   UINT16 data = 0xFFFF;
551   data = state->m_tlc_dtmf&0xF;
555   data = m_tlc_dtmf&0xF;
552556   logerror("m68k: TLC dtmf detector read, returning data = %02X", data);
553557#endif
554558   return 0;
r14844r14845
556560/* End 68k i/o handlers */
557561
558562/* Begin tms32010 i/o handlers */
559static WRITE16_HANDLER( spc_latch_outfifo_error_stats ) // latch 74ls74 @ E64 upper and lower halves with d0 and 1 respectively
563WRITE16_MEMBER(dectalk_state::spc_latch_outfifo_error_stats)// latch 74ls74 @ E64 upper and lower halves with d0 and 1 respectively
560564{
561   dectalk_state *state = space->machine().driver_data<dectalk_state>();
562565#ifdef USE_LOOSE_TIMING
563   space->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(25));
566   machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(25));
564567#endif
565568#ifdef SPC_LOG_DSP
566569   logerror("dsp: set fifo semaphore and set error status = %01X\n",data&1);
567570#endif
568   dectalk_semaphore_w(space->machine(), (~state->m_simulate_outfifo_error)&1); // always set to 1 here, unless outfifo error.
569   state->m_spc_error_latch = (data&1);
571   dectalk_semaphore_w(machine(), (~m_simulate_outfifo_error)&1); // always set to 1 here, unless outfifo error.
572   m_spc_error_latch = (data&1);
570573}
571574
572static READ16_HANDLER( spc_infifo_data_r )
575READ16_MEMBER(dectalk_state::spc_infifo_data_r)
573576{
574   dectalk_state *state = space->machine().driver_data<dectalk_state>();
575577   UINT16 data = 0xFFFF;
576   data = state->m_infifo[state->m_infifo_tail_ptr];
578   data = m_infifo[m_infifo_tail_ptr];
577579#ifdef SPC_LOG_DSP
578   logerror("dsp: SPC infifo read with data = %04X, fifo head: %02X; fifo tail was: %02X\n",data, state->m_infifo_head_ptr, state->m_infifo_tail_ptr);
580   logerror("dsp: SPC infifo read with data = %04X, fifo head: %02X; fifo tail was: %02X\n",data, m_infifo_head_ptr, m_infifo_tail_ptr);
579581#endif
580582   // if fifo is empty (tail ptr == head ptr), do not increment the tail ptr, otherwise do.
581   if (state->m_infifo_tail_ptr != state->m_infifo_head_ptr) state->m_infifo_tail_ptr++; // technically correct but doesn't match sn74ls224 sheet
582   //if (((state->m_infifo_head_ptr-1)&0x1F) != state->m_infifo_tail_ptr) state->m_infifo_tail_ptr++; // matches sn74ls224 sheet
583   state->m_infifo_tail_ptr&=0x1F;
583   if (m_infifo_tail_ptr != m_infifo_head_ptr) m_infifo_tail_ptr++; // technically correct but doesn't match sn74ls224 sheet
584   //if (((m_infifo_head_ptr-1)&0x1F) != m_infifo_tail_ptr) m_infifo_tail_ptr++; // matches sn74ls224 sheet
585   m_infifo_tail_ptr&=0x1F;
584586   return data;
585587}
586588
587static WRITE16_HANDLER( spc_outfifo_data_w )
589WRITE16_MEMBER(dectalk_state::spc_outfifo_data_w)
588590{
589   dectalk_state *state = space->machine().driver_data<dectalk_state>();
590591   // the low 4 data bits are thrown out on the real unit due to use of a 12 bit dac (and to save use of another 16x4 fifo chip), though technically they're probably valid, and with suitable hacking a dtc-01 could probably output full 16 bit samples at 10khz.
591592#ifdef SPC_LOG_DSP
592   logerror("dsp: SPC outfifo write, data = %04X, fifo head was: %02X; fifo tail: %02X\n", data, state->m_outfifo_head_ptr, state->m_outfifo_tail_ptr);
593   logerror("dsp: SPC outfifo write, data = %04X, fifo head was: %02X; fifo tail: %02X\n", data, m_outfifo_head_ptr, m_outfifo_tail_ptr);
593594#endif
594   cputag_set_input_line(space->machine(), "dsp", 0, CLEAR_LINE); //TMS32010 INT (cleared because LDCK inverts the IR line, clearing int on any outfifo write... for a moment at least.)
595   cputag_set_input_line(machine(), "dsp", 0, CLEAR_LINE); //TMS32010 INT (cleared because LDCK inverts the IR line, clearing int on any outfifo write... for a moment at least.)
595596   // if fifo is full (head ptr = tail ptr-1), do not increment the head ptr and do not store the data
596   if (((state->m_outfifo_tail_ptr-1)&0xF) == state->m_outfifo_head_ptr)
597   if (((m_outfifo_tail_ptr-1)&0xF) == m_outfifo_head_ptr)
597598   {
598599#ifdef SPC_LOG_DSP
599600      logerror("outfifo was full, write ignored!\n");
600601#endif
601602      return;
602603   }
603   state->m_outfifo[state->m_outfifo_head_ptr] = data;
604   state->m_outfifo_head_ptr++;
605   state->m_outfifo_head_ptr&=0xF;
606   //dectalk_outfifo_check(space->machine()); // commented to allow int to clear
604   m_outfifo[m_outfifo_head_ptr] = data;
605   m_outfifo_head_ptr++;
606   m_outfifo_head_ptr&=0xF;
607   //dectalk_outfifo_check(machine()); // commented to allow int to clear
607608}
608609
609static READ16_HANDLER( spc_semaphore_r ) // Return state of d-latch 74ls74 @ E64 'lower half' in d0 which indicates whether infifo is readable
610READ16_MEMBER(dectalk_state::spc_semaphore_r)// Return state of d-latch 74ls74 @ E64 'lower half' in d0 which indicates whether infifo is readable
610611{
611   dectalk_state *state = space->machine().driver_data<dectalk_state>();
612612#ifdef SPC_LOG_DSP
613   //logerror("dsp: read infifo semaphore, returned %d\n", state->m_infifo_semaphore); // commented due to extreme annoyance factor
614   if (!state->m_infifo_semaphore) logerror("dsp: read infifo semaphore, returned %d\n", state->m_infifo_semaphore);
613   //logerror("dsp: read infifo semaphore, returned %d\n", m_infifo_semaphore); // commented due to extreme annoyance factor
614   if (!m_infifo_semaphore) logerror("dsp: read infifo semaphore, returned %d\n", m_infifo_semaphore);
615615#endif
616   return state->m_infifo_semaphore;
616   return m_infifo_semaphore;
617617}
618618/* end tms32010 i/o handlers */
619619
r14844r14845
644644    AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_MIRROR(0x740000) /* ROM */
645645    AM_RANGE(0x080000, 0x093fff) AM_RAM AM_MIRROR(0x760000) /* RAM */
646646    //AM_RANGE(0x094000, 0x0943ff) AM_READWRITE_LEGACY(led_sw_nvr_read, led_sw_nv_write) AM_MIRROR(0x763C00) /* LED array and Xicor X2212 NVRAM */
647    AM_RANGE(0x094000, 0x0943ff) AM_WRITE8_LEGACY(led_write, 0x00FF) AM_MIRROR(0x763C00) /* LED array */
648    AM_RANGE(0x094000, 0x0943ff) AM_READWRITE8_LEGACY(nvram_read, nvram_write, 0xFF00) AM_MIRROR(0x763C00) /* Xicor X2212 NVRAM */
647    AM_RANGE(0x094000, 0x0943ff) AM_WRITE8(led_write, 0x00FF) AM_MIRROR(0x763C00) /* LED array */
648    AM_RANGE(0x094000, 0x0943ff) AM_READWRITE8(nvram_read, nvram_write, 0xFF00) AM_MIRROR(0x763C00) /* Xicor X2212 NVRAM */
649649    AM_RANGE(0x098000, 0x09801f) AM_DEVREADWRITE8_LEGACY("duart68681", duart68681_r, duart68681_w, 0xff) AM_MIRROR(0x763FE0) /* DUART */
650    AM_RANGE(0x09C000, 0x09C001) AM_READWRITE_LEGACY(m68k_spcflags_r, m68k_spcflags_w) AM_MIRROR(0x763FF8) /* SPC flags reg */
651    AM_RANGE(0x09C002, 0x09C003) AM_WRITE_LEGACY(m68k_infifo_w) AM_MIRROR(0x763FF8) /* SPC fifo reg */
652    AM_RANGE(0x09C004, 0x09C005) AM_READWRITE_LEGACY(m68k_tlcflags_r, m68k_tlcflags_w) AM_MIRROR(0x763FF8) /* telephone status flags */
653    AM_RANGE(0x09C006, 0x09C007) AM_READ_LEGACY(m68k_tlc_dtmf_r) AM_MIRROR(0x763FF8) /* telephone dtmf read */
650    AM_RANGE(0x09C000, 0x09C001) AM_READWRITE(m68k_spcflags_r, m68k_spcflags_w) AM_MIRROR(0x763FF8) /* SPC flags reg */
651    AM_RANGE(0x09C002, 0x09C003) AM_WRITE(m68k_infifo_w) AM_MIRROR(0x763FF8) /* SPC fifo reg */
652    AM_RANGE(0x09C004, 0x09C005) AM_READWRITE(m68k_tlcflags_r, m68k_tlcflags_w) AM_MIRROR(0x763FF8) /* telephone status flags */
653    AM_RANGE(0x09C006, 0x09C007) AM_READ(m68k_tlc_dtmf_r) AM_MIRROR(0x763FF8) /* telephone dtmf read */
654654ADDRESS_MAP_END
655655
656656// do we even need this below?
r14844r14845
663663ADDRESS_MAP_END
664664
665665static ADDRESS_MAP_START(tms32010_io, AS_IO, 16, dectalk_state )
666    AM_RANGE(0, 0) AM_WRITE_LEGACY(spc_latch_outfifo_error_stats) // *set* the outfifo_status_r semaphore, and also latch the error bit at D0.
667    AM_RANGE(1, 1) AM_READWRITE_LEGACY(spc_infifo_data_r, spc_outfifo_data_w) //read from input fifo, write to sound fifo
668    AM_RANGE(TMS32010_BIO, TMS32010_BIO) AM_READ_LEGACY(spc_semaphore_r) //read output fifo writable status
666    AM_RANGE(0, 0) AM_WRITE(spc_latch_outfifo_error_stats) // *set* the outfifo_status_r semaphore, and also latch the error bit at D0.
667    AM_RANGE(1, 1) AM_READWRITE(spc_infifo_data_r, spc_outfifo_data_w) //read from input fifo, write to sound fifo
668    AM_RANGE(TMS32010_BIO, TMS32010_BIO) AM_READ(spc_semaphore_r) //read output fifo writable status
669669ADDRESS_MAP_END
670670
671671/******************************************************************************
src/mess/drivers/pc9801.c
r14844r14845
312312
313313   /* PC9821 specific */
314314   UINT8 m_analog256,m_analog256e;
315   DECLARE_READ8_MEMBER(pc9801_xx_r);
316   DECLARE_WRITE8_MEMBER(pc9801_xx_w);
317   DECLARE_READ8_MEMBER(pc9801_00_r);
318   DECLARE_WRITE8_MEMBER(pc9801_00_w);
319   DECLARE_READ8_MEMBER(pc9801_20_r);
320   DECLARE_WRITE8_MEMBER(pc9801_20_w);
321   DECLARE_READ8_MEMBER(pc9801_30_r);
322   DECLARE_WRITE8_MEMBER(pc9801_30_w);
323   DECLARE_READ8_MEMBER(pc9801_40_r);
324   DECLARE_WRITE8_MEMBER(pc9801_40_w);
325   DECLARE_READ8_MEMBER(pc9801_50_r);
326   DECLARE_WRITE8_MEMBER(pc9801_50_w);
327   DECLARE_READ8_MEMBER(pc9801_60_r);
328   DECLARE_WRITE8_MEMBER(pc9801_60_w);
329   DECLARE_WRITE8_MEMBER(pc9801_vrtc_mask_w);
330   DECLARE_WRITE8_MEMBER(pc9801_video_ff_w);
331   DECLARE_READ8_MEMBER(pc9801_70_r);
332   DECLARE_WRITE8_MEMBER(pc9801_70_w);
333   DECLARE_READ8_MEMBER(pc9801_sasi_r);
334   DECLARE_WRITE8_MEMBER(pc9801_sasi_w);
335   DECLARE_READ8_MEMBER(pc9801_a0_r);
336   DECLARE_WRITE8_MEMBER(pc9801_a0_w);
337   DECLARE_READ8_MEMBER(pc9801_fdc_2hd_r);
338   DECLARE_WRITE8_MEMBER(pc9801_fdc_2hd_w);
339   DECLARE_READ8_MEMBER(pc9801_fdc_2dd_r);
340   DECLARE_WRITE8_MEMBER(pc9801_fdc_2dd_w);
341   DECLARE_READ8_MEMBER(pc9801_tvram_r);
342   DECLARE_WRITE8_MEMBER(pc9801_tvram_w);
343   DECLARE_READ8_MEMBER(pc9801_gvram_r);
344   DECLARE_WRITE8_MEMBER(pc9801_gvram_w);
345   DECLARE_READ8_MEMBER(pc9801_opn_r);
346   DECLARE_WRITE8_MEMBER(pc9801_opn_w);
347   DECLARE_READ8_MEMBER(pc9801rs_wram_r);
348   DECLARE_WRITE8_MEMBER(pc9801rs_wram_w);
349   DECLARE_READ8_MEMBER(pc9801rs_ex_wram_r);
350   DECLARE_WRITE8_MEMBER(pc9801rs_ex_wram_w);
351   DECLARE_READ8_MEMBER(pc9801rs_ipl_r);
352   DECLARE_READ8_MEMBER(pc9801rs_knjram_r);
353   DECLARE_WRITE8_MEMBER(pc9801rs_knjram_w);
354   DECLARE_WRITE8_MEMBER(pc9801rs_bank_w);
355   DECLARE_READ8_MEMBER(pc9801rs_f0_r);
356   DECLARE_WRITE8_MEMBER(pc9801rs_f0_w);
357   DECLARE_READ8_MEMBER(pc9801rs_30_r);
358   DECLARE_READ8_MEMBER(pc9801rs_memory_r);
359   DECLARE_WRITE8_MEMBER(pc9801rs_memory_w);
360   DECLARE_READ8_MEMBER(pc9810rs_fdc_ctrl_r);
361   DECLARE_WRITE8_MEMBER(pc9810rs_fdc_ctrl_w);
362   DECLARE_READ8_MEMBER(pc9801rs_2hd_r);
363   DECLARE_WRITE8_MEMBER(pc9801rs_2hd_w);
364   DECLARE_READ8_MEMBER(pc9801rs_2dd_r);
365   DECLARE_WRITE8_MEMBER(pc9801rs_2dd_w);
366   DECLARE_WRITE8_MEMBER(pc9801rs_video_ff_w);
367   DECLARE_WRITE8_MEMBER(pc9801rs_a0_w);
368   DECLARE_READ8_MEMBER(pc980ux_memory_r);
369   DECLARE_WRITE8_MEMBER(pc9801ux_memory_w);
370   DECLARE_WRITE8_MEMBER(pc9821_video_ff_w);
371   DECLARE_READ8_MEMBER(pc9821_a0_r);
372   DECLARE_WRITE8_MEMBER(pc9821_a0_w);
373   DECLARE_READ8_MEMBER(ide_status_r);
374   DECLARE_READ8_MEMBER(pc_dma_read_byte);
375   DECLARE_WRITE8_MEMBER(pc_dma_write_byte);
315376};
316377
317378
r14844r14845
473534
474535
475536#if 0
476static READ8_HANDLER( pc9801_xx_r )
537READ8_MEMBER(pc9801_state::pc9801_xx_r)
477538{
478539   if((offset & 1) == 0)
479540   {
r14844r14845
487548   }
488549}
489550
490static WRITE8_HANDLER( pc9801_xx_w )
551WRITE8_MEMBER(pc9801_state::pc9801_xx_w)
491552{
492553   if((offset & 1) == 0)
493554   {
r14844r14845
501562
502563#endif
503564
504static READ8_HANDLER( pc9801_00_r )
565READ8_MEMBER(pc9801_state::pc9801_00_r)
505566{
506567   if((offset & 1) == 0)
507568   {
508569      if(offset & 0x14)
509570         printf("Read to undefined port [%02x]\n",offset+0x00);
510571      else
511         return pic8259_r(space->machine().device((offset & 8) ? "pic8259_slave" : "pic8259_master"), (offset & 2) >> 1);
572         return pic8259_r(machine().device((offset & 8) ? "pic8259_slave" : "pic8259_master"), (offset & 2) >> 1);
512573   }
513574   else // odd
514575   {
515      return i8237_r(space->machine().device("dma8237"), (offset & 0x1e) >> 1);
576      return i8237_r(machine().device("dma8237"), (offset & 0x1e) >> 1);
516577   }
517578
518579   return 0xff;
519580}
520581
521static WRITE8_HANDLER( pc9801_00_w )
582WRITE8_MEMBER(pc9801_state::pc9801_00_w)
522583{
523584   if((offset & 1) == 0)
524585   {
525586      if(offset & 0x14)
526587         printf("Write to undefined port [%02x] <- %02x\n",offset+0x00,data);
527588      else
528         pic8259_w(space->machine().device((offset & 8) ? "pic8259_slave" : "pic8259_master"), (offset & 2) >> 1, data);
589         pic8259_w(machine().device((offset & 8) ? "pic8259_slave" : "pic8259_master"), (offset & 2) >> 1, data);
529590   }
530591   else // odd
531592   {
532      i8237_w(space->machine().device("dma8237"), (offset & 0x1e) >> 1, data);
593      i8237_w(machine().device("dma8237"), (offset & 0x1e) >> 1, data);
533594   }
534595}
535596
536static READ8_HANDLER( pc9801_20_r )
597READ8_MEMBER(pc9801_state::pc9801_20_r)
537598{
538599   if((offset & 1) == 0)
539600   {
r14844r14845
551612   }
552613}
553614
554static WRITE8_HANDLER( pc9801_20_w )
615WRITE8_MEMBER(pc9801_state::pc9801_20_w)
555616{
556   pc9801_state *state = space->machine().driver_data<pc9801_state>();
557617
558618   if((offset & 1) == 0)
559619   {
560620      if(offset == 0)
561621      {
562         state->m_rtc->c0_w((data & 0x01) >> 0);
563         state->m_rtc->c1_w((data & 0x02) >> 1);
564         state->m_rtc->c2_w((data & 0x04) >> 2);
565         state->m_rtc->stb_w((data & 0x08) >> 3);
566         state->m_rtc->clk_w((data & 0x10) >> 4);
567         state->m_rtc->data_in_w((data & 0x20) >> 5);
622         m_rtc->c0_w((data & 0x01) >> 0);
623         m_rtc->c1_w((data & 0x02) >> 1);
624         m_rtc->c2_w((data & 0x04) >> 2);
625         m_rtc->stb_w((data & 0x08) >> 3);
626         m_rtc->clk_w((data & 0x10) >> 4);
627         m_rtc->data_in_w((data & 0x20) >> 5);
568628         if(data & 0xc0)
569629            printf("RTC write to undefined bits %02x\n",data & 0xc0);
570630      }
r14844r14845
574634   else // odd
575635   {
576636      printf("Write to DMA bank register %d %02x\n",((offset >> 1)+1) & 3,data);
577      state->m_dma_offset[0][((offset >> 1)+1) & 3] = data & 0x0f;
637      m_dma_offset[0][((offset >> 1)+1) & 3] = data & 0x0f;
578638   }
579639}
580640
581static READ8_HANDLER( pc9801_30_r )
641READ8_MEMBER(pc9801_state::pc9801_30_r)
582642{
583643   if((offset & 1) == 0)
584644   {
r14844r14845
591651   }
592652   else // odd
593653   {
594      return space->machine().device<i8255_device>("ppi8255_sys")->read(*space, (offset & 6) >> 1);
654      return machine().device<i8255_device>("ppi8255_sys")->read(*&space, (offset & 6) >> 1);
595655   }
596656}
597657
598static WRITE8_HANDLER( pc9801_30_w )
658WRITE8_MEMBER(pc9801_state::pc9801_30_w)
599659{
600660   if((offset & 1) == 0)
601661   {
r14844r14845
606666   }
607667   else // odd
608668   {
609      space->machine().device<i8255_device>("ppi8255_sys")->write(*space, (offset & 6) >> 1,data);
669      machine().device<i8255_device>("ppi8255_sys")->write(*&space, (offset & 6) >> 1,data);
610670   }
611671}
612672
613static READ8_HANDLER( pc9801_40_r )
673READ8_MEMBER(pc9801_state::pc9801_40_r)
614674{
615   pc9801_state *state = space->machine().driver_data<pc9801_state>();
616675
617676   if((offset & 1) == 0)
618677   {
619      return space->machine().device<i8255_device>("ppi8255_prn")->read(*space, (offset & 6) >> 1);
678      return machine().device<i8255_device>("ppi8255_prn")->read(*&space, (offset & 6) >> 1);
620679   }
621680   else // odd
622681   {
r14844r14845
629688         {
630689            UINT8 res;
631690
632            res = state->m_keyb_press;
691            res = m_keyb_press;
633692
634693            return res;
635694         }
r14844r14845
641700   return 0xff;
642701}
643702
644static WRITE8_HANDLER( pc9801_40_w )
703WRITE8_MEMBER(pc9801_state::pc9801_40_w)
645704{
646705   if((offset & 1) == 0)
647706   {
648      space->machine().device<i8255_device>("ppi8255_prn")->write(*space, (offset & 6) >> 1,data);
707      machine().device<i8255_device>("ppi8255_prn")->write(*&space, (offset & 6) >> 1,data);
649708   }
650709   else // odd
651710   {
r14844r14845
656715   }
657716}
658717
659static READ8_HANDLER( pc9801_50_r )
718READ8_MEMBER(pc9801_state::pc9801_50_r)
660719{
661   //pc9801_state *state = space->machine().driver_data<pc9801_state>();
662720
663721   if((offset & 1) == 0)
664722   {
r14844r14845
671729   }
672730   else // odd
673731   {
674      return space->machine().device<i8255_device>("ppi8255_fdd")->read(*space, (offset & 6) >> 1);
732      return machine().device<i8255_device>("ppi8255_fdd")->read(*&space, (offset & 6) >> 1);
675733   }
676734}
677735
678static WRITE8_HANDLER( pc9801_50_w )
736WRITE8_MEMBER(pc9801_state::pc9801_50_w)
679737{
680   pc9801_state *state = space->machine().driver_data<pc9801_state>();
681738
682739   if((offset & 1) == 0)
683740   {
684741      if(offset & 4)
685742         printf("Write to undefined port [%02x] %02x\n",offset+0x50,data);
686743      else
687         state->m_nmi_ff = (offset & 2) >> 1;
744         m_nmi_ff = (offset & 2) >> 1;
688745
689746   }
690747   else // odd
691748   {
692      space->machine().device<i8255_device>("ppi8255_fdd")->write(*space, (offset & 6) >> 1,data);
749      machine().device<i8255_device>("ppi8255_fdd")->write(*&space, (offset & 6) >> 1,data);
693750   }
694751}
695752
696static READ8_HANDLER( pc9801_60_r )
753READ8_MEMBER(pc9801_state::pc9801_60_r)
697754{
698   pc9801_state *state = space->machine().driver_data<pc9801_state>();
699755
700756   if((offset & 1) == 0)
701757   {
702      return state->m_hgdc1->read(*space, (offset & 2) >> 1); // upd7220 character port
758      return m_hgdc1->read(*&space, (offset & 2) >> 1); // upd7220 character port
703759   }
704760   else // odd
705761   {
r14844r14845
708764   }
709765}
710766
711static WRITE8_HANDLER( pc9801_60_w )
767WRITE8_MEMBER(pc9801_state::pc9801_60_w)
712768{
713   pc9801_state *state = space->machine().driver_data<pc9801_state>();
714769
715770   if((offset & 1) == 0)
716771   {
717      state->m_hgdc1->write(*space, (offset & 2) >> 1,data); // upd7220 character port
772      m_hgdc1->write(*&space, (offset & 2) >> 1,data); // upd7220 character port
718773   }
719774   else // odd
720775   {
r14844r14845
722777   }
723778}
724779
725static WRITE8_HANDLER( pc9801_vrtc_mask_w )
780WRITE8_MEMBER(pc9801_state::pc9801_vrtc_mask_w)
726781{
727   pc9801_state *state = space->machine().driver_data<pc9801_state>();
728782
729783   if((offset & 1) == 0)
730784   {
731      state->m_vrtc_irq_mask = 1;
785      m_vrtc_irq_mask = 1;
732786   }
733787   else // odd
734788   {
r14844r14845
736790   }
737791}
738792
739static WRITE8_HANDLER( pc9801_video_ff_w )
793WRITE8_MEMBER(pc9801_state::pc9801_video_ff_w)
740794{
741   pc9801_state *state = space->machine().driver_data<pc9801_state>();
742795
743796   if((offset & 1) == 0)
744797   {
745      state->m_video_ff[(data & 0x0e) >> 1] = data & 1;
798      m_video_ff[(data & 0x0e) >> 1] = data & 1;
746799
747800      if(0)
748801      {
r14844r14845
768821}
769822
770823
771static READ8_HANDLER( pc9801_70_r )
824READ8_MEMBER(pc9801_state::pc9801_70_r)
772825{
773826   if((offset & 1) == 0)
774827   {
r14844r14845
780833      if(offset & 0x08)
781834         printf("Read to undefined port [%02x]\n",offset+0x70);
782835      else
783         return pit8253_r(space->machine().device("pit8253"), (offset & 6) >> 1);
836         return pit8253_r(machine().device("pit8253"), (offset & 6) >> 1);
784837   }
785838
786839   return 0xff;
787840}
788841
789static WRITE8_HANDLER( pc9801_70_w )
842WRITE8_MEMBER(pc9801_state::pc9801_70_w)
790843{
791   pc9801_state *state = space->machine().driver_data<pc9801_state>();
792844
793845   if((offset & 1) == 0)
794846   {
795847      printf("Write to display register [%02x] %02x\n",offset+0x70,data);
796      state->m_video_reg[offset >> 1] = data;
848      m_video_reg[offset >> 1] = data;
797849   }
798850   else // odd
799851   {
800852      if(offset < 0x08)
801         pit8253_w(space->machine().device("pit8253"), (offset & 6) >> 1, data);
853         pit8253_w(machine().device("pit8253"), (offset & 6) >> 1, data);
802854      else
803855         printf("Write to undefined port [%02x] <- %02x\n",offset+0x70,data);
804856   }
805857}
806858
807static READ8_HANDLER( pc9801_sasi_r )
859READ8_MEMBER(pc9801_state::pc9801_sasi_r)
808860{
809861   if((offset & 1) == 0)
810862   {
r14844r14845
818870   }
819871}
820872
821static WRITE8_HANDLER( pc9801_sasi_w )
873WRITE8_MEMBER(pc9801_state::pc9801_sasi_w)
822874{
823875   if((offset & 1) == 0)
824876   {
r14844r14845
830882   }
831883}
832884
833static READ8_HANDLER( pc9801_a0_r )
885READ8_MEMBER(pc9801_state::pc9801_a0_r)
834886{
835   pc9801_state *state = space->machine().driver_data<pc9801_state>();
836887
837888   if((offset & 1) == 0)
838889   {
r14844r14845
840891      {
841892         case 0x00:
842893         case 0x02:
843            return state->m_hgdc2->read(*space, (offset & 2) >> 1);
894            return m_hgdc2->read(*&space, (offset & 2) >> 1);
844895         /* bitmap palette clut read */
845896         case 0x04:
846            return state->m_vram_disp & 1;
897            return m_vram_disp & 1;
847898         case 0x06:
848            return state->m_vram_bank & 1;
899            return m_vram_bank & 1;
849900         case 0x08:
850901         case 0x0a:
851902         case 0x0c:
852903         case 0x0e:
853            return state->m_pal_clut[(offset & 0x6) >> 1];
904            return m_pal_clut[(offset & 0x6) >> 1];
854905      }
855906
856907      return 0xff; //code unreachable
r14844r14845
861912      {
862913         case 0x09://cg window font read
863914         {
864            UINT8 *pcg = space->machine().region("pcg")->base();
915            UINT8 *pcg = machine().region("pcg")->base();
865916
866            return pcg[((state->m_font_addr & 0x7f7f) << 4) | state->m_font_lr | (state->m_font_line & 0x0f)];
917            return pcg[((m_font_addr & 0x7f7f) << 4) | m_font_lr | (m_font_line & 0x0f)];
867918         }
868919      }
869920
r14844r14845
872923   }
873924}
874925
875static WRITE8_HANDLER( pc9801_a0_w )
926WRITE8_MEMBER(pc9801_state::pc9801_a0_w)
876927{
877   pc9801_state *state = space->machine().driver_data<pc9801_state>();
878928
879929   if((offset & 1) == 0)
880930   {
r14844r14845
882932      {
883933         case 0x00:
884934         case 0x02:
885            state->m_hgdc2->write(*space, (offset & 2) >> 1,data);
935            m_hgdc2->write(*&space, (offset & 2) >> 1,data);
886936            return;
887         case 0x04: state->m_vram_disp = data & 1; return;
937         case 0x04: m_vram_disp = data & 1; return;
888938         case 0x06:
889            state->m_vram_bank = data & 1;
890            //state->m_hgdc2->bank_w(*space, 0,(data & 1) << 2); //TODO: check me
939            m_vram_bank = data & 1;
940            //m_hgdc2->bank_w(*&space, 0,(data & 1) << 2); //TODO: check me
891941            return;
892942         /* bitmap palette clut write */
893943         case 0x08:
r14844r14845
897947         {
898948            UINT8 pal_entry;
899949
900            state->m_pal_clut[(offset & 0x6) >> 1] = data;
950            m_pal_clut[(offset & 0x6) >> 1] = data;
901951
902952            /* can't be more twisted I presume ... :-/ */
903953            pal_entry = (((offset & 4) >> 1) | ((offset & 2) << 1)) >> 1;
904954            pal_entry ^= 3;
905955
906            palette_set_color_rgb(space->machine(), (pal_entry)|4|8, pal1bit((data & 0x2) >> 1), pal1bit((data & 4) >> 2), pal1bit((data & 1) >> 0));
907            palette_set_color_rgb(space->machine(), (pal_entry)|8, pal1bit((data & 0x20) >> 5), pal1bit((data & 0x40) >> 6), pal1bit((data & 0x10) >> 4));
956            palette_set_color_rgb(machine(), (pal_entry)|4|8, pal1bit((data & 0x2) >> 1), pal1bit((data & 4) >> 2), pal1bit((data & 1) >> 0));
957            palette_set_color_rgb(machine(), (pal_entry)|8, pal1bit((data & 0x20) >> 5), pal1bit((data & 0x40) >> 6), pal1bit((data & 0x10) >> 4));
908958            return;
909959         }
910960         default:
r14844r14845
917967      switch((offset & 0xe) + 1)
918968      {
919969         case 0x01:
920            state->m_font_addr = (data << 8) | (state->m_font_addr & 0xff);
970            m_font_addr = (data << 8) | (m_font_addr & 0xff);
921971            return;
922972         case 0x03:
923            state->m_font_addr = (data & 0xff) | (state->m_font_addr & 0xff00);
973            m_font_addr = (data & 0xff) | (m_font_addr & 0xff00);
924974            return;
925975         case 0x05:
926            state->m_font_line = data & 0x1f;
927            state->m_font_lr = data & 0x20 ? 0x000 : 0x800;
976            m_font_line = data & 0x1f;
977            m_font_lr = data & 0x20 ? 0x000 : 0x800;
928978            return;
929979         case 0x09: //cg window font write
930980         {
931            UINT8 *pcg = space->machine().region("pcg")->base();
981            UINT8 *pcg = machine().region("pcg")->base();
932982
933            pcg[((state->m_font_addr & 0x7f7f) << 4) | state->m_font_lr | state->m_font_line] = data;
983            pcg[((m_font_addr & 0x7f7f) << 4) | m_font_lr | m_font_line] = data;
934984            return;
935985         }
936986      }
r14844r14845
939989   }
940990}
941991
942static READ8_HANDLER( pc9801_fdc_2hd_r )
992READ8_MEMBER(pc9801_state::pc9801_fdc_2hd_r)
943993{
944   pc9801_state *state = space->machine().driver_data<pc9801_state>();
945994
946995   if((offset & 1) == 0)
947996   {
948997      switch(offset & 6)
949998      {
950         case 0:   return upd765_status_r(space->machine().device("upd765_2hd"),0);
951         case 2: return upd765_data_r(space->machine().device("upd765_2hd"),0);
999         case 0:   return upd765_status_r(machine().device("upd765_2hd"),0);
1000         case 2: return upd765_data_r(machine().device("upd765_2hd"),0);
9521001         case 4: return 0x5f; //unknown port meaning
9531002      }
9541003   }
r14844r14845
9561005   {
9571006      switch((offset & 6) + 1)
9581007      {
959         case 1: return state->m_sio->data_r(*space, 0);
960         case 3: return state->m_sio->status_r(*space, 0);
1008         case 1: return m_sio->data_r(*&space, 0);
1009         case 3: return m_sio->status_r(*&space, 0);
9611010      }
9621011      printf("Read to undefined port [%02x]\n",offset+0x90);
9631012      return 0xff;
r14844r14845
9661015   return 0xff;
9671016}
9681017
969static WRITE8_HANDLER( pc9801_fdc_2hd_w )
1018WRITE8_MEMBER(pc9801_state::pc9801_fdc_2hd_w)
9701019{
971   pc9801_state *state = space->machine().driver_data<pc9801_state>();
9721020
9731021   if((offset & 1) == 0)
9741022   {
9751023      switch(offset & 6)
9761024      {
9771025         case 0: printf("Write to undefined port [%02x] <- %02x\n",offset+0x90,data); return;
978         case 2: upd765_data_w(space->machine().device("upd765_2hd"),0,data); return;
1026         case 2: upd765_data_w(machine().device("upd765_2hd"),0,data); return;
9791027         case 4:
9801028            printf("%02x ctrl\n",data);
981            if(((state->m_fdc_2hd_ctrl & 0x80) == 0) && (data & 0x80))
982               upd765_reset_w(space->machine().device("upd765_2hd"),1);
983            if((state->m_fdc_2hd_ctrl & 0x80) && (!(data & 0x80)))
984               upd765_reset_w(space->machine().device("upd765_2hd"),0);
1029            if(((m_fdc_2hd_ctrl & 0x80) == 0) && (data & 0x80))
1030               upd765_reset_w(machine().device("upd765_2hd"),1);
1031            if((m_fdc_2hd_ctrl & 0x80) && (!(data & 0x80)))
1032               upd765_reset_w(machine().device("upd765_2hd"),0);
9851033
986            state->m_fdc_2hd_ctrl = data;
987            floppy_mon_w(floppy_get_device(space->machine(), 0), (data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
988            floppy_mon_w(floppy_get_device(space->machine(), 1), (data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
989            floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0), (data & 0x40), 0);
990            floppy_drive_set_ready_state(floppy_get_device(space->machine(), 1), (data & 0x40), 0);
1034            m_fdc_2hd_ctrl = data;
1035            floppy_mon_w(floppy_get_device(machine(), 0), (data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
1036            floppy_mon_w(floppy_get_device(machine(), 1), (data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
1037            floppy_drive_set_ready_state(floppy_get_device(machine(), 0), (data & 0x40), 0);
1038            floppy_drive_set_ready_state(floppy_get_device(machine(), 1), (data & 0x40), 0);
9911039            break;
9921040      }
9931041   }
r14844r14845
9951043   {
9961044      switch((offset & 6) + 1)
9971045      {
998         case 1: state->m_sio->data_w(*space, 0, data); return;
999         case 3: state->m_sio->control_w(*space, 0, data); return;
1046         case 1: m_sio->data_w(*&space, 0, data); return;
1047         case 3: m_sio->control_w(*&space, 0, data); return;
10001048      }
10011049      printf("Write to undefined port [%02x] <- %02x\n",offset+0x90,data);
10021050   }
10031051}
10041052
10051053
1006static READ8_HANDLER( pc9801_fdc_2dd_r )
1054READ8_MEMBER(pc9801_state::pc9801_fdc_2dd_r)
10071055{
10081056   if((offset & 1) == 0)
10091057   {
10101058      switch(offset & 6)
10111059      {
1012         case 0:   return upd765_status_r(space->machine().device("upd765_2dd"),0);
1013         case 2: return upd765_data_r(space->machine().device("upd765_2dd"),0);
1060         case 0:   return upd765_status_r(machine().device("upd765_2dd"),0);
1061         case 2: return upd765_data_r(machine().device("upd765_2dd"),0);
10141062         case 4: return 0x40; //unknown port meaning, might be 0x70
10151063      }
10161064   }
r14844r14845
10231071   return 0xff;
10241072}
10251073
1026static WRITE8_HANDLER( pc9801_fdc_2dd_w )
1074WRITE8_MEMBER(pc9801_state::pc9801_fdc_2dd_w)
10271075{
1028   pc9801_state *state = space->machine().driver_data<pc9801_state>();
10291076
10301077   if((offset & 1) == 0)
10311078   {
10321079      switch(offset & 6)
10331080      {
10341081         case 0: printf("Write to undefined port [%02x] <- %02x\n",offset+0xc8,data); return;
1035         case 2: upd765_data_w(space->machine().device("upd765_2dd"),0,data); return;
1082         case 2: upd765_data_w(machine().device("upd765_2dd"),0,data); return;
10361083         case 4:
10371084            printf("%02x ctrl\n",data);
1038            if(((state->m_fdc_2dd_ctrl & 0x80) == 0) && (data & 0x80))
1039               upd765_reset_w(space->machine().device("upd765_2dd"),1);
1040            if((state->m_fdc_2dd_ctrl & 0x80) && (!(data & 0x80)))
1041               upd765_reset_w(space->machine().device("upd765_2dd"),0);
1085            if(((m_fdc_2dd_ctrl & 0x80) == 0) && (data & 0x80))
1086               upd765_reset_w(machine().device("upd765_2dd"),1);
1087            if((m_fdc_2dd_ctrl & 0x80) && (!(data & 0x80)))
1088               upd765_reset_w(machine().device("upd765_2dd"),0);
10421089
1043            state->m_fdc_2dd_ctrl = data;
1044            //floppy_mon_w(floppy_get_device(space->machine(), 0), (data & 8) ? CLEAR_LINE : ASSERT_LINE);
1045            //floppy_mon_w(floppy_get_device(space->machine(), 1), (data & 8) ? CLEAR_LINE : ASSERT_LINE);
1046            //floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0), (data & 8), 0);
1047            //floppy_drive_set_ready_state(floppy_get_device(space->machine(), 1), (data & 8), 0);
1090            m_fdc_2dd_ctrl = data;
1091            //floppy_mon_w(floppy_get_device(machine(), 0), (data & 8) ? CLEAR_LINE : ASSERT_LINE);
1092            //floppy_mon_w(floppy_get_device(machine(), 1), (data & 8) ? CLEAR_LINE : ASSERT_LINE);
1093            //floppy_drive_set_ready_state(floppy_get_device(machine(), 0), (data & 8), 0);
1094            //floppy_drive_set_ready_state(floppy_get_device(machine(), 1), (data & 8), 0);
10481095            break;
10491096      }
10501097   }
r14844r14845
10561103
10571104
10581105/* TODO: banking? */
1059static READ8_HANDLER( pc9801_tvram_r )
1106READ8_MEMBER(pc9801_state::pc9801_tvram_r)
10601107{
1061   pc9801_state *state = space->machine().driver_data<pc9801_state>();
10621108   UINT8 res;
10631109
10641110   if((offset & 0x2000) && offset & 1)
10651111      return 0xff;
10661112
1067   //res = upd7220_vram_r(space->machine().device("upd7220_chr"),offset);
1068   res = state->m_tvram[offset];
1113   //res = upd7220_vram_r(machine().device("upd7220_chr"),offset);
1114   res = m_tvram[offset];
10691115
10701116   return res;
10711117}
10721118
1073static WRITE8_HANDLER( pc9801_tvram_w )
1119WRITE8_MEMBER(pc9801_state::pc9801_tvram_w)
10741120{
1075   pc9801_state *state = space->machine().driver_data<pc9801_state>();
10761121
1077   if(offset < (0x3fe2) || state->m_video_ff[MEMSW_REG])
1078      state->m_tvram[offset] = data;
1122   if(offset < (0x3fe2) || m_video_ff[MEMSW_REG])
1123      m_tvram[offset] = data;
10791124
1080   state->m_video_ram_1[offset] = data; //TODO: check me
1125   m_video_ram_1[offset] = data; //TODO: check me
10811126}
10821127
1083static READ8_HANDLER( pc9801_gvram_r )
1128READ8_MEMBER(pc9801_state::pc9801_gvram_r)
10841129{
1085   pc9801_state *state = space->machine().driver_data<pc9801_state>();
10861130
1087   return state->m_video_ram_2[offset+0x8000+state->m_vram_bank*0x20000];
1131   return m_video_ram_2[offset+0x8000+m_vram_bank*0x20000];
10881132}
10891133
1090static WRITE8_HANDLER( pc9801_gvram_w )
1134WRITE8_MEMBER(pc9801_state::pc9801_gvram_w)
10911135{
1092   pc9801_state *state = space->machine().driver_data<pc9801_state>();
10931136
1094   state->m_video_ram_2[offset+0x8000+state->m_vram_bank*0x20000] = data;
1137   m_video_ram_2[offset+0x8000+m_vram_bank*0x20000] = data;
10951138}
10961139
1097static READ8_HANDLER( pc9801_opn_r )
1140READ8_MEMBER(pc9801_state::pc9801_opn_r)
10981141{
10991142   if((offset & 1) == 0)
1100      return ym2203_r(space->machine().device("opn"),offset >> 1);
1143      return ym2203_r(machine().device("opn"),offset >> 1);
11011144   else // odd
11021145   {
11031146      printf("Read to undefined port [%02x]\n",offset+0x188);
r14844r14845
11051148   }
11061149}
11071150
1108static WRITE8_HANDLER( pc9801_opn_w )
1151WRITE8_MEMBER(pc9801_state::pc9801_opn_w)
11091152{
11101153   if((offset & 1) == 0)
1111      ym2203_w(space->machine().device("opn"),offset >> 1,data);
1154      ym2203_w(machine().device("opn"),offset >> 1,data);
11121155   else // odd
11131156   {
11141157      printf("Write to undefined port [%02x] %02x\n",offset+0x188,data);
r14844r14845
11181161
11191162static ADDRESS_MAP_START( pc9801_map, AS_PROGRAM, 16, pc9801_state )
11201163   AM_RANGE(0x00000, 0x9ffff) AM_RAM //work RAM
1121   AM_RANGE(0xa0000, 0xa3fff) AM_READWRITE8_LEGACY(pc9801_tvram_r,pc9801_tvram_w,0xffff) //TVRAM
1122   AM_RANGE(0xa8000, 0xbffff) AM_READWRITE8_LEGACY(pc9801_gvram_r,pc9801_gvram_w,0xffff) //bitmap VRAM
1164   AM_RANGE(0xa0000, 0xa3fff) AM_READWRITE8(pc9801_tvram_r,pc9801_tvram_w,0xffff) //TVRAM
1165   AM_RANGE(0xa8000, 0xbffff) AM_READWRITE8(pc9801_gvram_r,pc9801_gvram_w,0xffff) //bitmap VRAM
11231166   AM_RANGE(0xcc000, 0xcdfff) AM_ROM AM_REGION("sound_bios",0) //sound BIOS
11241167   AM_RANGE(0xd6000, 0xd6fff) AM_ROM AM_REGION("fdc_bios_2dd",0) //floppy BIOS 2dd
11251168    AM_RANGE(0xd7000, 0xd7fff) AM_ROM AM_REGION("fdc_bios_2hd",0) //floppy BIOS 2hd
r14844r14845
11281171
11291172/* first device is even offsets, second one is odd offsets */
11301173static ADDRESS_MAP_START( pc9801_io, AS_IO, 16, pc9801_state )
1131   AM_RANGE(0x0000, 0x001f) AM_READWRITE8_LEGACY(pc9801_00_r,pc9801_00_w,0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
1132   AM_RANGE(0x0020, 0x0027) AM_READWRITE8_LEGACY(pc9801_20_r,pc9801_20_w,0xffff) // RTC / DMA registers (LS244)
1133   AM_RANGE(0x0030, 0x0037) AM_READWRITE8_LEGACY(pc9801_30_r,pc9801_30_w,0xffff) //i8251 RS232c / i8255 system port
1134   AM_RANGE(0x0040, 0x0047) AM_READWRITE8_LEGACY(pc9801_40_r,pc9801_40_w,0xffff) //i8255 printer port / i8251 keyboard
1135   AM_RANGE(0x0050, 0x0057) AM_READWRITE8_LEGACY(pc9801_50_r,pc9801_50_w,0xffff) // NMI FF / i8255 floppy port (2d?)
1136   AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(pc9801_60_r,pc9801_60_w,0xffff) //upd7220 character ports / <undefined>
1137   AM_RANGE(0x0064, 0x0065) AM_WRITE8_LEGACY(pc9801_vrtc_mask_w,0xffff)
1138   AM_RANGE(0x0068, 0x0069) AM_WRITE8_LEGACY(pc9801_video_ff_w,0xffff) //mode FF / <undefined>
1174   AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,pc9801_00_w,0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
1175   AM_RANGE(0x0020, 0x0027) AM_READWRITE8(pc9801_20_r,pc9801_20_w,0xffff) // RTC / DMA registers (LS244)
1176   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801_30_r,pc9801_30_w,0xffff) //i8251 RS232c / i8255 system port
1177   AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,pc9801_40_w,0xffff) //i8255 printer port / i8251 keyboard
1178   AM_RANGE(0x0050, 0x0057) AM_READWRITE8(pc9801_50_r,pc9801_50_w,0xffff) // NMI FF / i8255 floppy port (2d?)
1179   AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,pc9801_60_w,0xffff) //upd7220 character ports / <undefined>
1180   AM_RANGE(0x0064, 0x0065) AM_WRITE8(pc9801_vrtc_mask_w,0xffff)
1181   AM_RANGE(0x0068, 0x0069) AM_WRITE8(pc9801_video_ff_w,0xffff) //mode FF / <undefined>
11391182//  AM_RANGE(0x006c, 0x006f) border color / <undefined>
1140   AM_RANGE(0x0070, 0x007b) AM_READWRITE8_LEGACY(pc9801_70_r,pc9801_70_w,0xffff) //display registers / i8253 pit
1141   AM_RANGE(0x0080, 0x0083) AM_READWRITE8_LEGACY(pc9801_sasi_r,pc9801_sasi_w,0xffff) //HDD SASI interface / <undefined>
1142   AM_RANGE(0x0090, 0x0097) AM_READWRITE8_LEGACY(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt
1143   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8_LEGACY(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers
1144   AM_RANGE(0x00c8, 0x00cd) AM_READWRITE8_LEGACY(pc9801_fdc_2dd_r,pc9801_fdc_2dd_w,0xffff) //upd765a 2dd / <undefined>
1145   AM_RANGE(0x0188, 0x018b) AM_READWRITE8_LEGACY(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / <undefined>
1183   AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,pc9801_70_w,0xffff) //display registers / i8253 pit
1184   AM_RANGE(0x0080, 0x0083) AM_READWRITE8(pc9801_sasi_r,pc9801_sasi_w,0xffff) //HDD SASI interface / <undefined>
1185   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801_fdc_2hd_r,pc9801_fdc_2hd_w,0xffff) //upd765a 2hd / cmt
1186   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,pc9801_a0_w,0xffff) //upd7220 bitmap ports / display registers
1187   AM_RANGE(0x00c8, 0x00cd) AM_READWRITE8(pc9801_fdc_2dd_r,pc9801_fdc_2dd_w,0xffff) //upd765a 2dd / <undefined>
1188   AM_RANGE(0x0188, 0x018b) AM_READWRITE8(pc9801_opn_r,pc9801_opn_w,0xffff) //ym2203 opn / <undefined>
11461189ADDRESS_MAP_END
11471190
11481191/*************************************
r14844r14845
11511194 *
11521195 ************************************/
11531196
1154static READ8_HANDLER( pc9801rs_wram_r )
1197READ8_MEMBER(pc9801_state::pc9801rs_wram_r)
11551198{
1156   UINT8 *WRAM = space->machine().region("wram")->base();
1199   UINT8 *WRAM = machine().region("wram")->base();
11571200
11581201   return WRAM[offset];
11591202}
11601203
1161static WRITE8_HANDLER( pc9801rs_wram_w )
1204WRITE8_MEMBER(pc9801_state::pc9801rs_wram_w)
11621205{
1163   UINT8 *WRAM = space->machine().region("wram")->base();
1206   UINT8 *WRAM = machine().region("wram")->base();
11641207
11651208   WRAM[offset] = data;
11661209}
11671210
1168static READ8_HANDLER( pc9801rs_ex_wram_r )
1211READ8_MEMBER(pc9801_state::pc9801rs_ex_wram_r)
11691212{
1170   UINT8 *EX_WRAM = space->machine().region("ex_wram")->base();
1213   UINT8 *EX_WRAM = machine().region("ex_wram")->base();
11711214
11721215   return EX_WRAM[offset];
11731216}
11741217
1175static WRITE8_HANDLER( pc9801rs_ex_wram_w )
1218WRITE8_MEMBER(pc9801_state::pc9801rs_ex_wram_w)
11761219{
1177   UINT8 *EX_WRAM = space->machine().region("ex_wram")->base();
1220   UINT8 *EX_WRAM = machine().region("ex_wram")->base();
11781221
11791222   EX_WRAM[offset] = data;
11801223}
11811224
1182static READ8_HANDLER( pc9801rs_ipl_r )
1225READ8_MEMBER(pc9801_state::pc9801rs_ipl_r)
11831226{
1184   pc9801_state *state = space->machine().driver_data<pc9801_state>();
1185   UINT8 *ROM = space->machine().region("ipl")->base();
1227   UINT8 *ROM = machine().region("ipl")->base();
11861228
1187   return ROM[(offset & 0x1ffff)+(state->m_rom_bank*0x20000)];
1229   return ROM[(offset & 0x1ffff)+(m_rom_bank*0x20000)];
11881230}
11891231
1190static READ8_HANDLER( pc9801rs_knjram_r )
1232READ8_MEMBER(pc9801_state::pc9801rs_knjram_r)
11911233{
11921234
1193   UINT8 *KNJRAM = space->machine().region("kanji")->base();
1235   UINT8 *KNJRAM = machine().region("kanji")->base();
11941236
11951237   return KNJRAM[offset];
11961238}
11971239
1198static WRITE8_HANDLER( pc9801rs_knjram_w )
1240WRITE8_MEMBER(pc9801_state::pc9801rs_knjram_w)
11991241{
1200   UINT8 *KNJRAM = space->machine().region("kanji")->base();
1242   UINT8 *KNJRAM = machine().region("kanji")->base();
12011243
12021244   KNJRAM[offset] = data;
12031245}
12041246
12051247/* FF-based */
1206static WRITE8_HANDLER( pc9801rs_bank_w )
1248WRITE8_MEMBER(pc9801_state::pc9801rs_bank_w)
12071249{
1208   pc9801_state *state = space->machine().driver_data<pc9801_state>();
12091250
12101251   if(offset == 1)
12111252   {
r14844r14845
12131254      {
12141255         if((data & 0xed) == 0x00)
12151256         {
1216            state->m_rom_bank = (data & 2) >> 1;
1257            m_rom_bank = (data & 2) >> 1;
12171258            return;
12181259         }
12191260      }
r14844r14845
12231264   if(offset == 3)
12241265   {
12251266      if((data & 0xf0) == 0x20)
1226         state->m_vram_bank = (data & 2) >> 1;
1267         m_vram_bank = (data & 2) >> 1;
12271268      else
12281269         printf("Unknown EMS RAM setting %02x\n",data);
12291270   }
12301271}
12311272
1232static READ8_HANDLER( pc9801rs_f0_r )
1273READ8_MEMBER(pc9801_state::pc9801rs_f0_r)
12331274{
1234   pc9801_state *state = space->machine().driver_data<pc9801_state>();
12351275
12361276   if(offset == 0x02)
1237      return (state->m_gate_a20 ^ 1) | 0x2e;
1277      return (m_gate_a20 ^ 1) | 0x2e;
12381278   else if(offset == 0x06)
1239      return (state->m_gate_a20 ^ 1) | 0x5e;
1279      return (m_gate_a20 ^ 1) | 0x5e;
12401280
12411281   return 0x00;
12421282}
12431283
1244static WRITE8_HANDLER( pc9801rs_f0_w )
1284WRITE8_MEMBER(pc9801_state::pc9801rs_f0_w)
12451285{
1246   pc9801_state *state = space->machine().driver_data<pc9801_state>();
12471286
12481287   if(offset == 0x00)
12491288   {
1250      state->m_por = 0x00;
1251      cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_RESET, PULSE_LINE);
1289      m_por = 0x00;
1290      cputag_set_input_line(machine(), "maincpu", INPUT_LINE_RESET, PULSE_LINE);
12521291   }
12531292
12541293   if(offset == 0x02)
1255      state->m_gate_a20 = 1;
1294      m_gate_a20 = 1;
12561295
12571296   if(offset == 0x06)
12581297   {
12591298      if(data == 0x02)
1260         state->m_gate_a20 = 1;
1299         m_gate_a20 = 1;
12611300      else if(data == 0x03)
1262         state->m_gate_a20 = 0;
1301         m_gate_a20 = 0;
12631302   }
12641303}
12651304
1266static READ8_HANDLER( pc9801rs_30_r )
1305READ8_MEMBER(pc9801_state::pc9801rs_30_r)
12671306{
1268   pc9801_state *state = space->machine().driver_data<pc9801_state>();
12691307
12701308   if(offset == 5)
1271      return (pc9801_30_r(space,offset) & ~0xa0) | state->m_por; //ppi bug?
1309      return (pc9801_30_r(space,offset) & ~0xa0) | m_por; //ppi bug?
12721310
12731311   return pc9801_30_r(space,offset);
12741312}
12751313
1276static READ8_HANDLER( pc9801rs_memory_r )
1314READ8_MEMBER(pc9801_state::pc9801rs_memory_r)
12771315{
1278   pc9801_state *state = space->machine().driver_data<pc9801_state>();
12791316
1280   if(state->m_gate_a20 == 0)
1317   if(m_gate_a20 == 0)
12811318      offset &= 0xfffff;
12821319
12831320   if      (                        offset <= 0x0009ffff)                   { return pc9801rs_wram_r(space,offset);               }
r14844r14845
12851322   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { return pc9801rs_knjram_r(space,offset & 0xfff);     }
12861323   else if(offset >= 0x000a8000 && offset <= 0x000bffff)                   { return pc9801_gvram_r(space,offset-0xa8000);        }
12871324   else if(offset >= 0x000e0000 && offset <= 0x000fffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
1288   else if(offset >= 0x00100000 && offset <= 0x00100000+state->m_ram_size-1) { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
1325   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
12891326   else if(offset >= 0xfffe0000 && offset <= 0xffffffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
12901327
12911328   //printf("%08x\n",offset);
r14844r14845
12931330}
12941331
12951332
1296static WRITE8_HANDLER( pc9801rs_memory_w )
1333WRITE8_MEMBER(pc9801_state::pc9801rs_memory_w)
12971334{
1298   pc9801_state *state = space->machine().driver_data<pc9801_state>();
12991335
1300   if(state->m_gate_a20 == 0)
1336   if(m_gate_a20 == 0)
13011337      offset &= 0xfffff;
13021338
13031339   if      (                        offset <= 0x0009ffff)                   { pc9801rs_wram_w(space,offset,data);                  }
13041340   else if(offset >= 0x000a0000 && offset <= 0x000a3fff)                   { pc9801_tvram_w(space,offset-0xa0000,data);           }
13051341   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { pc9801rs_knjram_w(space,offset & 0xfff,data);        }
13061342   else if(offset >= 0x000a8000 && offset <= 0x000bffff)                   { pc9801_gvram_w(space,offset-0xa8000,data);           }
1307   else if(offset >= 0x00100000 && offset <= 0x00100000+state->m_ram_size-1) { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
1343   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
13081344   //else
13091345   //  printf("%08x %08x\n",offset,data);
13101346
13111347}
13121348
1313static READ8_HANDLER( pc9810rs_fdc_ctrl_r )
1349READ8_MEMBER(pc9801_state::pc9810rs_fdc_ctrl_r)
13141350{
1315   pc9801_state *state = space->machine().driver_data<pc9801_state>();
13161351
1317   return (state->m_fdc_ctrl & 3) | 8;
1352   return (m_fdc_ctrl & 3) | 8;
13181353}
13191354
1320static WRITE8_HANDLER( pc9810rs_fdc_ctrl_w )
1355WRITE8_MEMBER(pc9801_state::pc9810rs_fdc_ctrl_w)
13211356{
13221357   /*
13231358    ---- x--- ready line?
13241359    ---- --x- select type (1) 2hd (0) 2dd
13251360    ---- ---x select irq
13261361    */
1327   pc9801_state *state = space->machine().driver_data<pc9801_state>();
13281362
1329   state->m_fdc_ctrl = data;
1363   m_fdc_ctrl = data;
13301364   if(data & 0xfc)
13311365      printf("FDC ctrl called with %02x\n",data);
13321366}
13331367
1334static READ8_HANDLER( pc9801rs_2hd_r )
1368READ8_MEMBER(pc9801_state::pc9801rs_2hd_r)
13351369{
13361370   if((offset & 1) == 0)
13371371   {
13381372      switch(offset & 6)
13391373      {
1340         case 0:   return upd765_status_r(space->machine().device("upd765_2hd"),0);
1341         case 2: return upd765_data_r(space->machine().device("upd765_2hd"),0);
1374         case 0:   return upd765_status_r(machine().device("upd765_2hd"),0);
1375         case 2: return upd765_data_r(machine().device("upd765_2hd"),0);
13421376         case 4: return 0x40; //2hd flag
13431377      }
13441378   }
r14844r14845
13481382   return 0xff;
13491383}
13501384
1351static WRITE8_HANDLER( pc9801rs_2hd_w )
1385WRITE8_MEMBER(pc9801_state::pc9801rs_2hd_w)
13521386{
13531387   if((offset & 1) == 0)
13541388   {
13551389      switch(offset & 6)
13561390      {
1357         case 2: upd765_data_w(space->machine().device("upd765_2hd"),0,data); return;
1391         case 2: upd765_data_w(machine().device("upd765_2hd"),0,data); return;
13581392         case 4: printf("%02x FDC ctrl\n",data); return;
13591393      }
13601394   }
r14844r14845
13621396   printf("Write to undefined port [%02x] %02x\n",offset+0x90,data);
13631397}
13641398
1365static READ8_HANDLER( pc9801rs_2dd_r )
1399READ8_MEMBER(pc9801_state::pc9801rs_2dd_r)
13661400{
1367//  pc9801_state *state = space->machine().driver_data<pc9801_state>();
13681401
1369//  if(state->m_fdc_ctrl & 1)
1402//  if(m_fdc_ctrl & 1)
13701403//      return 0xff;
13711404
13721405   if((offset & 1) == 0)
13731406   {
13741407      switch(offset & 6)
13751408      {
1376         case 0:   return upd765_status_r(space->machine().device("upd765_2hd"),0);
1377         case 2: return upd765_data_r(space->machine().device("upd765_2hd"),0);
1409         case 0:   return upd765_status_r(machine().device("upd765_2hd"),0);
1410         case 2: return upd765_data_r(machine().device("upd765_2hd"),0);
13781411         case 4: return 0x70; //2dd flag
13791412      }
13801413   }
r14844r14845
13841417   return 0xff;
13851418}
13861419
1387static WRITE8_HANDLER( pc9801rs_2dd_w )
1420WRITE8_MEMBER(pc9801_state::pc9801rs_2dd_w)
13881421{
1389//  pc9801_state *state = space->machine().driver_data<pc9801_state>();
13901422
1391//  if(state->m_fdc_ctrl & 1)
1423//  if(m_fdc_ctrl & 1)
13921424//      return;
13931425
13941426   if((offset & 1) == 0)
13951427   {
13961428      switch(offset & 6)
13971429      {
1398         case 2: upd765_data_w(space->machine().device("upd765_2hd"),0,data); return;
1430         case 2: upd765_data_w(machine().device("upd765_2hd"),0,data); return;
13991431         case 4: printf("%02x FDC ctrl\n",data); return;
14001432      }
14011433   }
r14844r14845
14031435   printf("Write to undefined port [%02x] %02x\n",offset+0x90,data);
14041436}
14051437
1406static WRITE8_HANDLER( pc9801rs_video_ff_w )
1438WRITE8_MEMBER(pc9801_state::pc9801rs_video_ff_w)
14071439{
1408   pc9801_state *state = space->machine().driver_data<pc9801_state>();
14091440
14101441   if(offset == 2)
14111442   {
14121443      if((data & 0xf8) == 0)
14131444      {
1414         state->m_ex_video_ff[(data & 0x6) >> 1] = data & 1;
1445         m_ex_video_ff[(data & 0x6) >> 1] = data & 1;
14151446
14161447         if(1)
14171448         {
r14844r14845
14341465   pc9801_video_ff_w(space,offset,data);
14351466}
14361467
1437static WRITE8_HANDLER( pc9801rs_a0_w )
1468WRITE8_MEMBER(pc9801_state::pc9801rs_a0_w)
14381469{
1439   pc9801_state *state = space->machine().driver_data<pc9801_state>();
14401470
1441   if((offset & 1) == 0 && offset & 8 && state->m_ex_video_ff[ANALOG_16])
1471   if((offset & 1) == 0 && offset & 8 && m_ex_video_ff[ANALOG_16])
14421472   {
14431473      switch(offset)
14441474      {
1445         case 0x08: state->m_analog16.pal_entry = data & 0xf; break;
1446         case 0x0a: state->m_analog16.g[state->m_analog16.pal_entry] = data & 0xf; break;
1447         case 0x0c: state->m_analog16.r[state->m_analog16.pal_entry] = data & 0xf; break;
1448         case 0x0e: state->m_analog16.b[state->m_analog16.pal_entry] = data & 0xf; break;
1475         case 0x08: m_analog16.pal_entry = data & 0xf; break;
1476         case 0x0a: m_analog16.g[m_analog16.pal_entry] = data & 0xf; break;
1477         case 0x0c: m_analog16.r[m_analog16.pal_entry] = data & 0xf; break;
1478         case 0x0e: m_analog16.b[m_analog16.pal_entry] = data & 0xf; break;
14491479      }
14501480
1451      palette_set_color_rgb(space->machine(), (state->m_analog16.pal_entry)+0x10,
1452                                   pal4bit(state->m_analog16.r[state->m_analog16.pal_entry]),
1453                                   pal4bit(state->m_analog16.g[state->m_analog16.pal_entry]),
1454                                   pal4bit(state->m_analog16.b[state->m_analog16.pal_entry]));
1481      palette_set_color_rgb(machine(), (m_analog16.pal_entry)+0x10,
1482                                   pal4bit(m_analog16.r[m_analog16.pal_entry]),
1483                                   pal4bit(m_analog16.g[m_analog16.pal_entry]),
1484                                   pal4bit(m_analog16.b[m_analog16.pal_entry]));
14551485      return;
14561486   }
14571487
r14844r14845
14591489}
14601490
14611491static ADDRESS_MAP_START( pc9801rs_map, AS_PROGRAM, 32, pc9801_state )
1462   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8_LEGACY(pc9801rs_memory_r,pc9801rs_memory_w,0xffffffff)
1492   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9801rs_memory_r,pc9801rs_memory_w,0xffffffff)
14631493ADDRESS_MAP_END
14641494
14651495static ADDRESS_MAP_START( pc9801rs_io, AS_IO, 32, pc9801_state )
1466   AM_RANGE(0x0000, 0x001f) AM_READWRITE8_LEGACY(pc9801_00_r,        pc9801_00_w,        0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
1496   AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,        pc9801_00_w,        0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
14671497
1468   AM_RANGE(0x0030, 0x0037) AM_READWRITE8_LEGACY(pc9801rs_30_r,      pc9801_30_w,        0xffffffff) //i8251 RS232c / i8255 system port
1469   AM_RANGE(0x0040, 0x0047) AM_READWRITE8_LEGACY(pc9801_40_r,        pc9801_40_w,        0xffffffff) //i8255 printer port / i8251 keyboard
1470   AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(pc9801_60_r,        pc9801_60_w,        0xffffffff) //upd7220 character ports / <undefined>
1471   AM_RANGE(0x0064, 0x0067) AM_WRITE8_LEGACY(pc9801_vrtc_mask_w, 0xffffffff)
1472   AM_RANGE(0x0068, 0x006b) AM_WRITE8_LEGACY(pc9801rs_video_ff_w,0xffffffff) //mode FF / <undefined>
1473   AM_RANGE(0x0070, 0x007b) AM_READWRITE8_LEGACY(pc9801_70_r,        pc9801_70_w,        0xffffffff) //display registers "GRCG" / i8253 pit
1474   AM_RANGE(0x0090, 0x0097) AM_READWRITE8_LEGACY(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
1475   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8_LEGACY(pc9801_a0_r,        pc9801rs_a0_w,      0xffffffff) //upd7220 bitmap ports / display registers
1476   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8_LEGACY(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffffffff)
1477   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8_LEGACY(pc9801rs_2dd_r,     pc9801rs_2dd_w,     0xffffffff)
1478   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8_LEGACY(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffffffff)
1479   AM_RANGE(0x043c, 0x043f) AM_WRITE8_LEGACY(pc9801rs_bank_w,    0xffffffff) //ROM/RAM bank
1498   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r,      pc9801_30_w,        0xffffffff) //i8251 RS232c / i8255 system port
1499   AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,        pc9801_40_w,        0xffffffff) //i8255 printer port / i8251 keyboard
1500   AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,        pc9801_60_w,        0xffffffff) //upd7220 character ports / <undefined>
1501   AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff)
1502   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffffffff) //mode FF / <undefined>
1503   AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,        pc9801_70_w,        0xffffffff) //display registers "GRCG" / i8253 pit
1504   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
1505   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,        pc9801rs_a0_w,      0xffffffff) //upd7220 bitmap ports / display registers
1506   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffffffff)
1507   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2dd_r,     pc9801rs_2dd_w,     0xffffffff)
1508   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffffffff)
1509   AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w,    0xffffffff) //ROM/RAM bank
14801510
14811511ADDRESS_MAP_END
14821512
1483static READ8_HANDLER( pc980ux_memory_r )
1513READ8_MEMBER(pc9801_state::pc980ux_memory_r)
14841514{
1485   pc9801_state *state = space->machine().driver_data<pc9801_state>();
14861515
1487   //printf("%08x %d\n",offset,state->m_gate_a20);
1516   //printf("%08x %d\n",offset,m_gate_a20);
14881517
1489   //if(state->m_gate_a20 == 0)
1518   //if(m_gate_a20 == 0)
14901519   //  offset &= 0xfffff;
14911520
14921521   if      (                        offset <= 0x0009ffff)                   { return pc9801rs_wram_r(space,offset);               }
r14844r14845
14941523   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { return pc9801rs_knjram_r(space,offset & 0xfff);     }
14951524   else if(offset >= 0x000a8000 && offset <= 0x000bffff)                   { return pc9801_gvram_r(space,offset-0xa8000);        }
14961525   else if(offset >= 0x000e0000 && offset <= 0x000fffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
1497   else if(offset >= 0x00100000 && offset <= 0x00100000+state->m_ram_size-1) { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
1526   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { return pc9801rs_ex_wram_r(space,offset-0x00100000); }
14981527   else if(offset >= 0x00fe0000 && offset <= 0x00ffffff)                   { return pc9801rs_ipl_r(space,offset & 0x1ffff);      }
14991528
15001529   return 0x00;
15011530}
15021531
15031532
1504static WRITE8_HANDLER( pc9801ux_memory_w )
1533WRITE8_MEMBER(pc9801_state::pc9801ux_memory_w)
15051534{
1506   pc9801_state *state = space->machine().driver_data<pc9801_state>();
15071535
1508   //if(state->m_gate_a20 == 0)
1536   //if(m_gate_a20 == 0)
15091537   //  offset &= 0xfffff;
15101538
15111539   if      (                        offset <= 0x0009ffff)                   { pc9801rs_wram_w(space,offset,data);                  }
15121540   else if(offset >= 0x000a0000 && offset <= 0x000a3fff)                   { pc9801_tvram_w(space,offset-0xa0000,data);           }
15131541   else if(offset >= 0x000a4000 && offset <= 0x000a4fff)                   { pc9801rs_knjram_w(space,offset & 0xfff,data);        }
15141542   else if(offset >= 0x000a8000 && offset <= 0x000bffff)                   { pc9801_gvram_w(space,offset-0xa8000,data);           }
1515   else if(offset >= 0x00100000 && offset <= 0x00100000+state->m_ram_size-1) { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
1543   else if(offset >= 0x00100000 && offset <= 0x00100000+m_ram_size-1) { pc9801rs_ex_wram_w(space,offset-0x00100000,data);    }
15161544   //else
15171545   //  printf("%08x %08x\n",offset,data);
15181546
r14844r14845
15201548
15211549static ADDRESS_MAP_START( pc9801ux_map, AS_PROGRAM, 16, pc9801_state )
15221550   /* TODO! */
1523   AM_RANGE(0x000000, 0xffffff) AM_READWRITE8_LEGACY(pc980ux_memory_r,pc9801ux_memory_w,0xffff)
1551   AM_RANGE(0x000000, 0xffffff) AM_READWRITE8(pc980ux_memory_r,pc9801ux_memory_w,0xffff)
15241552ADDRESS_MAP_END
15251553
15261554static ADDRESS_MAP_START( pc9801ux_io, AS_IO, 16, pc9801_state )
1527   AM_RANGE(0x0000, 0x001f) AM_READWRITE8_LEGACY(pc9801_00_r,        pc9801_00_w,        0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
1555   AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,        pc9801_00_w,        0xffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
15281556
1529   AM_RANGE(0x0030, 0x0037) AM_READWRITE8_LEGACY(pc9801rs_30_r,      pc9801_30_w,        0xffff) //i8251 RS232c / i8255 system port
1530   AM_RANGE(0x0040, 0x0047) AM_READWRITE8_LEGACY(pc9801_40_r,        pc9801_40_w,        0xffff) //i8255 printer port / i8251 keyboard
1531   AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(pc9801_60_r,        pc9801_60_w,        0xffff) //upd7220 character ports / <undefined>
1532   AM_RANGE(0x0064, 0x0067) AM_WRITE8_LEGACY(pc9801_vrtc_mask_w, 0xffff)
1533   AM_RANGE(0x0068, 0x006b) AM_WRITE8_LEGACY(pc9801rs_video_ff_w,0xffff) //mode FF / <undefined>
1534   AM_RANGE(0x0070, 0x007b) AM_READWRITE8_LEGACY(pc9801_70_r,        pc9801_70_w,        0xffff) //display registers "GRCG" / i8253 pit
1535   AM_RANGE(0x0090, 0x0097) AM_READWRITE8_LEGACY(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffff)
1536   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8_LEGACY(pc9801_a0_r,        pc9801rs_a0_w,      0xffff) //upd7220 bitmap ports / display registers
1537   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8_LEGACY(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffff)
1538   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8_LEGACY(pc9801rs_2dd_r,     pc9801rs_2dd_w,     0xffff)
1539   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8_LEGACY(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffff)
1540   AM_RANGE(0x043c, 0x043f) AM_WRITE8_LEGACY(pc9801rs_bank_w,    0xffff) //ROM/RAM bank
1557   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r,      pc9801_30_w,        0xffff) //i8251 RS232c / i8255 system port
1558   AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,        pc9801_40_w,        0xffff) //i8255 printer port / i8251 keyboard
1559   AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,        pc9801_60_w,        0xffff) //upd7220 character ports / <undefined>
1560   AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffff)
1561   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9801rs_video_ff_w,0xffff) //mode FF / <undefined>
1562   AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,        pc9801_70_w,        0xffff) //display registers "GRCG" / i8253 pit
1563   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffff)
1564   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9801_a0_r,        pc9801rs_a0_w,      0xffff) //upd7220 bitmap ports / display registers
1565   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffff)
1566   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2dd_r,     pc9801rs_2dd_w,     0xffff)
1567   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffff)
1568   AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w,    0xffff) //ROM/RAM bank
15411569
15421570ADDRESS_MAP_END
15431571
r14844r14845
15481576 *
15491577 ************************************/
15501578
1551static WRITE8_HANDLER( pc9821_video_ff_w )
1579WRITE8_MEMBER(pc9801_state::pc9821_video_ff_w)
15521580{
1553   pc9801_state *state = space->machine().driver_data<pc9801_state>();
15541581
15551582   if(offset == 2)
15561583   {
15571584      switch(data & 0xf8)   // pc-9821 specific extended registers
15581585      {
1559         case 0x20: state->m_analog256 = data & 1; return;
1560         case 0x68: state->m_analog256e = data & 1; return;
1586         case 0x20: m_analog256 = data & 1; return;
1587         case 0x68: m_analog256e = data & 1; return;
15611588      } // intentional fall-through
15621589   }
15631590
15641591   pc9801rs_video_ff_w(space,offset,data);
15651592}
15661593
1567static READ8_HANDLER( pc9821_a0_r )
1594READ8_MEMBER(pc9801_state::pc9821_a0_r)
15681595{
1569   pc9801_state *state = space->machine().driver_data<pc9801_state>();
15701596
15711597   if((offset & 1) == 0 && offset & 8)
15721598   {
1573      if(state->m_analog256)
1599      if(m_analog256)
15741600      {
15751601         printf("256 color mode [%02x] R\n",offset);
15761602         return 0;
15771603      }
1578      else if(state->m_ex_video_ff[ANALOG_16]) //16 color mode, readback possible there
1604      else if(m_ex_video_ff[ANALOG_16]) //16 color mode, readback possible there
15791605      {
15801606         UINT8 res = 0;
15811607
15821608         switch(offset)
15831609         {
1584            case 0x08: res = state->m_analog16.pal_entry & 0xf; break;
1585            case 0x0a: res = state->m_analog16.g[state->m_analog16.pal_entry] & 0xf; break;
1586            case 0x0c: res = state->m_analog16.r[state->m_analog16.pal_entry] & 0xf; break;
1587            case 0x0e: res = state->m_analog16.b[state->m_analog16.pal_entry] & 0xf; break;
1610            case 0x08: res = m_analog16.pal_entry & 0xf; break;
1611            case 0x0a: res = m_analog16.g[m_analog16.pal_entry] & 0xf; break;
1612            case 0x0c: res = m_analog16.r[m_analog16.pal_entry] & 0xf; break;
1613            case 0x0e: res = m_analog16.b[m_analog16.pal_entry] & 0xf; break;
15881614         }
15891615
15901616         return res;
r14844r14845
15941620   return pc9801_a0_r(space,offset);
15951621}
15961622
1597static WRITE8_HANDLER( pc9821_a0_w )
1623WRITE8_MEMBER(pc9801_state::pc9821_a0_w)
15981624{
1599   pc9801_state *state = space->machine().driver_data<pc9801_state>();
16001625
1601   if((offset & 1) == 0 && offset & 8 && state->m_analog256)
1626   if((offset & 1) == 0 && offset & 8 && m_analog256)
16021627   {
16031628      printf("256 color mode [%02x] %02x W\n",offset,data);
16041629      return;
r14844r14845
16071632   pc9801rs_a0_w(space,offset,data);
16081633}
16091634
1610static READ8_HANDLER( ide_status_r )
1635READ8_MEMBER(pc9801_state::ide_status_r)
16111636{
16121637   return 0x50; // status
16131638}
16141639
16151640static ADDRESS_MAP_START( pc9821_map, AS_PROGRAM, 32, pc9801_state )
1616   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8_LEGACY(pc9801rs_memory_r,pc9801rs_memory_w,0xffffffff)
1641   AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE8(pc9801rs_memory_r,pc9801rs_memory_w,0xffffffff)
16171642ADDRESS_MAP_END
16181643
16191644static ADDRESS_MAP_START( pc9821_io, AS_IO, 32, pc9801_state )
1620   AM_RANGE(0x0000, 0x001f) AM_READWRITE8_LEGACY(pc9801_00_r,        pc9801_00_w,        0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
1645   AM_RANGE(0x0000, 0x001f) AM_READWRITE8(pc9801_00_r,        pc9801_00_w,        0xffffffff) // i8259 PIC (bit 3 ON slave / master) / i8237 DMA
16211646
1622   AM_RANGE(0x0030, 0x0037) AM_READWRITE8_LEGACY(pc9801rs_30_r,      pc9801_30_w,        0xffffffff) //i8251 RS232c / i8255 system port
1623   AM_RANGE(0x0040, 0x0047) AM_READWRITE8_LEGACY(pc9801_40_r,        pc9801_40_w,        0xffffffff) //i8255 printer port / i8251 keyboard
1647   AM_RANGE(0x0030, 0x0037) AM_READWRITE8(pc9801rs_30_r,      pc9801_30_w,        0xffffffff) //i8251 RS232c / i8255 system port
1648   AM_RANGE(0x0040, 0x0047) AM_READWRITE8(pc9801_40_r,        pc9801_40_w,        0xffffffff) //i8255 printer port / i8251 keyboard
16241649   AM_RANGE(0x005c, 0x005f) AM_NOP //ARTIC (serial card?)
1625   AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(pc9801_60_r,        pc9801_60_w,        0xffffffff) //upd7220 character ports / <undefined>
1626   AM_RANGE(0x0064, 0x0067) AM_WRITE8_LEGACY(pc9801_vrtc_mask_w, 0xffffffff)
1627   AM_RANGE(0x0068, 0x006b) AM_WRITE8_LEGACY(pc9821_video_ff_w,  0xffffffff) //mode FF / <undefined>
1628   AM_RANGE(0x0070, 0x007b) AM_READWRITE8_LEGACY(pc9801_70_r,        pc9801_70_w,        0xffffffff) //display registers "GRCG" / i8253 pit
1650   AM_RANGE(0x0060, 0x0063) AM_READWRITE8(pc9801_60_r,        pc9801_60_w,        0xffffffff) //upd7220 character ports / <undefined>
1651   AM_RANGE(0x0064, 0x0067) AM_WRITE8(pc9801_vrtc_mask_w, 0xffffffff)
1652   AM_RANGE(0x0068, 0x006b) AM_WRITE8(pc9821_video_ff_w,  0xffffffff) //mode FF / <undefined>
1653   AM_RANGE(0x0070, 0x007b) AM_READWRITE8(pc9801_70_r,        pc9801_70_w,        0xffffffff) //display registers "GRCG" / i8253 pit
16291654//  AM_RANGE(0x0080, 0x0083) SASI interface / <undefined>
1630   AM_RANGE(0x0090, 0x0097) AM_READWRITE8_LEGACY(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
1631   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8_LEGACY(pc9821_a0_r,        pc9821_a0_w,        0xffffffff) //upd7220 bitmap ports / display registers
1655   AM_RANGE(0x0090, 0x0097) AM_READWRITE8(pc9801rs_2hd_r,     pc9801rs_2hd_w,     0xffffffff)
1656   AM_RANGE(0x00a0, 0x00af) AM_READWRITE8(pc9821_a0_r,        pc9821_a0_w,        0xffffffff) //upd7220 bitmap ports / display registers
16321657//  AM_RANGE(0x00b0, 0x00b3) PC9861k (serial port?)
16331658//  AM_RANGE(0x00b9, 0x00b9) PC9861k
16341659//  AM_RANGE(0x00bb, 0x00bb) PC9861k
1635   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8_LEGACY(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffffffff)
1636   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8_LEGACY(pc9801rs_2dd_r,     pc9801rs_2dd_w,     0xffffffff)
1660   AM_RANGE(0x00bc, 0x00bf) AM_READWRITE8(pc9810rs_fdc_ctrl_r,pc9810rs_fdc_ctrl_w,0xffffffff)
1661   AM_RANGE(0x00c8, 0x00cf) AM_READWRITE8(pc9801rs_2dd_r,     pc9801rs_2dd_w,     0xffffffff)
16371662//  AM_RANGE(0x00d8, 0x00df) AMD98 (sound?) board
1638   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8_LEGACY(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffffffff)
1663   AM_RANGE(0x00f0, 0x00ff) AM_READWRITE8(pc9801rs_f0_r,      pc9801rs_f0_w,      0xffffffff)
16391664//  AM_RANGE(0x0188, 0x018b) YM2203 OPN board / <undefined>
16401665//  AM_RANGE(0x018c, 0x018f) YM2203 OPN extended ports / <undefined>
16411666//  AM_RANGE(0x0430, 0x0430) IDE bank register
16421667//  AM_RANGE(0x0432, 0x0432) IDE bank register (mirror)
16431668//  AM_RANGE(0x0439, 0x0439) ROM/RAM bank (NEC)
16441669//  AM_RANGE(0x043d, 0x043d) ROM/RAM bank (NEC)
1645   AM_RANGE(0x043c, 0x043f) AM_WRITE8_LEGACY(pc9801rs_bank_w,    0xffffffff) //ROM/RAM bank (EPSON)
1670   AM_RANGE(0x043c, 0x043f) AM_WRITE8(pc9801rs_bank_w,    0xffffffff) //ROM/RAM bank (EPSON)
16461671//  AM_RANGE(0x04a0, 0x04af) EGC
16471672//  AM_RANGE(0x04be, 0x04be) FDC "RPM" register
16481673//  AM_RANGE(0x0642, 0x064f) IDE registers / <undefined>
1649   AM_RANGE(0x074c, 0x074f) AM_READ8_LEGACY(ide_status_r, 0x000000ff) // IDE status (r) - IDE control registers (w) / <undefined>
1674   AM_RANGE(0x074c, 0x074f) AM_READ8(ide_status_r, 0x000000ff) // IDE status (r) - IDE control registers (w) / <undefined>
16501675//  AM_RANGE(0x08e0, 0x08ea) <undefined> / EMM SIO registers
16511676//  AM_RANGE(0x09a0, 0x09a0) GDC extended register r/w
16521677//  AM_RANGE(0x09a8, 0x09a8) GDC 31KHz register r/w
r14844r14845
21202145}
21212146
21222147
2123static READ8_HANDLER( pc_dma_read_byte )
2148READ8_MEMBER(pc9801_state::pc_dma_read_byte)
21242149{
2125   pc9801_state *state = space->machine().driver_data<pc9801_state>();
2126   offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
2150   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
21272151      & 0xFF0000;
21282152
2129   return space->read_byte(page_offset + offset);
2153   return space.read_byte(page_offset + offset);
21302154}
21312155
21322156
2133static WRITE8_HANDLER( pc_dma_write_byte )
2157WRITE8_MEMBER(pc9801_state::pc_dma_write_byte)
21342158{
2135   pc9801_state *state = space->machine().driver_data<pc9801_state>();
2136   offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
2159   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
21372160      & 0xFF0000;
21382161
2139   space->write_byte(page_offset + offset, data);
2162   space.write_byte(page_offset + offset, data);
21402163}
21412164
21422165static void set_dma_channel(device_t *device, int channel, int state)
r14844r14845
21662189{
21672190   DEVCB_LINE(pc_dma_hrq_changed),
21682191   DEVCB_NULL,
2169   DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte),
2170   DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte),
2192   DEVCB_DRIVER_MEMBER(pc9801_state, pc_dma_read_byte),
2193   DEVCB_DRIVER_MEMBER(pc9801_state, pc_dma_write_byte),
21712194   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(test_r) },
21722195   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(test_w) },
21732196   { DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) }
src/mess/drivers/mz2000.c
r14844r14845
5151   UINT8 m_color_mode;
5252   UINT8 m_has_fdc;
5353   UINT8 m_hi_mode;
54   DECLARE_READ8_MEMBER(mz2000_ipl_r);
55   DECLARE_READ8_MEMBER(mz2000_wram_r);
56   DECLARE_WRITE8_MEMBER(mz2000_wram_w);
57   DECLARE_READ8_MEMBER(mz2000_tvram_r);
58   DECLARE_WRITE8_MEMBER(mz2000_tvram_w);
59   DECLARE_READ8_MEMBER(mz2000_gvram_r);
60   DECLARE_WRITE8_MEMBER(mz2000_gvram_w);
61   DECLARE_READ8_MEMBER(mz2000_mem_r);
62   DECLARE_WRITE8_MEMBER(mz2000_mem_w);
63   DECLARE_WRITE8_MEMBER(mz2000_gvram_bank_w);
64   DECLARE_WRITE8_MEMBER(mz2000_fdc_w);
65   DECLARE_WRITE8_MEMBER(timer_w);
66   DECLARE_WRITE8_MEMBER(mz2000_tvram_attr_w);
67   DECLARE_WRITE8_MEMBER(mz2000_gvram_mask_w);
5468};
5569
5670static VIDEO_START( mz2000 )
r14844r14845
154168    return 0;
155169}
156170
157static READ8_HANDLER( mz2000_ipl_r )
171READ8_MEMBER(mz2000_state::mz2000_ipl_r)
158172{
159   UINT8 *ipl = space->machine().region("ipl")->base();
173   UINT8 *ipl = machine().region("ipl")->base();
160174
161175   return ipl[offset];
162176}
163177
164static READ8_HANDLER( mz2000_wram_r )
178READ8_MEMBER(mz2000_state::mz2000_wram_r)
165179{
166   UINT8 *wram = space->machine().region("wram")->base();
180   UINT8 *wram = machine().region("wram")->base();
167181
168182   return wram[offset];
169183}
170184
171static WRITE8_HANDLER( mz2000_wram_w )
185WRITE8_MEMBER(mz2000_state::mz2000_wram_w)
172186{
173   UINT8 *wram = space->machine().region("wram")->base();
187   UINT8 *wram = machine().region("wram")->base();
174188
175189   wram[offset] = data;
176190}
177191
178static READ8_HANDLER( mz2000_tvram_r )
192READ8_MEMBER(mz2000_state::mz2000_tvram_r)
179193{
180   UINT8 *tvram = space->machine().region("tvram")->base();
194   UINT8 *tvram = machine().region("tvram")->base();
181195
182196   return tvram[offset];
183197}
184198
185static WRITE8_HANDLER( mz2000_tvram_w )
199WRITE8_MEMBER(mz2000_state::mz2000_tvram_w)
186200{
187   UINT8 *tvram = space->machine().region("tvram")->base();
201   UINT8 *tvram = machine().region("tvram")->base();
188202
189203   tvram[offset] = data;
190204}
191205
192static READ8_HANDLER( mz2000_gvram_r )
206READ8_MEMBER(mz2000_state::mz2000_gvram_r)
193207{
194   mz2000_state *state = space->machine().driver_data<mz2000_state>();
195   UINT8 *gvram = space->machine().region("gvram")->base();
208   UINT8 *gvram = machine().region("gvram")->base();
196209
197   return gvram[offset+state->m_gvram_bank*0x4000];
210   return gvram[offset+m_gvram_bank*0x4000];
198211}
199212
200static WRITE8_HANDLER( mz2000_gvram_w )
213WRITE8_MEMBER(mz2000_state::mz2000_gvram_w)
201214{
202   mz2000_state *state = space->machine().driver_data<mz2000_state>();
203   UINT8 *gvram = space->machine().region("gvram")->base();
215   UINT8 *gvram = machine().region("gvram")->base();
204216
205   gvram[offset+state->m_gvram_bank*0x4000] = data;
217   gvram[offset+m_gvram_bank*0x4000] = data;
206218}
207219
208220
209static READ8_HANDLER( mz2000_mem_r )
221READ8_MEMBER(mz2000_state::mz2000_mem_r)
210222{
211   mz2000_state *state = space->machine().driver_data<mz2000_state>();
212223   UINT8 page_mem;
213224
214225   page_mem = (offset & 0xf000) >> 12;
215226
216   if(page_mem == 0 && state->m_ipl_enable)
227   if(page_mem == 0 && m_ipl_enable)
217228      return mz2000_ipl_r(space,offset & 0xfff);
218229
219   if(((page_mem & 8) == 0) && state->m_ipl_enable == 0) // if ipl is enabled, 0x1000 - 0x7fff accesses to dummy region
230   if(((page_mem & 8) == 0) && m_ipl_enable == 0) // if ipl is enabled, 0x1000 - 0x7fff accesses to dummy region
220231      return mz2000_wram_r(space,offset);
221232
222233   if(page_mem & 8)
223234   {
224      if(page_mem == 0xd && state->m_tvram_enable)
235      if(page_mem == 0xd && m_tvram_enable)
225236         return mz2000_tvram_r(space,offset & 0xfff);
226      else if(page_mem >= 0xc && state->m_gvram_enable)
237      else if(page_mem >= 0xc && m_gvram_enable)
227238         return mz2000_gvram_r(space,offset & 0x3fff);
228239      else
229240      {
230         UINT16 wram_mask = (state->m_ipl_enable) ? 0x7fff : 0xffff;
241         UINT16 wram_mask = (m_ipl_enable) ? 0x7fff : 0xffff;
231242         return mz2000_wram_r(space,offset & wram_mask);
232243      }
233244   }
r14844r14845
235246   return 0xff;
236247}
237248
238static WRITE8_HANDLER( mz2000_mem_w )
249WRITE8_MEMBER(mz2000_state::mz2000_mem_w)
239250{
240   mz2000_state *state = space->machine().driver_data<mz2000_state>();
241251   UINT8 page_mem;
242252
243253   page_mem = (offset & 0xf000) >> 12;
244254
245   if((page_mem & 8) == 0 && state->m_ipl_enable == 0)
255   if((page_mem & 8) == 0 && m_ipl_enable == 0)
246256      mz2000_wram_w(space,offset,data);
247257
248258   if(page_mem & 8)
249259   {
250      if(page_mem == 0xd && state->m_tvram_enable)
260      if(page_mem == 0xd && m_tvram_enable)
251261         mz2000_tvram_w(space,offset & 0xfff,data);
252      else if(page_mem >= 0xc && state->m_gvram_enable)
262      else if(page_mem >= 0xc && m_gvram_enable)
253263         mz2000_gvram_w(space,offset & 0x3fff,data);
254264      else
255265      {
256         UINT16 wram_mask = (state->m_ipl_enable) ? 0x7fff : 0xffff;
266         UINT16 wram_mask = (m_ipl_enable) ? 0x7fff : 0xffff;
257267
258268         mz2000_wram_w(space,offset & wram_mask,data);
259269      }
260270   }
261271}
262272
263static WRITE8_HANDLER( mz2000_gvram_bank_w )
273WRITE8_MEMBER(mz2000_state::mz2000_gvram_bank_w)
264274{
265   mz2000_state *state = space->machine().driver_data<mz2000_state>();
266275
267   state->m_gvram_bank = data & 3;
276   m_gvram_bank = data & 3;
268277}
269278
270279static READ8_DEVICE_HANDLER( mz2000_wd17xx_r )
r14844r14845
285294      wd17xx_w(device, offset, data ^ 0xff);
286295}
287296
288static WRITE8_HANDLER( mz2000_fdc_w )
297WRITE8_MEMBER(mz2000_state::mz2000_fdc_w)
289298{
290   device_t* dev = space->machine().device("mb8877a");
299   device_t* dev = machine().device("mb8877a");
291300
292301   switch(offset+0xdc)
293302   {
294303      case 0xdc:
295304         wd17xx_set_drive(dev,data & 3);
296         floppy_mon_w(floppy_get_device(space->machine(), data & 3), (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
297         floppy_drive_set_ready_state(floppy_get_device(space->machine(), data & 3), 1,0);
305         floppy_mon_w(floppy_get_device(machine(), data & 3), (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
306         floppy_drive_set_ready_state(floppy_get_device(machine(), data & 3), 1,0);
298307         break;
299308      case 0xdd:
300309         wd17xx_set_side(dev,(data & 1));
r14844r14845
302311   }
303312}
304313
305static WRITE8_HANDLER( timer_w )
314WRITE8_MEMBER(mz2000_state::timer_w)
306315{
307   device_t *pit8253 = space->machine().device("pit");
316   device_t *pit8253 = machine().device("pit");
308317
309318   pit8253_gate0_w(pit8253, 1);
310319   pit8253_gate1_w(pit8253, 1);
r14844r14845
314323   pit8253_gate1_w(pit8253, 1);
315324}
316325
317static WRITE8_HANDLER( mz2000_tvram_attr_w )
326WRITE8_MEMBER(mz2000_state::mz2000_tvram_attr_w)
318327{
319   mz2000_state *state = space->machine().driver_data<mz2000_state>();
320   state->m_tvram_attr = data;
328   m_tvram_attr = data;
321329}
322330
323static WRITE8_HANDLER( mz2000_gvram_mask_w )
331WRITE8_MEMBER(mz2000_state::mz2000_gvram_mask_w)
324332{
325   mz2000_state *state = space->machine().driver_data<mz2000_state>();
326   state->m_gvram_mask = data;
333   m_gvram_mask = data;
327334}
328335
329336static ADDRESS_MAP_START(mz2000_map, AS_PROGRAM, 8, mz2000_state )
330337   ADDRESS_MAP_UNMAP_HIGH
331   AM_RANGE( 0x0000, 0xffff ) AM_READWRITE_LEGACY(mz2000_mem_r,mz2000_mem_w)
338   AM_RANGE( 0x0000, 0xffff ) AM_READWRITE(mz2000_mem_r,mz2000_mem_w)
332339ADDRESS_MAP_END
333340
334341static ADDRESS_MAP_START(mz2000_io, AS_IO, 8, mz2000_state )
335342   ADDRESS_MAP_UNMAP_HIGH
336343   ADDRESS_MAP_GLOBAL_MASK(0xff)
337344   AM_RANGE(0xd8, 0xdb) AM_DEVREADWRITE_LEGACY("mb8877a", mz2000_wd17xx_r, mz2000_wd17xx_w)
338   AM_RANGE(0xdc, 0xdd) AM_WRITE_LEGACY(mz2000_fdc_w)
345   AM_RANGE(0xdc, 0xdd) AM_WRITE(mz2000_fdc_w)
339346   AM_RANGE(0xe0, 0xe3) AM_DEVREADWRITE("i8255_0", i8255_device, read, write)
340347    AM_RANGE(0xe4, 0xe7) AM_DEVREADWRITE_LEGACY("pit", pit8253_r, pit8253_w)
341348   AM_RANGE(0xe8, 0xeb) AM_DEVREADWRITE_LEGACY("z80pio_1", z80pio_ba_cd_r, z80pio_ba_cd_w)
342    AM_RANGE(0xf0, 0xf3) AM_WRITE_LEGACY(timer_w)
349    AM_RANGE(0xf0, 0xf3) AM_WRITE(timer_w)
343350//  AM_RANGE(0xf4, 0xf7) CRTC
344   AM_RANGE(0xf5, 0xf5) AM_WRITE_LEGACY(mz2000_tvram_attr_w)
345   AM_RANGE(0xf6, 0xf6) AM_WRITE_LEGACY(mz2000_gvram_mask_w)
346   AM_RANGE(0xf7, 0xf7) AM_WRITE_LEGACY(mz2000_gvram_bank_w)
351   AM_RANGE(0xf5, 0xf5) AM_WRITE(mz2000_tvram_attr_w)
352   AM_RANGE(0xf6, 0xf6) AM_WRITE(mz2000_gvram_mask_w)
353   AM_RANGE(0xf7, 0xf7) AM_WRITE(mz2000_gvram_bank_w)
347354ADDRESS_MAP_END
348355
349356
src/mess/drivers/osbexec.c
r14844r14845
102102      else
103103         device_set_input_line( m_maincpu, 0, CLEAR_LINE );
104104   }
105   DECLARE_WRITE8_MEMBER(osbexec_0000_w);
106   DECLARE_READ8_MEMBER(osbexec_c000_r);
107   DECLARE_WRITE8_MEMBER(osbexec_c000_w);
108   DECLARE_READ8_MEMBER(osbexec_kbd_r);
109   DECLARE_READ8_MEMBER(osbexec_rtc_r);
105110};
106111
107112
108static WRITE8_HANDLER( osbexec_0000_w )
113WRITE8_MEMBER(osbexec_state::osbexec_0000_w)
109114{
110   osbexec_state *state = space->machine().driver_data<osbexec_state>();
111115
112116   /* Font RAM writing is enabled when ROM bank is enabled */
113   if ( state->m_pia0_porta & 0x80 )
117   if ( m_pia0_porta & 0x80 )
114118   {
115119      if ( offset < 0x1000 )
116         state->m_fontram[ offset ] = data;
120         m_fontram[ offset ] = data;
117121   }
118122   else
119123   {
120      state->m_ram_0000[ offset ] = data;
124      m_ram_0000[ offset ] = data;
121125   }
122126}
123127
124128
125static READ8_HANDLER( osbexec_c000_r )
129READ8_MEMBER(osbexec_state::osbexec_c000_r)
126130{
127   osbexec_state *state = space->machine().driver_data<osbexec_state>();
128   UINT8   data = state->m_ram_c000[offset];
131   UINT8   data = m_ram_c000[offset];
129132
130   if ( ( state->m_pia0_porta & 0x40 ) && offset < 0x1000 )
133   if ( ( m_pia0_porta & 0x40 ) && offset < 0x1000 )
131134   {
132      state->m_temp_attr = state->m_ram_c000[ 0x1000 + offset ];
135      m_temp_attr = m_ram_c000[ 0x1000 + offset ];
133136   }
134137
135138   return data;
136139}
137140
138141
139static WRITE8_HANDLER( osbexec_c000_w )
142WRITE8_MEMBER(osbexec_state::osbexec_c000_w)
140143{
141   osbexec_state *state = space->machine().driver_data<osbexec_state>();
142144
143   state->m_ram_c000[offset] = data;
145   m_ram_c000[offset] = data;
144146
145   if ( ( state->m_pia0_porta & 0x40 ) && offset < 0x1000 )
147   if ( ( m_pia0_porta & 0x40 ) && offset < 0x1000 )
146148   {
147      state->m_ram_c000[ 0x1000 + offset ] = state->m_temp_attr;
149      m_ram_c000[ 0x1000 + offset ] = m_temp_attr;
148150   }
149151}
150152
151153
152static READ8_HANDLER( osbexec_kbd_r )
154READ8_MEMBER(osbexec_state::osbexec_kbd_r)
153155{
154156   UINT8 data = 0xFF;
155157
156158   if ( offset & 0x0100 )
157      data &= input_port_read( space->machine(), "ROW0" );
159      data &= input_port_read( machine(), "ROW0" );
158160
159161   if ( offset & 0x0200 )
160      data &= input_port_read( space->machine(), "ROW1" );
162      data &= input_port_read( machine(), "ROW1" );
161163
162164   if ( offset & 0x0400 )
163      data &= input_port_read( space->machine(), "ROW2" );
165      data &= input_port_read( machine(), "ROW2" );
164166
165167   if ( offset & 0x0800 )
166      data &= input_port_read( space->machine(), "ROW3" );
168      data &= input_port_read( machine(), "ROW3" );
167169
168170   if ( offset & 0x1000 )
169      data &= input_port_read( space->machine(), "ROW4" );
171      data &= input_port_read( machine(), "ROW4" );
170172
171173   if ( offset & 0x2000 )
172      data &= input_port_read( space->machine(), "ROW5" );
174      data &= input_port_read( machine(), "ROW5" );
173175
174176   if ( offset & 0x4000 )
175      data &= input_port_read( space->machine(), "ROW6" );
177      data &= input_port_read( machine(), "ROW6" );
176178
177179   if ( offset & 0x8000 )
178      data &= input_port_read( space->machine(), "ROW7" );
180      data &= input_port_read( machine(), "ROW7" );
179181
180182   return data;
181183}
182184
183185
184static READ8_HANDLER( osbexec_rtc_r )
186READ8_MEMBER(osbexec_state::osbexec_rtc_r)
185187{
186   osbexec_state *state = space->machine().driver_data<osbexec_state>();
187188
188   return state->m_rtc;
189   return m_rtc;
189190}
190191
191192
192193static ADDRESS_MAP_START( osbexec_mem, AS_PROGRAM, 8, osbexec_state )
193   AM_RANGE( 0x0000, 0x1FFF ) AM_READ_BANK("0000") AM_WRITE_LEGACY(osbexec_0000_w )   /* ROM and maybe also banked ram */
194   AM_RANGE( 0x0000, 0x1FFF ) AM_READ_BANK("0000") AM_WRITE(osbexec_0000_w )   /* ROM and maybe also banked ram */
194195   AM_RANGE( 0x2000, 0x3FFF ) AM_RAMBANK("2000")                        /* Banked RAM */
195196   AM_RANGE( 0x4000, 0xBFFF ) AM_RAMBANK("4000")                        /* Banked RAM */
196   AM_RANGE( 0xC000, 0xDFFF ) AM_READWRITE_LEGACY(osbexec_c000_r, osbexec_c000_w )   /* Video ram / Banked RAM */
197   AM_RANGE( 0xC000, 0xDFFF ) AM_READWRITE(osbexec_c000_r, osbexec_c000_w )   /* Video ram / Banked RAM */
197198   AM_RANGE( 0xE000, 0xEFFF ) AM_RAMBANK("e000")                        /* Banked RAM */
198199   AM_RANGE( 0xF000, 0xFFFF ) AM_RAM                                 /* 4KB of non-banked RAM for system stack etc */
199200ADDRESS_MAP_END
r14844r14845
206207   AM_RANGE( 0x08, 0x0B ) AM_MIRROR( 0xff00 ) AM_DEVREADWRITE_LEGACY("mb8877", wd17xx_r, wd17xx_w )            /* MB8877 @ UB17 input clock = 1MHz */
207208   AM_RANGE( 0x0C, 0x0F ) AM_MIRROR( 0xff00 ) AM_DEVREADWRITE_LEGACY("sio", z80dart_ba_cd_r, z80dart_ba_cd_w )   /* SIO @ UD4 */
208209   AM_RANGE( 0x10, 0x13 ) AM_MIRROR( 0xff00 ) AM_DEVREADWRITE( "pia_1", pia6821_device, read, write)            /* 6821 PIA @ UD8 */
209   AM_RANGE( 0x14, 0x17 ) AM_MIRROR( 0xff00 ) AM_MASK( 0xff00 ) AM_READ_LEGACY(osbexec_kbd_r )               /* KBD */
210   AM_RANGE( 0x18, 0x1b ) AM_MIRROR( 0xff00 ) AM_READ_LEGACY(osbexec_rtc_r )                              /* "RTC" @ UE13/UF13 */
210   AM_RANGE( 0x14, 0x17 ) AM_MIRROR( 0xff00 ) AM_MASK( 0xff00 ) AM_READ(osbexec_kbd_r )               /* KBD */
211   AM_RANGE( 0x18, 0x1b ) AM_MIRROR( 0xff00 ) AM_READ(osbexec_rtc_r )                              /* "RTC" @ UE13/UF13 */
211212   /* ?? - vid ? */
212213ADDRESS_MAP_END
213214
src/mess/drivers/pc88va.c
r14844r14845
7171   UINT8 m_i8255_1_pc;
7272   UINT8 m_fdc_mode;
7373   UINT8 m_fdc_irq_opcode;
74   DECLARE_READ16_MEMBER(sys_mem_r);
75   DECLARE_WRITE16_MEMBER(sys_mem_w);
76   DECLARE_READ8_MEMBER(idp_status_r);
77   DECLARE_WRITE8_MEMBER(idp_command_w);
78   DECLARE_WRITE8_MEMBER(idp_param_w);
79   DECLARE_WRITE16_MEMBER(palette_ram_w);
80   DECLARE_READ16_MEMBER(sys_port4_r);
81   DECLARE_READ16_MEMBER(bios_bank_r);
82   DECLARE_WRITE16_MEMBER(bios_bank_w);
83   DECLARE_READ8_MEMBER(rom_bank_r);
84   DECLARE_READ8_MEMBER(key_r);
85   DECLARE_WRITE16_MEMBER(backupram_wp_1_w);
86   DECLARE_WRITE16_MEMBER(backupram_wp_0_w);
87   DECLARE_READ8_MEMBER(hdd_status_r);
88   DECLARE_WRITE8_MEMBER(upd765_mc_w);
89   DECLARE_READ8_MEMBER(upd765_tc_r);
90   DECLARE_READ8_MEMBER(pc88va_fdc_r);
91   DECLARE_WRITE8_MEMBER(pc88va_fdc_w);
92   DECLARE_READ16_MEMBER(sysop_r);
93   DECLARE_READ16_MEMBER(screen_ctrl_r);
94   DECLARE_WRITE16_MEMBER(screen_ctrl_w);
95   DECLARE_WRITE8_MEMBER(timer3_ctrl_reg_w);
96   DECLARE_WRITE16_MEMBER(video_pri_w);
97   DECLARE_READ8_MEMBER(backupram_dsw_r);
98   DECLARE_WRITE8_MEMBER(sys_port1_w);
99   DECLARE_WRITE8_MEMBER(fdc_irq_vector_w);
74100};
75101
76102
r14844r14845
428454   return 0;
429455}
430456
431static READ16_HANDLER( sys_mem_r )
457READ16_MEMBER(pc88va_state::sys_mem_r)
432458{
433   pc88va_state *state = space->machine().driver_data<pc88va_state>();
434   switch((state->m_bank_reg & 0xf00) >> 8)
459   switch((m_bank_reg & 0xf00) >> 8)
435460   {
436461      case 0: // select bus slot
437462         return 0xffff;
438463      case 1: // TVRAM
439464      {
440         UINT16 *tvram = (UINT16 *)(*space->machine().region("tvram"));
465         UINT16 *tvram = (UINT16 *)(*machine().region("tvram"));
441466
442467         if(((offset*2) & 0x30000) == 0)
443468            return tvram[offset];
r14844r14845
446471      }
447472      case 4:
448473      {
449         UINT16 *gvram = (UINT16 *)(*space->machine().region("gvram"));
474         UINT16 *gvram = (UINT16 *)(*machine().region("gvram"));
450475
451476         return gvram[offset];
452477      }
453478      case 8: // kanji ROM
454479      case 9:
455480      {
456         UINT16 *knj_ram = (UINT16 *)(*space->machine().region("kanji"));
481         UINT16 *knj_ram = (UINT16 *)(*machine().region("kanji"));
457482         UINT32 knj_offset;
458483
459         knj_offset = (offset + (((state->m_bank_reg & 0x100) >> 8)*0x20000));
484         knj_offset = (offset + (((m_bank_reg & 0x100) >> 8)*0x20000));
460485
461486         /* 0x00000 - 0x3ffff Kanji ROM 1*/
462487         /* 0x40000 - 0x4ffff Kanji ROM 2*/
r14844r14845
469494      case 0xc: // Dictionary ROM
470495      case 0xd:
471496      {
472         UINT16 *dic_rom = (UINT16 *)(*space->machine().region("dictionary"));
497         UINT16 *dic_rom = (UINT16 *)(*machine().region("dictionary"));
473498         UINT32 dic_offset;
474499
475         dic_offset = (offset + (((state->m_bank_reg & 0x100) >> 8)*0x20000));
500         dic_offset = (offset + (((m_bank_reg & 0x100) >> 8)*0x20000));
476501
477502         return dic_rom[dic_offset];
478503      }
r14844r14845
481506   return 0xffff;
482507}
483508
484static WRITE16_HANDLER( sys_mem_w )
509WRITE16_MEMBER(pc88va_state::sys_mem_w)
485510{
486   pc88va_state *state = space->machine().driver_data<pc88va_state>();
487   switch((state->m_bank_reg & 0xf00) >> 8)
511   switch((m_bank_reg & 0xf00) >> 8)
488512   {
489513      case 0: // select bus slot
490514         break;
491515      case 1: // TVRAM
492516      {
493         UINT16 *tvram = (UINT16 *)(*space->machine().region("tvram"));
517         UINT16 *tvram = (UINT16 *)(*machine().region("tvram"));
494518
495519         if(((offset*2) & 0x30000) == 0)
496520            COMBINE_DATA(&tvram[offset]);
r14844r14845
498522      break;
499523      case 4: // TVRAM
500524      {
501         UINT16 *gvram = (UINT16 *)(*space->machine().region("gvram"));
525         UINT16 *gvram = (UINT16 *)(*machine().region("gvram"));
502526
503527         COMBINE_DATA(&gvram[offset]);
504528      }
r14844r14845
506530      case 8: // kanji ROM, backup RAM at 0xb0000 - 0xb3fff
507531      case 9:
508532      {
509         UINT16 *knj_ram = (UINT16 *)(*space->machine().region("kanji"));
533         UINT16 *knj_ram = (UINT16 *)(*machine().region("kanji"));
510534         UINT32 knj_offset;
511535
512         knj_offset = ((offset) + (((state->m_bank_reg & 0x100) >> 8)*0x20000));
536         knj_offset = ((offset) + (((m_bank_reg & 0x100) >> 8)*0x20000));
513537
514538         if(knj_offset >= 0x50000/2 && knj_offset <= 0x53fff/2) // TODO: there's an area that can be write protected
515539         {
516540            COMBINE_DATA(&knj_ram[knj_offset]);
517            gfx_element_mark_dirty(space->machine().gfx[0], (knj_offset * 2) / 8);
518            gfx_element_mark_dirty(space->machine().gfx[1], (knj_offset * 2) / 32);
541            gfx_element_mark_dirty(machine().gfx[0], (knj_offset * 2) / 8);
542            gfx_element_mark_dirty(machine().gfx[1], (knj_offset * 2) / 32);
519543         }
520544      }
521545      break;
r14844r14845
531555static ADDRESS_MAP_START( pc88va_map, AS_PROGRAM, 16, pc88va_state )
532556   AM_RANGE(0x00000, 0x7ffff) AM_RAM
533557//  AM_RANGE(0x80000, 0x9ffff) AM_RAM // EMM
534   AM_RANGE(0xa0000, 0xdffff) AM_READWRITE_LEGACY(sys_mem_r,sys_mem_w)
558   AM_RANGE(0xa0000, 0xdffff) AM_READWRITE(sys_mem_r,sys_mem_w)
535559   AM_RANGE(0xe0000, 0xeffff) AM_ROMBANK("rom00_bank")
536560   AM_RANGE(0xf0000, 0xfffff) AM_ROMBANK("rom10_bank")
537561ADDRESS_MAP_END
538562
539static READ8_HANDLER( idp_status_r )
563READ8_MEMBER(pc88va_state::idp_status_r)
540564{
541565/*
542566    x--- ---- LP   Light-pen signal detection (with VA use failure)
r14844r14845
566590#define SPRSW  0x85
567591#define SPROV  0x81
568592
569static WRITE8_HANDLER( idp_command_w )
593WRITE8_MEMBER(pc88va_state::idp_command_w)
570594{
571   pc88va_state *state = space->machine().driver_data<pc88va_state>();
572595   switch(data)
573596   {
574597      /* 0x10 - SYNC: sets CRTC values */
575      case SYNC:   state->m_cmd = SYNC;  state->m_buf_size = 14; state->m_buf_index = 0; break;
598      case SYNC:   m_cmd = SYNC;  m_buf_size = 14; m_buf_index = 0; break;
576599
577600      /* 0x12 - DSPON: set DiSPlay ON and set up tvram table vreg */
578      case DSPON:  state->m_cmd = DSPON; state->m_buf_size = 3;  state->m_buf_index = 0; break;
601      case DSPON:  m_cmd = DSPON; m_buf_size = 3;  m_buf_index = 0; break;
579602
580603      /* 0x13 - DSPOFF: set DiSPlay OFF */
581      case DSPOFF: state->m_cmd = DSPOFF; state->m_tsp.disp_on = 0; break;
604      case DSPOFF: m_cmd = DSPOFF; m_tsp.disp_on = 0; break;
582605
583606      /* 0x14 - DSPDEF: set DiSPlay DEFinitions */
584      case DSPDEF: state->m_cmd = DSPDEF; state->m_buf_size = 6; state->m_buf_index = 0; break;
607      case DSPDEF: m_cmd = DSPDEF; m_buf_size = 6; m_buf_index = 0; break;
585608
586609      /* 0x15 - CURDEF: set CURsor DEFinition */
587      case CURDEF: state->m_cmd = CURDEF; state->m_buf_size = 1; state->m_buf_index = 0; break;
610      case CURDEF: m_cmd = CURDEF; m_buf_size = 1; m_buf_index = 0; break;
588611
589612      /* 0x16 - ACTSCR: ??? */
590      case ACTSCR: state->m_cmd = ACTSCR; state->m_buf_size = 1; state->m_buf_index = 0; break;
613      case ACTSCR: m_cmd = ACTSCR; m_buf_size = 1; m_buf_index = 0; break;
591614
592615      /* 0x15 - CURS: set CURSor position */
593      case CURS:   state->m_cmd = CURS;   state->m_buf_size = 4; state->m_buf_index = 0; break;
616      case CURS:   m_cmd = CURS;   m_buf_size = 4; m_buf_index = 0; break;
594617
595618      /* 0x8c - EMUL: set 3301 EMULation */
596      case EMUL:   state->m_cmd = EMUL;   state->m_buf_size = 4; state->m_buf_index = 0; break;
619      case EMUL:   m_cmd = EMUL;   m_buf_size = 4; m_buf_index = 0; break;
597620
598621      /* 0x88 - EXIT: ??? */
599      case EXIT:   state->m_cmd = EXIT; break;
622      case EXIT:   m_cmd = EXIT; break;
600623
601624      /* 0x82 - SPRON: set SPRite ON */
602      case SPRON:  state->m_cmd = SPRON;  state->m_buf_size = 3; state->m_buf_index = 0; break;
625      case SPRON:  m_cmd = SPRON;  m_buf_size = 3; m_buf_index = 0; break;
603626
604627      /* 0x83 - SPROFF: set SPRite OFF */
605      case SPROFF: state->m_cmd = SPROFF; state->m_tsp.spr_on = 0; break;
628      case SPROFF: m_cmd = SPROFF; m_tsp.spr_on = 0; break;
606629
607630      /* 0x85 - SPRSW: ??? */
608      case SPRSW:  state->m_cmd = SPRSW;  state->m_buf_size = 1; state->m_buf_index = 0; break;
631      case SPRSW:  m_cmd = SPRSW;  m_buf_size = 1; m_buf_index = 0; break;
609632
610633      /* 0x81 - SPROV: set SPRite OVerflow information */
611634      /*
r14844r14845
613636        --x- ---- Sprite Collision flag
614637        ---x xxxx First sprite that caused Sprite Over event
615638        */
616      case SPROV:  state->m_cmd = SPROV; /* TODO: where it returns the info? */ break;
639      case SPROV:  m_cmd = SPROV; /* TODO: where it returns the info? */ break;
617640
618641      /* TODO: 0x89 shouldn't trigger, should be one of the above commands */
619      default:   state->m_cmd = 0x00; printf("PC=%05x: Unknown IDP %02x cmd set\n",cpu_get_pc(&space->device()),data); break;
642      default:   m_cmd = 0x00; printf("PC=%05x: Unknown IDP %02x cmd set\n",cpu_get_pc(&space.device()),data); break;
620643   }
621644}
622645
r14844r14845
786809   tsp_sprite_enable(machine, 0xa0000 + state->m_tsp.spr_offset + (state->m_buf_ram[0] & 0xf8), (state->m_buf_ram[0] & 2) << 8);
787810}
788811
789static WRITE8_HANDLER( idp_param_w )
812WRITE8_MEMBER(pc88va_state::idp_param_w)
790813{
791   pc88va_state *state = space->machine().driver_data<pc88va_state>();
792   if(state->m_cmd == DSPOFF || state->m_cmd == EXIT || state->m_cmd == SPROFF || state->m_cmd == SPROV) // no param commands
814   if(m_cmd == DSPOFF || m_cmd == EXIT || m_cmd == SPROFF || m_cmd == SPROV) // no param commands
793815      return;
794816
795   state->m_buf_ram[state->m_buf_index] = data;
796   state->m_buf_index++;
817   m_buf_ram[m_buf_index] = data;
818   m_buf_index++;
797819
798   if(state->m_buf_index >= state->m_buf_size)
820   if(m_buf_index >= m_buf_size)
799821   {
800      state->m_buf_index = 0;
801      switch(state->m_cmd)
822      m_buf_index = 0;
823      switch(m_cmd)
802824      {
803         case SYNC:      execute_sync_cmd(space->machine());   break;
804         case DSPON:    execute_dspon_cmd(space->machine());   break;
805         case DSPDEF:   execute_dspdef_cmd(space->machine()); break;
806         case CURDEF:   execute_curdef_cmd(space->machine()); break;
807         case ACTSCR:   execute_actscr_cmd(space->machine()); break;
808         case CURS:      execute_curs_cmd(space->machine());   break;
809         case EMUL:      execute_emul_cmd(space->machine());   break;
810         case SPRON:      execute_spron_cmd(space->machine());  break;
811         case SPRSW:      execute_sprsw_cmd(space->machine());   break;
825         case SYNC:      execute_sync_cmd(machine());   break;
826         case DSPON:    execute_dspon_cmd(machine());   break;
827         case DSPDEF:   execute_dspdef_cmd(machine()); break;
828         case CURDEF:   execute_curdef_cmd(machine()); break;
829         case ACTSCR:   execute_actscr_cmd(machine()); break;
830         case CURS:      execute_curs_cmd(machine());   break;
831         case EMUL:      execute_emul_cmd(machine());   break;
832         case SPRON:      execute_spron_cmd(machine());  break;
833         case SPRSW:      execute_sprsw_cmd(machine());   break;
812834
813835         default:
814836            //printf("%02x\n",data);
r14844r14845
817839   }
818840}
819841
820static WRITE16_HANDLER( palette_ram_w )
842WRITE16_MEMBER(pc88va_state::palette_ram_w)
821843{
822   pc88va_state *state = space->machine().driver_data<pc88va_state>();
823844   int r,g,b;
824   COMBINE_DATA(&state->m_palram[offset]);
845   COMBINE_DATA(&m_palram[offset]);
825846
826   b = (state->m_palram[offset] & 0x001e) >> 1;
827   r = (state->m_palram[offset] & 0x03c0) >> 6;
828   g = (state->m_palram[offset] & 0x7800) >> 11;
847   b = (m_palram[offset] & 0x001e) >> 1;
848   r = (m_palram[offset] & 0x03c0) >> 6;
849   g = (m_palram[offset] & 0x7800) >> 11;
829850
830   palette_set_color_rgb(space->machine(),offset,pal4bit(r),pal4bit(g),pal4bit(b));
851   palette_set_color_rgb(machine(),offset,pal4bit(r),pal4bit(g),pal4bit(b));
831852}
832853
833static READ16_HANDLER( sys_port4_r )
854READ16_MEMBER(pc88va_state::sys_port4_r)
834855{
835856   UINT8 vrtc,sw1;
836   vrtc = (space->machine().primary_screen->vpos() < 200) ? 0x20 : 0x00; // vblank
857   vrtc = (machine().primary_screen->vpos() < 200) ? 0x20 : 0x00; // vblank
837858
838   sw1 = (input_port_read(space->machine(), "DSW") & 1) ? 2 : 0;
859   sw1 = (input_port_read(machine(), "DSW") & 1) ? 2 : 0;
839860
840861   return vrtc | sw1 | 0xc0;
841862}
842863
843static READ16_HANDLER( bios_bank_r )
864READ16_MEMBER(pc88va_state::bios_bank_r)
844865{
845   pc88va_state *state = space->machine().driver_data<pc88va_state>();
846   return state->m_bank_reg;
866   return m_bank_reg;
847867}
848868
849static WRITE16_HANDLER( bios_bank_w )
869WRITE16_MEMBER(pc88va_state::bios_bank_w)
850870{
851   pc88va_state *state = space->machine().driver_data<pc88va_state>();
852871   /*
853872    -x-- ---- ---- ---- SMM (compatibility mode)
854873    ---x ---- ---- ---- GMSP (VRAM drawing Mode)
r14844r14845
857876    ---- ---- ---- xxxx RBC0 (0xe0000 - 0xeffff ROM bank)
858877    */
859878   if ((mem_mask&0xffff) == 0xffff)
860      state->m_bank_reg = data;
879      m_bank_reg = data;
861880   else if ((mem_mask & 0xffff) == 0xff00)
862      state->m_bank_reg = (data & 0xff00) | (state->m_bank_reg & 0x00ff);
881      m_bank_reg = (data & 0xff00) | (m_bank_reg & 0x00ff);
863882   else if ((mem_mask & 0xffff) == 0x00ff)
864      state->m_bank_reg = (data & 0x00ff) | (state->m_bank_reg & 0xff00);
883      m_bank_reg = (data & 0x00ff) | (m_bank_reg & 0xff00);
865884
866885
867886   /* RBC1 */
868887   {
869      UINT8 *ROM10 = space->machine().region("rom10")->base();
888      UINT8 *ROM10 = machine().region("rom10")->base();
870889
871      if((state->m_bank_reg & 0xe0) == 0x00)
872         memory_set_bankptr(space->machine(), "rom10_bank", &ROM10[(state->m_bank_reg & 0x10) ? 0x10000 : 0x00000]);
890      if((m_bank_reg & 0xe0) == 0x00)
891         memory_set_bankptr(machine(), "rom10_bank", &ROM10[(m_bank_reg & 0x10) ? 0x10000 : 0x00000]);
873892   }
874893
875894   /* RBC0 */
876895   {
877      UINT8 *ROM00 = space->machine().region("rom00")->base();
896      UINT8 *ROM00 = machine().region("rom00")->base();
878897
879      memory_set_bankptr(space->machine(), "rom00_bank", &ROM00[(state->m_bank_reg & 0xf)*0x10000]); // TODO: docs says that only 0 - 5 are used, dunno why ...
898      memory_set_bankptr(machine(), "rom00_bank", &ROM00[(m_bank_reg & 0xf)*0x10000]); // TODO: docs says that only 0 - 5 are used, dunno why ...
880899   }
881900}
882901
883static READ8_HANDLER( rom_bank_r )
902READ8_MEMBER(pc88va_state::rom_bank_r)
884903{
885904   return 0xff; // bit 7 low is va91 rom bank status
886905}
887906
888static READ8_HANDLER( key_r )
907READ8_MEMBER(pc88va_state::key_r)
889908{
890909   // note row C bit 2 does something at POST ... some kind of test mode?
891910   static const char *const keynames[] = { "KEY0", "KEY1", "KEY2", "KEY3",
r14844r14845
893912                                           "KEY8", "KEY9", "KEYA", "KEYB",
894913                                           "KEYC", "KEYD", "KEYE", "KEYF" };
895914
896   return input_port_read(space->machine(), keynames[offset]);
915   return input_port_read(machine(), keynames[offset]);
897916}
898917
899static WRITE16_HANDLER( backupram_wp_1_w )
918WRITE16_MEMBER(pc88va_state::backupram_wp_1_w)
900919{
901   pc88va_state *state = space->machine().driver_data<pc88va_state>();
902   state->m_backupram_wp = 1;
920   m_backupram_wp = 1;
903921}
904922
905static WRITE16_HANDLER( backupram_wp_0_w )
923WRITE16_MEMBER(pc88va_state::backupram_wp_0_w)
906924{
907   pc88va_state *state = space->machine().driver_data<pc88va_state>();
908   state->m_backupram_wp = 0;
925   m_backupram_wp = 0;
909926}
910927
911static READ8_HANDLER( hdd_status_r )
928READ8_MEMBER(pc88va_state::hdd_status_r)
912929{
913930   return 0x20;
914931}
915932
916static WRITE8_HANDLER( upd765_mc_w )
933WRITE8_MEMBER(pc88va_state::upd765_mc_w)
917934{
918   floppy_mon_w(floppy_get_device(space->machine(), 0), (data & 1) ? CLEAR_LINE : ASSERT_LINE);
919   floppy_mon_w(floppy_get_device(space->machine(), 1), (data & 2) ? CLEAR_LINE : ASSERT_LINE);
920   floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0), (data & 1), 0);
921   floppy_drive_set_ready_state(floppy_get_device(space->machine(), 1), (data & 2), 0);
935   floppy_mon_w(floppy_get_device(machine(), 0), (data & 1) ? CLEAR_LINE : ASSERT_LINE);
936   floppy_mon_w(floppy_get_device(machine(), 1), (data & 2) ? CLEAR_LINE : ASSERT_LINE);
937   floppy_drive_set_ready_state(floppy_get_device(machine(), 0), (data & 1), 0);
938   floppy_drive_set_ready_state(floppy_get_device(machine(), 1), (data & 2), 0);
922939}
923940
924941static TIMER_CALLBACK( pc8801fd_upd765_tc_to_zero )
r14844r14845
928945   upd765_tc_w(machine.device("upd765"), 0);
929946}
930947
931static READ8_HANDLER( upd765_tc_r )
948READ8_MEMBER(pc88va_state::upd765_tc_r)
932949{
933   //pc88va_state *state = space->machine().driver_data<pc88va_state>();
934950
935   upd765_tc_w(space->machine().device("upd765"), 1);
936   space->machine().scheduler().timer_set(attotime::from_usec(500), FUNC(pc8801fd_upd765_tc_to_zero));
951   upd765_tc_w(machine().device("upd765"), 1);
952   machine().scheduler().timer_set(attotime::from_usec(500), FUNC(pc8801fd_upd765_tc_to_zero));
937953   return 0;
938954}
939955
940static READ8_HANDLER( pc88va_fdc_r )
956READ8_MEMBER(pc88va_state::pc88va_fdc_r)
941957{
942958   switch(offset*2)
943959   {
r14844r14845
947963      /* ---x ---- RDY: (0) Busy (1) Ready */
948964      case 0x06: // FDC control port 2
949965         return 0;
950      case 0x08: return upd765_status_r(space->machine().device("upd765"), 0);
951      case 0x0a: return upd765_data_r(space->machine().device("upd765"), 0);
966      case 0x08: return upd765_status_r(machine().device("upd765"), 0);
967      case 0x0a: return upd765_data_r(machine().device("upd765"), 0);
952968   }
953969
954970   return 0xff;
955971}
956972
957static WRITE8_HANDLER( pc88va_fdc_w )
973WRITE8_MEMBER(pc88va_state::pc88va_fdc_w)
958974{
959   pc88va_state *state = space->machine().driver_data<pc88va_state>();
960975   switch(offset*2)
961976   {
962977      /*
963978        ---- ---x MODE: FDC op mode (0) Intelligent (1) DMA
964979        */
965980      case 0x00: // FDC mode register
966         state->m_fdc_mode = data & 1;
967         cputag_set_input_line(space->machine(), "fdccpu", INPUT_LINE_HALT, (state->m_fdc_mode) ? ASSERT_LINE : CLEAR_LINE);
981         m_fdc_mode = data & 1;
982         cputag_set_input_line(machine(), "fdccpu", INPUT_LINE_HALT, (m_fdc_mode) ? ASSERT_LINE : CLEAR_LINE);
968983         break;
969984      /*
970985        --x- ---- CLK: FDC clock selection (0) 4.8MHz (1) 8 MHz
r14844r14845
9901005         printf("%02x\n",data);
9911006         break; // FDC control port 2
9921007      case 0x08: break; // UPD765 status
993      case 0x0a: upd765_data_w(space->machine().device("upd765"), 0,data); break;
1008      case 0x0a: upd765_data_w(machine().device("upd765"), 0,data); break;
9941009   }
9951010}
9961011
9971012
998static READ16_HANDLER( sysop_r )
1013READ16_MEMBER(pc88va_state::sysop_r)
9991014{
10001015   UINT8 sys_op;
10011016
1002   sys_op = input_port_read(space->machine(), "SYSOP_SW") & 3;
1017   sys_op = input_port_read(machine(), "SYSOP_SW") & 3;
10031018
10041019   return 0xfffc | sys_op; // docs says all the other bits are high
10051020}
10061021
1007static READ16_HANDLER( screen_ctrl_r )
1022READ16_MEMBER(pc88va_state::screen_ctrl_r)
10081023{
1009   pc88va_state *state = space->machine().driver_data<pc88va_state>();
1010   return state->m_screen_ctrl_reg;
1024   return m_screen_ctrl_reg;
10111025}
10121026
1013static WRITE16_HANDLER( screen_ctrl_w )
1027WRITE16_MEMBER(pc88va_state::screen_ctrl_w)
10141028{
1015   pc88va_state *state = space->machine().driver_data<pc88va_state>();
1016   state->m_screen_ctrl_reg = data;
1029   m_screen_ctrl_reg = data;
10171030}
10181031
10191032static TIMER_CALLBACK( t3_mouse_callback )
r14844r14845
10261039   }
10271040}
10281041
1029static WRITE8_HANDLER( timer3_ctrl_reg_w )
1042WRITE8_MEMBER(pc88va_state::timer3_ctrl_reg_w)
10301043{
1031   pc88va_state *state = space->machine().driver_data<pc88va_state>();
10321044   /*
10331045    x--- ---- MINTEN (TCU irq enable)
10341046    ---- --xx general purpose timer 3 interval (120, 60, 30, 15)
10351047    */
1036   state->m_timer3_io_reg = data;
1048   m_timer3_io_reg = data;
10371049
10381050   if(data & 0x80)
1039      state->m_t3_mouse_timer->adjust(attotime::from_hz(120 >> (state->m_timer3_io_reg & 3)));
1051      m_t3_mouse_timer->adjust(attotime::from_hz(120 >> (m_timer3_io_reg & 3)));
10401052   else
10411053   {
1042      pic8259_ir5_w(space->machine().device("pic8259_slave"), 0);
1043      state->m_t3_mouse_timer->adjust(attotime::never);
1054      pic8259_ir5_w(machine().device("pic8259_slave"), 0);
1055      m_t3_mouse_timer->adjust(attotime::never);
10441056   }
10451057}
10461058
1047static WRITE16_HANDLER( video_pri_w )
1059WRITE16_MEMBER(pc88va_state::video_pri_w)
10481060{
1049   pc88va_state *state = space->machine().driver_data<pc88va_state>();
1050   COMBINE_DATA(&state->m_video_pri_reg[offset]);
1061   COMBINE_DATA(&m_video_pri_reg[offset]);
10511062}
10521063
1053static READ8_HANDLER( backupram_dsw_r )
1064READ8_MEMBER(pc88va_state::backupram_dsw_r)
10541065{
1055   UINT16 *knj_ram = (UINT16 *)(*space->machine().region("kanji"));
1066   UINT16 *knj_ram = (UINT16 *)(*machine().region("kanji"));
10561067
10571068   if(offset == 0)
10581069      return knj_ram[(0x50000 + 0x1fc2) / 2] & 0xff;
r14844r14845
10601071   return knj_ram[(0x50000 + 0x1fc6) / 2] & 0xff;
10611072}
10621073
1063static WRITE8_HANDLER( sys_port1_w )
1074WRITE8_MEMBER(pc88va_state::sys_port1_w)
10641075{
10651076   // ...
10661077}
10671078
10681079static ADDRESS_MAP_START( pc88va_io_map, AS_IO, 16, pc88va_state )
1069   AM_RANGE(0x0000, 0x000f) AM_READ8_LEGACY(key_r,0xffff) // Keyboard ROW reading
1080   AM_RANGE(0x0000, 0x000f) AM_READ8(key_r,0xffff) // Keyboard ROW reading
10701081//  AM_RANGE(0x0010, 0x0010) Printer / Calendar Clock Interface
10711082   AM_RANGE(0x0020, 0x0021) AM_NOP // RS-232C
1072   AM_RANGE(0x0030, 0x0031) AM_READWRITE8_LEGACY(backupram_dsw_r,sys_port1_w,0xffff) // 0x30 (R) DSW1 (W) Text Control Port 0 / 0x31 (R) DSW2 (W) System Port 1
1083   AM_RANGE(0x0030, 0x0031) AM_READWRITE8(backupram_dsw_r,sys_port1_w,0xffff) // 0x30 (R) DSW1 (W) Text Control Port 0 / 0x31 (R) DSW2 (W) System Port 1
10731084//  AM_RANGE(0x0032, 0x0032) (R) ? (W) System Port 2
10741085//  AM_RANGE(0x0034, 0x0034) GVRAM Control Port 1
10751086//  AM_RANGE(0x0035, 0x0035) GVRAM Control Port 2
1076   AM_RANGE(0x0040, 0x0041) AM_READ_LEGACY(sys_port4_r) // (R) System Port 4 (W) System port 3 (strobe port)
1087   AM_RANGE(0x0040, 0x0041) AM_READ(sys_port4_r) // (R) System Port 4 (W) System port 3 (strobe port)
10771088   AM_RANGE(0x0044, 0x0045) AM_MIRROR(0x0002) AM_DEVREADWRITE8_LEGACY("ym", ym2203_r,ym2203_w,0xffff)
10781089//  AM_RANGE(0x005c, 0x005c) (R) GVRAM status
10791090//  AM_RANGE(0x005c, 0x005f) (W) GVRAM selection
r14844r14845
10811092//  AM_RANGE(0x0071, 0x0071) Expansion ROM select (*)
10821093//  AM_RANGE(0x0078, 0x0078) Memory offset increment (*)
10831094//  AM_RANGE(0x0080, 0x0081) HDD related
1084   AM_RANGE(0x0082, 0x0083) AM_READ8_LEGACY(hdd_status_r,0x00ff)// HDD control, byte access 7-0
1095   AM_RANGE(0x0082, 0x0083) AM_READ8(hdd_status_r,0x00ff)// HDD control, byte access 7-0
10851096//  AM_RANGE(0x00bc, 0x00bf) d8255 1
10861097//  AM_RANGE(0x00e2, 0x00e3) Expansion RAM selection (*)
10871098//  AM_RANGE(0x00e4, 0x00e4) 8214 IRQ control (*)
r14844r14845
10901101//  AM_RANGE(0x00ec, 0x00ed) ? (*)
10911102   AM_RANGE(0x00fc, 0x00ff) AM_DEVREADWRITE8("d8255_2", i8255_device, read, write, 0xffff) // d8255 2, FDD
10921103
1093   AM_RANGE(0x0100, 0x0101) AM_READWRITE_LEGACY(screen_ctrl_r,screen_ctrl_w) // Screen Control Register
1104   AM_RANGE(0x0100, 0x0101) AM_READWRITE(screen_ctrl_r,screen_ctrl_w) // Screen Control Register
10941105//  AM_RANGE(0x0102, 0x0103) Graphic Screen Control Register
1095   AM_RANGE(0x0106, 0x0109) AM_WRITE_LEGACY(video_pri_w) // Palette Control Register (priority) / Direct Color Control Register (priority)
1106   AM_RANGE(0x0106, 0x0109) AM_WRITE(video_pri_w) // Palette Control Register (priority) / Direct Color Control Register (priority)
10961107//  AM_RANGE(0x010a, 0x010b) Picture Mask Mode Register
10971108//  AM_RANGE(0x010c, 0x010d) Color Palette Mode Register
10981109//  AM_RANGE(0x010e, 0x010f) Backdrop Color Register
r14844r14845
11011112//  AM_RANGE(0x0126, 0x0127) ? (related to Transparent Color of Graphic Screen 1)
11021113//  AM_RANGE(0x012e, 0x012f) ? (related to Transparent Color of Text/Sprite)
11031114//  AM_RANGE(0x0130, 0x0137) Picture Mask Parameter
1104   AM_RANGE(0x0142, 0x0143) AM_READWRITE8_LEGACY(idp_status_r,idp_command_w,0x00ff) //Text Controller (IDP) - (R) Status (W) command
1105   AM_RANGE(0x0146, 0x0147) AM_WRITE8_LEGACY(idp_param_w,0x00ff) //Text Controller (IDP) - (R/W) Parameter
1115   AM_RANGE(0x0142, 0x0143) AM_READWRITE8(idp_status_r,idp_command_w,0x00ff) //Text Controller (IDP) - (R) Status (W) command
1116   AM_RANGE(0x0146, 0x0147) AM_WRITE8(idp_param_w,0x00ff) //Text Controller (IDP) - (R/W) Parameter
11061117//  AM_RANGE(0x0148, 0x0149) Text control port 1
11071118//  AM_RANGE(0x014c, 0x014f) ? CG Port
1108   AM_RANGE(0x0150, 0x0151) AM_READ_LEGACY(sysop_r) // System Operational Mode
1109   AM_RANGE(0x0152, 0x0153) AM_READWRITE_LEGACY(bios_bank_r,bios_bank_w) // Memory Map Register
1119   AM_RANGE(0x0150, 0x0151) AM_READ(sysop_r) // System Operational Mode
1120   AM_RANGE(0x0152, 0x0153) AM_READWRITE(bios_bank_r,bios_bank_w) // Memory Map Register
11101121//  AM_RANGE(0x0154, 0x0155) Refresh Register (wait states)
1111   AM_RANGE(0x0156, 0x0157) AM_READ8_LEGACY(rom_bank_r,0x00ff) // ROM bank status
1122   AM_RANGE(0x0156, 0x0157) AM_READ8(rom_bank_r,0x00ff) // ROM bank status
11121123//  AM_RANGE(0x0158, 0x0159) Interruption Mode Modification
11131124//  AM_RANGE(0x015c, 0x015f) NMI mask port (strobe port)
11141125//  AM_RANGE(0x0160, 0x016f) DMA Controller
r14844r14845
11161127   AM_RANGE(0x0188, 0x018b) AM_DEVREADWRITE8_LEGACY("pic8259_master", pic8259_r, pic8259_w, 0x00ff) // ICU, also controls 8214 emulation
11171128//  AM_RANGE(0x0190, 0x0191) System Port 5
11181129//  AM_RANGE(0x0196, 0x0197) Keyboard sub CPU command port
1119   AM_RANGE(0x0198, 0x0199) AM_WRITE_LEGACY(backupram_wp_1_w) //Backup RAM write inhibit
1120   AM_RANGE(0x019a, 0x019b) AM_WRITE_LEGACY(backupram_wp_0_w) //Backup RAM write permission
1130   AM_RANGE(0x0198, 0x0199) AM_WRITE(backupram_wp_1_w) //Backup RAM write inhibit
1131   AM_RANGE(0x019a, 0x019b) AM_WRITE(backupram_wp_0_w) //Backup RAM write permission
11211132   AM_RANGE(0x01a0, 0x01a7) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0x00ff)// vTCU (timer counter unit)
1122   AM_RANGE(0x01a8, 0x01a9) AM_WRITE8_LEGACY(timer3_ctrl_reg_w,0x00ff) // General-purpose timer 3 control port
1123   AM_RANGE(0x01b0, 0x01bb) AM_READWRITE8_LEGACY(pc88va_fdc_r,pc88va_fdc_w,0x00ff)// FDC related (765)
1133   AM_RANGE(0x01a8, 0x01a9) AM_WRITE8(timer3_ctrl_reg_w,0x00ff) // General-purpose timer 3 control port
1134   AM_RANGE(0x01b0, 0x01bb) AM_READWRITE8(pc88va_fdc_r,pc88va_fdc_w,0x00ff)// FDC related (765)
11241135//  AM_RANGE(0x01c0, 0x01c1) ?
11251136   AM_RANGE(0x01c6, 0x01c7) AM_WRITENOP // ???
11261137   AM_RANGE(0x01c8, 0x01cf) AM_DEVREADWRITE8("d8255_3", i8255_device, read, write,0xff00) //i8255 3 (byte access)
r14844r14845
11291140   AM_RANGE(0x0220, 0x023f) AM_RAM // Frame buffer 1 control parameter
11301141   AM_RANGE(0x0240, 0x025f) AM_RAM // Frame buffer 2 control parameter
11311142   AM_RANGE(0x0260, 0x027f) AM_RAM // Frame buffer 3 control parameter
1132   AM_RANGE(0x0300, 0x033f) AM_RAM_WRITE_LEGACY(palette_ram_w) AM_BASE(m_palram) // Palette RAM (xBBBBxRRRRxGGGG format)
1143   AM_RANGE(0x0300, 0x033f) AM_RAM_WRITE(palette_ram_w) AM_BASE(m_palram) // Palette RAM (xBBBBxRRRRxGGGG format)
11331144
11341145//  AM_RANGE(0x0500, 0x05ff) GVRAM
11351146//  AM_RANGE(0x1000, 0xfeff) user area (???)
r14844r14845
11431154   AM_RANGE(0x4000, 0x7fff) AM_RAM
11441155ADDRESS_MAP_END
11451156
1146static WRITE8_HANDLER( fdc_irq_vector_w )
1157WRITE8_MEMBER(pc88va_state::fdc_irq_vector_w)
11471158{
1148   pc88va_state *state = space->machine().driver_data<pc88va_state>();
1149   state->m_fdc_irq_opcode = data;
1159   m_fdc_irq_opcode = data;
11501160}
11511161
11521162static ADDRESS_MAP_START( pc88va_z80_io_map, AS_IO, 8, pc88va_state )
11531163   ADDRESS_MAP_GLOBAL_MASK(0xff)
1154   AM_RANGE(0xf0, 0xf0) AM_WRITE_LEGACY(fdc_irq_vector_w) // Interrupt Opcode Port
1164   AM_RANGE(0xf0, 0xf0) AM_WRITE(fdc_irq_vector_w) // Interrupt Opcode Port
11551165//  AM_RANGE(0xf4, 0xf4) // Drive Control Port
1156   AM_RANGE(0xf8, 0xf8) AM_READWRITE_LEGACY(upd765_tc_r,upd765_mc_w) // (R) Terminal Count Port (W) Motor Control Port
1166   AM_RANGE(0xf8, 0xf8) AM_READWRITE(upd765_tc_r,upd765_mc_w) // (R) Terminal Count Port (W) Motor Control Port
11571167   AM_RANGE(0xfa, 0xfa) AM_DEVREAD_LEGACY("upd765", upd765_status_r )
11581168   AM_RANGE(0xfb, 0xfb) AM_DEVREADWRITE_LEGACY("upd765", upd765_data_r, upd765_data_w )
11591169   AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE("d8255_2s", i8255_device, read, write)
src/mess/drivers/pc6001.c
r14844r14845
176176   UINT32 m_old_key1;
177177   UINT32 m_old_key2;
178178   UINT32 m_old_key3;
179   DECLARE_WRITE8_MEMBER(pc6001_system_latch_w);
180   DECLARE_READ8_MEMBER(nec_ppi8255_r);
181   DECLARE_WRITE8_MEMBER(nec_ppi8255_w);
182   DECLARE_WRITE8_MEMBER(pc6001m2_bank_r0_w);
183   DECLARE_WRITE8_MEMBER(pc6001m2_bank_r1_w);
184   DECLARE_WRITE8_MEMBER(pc6001m2_bank_w0_w);
185   DECLARE_WRITE8_MEMBER(pc6001m2_opt_bank_w);
186   DECLARE_WRITE8_MEMBER(work_ram0_w);
187   DECLARE_WRITE8_MEMBER(work_ram1_w);
188   DECLARE_WRITE8_MEMBER(work_ram2_w);
189   DECLARE_WRITE8_MEMBER(work_ram3_w);
190   DECLARE_WRITE8_MEMBER(work_ram4_w);
191   DECLARE_WRITE8_MEMBER(work_ram5_w);
192   DECLARE_WRITE8_MEMBER(work_ram6_w);
193   DECLARE_WRITE8_MEMBER(work_ram7_w);
194   DECLARE_WRITE8_MEMBER(necmk2_ppi8255_w);
195   DECLARE_WRITE8_MEMBER(pc6001m2_system_latch_w);
196   DECLARE_WRITE8_MEMBER(pc6001m2_vram_bank_w);
197   DECLARE_WRITE8_MEMBER(pc6001m2_col_bank_w);
198   DECLARE_READ8_MEMBER(upd7752_reg_r);
199   DECLARE_WRITE8_MEMBER(upd7752_reg_w);
200   DECLARE_WRITE8_MEMBER(pc6001m2_0xf3_w);
201   DECLARE_WRITE8_MEMBER(pc6001m2_timer_adj_w);
202   DECLARE_WRITE8_MEMBER(pc6001m2_timer_irqv_w);
203   DECLARE_READ8_MEMBER(pc6001m2_bank_r0_r);
204   DECLARE_READ8_MEMBER(pc6001m2_bank_r1_r);
205   DECLARE_READ8_MEMBER(pc6001m2_bank_w0_r);
206   DECLARE_READ8_MEMBER(pc6601_fdc_r);
207   DECLARE_WRITE8_MEMBER(pc6601_fdc_w);
208   DECLARE_READ8_MEMBER(pc6001sr_bank_rn_r);
209   DECLARE_WRITE8_MEMBER(pc6001sr_bank_rn_w);
210   DECLARE_READ8_MEMBER(pc6001sr_bank_wn_r);
211   DECLARE_WRITE8_MEMBER(pc6001sr_bank_wn_w);
212   DECLARE_WRITE8_MEMBER(sr_work_ram0_w);
213   DECLARE_WRITE8_MEMBER(sr_work_ram1_w);
214   DECLARE_WRITE8_MEMBER(sr_work_ram2_w);
215   DECLARE_WRITE8_MEMBER(sr_work_ram3_w);
216   DECLARE_WRITE8_MEMBER(sr_work_ram4_w);
217   DECLARE_WRITE8_MEMBER(sr_work_ram5_w);
218   DECLARE_WRITE8_MEMBER(sr_work_ram6_w);
219   DECLARE_WRITE8_MEMBER(sr_work_ram7_w);
220   DECLARE_WRITE8_MEMBER(pc6001sr_mode_w);
221   DECLARE_WRITE8_MEMBER(pc6001sr_vram_bank_w);
222   DECLARE_WRITE8_MEMBER(pc6001sr_system_latch_w);
223   DECLARE_WRITE8_MEMBER(necsr_ppi8255_w);
179224};
180225
181226
r14844r14845
663708   return 0;
664709}
665710
666static WRITE8_HANDLER ( pc6001_system_latch_w )
711WRITE8_MEMBER(pc6001_state::pc6001_system_latch_w)
667712{
668   pc6001_state *state = space->machine().driver_data<pc6001_state>();
669713   static const UINT16 startaddr[] = {0xC000, 0xE000, 0x8000, 0xA000 };
670714
671   state->m_video_ram =  state->m_ram + startaddr[(data >> 1) & 0x03] - 0x8000;
715   m_video_ram =  m_ram + startaddr[(data >> 1) & 0x03] - 0x8000;
672716
673   if((!(state->m_sys_latch & 8)) && data & 0x8) //PLAY tape cmd
717   if((!(m_sys_latch & 8)) && data & 0x8) //PLAY tape cmd
674718   {
675      state->m_cas_switch = 1;
676      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
677      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_PLAY,CASSETTE_MASK_UISTATE);
719      m_cas_switch = 1;
720      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
721      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_PLAY,CASSETTE_MASK_UISTATE);
678722   }
679   if((state->m_sys_latch & 8) && ((data & 0x8) == 0)) //STOP tape cmd
723   if((m_sys_latch & 8) && ((data & 0x8) == 0)) //STOP tape cmd
680724   {
681      state->m_cas_switch = 0;
682      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
683      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_STOPPED,CASSETTE_MASK_UISTATE);
684      //state->m_irq_vector = 0x00;
685      //cputag_set_input_line(space->machine(),"maincpu", 0, ASSERT_LINE);
725      m_cas_switch = 0;
726      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
727      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_STOPPED,CASSETTE_MASK_UISTATE);
728      //m_irq_vector = 0x00;
729      //cputag_set_input_line(machine(),"maincpu", 0, ASSERT_LINE);
686730   }
687731
688   state->m_sys_latch = data;
689   state->m_timer_irq_mask = data & 1;
732   m_sys_latch = data;
733   m_timer_irq_mask = data & 1;
690734   //printf("%02x\n",data);
691735}
692736
r14844r14845
721765#endif
722766
723767
724static READ8_HANDLER(nec_ppi8255_r)
768READ8_MEMBER(pc6001_state::nec_ppi8255_r)
725769{
726   pc6001_state *state = space->machine().driver_data<pc6001_state>();
727770   if (offset==2)
728      return state->m_port_c_8255;
771      return m_port_c_8255;
729772   else if(offset==0)
730773   {
731774      UINT8 res;
732      res = state->m_cur_keycode;
733      //state->m_cur_keycode = 0;
775      res = m_cur_keycode;
776      //m_cur_keycode = 0;
734777      return res;
735778   }
736779
737   return state->m_ppi->read(*space, offset);
780   return m_ppi->read(*&space, offset);
738781}
739782
740static WRITE8_HANDLER(nec_ppi8255_w)
783WRITE8_MEMBER(pc6001_state::nec_ppi8255_w)
741784{
742   pc6001_state *state = space->machine().driver_data<pc6001_state>();
743785   if (offset==3)
744786   {
745787      if(data & 1)
746         state->m_port_c_8255 |=   1<<((data>>1)&0x07);
788         m_port_c_8255 |=   1<<((data>>1)&0x07);
747789      else
748         state->m_port_c_8255 &= ~(1<<((data>>1)&0x07));
790         m_port_c_8255 &= ~(1<<((data>>1)&0x07));
749791
750792      switch(data) {
751           case 0x08: state->m_port_c_8255 |= 0x88; break;
752           case 0x09: state->m_port_c_8255 &= 0xf7; break;
753           case 0x0c: state->m_port_c_8255 |= 0x28; break;
754           case 0x0d: state->m_port_c_8255 &= 0xf7; break;
793           case 0x08: m_port_c_8255 |= 0x88; break;
794           case 0x09: m_port_c_8255 &= 0xf7; break;
795           case 0x0c: m_port_c_8255 |= 0x28; break;
796           case 0x0d: m_port_c_8255 &= 0xf7; break;
755797           default: break;
756798      }
757799
758      state->m_port_c_8255 |= 0xa8;
800      m_port_c_8255 |= 0xa8;
759801
760802      {
761         UINT8 *gfx_data = space->machine().region("gfx1")->base();
762         UINT8 *ext_rom = space->machine().region("cart_img")->base();
803         UINT8 *gfx_data = machine().region("gfx1")->base();
804         UINT8 *ext_rom = machine().region("cart_img")->base();
763805
764806         //printf("%02x\n",data);
765807
766808         if((data & 0x0f) == 0x05)
767            memory_set_bankptr(space->machine(), "bank1", &ext_rom[0x2000]);
809            memory_set_bankptr(machine(), "bank1", &ext_rom[0x2000]);
768810         if((data & 0x0f) == 0x04)
769            memory_set_bankptr(space->machine(), "bank1", &gfx_data[0]);
811            memory_set_bankptr(machine(), "bank1", &gfx_data[0]);
770812      }
771813   }
772   state->m_ppi->write(*space,offset,data);
814   m_ppi->write(*&space,offset,data);
773815}
774816
775817static ADDRESS_MAP_START(pc6001_map, AS_PROGRAM, 8, pc6001_state )
r14844r14845
785827   ADDRESS_MAP_GLOBAL_MASK(0xff)
786828   AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w)
787829   AM_RANGE(0x81, 0x81) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
788   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE_LEGACY(nec_ppi8255_r, nec_ppi8255_w)
830   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE(nec_ppi8255_r, nec_ppi8255_w)
789831   AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_address_w)
790832   AM_RANGE(0xa1, 0xa1) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_data_w)
791833   AM_RANGE(0xa2, 0xa2) AM_MIRROR(0x0c) AM_DEVREAD_LEGACY("ay8910", ay8910_r)
792834   AM_RANGE(0xa3, 0xa3) AM_MIRROR(0x0c) AM_WRITENOP
793   AM_RANGE(0xb0, 0xb0) AM_MIRROR(0x0f) AM_WRITE_LEGACY(pc6001_system_latch_w)
835   AM_RANGE(0xb0, 0xb0) AM_MIRROR(0x0f) AM_WRITE(pc6001_system_latch_w)
794836   AM_RANGE(0xd0, 0xd3) AM_MIRROR(0x0c) AM_NOP // disk device
795837ADDRESS_MAP_END
796838
r14844r14845
9701012   { INVALID(0),   INVALID(0),      INVALID(0),      INVALID(0)  }   //0x0f: <invalid setting>
9711013};
9721014
973static WRITE8_HANDLER( pc6001m2_bank_r0_w )
1015WRITE8_MEMBER(pc6001_state::pc6001m2_bank_r0_w)
9741016{
975   pc6001_state *state = space->machine().driver_data<pc6001_state>();
976   UINT8 *ROM = space->machine().region("maincpu")->base();
977   UINT8 *gfx_data = space->machine().region("gfx1")->base();
1017   UINT8 *ROM = machine().region("maincpu")->base();
1018   UINT8 *gfx_data = machine().region("gfx1")->base();
9781019
9791020//  bankaddress = 0x10000 + (0x4000 * ((data & 0x40)>>6));
980//  memory_set_bankptr(space->machine(), 1, &ROM[bankaddress]);
1021//  memory_set_bankptr(machine(), 1, &ROM[bankaddress]);
9811022
982   state->m_bank_r0 = data;
1023   m_bank_r0 = data;
9831024
984//  printf("%02x BANK | %02x\n",data,state->m_bank_opt);
985   memory_set_bankptr(space->machine(), "bank1", &ROM[banksw_table_r0[(data & 0xf)+(state->m_bank_opt*0x10)][0]]);
986   memory_set_bankptr(space->machine(), "bank2", &ROM[banksw_table_r0[(data & 0xf)+(state->m_bank_opt*0x10)][1]]);
987   memory_set_bankptr(space->machine(), "bank3", &ROM[banksw_table_r0[((data & 0xf0)>>4)+(state->m_bank_opt*0x10)][2]]);
988   if(!state->m_gfx_bank_on)
989      memory_set_bankptr(space->machine(), "bank4", &ROM[banksw_table_r0[((state->m_bank_r0 & 0xf0)>>4)+(state->m_bank_opt*0x10)][3]]);
1025//  printf("%02x BANK | %02x\n",data,m_bank_opt);
1026   memory_set_bankptr(machine(), "bank1", &ROM[banksw_table_r0[(data & 0xf)+(m_bank_opt*0x10)][0]]);
1027   memory_set_bankptr(machine(), "bank2", &ROM[banksw_table_r0[(data & 0xf)+(m_bank_opt*0x10)][1]]);
1028   memory_set_bankptr(machine(), "bank3", &ROM[banksw_table_r0[((data & 0xf0)>>4)+(m_bank_opt*0x10)][2]]);
1029   if(!m_gfx_bank_on)
1030      memory_set_bankptr(machine(), "bank4", &ROM[banksw_table_r0[((m_bank_r0 & 0xf0)>>4)+(m_bank_opt*0x10)][3]]);
9901031   else
991      memory_set_bankptr(space->machine(), "bank4", &gfx_data[state->m_cgrom_bank_addr]);
1032      memory_set_bankptr(machine(), "bank4", &gfx_data[m_cgrom_bank_addr]);
9921033}
9931034
994static WRITE8_HANDLER( pc6001m2_bank_r1_w )
1035WRITE8_MEMBER(pc6001_state::pc6001m2_bank_r1_w)
9951036{
996   pc6001_state *state = space->machine().driver_data<pc6001_state>();
997   UINT8 *ROM = space->machine().region("maincpu")->base();
1037   UINT8 *ROM = machine().region("maincpu")->base();
9981038
9991039//  bankaddress = 0x10000 + (0x4000 * ((data & 0x40)>>6));
1000//  memory_set_bankptr(space->machine(), 1, &ROM[bankaddress]);
1040//  memory_set_bankptr(machine(), 1, &ROM[bankaddress]);
10011041
1002   state->m_bank_r1 = data;
1042   m_bank_r1 = data;
10031043
10041044//  printf("%02x BANK\n",data);
1005   memory_set_bankptr(space->machine(), "bank5", &ROM[banksw_table_r1[(data & 0xf)+(state->m_bank_opt*0x10)][0]]);
1006   memory_set_bankptr(space->machine(), "bank6", &ROM[banksw_table_r1[(data & 0xf)+(state->m_bank_opt*0x10)][1]]);
1007   memory_set_bankptr(space->machine(), "bank7", &ROM[banksw_table_r1[((data & 0xf0)>>4)+(state->m_bank_opt*0x10)][2]]);
1008   memory_set_bankptr(space->machine(), "bank8", &ROM[banksw_table_r1[((data & 0xf0)>>4)+(state->m_bank_opt*0x10)][3]]);
1045   memory_set_bankptr(machine(), "bank5", &ROM[banksw_table_r1[(data & 0xf)+(m_bank_opt*0x10)][0]]);
1046   memory_set_bankptr(machine(), "bank6", &ROM[banksw_table_r1[(data & 0xf)+(m_bank_opt*0x10)][1]]);
1047   memory_set_bankptr(machine(), "bank7", &ROM[banksw_table_r1[((data & 0xf0)>>4)+(m_bank_opt*0x10)][2]]);
1048   memory_set_bankptr(machine(), "bank8", &ROM[banksw_table_r1[((data & 0xf0)>>4)+(m_bank_opt*0x10)][3]]);
10091049}
10101050
1011static WRITE8_HANDLER( pc6001m2_bank_w0_w )
1051WRITE8_MEMBER(pc6001_state::pc6001m2_bank_w0_w)
10121052{
1013   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1014   state->m_bank_w = data;
1053   m_bank_w = data;
10151054}
10161055
1017static WRITE8_HANDLER( pc6001m2_opt_bank_w )
1056WRITE8_MEMBER(pc6001_state::pc6001m2_opt_bank_w)
10181057{
1019   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1020   UINT8 *ROM = space->machine().region("maincpu")->base();
1021   UINT8 *gfx_data = space->machine().region("gfx1")->base();
1058   UINT8 *ROM = machine().region("maincpu")->base();
1059   UINT8 *gfx_data = machine().region("gfx1")->base();
10221060
10231061   /*
10241062    0 - TVROM / VOICE ROM
r14844r14845
10261064    2 - KANJI ROM bank 1
10271065    3 - TVROM / VOICE ROM
10281066    */
1029   state->m_bank_opt = data & 3;
1067   m_bank_opt = data & 3;
10301068
1031   memory_set_bankptr(space->machine(), "bank1", &ROM[banksw_table_r0[(state->m_bank_r0 & 0xf)+(state->m_bank_opt*0x10)][0]]);
1032   memory_set_bankptr(space->machine(), "bank2", &ROM[banksw_table_r0[(state->m_bank_r0 & 0xf)+(state->m_bank_opt*0x10)][1]]);
1033   memory_set_bankptr(space->machine(), "bank3", &ROM[banksw_table_r0[((state->m_bank_r0 & 0xf0)>>4)+(state->m_bank_opt*0x10)][2]]);
1034   if(!state->m_gfx_bank_on)
1035      memory_set_bankptr(space->machine(), "bank4", &ROM[banksw_table_r0[((state->m_bank_r0 & 0xf0)>>4)+(state->m_bank_opt*0x10)][3]]);
1069   memory_set_bankptr(machine(), "bank1", &ROM[banksw_table_r0[(m_bank_r0 & 0xf)+(m_bank_opt*0x10)][0]]);
1070   memory_set_bankptr(machine(), "bank2", &ROM[banksw_table_r0[(m_bank_r0 & 0xf)+(m_bank_opt*0x10)][1]]);
1071   memory_set_bankptr(machine(), "bank3", &ROM[banksw_table_r0[((m_bank_r0 & 0xf0)>>4)+(m_bank_opt*0x10)][2]]);
1072   if(!m_gfx_bank_on)
1073      memory_set_bankptr(machine(), "bank4", &ROM[banksw_table_r0[((m_bank_r0 & 0xf0)>>4)+(m_bank_opt*0x10)][3]]);
10361074   else
1037      memory_set_bankptr(space->machine(), "bank4", &gfx_data[state->m_cgrom_bank_addr]);
1038   memory_set_bankptr(space->machine(), "bank4", &ROM[banksw_table_r0[((state->m_bank_r0 & 0xf0)>>4)+(state->m_bank_opt*0x10)][3]]);
1039   memory_set_bankptr(space->machine(), "bank5", &ROM[banksw_table_r1[(state->m_bank_r1 & 0xf)+(state->m_bank_opt*0x10)][0]]);
1040   memory_set_bankptr(space->machine(), "bank6", &ROM[banksw_table_r1[(state->m_bank_r1 & 0xf)+(state->m_bank_opt*0x10)][1]]);
1041   memory_set_bankptr(space->machine(), "bank7", &ROM[banksw_table_r1[((state->m_bank_r1 & 0xf0)>>4)+(state->m_bank_opt*0x10)][2]]);
1042   memory_set_bankptr(space->machine(), "bank8", &ROM[banksw_table_r1[((state->m_bank_r1 & 0xf0)>>4)+(state->m_bank_opt*0x10)][3]]);
1075      memory_set_bankptr(machine(), "bank4", &gfx_data[m_cgrom_bank_addr]);
1076   memory_set_bankptr(machine(), "bank4", &ROM[banksw_table_r0[((m_bank_r0 & 0xf0)>>4)+(m_bank_opt*0x10)][3]]);
1077   memory_set_bankptr(machine(), "bank5", &ROM[banksw_table_r1[(m_bank_r1 & 0xf)+(m_bank_opt*0x10)][0]]);
1078   memory_set_bankptr(machine(), "bank6", &ROM[banksw_table_r1[(m_bank_r1 & 0xf)+(m_bank_opt*0x10)][1]]);
1079   memory_set_bankptr(machine(), "bank7", &ROM[banksw_table_r1[((m_bank_r1 & 0xf0)>>4)+(m_bank_opt*0x10)][2]]);
1080   memory_set_bankptr(machine(), "bank8", &ROM[banksw_table_r1[((m_bank_r1 & 0xf0)>>4)+(m_bank_opt*0x10)][3]]);
10431081
10441082}
10451083
1046static WRITE8_HANDLER( work_ram0_w )
1084WRITE8_MEMBER(pc6001_state::work_ram0_w)
10471085{
1048   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1049   UINT8 *ROM = space->machine().region("maincpu")->base();
1050   ROM[offset+((state->m_bank_w & 0x01) ? WRAM(0) : EXWRAM(0))] = data;
1086   UINT8 *ROM = machine().region("maincpu")->base();
1087   ROM[offset+((m_bank_w & 0x01) ? WRAM(0) : EXWRAM(0))] = data;
10511088}
10521089
1053static WRITE8_HANDLER( work_ram1_w )
1090WRITE8_MEMBER(pc6001_state::work_ram1_w)
10541091{
1055   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1056   UINT8 *ROM = space->machine().region("maincpu")->base();
1057   ROM[offset+((state->m_bank_w & 0x01) ? WRAM(1) : EXWRAM(1))] = data;
1092   UINT8 *ROM = machine().region("maincpu")->base();
1093   ROM[offset+((m_bank_w & 0x01) ? WRAM(1) : EXWRAM(1))] = data;
10581094}
10591095
1060static WRITE8_HANDLER( work_ram2_w )
1096WRITE8_MEMBER(pc6001_state::work_ram2_w)
10611097{
1062   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1063   UINT8 *ROM = space->machine().region("maincpu")->base();
1064   ROM[offset+((state->m_bank_w & 0x04) ? WRAM(2) : EXWRAM(2))] = data;
1098   UINT8 *ROM = machine().region("maincpu")->base();
1099   ROM[offset+((m_bank_w & 0x04) ? WRAM(2) : EXWRAM(2))] = data;
10651100}
10661101
1067static WRITE8_HANDLER( work_ram3_w )
1102WRITE8_MEMBER(pc6001_state::work_ram3_w)
10681103{
1069   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1070   UINT8 *ROM = space->machine().region("maincpu")->base();
1071   ROM[offset+((state->m_bank_w & 0x04) ? WRAM(3) : EXWRAM(3))] = data;
1104   UINT8 *ROM = machine().region("maincpu")->base();
1105   ROM[offset+((m_bank_w & 0x04) ? WRAM(3) : EXWRAM(3))] = data;
10721106}
10731107
1074static WRITE8_HANDLER( work_ram4_w )
1108WRITE8_MEMBER(pc6001_state::work_ram4_w)
10751109{
1076   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1077   UINT8 *ROM = space->machine().region("maincpu")->base();
1078   ROM[offset+((state->m_bank_w & 0x10) ? WRAM(4) : EXWRAM(4))] = data;
1110   UINT8 *ROM = machine().region("maincpu")->base();
1111   ROM[offset+((m_bank_w & 0x10) ? WRAM(4) : EXWRAM(4))] = data;
10791112}
10801113
1081static WRITE8_HANDLER( work_ram5_w )
1114WRITE8_MEMBER(pc6001_state::work_ram5_w)
10821115{
1083   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1084   UINT8 *ROM = space->machine().region("maincpu")->base();
1085   ROM[offset+((state->m_bank_w & 0x10) ? WRAM(5) : EXWRAM(5))] = data;
1116   UINT8 *ROM = machine().region("maincpu")->base();
1117   ROM[offset+((m_bank_w & 0x10) ? WRAM(5) : EXWRAM(5))] = data;
10861118}
10871119
1088static WRITE8_HANDLER( work_ram6_w )
1120WRITE8_MEMBER(pc6001_state::work_ram6_w)
10891121{
1090   pc6001_state *state = space->machine().driver_data<pc6001_state>(); UINT8 *ROM = space->machine().region("maincpu")->base(); ROM[offset+((state->m_bank_w & 0x40) ? WRAM(6) : EXWRAM(6))] = data;
10911122}
10921123
1093static WRITE8_HANDLER( work_ram7_w )
1124WRITE8_MEMBER(pc6001_state::work_ram7_w)
10941125{
1095   pc6001_state *state = space->machine().driver_data<pc6001_state>(); UINT8 *ROM = space->machine().region("maincpu")->base(); ROM[offset+((state->m_bank_w & 0x40) ? WRAM(7) : EXWRAM(7))] = data;
10961126}
10971127
10981128
1099static WRITE8_HANDLER(necmk2_ppi8255_w)
1129WRITE8_MEMBER(pc6001_state::necmk2_ppi8255_w)
11001130{
1101   pc6001_state *state = space->machine().driver_data<pc6001_state>();
11021131   if (offset==3)
11031132   {
11041133      if(data & 1)
1105         state->m_port_c_8255 |=   1<<((data>>1)&0x07);
1134         m_port_c_8255 |=   1<<((data>>1)&0x07);
11061135      else
1107         state->m_port_c_8255 &= ~(1<<((data>>1)&0x07));
1136         m_port_c_8255 &= ~(1<<((data>>1)&0x07));
11081137
11091138      switch(data) {
1110           case 0x08: state->m_port_c_8255 |= 0x88; break;
1111           case 0x09: state->m_port_c_8255 &= 0xf7; break;
1112           case 0x0c: state->m_port_c_8255 |= 0x28; break;
1113           case 0x0d: state->m_port_c_8255 &= 0xf7; break;
1139           case 0x08: m_port_c_8255 |= 0x88; break;
1140           case 0x09: m_port_c_8255 &= 0xf7; break;
1141           case 0x0c: m_port_c_8255 |= 0x28; break;
1142           case 0x0d: m_port_c_8255 &= 0xf7; break;
11141143           default: break;
11151144      }
11161145
1117      state->m_port_c_8255 |= 0xa8;
1146      m_port_c_8255 |= 0xa8;
11181147
11191148      {
1120         UINT8 *ROM = space->machine().region("maincpu")->base();
1121         UINT8 *gfx_data = space->machine().region("gfx1")->base();
1149         UINT8 *ROM = machine().region("maincpu")->base();
1150         UINT8 *gfx_data = machine().region("gfx1")->base();
11221151
11231152         //printf("%02x\n",data);
11241153
11251154         if((data & 0x0f) == 0x05)
11261155         {
1127            state->m_gfx_bank_on = 0;
1128            memory_set_bankptr(space->machine(), "bank4", &ROM[banksw_table_r0[((state->m_bank_r0 & 0xf0)>>4)+(state->m_bank_opt*0x10)][3]]);
1156            m_gfx_bank_on = 0;
1157            memory_set_bankptr(machine(), "bank4", &ROM[banksw_table_r0[((m_bank_r0 & 0xf0)>>4)+(m_bank_opt*0x10)][3]]);
11291158         }
11301159         if((data & 0x0f) == 0x04)
11311160         {
1132            state->m_gfx_bank_on = 1;
1133            memory_set_bankptr(space->machine(), "bank4", &gfx_data[state->m_cgrom_bank_addr]);
1161            m_gfx_bank_on = 1;
1162            memory_set_bankptr(machine(), "bank4", &gfx_data[m_cgrom_bank_addr]);
11341163         }
11351164      }
11361165   }
1137   state->m_ppi->write(*space,offset,data);
1166   m_ppi->write(*&space,offset,data);
11381167}
11391168
11401169static void vram_bank_change(running_machine &machine,UINT8 vram_bank)
r14844r14845
11651194   }
11661195}
11671196
1168static WRITE8_HANDLER ( pc6001m2_system_latch_w )
1197WRITE8_MEMBER(pc6001_state::pc6001m2_system_latch_w)
11691198{
1170   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1171   if((!(state->m_sys_latch & 8)) && data & 0x8) //PLAY tape cmd
1199   if((!(m_sys_latch & 8)) && data & 0x8) //PLAY tape cmd
11721200   {
1173      state->m_cas_switch = 1;
1174      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
1175      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_PLAY,CASSETTE_MASK_UISTATE);
1201      m_cas_switch = 1;
1202      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
1203      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_PLAY,CASSETTE_MASK_UISTATE);
11761204   }
1177   if((state->m_sys_latch & 8) && ((data & 0x8) == 0)) //STOP tape cmd
1205   if((m_sys_latch & 8) && ((data & 0x8) == 0)) //STOP tape cmd
11781206   {
1179      state->m_cas_switch = 0;
1180      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
1181      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_STOPPED,CASSETTE_MASK_UISTATE);
1182      //state->m_irq_vector = 0x00;
1183      //cputag_set_input_line(space->machine(),"maincpu", 0, ASSERT_LINE);
1207      m_cas_switch = 0;
1208      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
1209      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_STOPPED,CASSETTE_MASK_UISTATE);
1210      //m_irq_vector = 0x00;
1211      //cputag_set_input_line(machine(),"maincpu", 0, ASSERT_LINE);
11841212   }
11851213
1186   state->m_sys_latch = data;
1214   m_sys_latch = data;
11871215
1188   state->m_timer_irq_mask = data & 1;
1189   vram_bank_change(space->machine(),(state->m_ex_vram_bank & 0x06) | ((state->m_sys_latch & 0x06) << 4));
1216   m_timer_irq_mask = data & 1;
1217   vram_bank_change(machine(),(m_ex_vram_bank & 0x06) | ((m_sys_latch & 0x06) << 4));
11901218
11911219   //printf("%02x B0\n",data);
11921220}
11931221
11941222
1195static WRITE8_HANDLER( pc6001m2_vram_bank_w )
1223WRITE8_MEMBER(pc6001_state::pc6001m2_vram_bank_w)
11961224{
1197   pc6001_state *state = space->machine().driver_data<pc6001_state>();
11981225   //static const UINT32 startaddr[] = {WRAM(6), WRAM(6), WRAM(0), WRAM(4) };
11991226
1200   state->m_ex_vram_bank = data;
1201   vram_bank_change(space->machine(),(state->m_ex_vram_bank & 0x06) | ((state->m_sys_latch & 0x06) << 4));
1227   m_ex_vram_bank = data;
1228   vram_bank_change(machine(),(m_ex_vram_bank & 0x06) | ((m_sys_latch & 0x06) << 4));
12021229
1203   state->m_exgfx_text_mode = ((data & 2) == 0);
1204   state->m_cgrom_bank_addr = (data & 2) ? 0x0000 : 0x2000;
1230   m_exgfx_text_mode = ((data & 2) == 0);
1231   m_cgrom_bank_addr = (data & 2) ? 0x0000 : 0x2000;
12051232
1206   state->m_exgfx_bitmap_mode = (data & 8);
1207   state->m_exgfx_2bpp_mode = ((data & 6) == 0);
1233   m_exgfx_bitmap_mode = (data & 8);
1234   m_exgfx_2bpp_mode = ((data & 6) == 0);
12081235
12091236   {
12101237      /* Apparently bitmap modes changes the screen res to 320 x 200 */
12111238      {
1212         rectangle visarea = space->machine().primary_screen->visible_area();
1239         rectangle visarea = machine().primary_screen->visible_area();
12131240         int y_height;
12141241
1215         y_height = (state->m_exgfx_bitmap_mode || state->m_exgfx_2bpp_mode) ? 200 : 240;
1242         y_height = (m_exgfx_bitmap_mode || m_exgfx_2bpp_mode) ? 200 : 240;
12161243
12171244         visarea.set(0, (320) - 1, 0, (y_height) - 1);
12181245
1219         space->machine().primary_screen->configure(320, 240, visarea, space->machine().primary_screen->frame_period().attoseconds);
1246         machine().primary_screen->configure(320, 240, visarea, machine().primary_screen->frame_period().attoseconds);
12201247      }
12211248   }
12221249
12231250//  popmessage("%02x",data);
12241251
1225//  state->m_video_ram = work_ram + startaddr[(data >> 1) & 0x03];
1252//  m_video_ram = work_ram + startaddr[(data >> 1) & 0x03];
12261253}
12271254
1228static WRITE8_HANDLER( pc6001m2_col_bank_w )
1255WRITE8_MEMBER(pc6001_state::pc6001m2_col_bank_w)
12291256{
1230   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1231   state->m_bgcol_bank = (data & 7);
1257   m_bgcol_bank = (data & 7);
12321258}
12331259
12341260/* voice synth is a NEC uPD7752 sound chip (currently unemulated) */
1235static READ8_HANDLER( upd7752_reg_r )
1261READ8_MEMBER(pc6001_state::upd7752_reg_r)
12361262{
12371263   switch(offset & 3)
12381264   {
r14844r14845
12501276   return 0xff;
12511277}
12521278
1253static WRITE8_HANDLER( upd7752_reg_w )
1279WRITE8_MEMBER(pc6001_state::upd7752_reg_w)
12541280{
12551281   switch(offset & 3)
12561282   {
r14844r14845
12701296   }
12711297}
12721298
1273static WRITE8_HANDLER( pc6001m2_0xf3_w )
1299WRITE8_MEMBER(pc6001_state::pc6001m2_0xf3_w)
12741300{
1275   pc6001_state *state = space->machine().driver_data<pc6001_state>();
12761301   /*
12771302    x--- ---- M1 (?) wait setting
12781303    -x-- ---- ROM wait setting
r14844r14845
12831308    ---- --x- custom irq 2 mask
12841309    ---- ---x custom irq 1 mask
12851310    */
1286   state->m_timer_irq_mask2 = data & 4;
1311   m_timer_irq_mask2 = data & 4;
12871312}
12881313
12891314static TIMER_CALLBACK(audio_callback)
r14844r14845
12981323}
12991324
13001325
1301static WRITE8_HANDLER( pc6001m2_timer_adj_w )
1326WRITE8_MEMBER(pc6001_state::pc6001m2_timer_adj_w)
13021327{
1303   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1304   state->m_timer_hz_div = data;
1305   attotime period = attotime::from_hz((487.5*4)/(state->m_timer_hz_div+1));
1306   state->m_timer_irq_timer->adjust(period,  0, period);
1328   m_timer_hz_div = data;
1329   attotime period = attotime::from_hz((487.5*4)/(m_timer_hz_div+1));
1330   m_timer_irq_timer->adjust(period,  0, period);
13071331}
13081332
1309static WRITE8_HANDLER( pc6001m2_timer_irqv_w )
1333WRITE8_MEMBER(pc6001_state::pc6001m2_timer_irqv_w)
13101334{
1311   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1312   state->m_timer_irq_vector = data;
1335   m_timer_irq_vector = data;
13131336}
13141337
1315static READ8_HANDLER( pc6001m2_bank_r0_r )
1338READ8_MEMBER(pc6001_state::pc6001m2_bank_r0_r)
13161339{
1317   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1318   return state->m_bank_r0;
1340   return m_bank_r0;
13191341}
13201342
1321static READ8_HANDLER( pc6001m2_bank_r1_r )
1343READ8_MEMBER(pc6001_state::pc6001m2_bank_r1_r)
13221344{
1323   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1324   return state->m_bank_r1;
1345   return m_bank_r1;
13251346}
13261347
1327static READ8_HANDLER( pc6001m2_bank_w0_r )
1348READ8_MEMBER(pc6001_state::pc6001m2_bank_w0_r)
13281349{
1329   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1330   return state->m_bank_w;
1350   return m_bank_w;
13311351}
13321352
13331353static ADDRESS_MAP_START(pc6001m2_map, AS_PROGRAM, 8, pc6001_state )
13341354   ADDRESS_MAP_UNMAP_HIGH
1335   AM_RANGE(0x0000, 0x1fff) AM_ROMBANK("bank1") AM_WRITE_LEGACY(work_ram0_w)
1336   AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank2") AM_WRITE_LEGACY(work_ram1_w)
1337   AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") AM_WRITE_LEGACY(work_ram2_w)
1338   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") AM_WRITE_LEGACY(work_ram3_w)
1339   AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank5") AM_WRITE_LEGACY(work_ram4_w)
1340   AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank6") AM_WRITE_LEGACY(work_ram5_w)
1341   AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("bank7") AM_WRITE_LEGACY(work_ram6_w)
1342   AM_RANGE(0xe000, 0xffff) AM_ROMBANK("bank8") AM_WRITE_LEGACY(work_ram7_w)
1355   AM_RANGE(0x0000, 0x1fff) AM_ROMBANK("bank1") AM_WRITE(work_ram0_w)
1356   AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank2") AM_WRITE(work_ram1_w)
1357   AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") AM_WRITE(work_ram2_w)
1358   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") AM_WRITE(work_ram3_w)
1359   AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank5") AM_WRITE(work_ram4_w)
1360   AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank6") AM_WRITE(work_ram5_w)
1361   AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("bank7") AM_WRITE(work_ram6_w)
1362   AM_RANGE(0xe000, 0xffff) AM_ROMBANK("bank8") AM_WRITE(work_ram7_w)
13431363ADDRESS_MAP_END
13441364
13451365static ADDRESS_MAP_START( pc6001m2_io , AS_IO, 8, pc6001_state )
r14844r14845
13481368   AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w)
13491369   AM_RANGE(0x81, 0x81) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
13501370
1351   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE_LEGACY(nec_ppi8255_r, necmk2_ppi8255_w)
1371   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE(nec_ppi8255_r, necmk2_ppi8255_w)
13521372
13531373   AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_address_w)
13541374   AM_RANGE(0xa1, 0xa1) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_data_w)
13551375   AM_RANGE(0xa2, 0xa2) AM_MIRROR(0x0c) AM_DEVREAD_LEGACY("ay8910", ay8910_r)
13561376   AM_RANGE(0xa3, 0xa3) AM_MIRROR(0x0c) AM_NOP
13571377
1358   AM_RANGE(0xb0, 0xb0) AM_MIRROR(0x0f) AM_WRITE_LEGACY(pc6001m2_system_latch_w)
1378   AM_RANGE(0xb0, 0xb0) AM_MIRROR(0x0f) AM_WRITE(pc6001m2_system_latch_w)
13591379
1360   AM_RANGE(0xc0, 0xc0) AM_WRITE_LEGACY(pc6001m2_col_bank_w)
1361   AM_RANGE(0xc1, 0xc1) AM_WRITE_LEGACY(pc6001m2_vram_bank_w)
1362   AM_RANGE(0xc2, 0xc2) AM_WRITE_LEGACY(pc6001m2_opt_bank_w)
1380   AM_RANGE(0xc0, 0xc0) AM_WRITE(pc6001m2_col_bank_w)
1381   AM_RANGE(0xc1, 0xc1) AM_WRITE(pc6001m2_vram_bank_w)
1382   AM_RANGE(0xc2, 0xc2) AM_WRITE(pc6001m2_opt_bank_w)
13631383
13641384   AM_RANGE(0xd0, 0xd3) AM_MIRROR(0x0c) AM_NOP // disk device
13651385
1366   AM_RANGE(0xe0, 0xe3) AM_MIRROR(0x0c) AM_READWRITE_LEGACY(upd7752_reg_r,upd7752_reg_w)
1386   AM_RANGE(0xe0, 0xe3) AM_MIRROR(0x0c) AM_READWRITE(upd7752_reg_r,upd7752_reg_w)
13671387
1368   AM_RANGE(0xf0, 0xf0) AM_READWRITE_LEGACY(pc6001m2_bank_r0_r,pc6001m2_bank_r0_w)
1369   AM_RANGE(0xf1, 0xf1) AM_READWRITE_LEGACY(pc6001m2_bank_r1_r,pc6001m2_bank_r1_w)
1370   AM_RANGE(0xf2, 0xf2) AM_READWRITE_LEGACY(pc6001m2_bank_w0_r,pc6001m2_bank_w0_w)
1371   AM_RANGE(0xf3, 0xf3) AM_WRITE_LEGACY(pc6001m2_0xf3_w)
1388   AM_RANGE(0xf0, 0xf0) AM_READWRITE(pc6001m2_bank_r0_r,pc6001m2_bank_r0_w)
1389   AM_RANGE(0xf1, 0xf1) AM_READWRITE(pc6001m2_bank_r1_r,pc6001m2_bank_r1_w)
1390   AM_RANGE(0xf2, 0xf2) AM_READWRITE(pc6001m2_bank_w0_r,pc6001m2_bank_w0_w)
1391   AM_RANGE(0xf3, 0xf3) AM_WRITE(pc6001m2_0xf3_w)
13721392//  AM_RANGE(0xf4
13731393//  AM_RANGE(0xf5
1374   AM_RANGE(0xf6, 0xf6) AM_WRITE_LEGACY(pc6001m2_timer_adj_w)
1375   AM_RANGE(0xf7, 0xf7) AM_WRITE_LEGACY(pc6001m2_timer_irqv_w)
1394   AM_RANGE(0xf6, 0xf6) AM_WRITE(pc6001m2_timer_adj_w)
1395   AM_RANGE(0xf7, 0xf7) AM_WRITE(pc6001m2_timer_irqv_w)
13761396ADDRESS_MAP_END
13771397
13781398/* disk device placeholder (TODO: identify & hook-up this) */
1379static READ8_HANDLER( pc6601_fdc_r )
1399READ8_MEMBER(pc6001_state::pc6601_fdc_r)
13801400{
1381   return space->machine().rand();
1401   return machine().rand();
13821402}
13831403
1384static WRITE8_HANDLER( pc6601_fdc_w )
1404WRITE8_MEMBER(pc6001_state::pc6601_fdc_w)
13851405{
13861406}
13871407
r14844r14845
13911411   AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w)
13921412   AM_RANGE(0x81, 0x81) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
13931413
1394   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE_LEGACY(nec_ppi8255_r, necmk2_ppi8255_w)
1414   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE(nec_ppi8255_r, necmk2_ppi8255_w)
13951415
13961416   AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_address_w)
13971417   AM_RANGE(0xa1, 0xa1) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_data_w)
13981418   AM_RANGE(0xa2, 0xa2) AM_MIRROR(0x0c) AM_DEVREAD_LEGACY("ay8910", ay8910_r)
13991419   AM_RANGE(0xa3, 0xa3) AM_MIRROR(0x0c) AM_NOP
14001420
1401   AM_RANGE(0xb0, 0xb0) AM_WRITE_LEGACY(pc6001m2_system_latch_w)
1421   AM_RANGE(0xb0, 0xb0) AM_WRITE(pc6001m2_system_latch_w)
14021422   /* these are disk related */
14031423//  AM_RANGE(0xb1
14041424//  AM_RANGE(0xb2
14051425//  AM_RANGE(0xb3
14061426
1407   AM_RANGE(0xc0, 0xc0) AM_WRITE_LEGACY(pc6001m2_col_bank_w)
1408   AM_RANGE(0xc1, 0xc1) AM_WRITE_LEGACY(pc6001m2_vram_bank_w)
1409   AM_RANGE(0xc2, 0xc2) AM_WRITE_LEGACY(pc6001m2_opt_bank_w)
1427   AM_RANGE(0xc0, 0xc0) AM_WRITE(pc6001m2_col_bank_w)
1428   AM_RANGE(0xc1, 0xc1) AM_WRITE(pc6001m2_vram_bank_w)
1429   AM_RANGE(0xc2, 0xc2) AM_WRITE(pc6001m2_opt_bank_w)
14101430
1411   AM_RANGE(0xd0, 0xdf) AM_READWRITE_LEGACY(pc6601_fdc_r,pc6601_fdc_w) // disk device
1431   AM_RANGE(0xd0, 0xdf) AM_READWRITE(pc6601_fdc_r,pc6601_fdc_w) // disk device
14121432
1413   AM_RANGE(0xe0, 0xe3) AM_MIRROR(0x0c) AM_READWRITE_LEGACY(upd7752_reg_r,upd7752_reg_w)
1433   AM_RANGE(0xe0, 0xe3) AM_MIRROR(0x0c) AM_READWRITE(upd7752_reg_r,upd7752_reg_w)
14141434
1415   AM_RANGE(0xf0, 0xf0) AM_READWRITE_LEGACY(pc6001m2_bank_r0_r,pc6001m2_bank_r0_w)
1416   AM_RANGE(0xf1, 0xf1) AM_READWRITE_LEGACY(pc6001m2_bank_r1_r,pc6001m2_bank_r1_w)
1417   AM_RANGE(0xf2, 0xf2) AM_READWRITE_LEGACY(pc6001m2_bank_w0_r,pc6001m2_bank_w0_w)
1418   AM_RANGE(0xf3, 0xf3) AM_WRITE_LEGACY(pc6001m2_0xf3_w)
1435   AM_RANGE(0xf0, 0xf0) AM_READWRITE(pc6001m2_bank_r0_r,pc6001m2_bank_r0_w)
1436   AM_RANGE(0xf1, 0xf1) AM_READWRITE(pc6001m2_bank_r1_r,pc6001m2_bank_r1_w)
1437   AM_RANGE(0xf2, 0xf2) AM_READWRITE(pc6001m2_bank_w0_r,pc6001m2_bank_w0_w)
1438   AM_RANGE(0xf3, 0xf3) AM_WRITE(pc6001m2_0xf3_w)
14191439//  AM_RANGE(0xf4
14201440//  AM_RANGE(0xf5
1421   AM_RANGE(0xf6, 0xf6) AM_WRITE_LEGACY(pc6001m2_timer_adj_w)
1422   AM_RANGE(0xf7, 0xf7) AM_WRITE_LEGACY(pc6001m2_timer_irqv_w)
1441   AM_RANGE(0xf6, 0xf6) AM_WRITE(pc6001m2_timer_adj_w)
1442   AM_RANGE(0xf7, 0xf7) AM_WRITE(pc6001m2_timer_irqv_w)
14231443ADDRESS_MAP_END
14241444
14251445/* PC-6001 SR */
r14844r14845
14481468#define SR_NULL(_v_) \
14491469   0x80000+(0x1000*_v_) \
14501470
1451static READ8_HANDLER( pc6001sr_bank_rn_r )
1471READ8_MEMBER(pc6001_state::pc6001sr_bank_rn_r)
14521472{
1453   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1454   return state->m_sr_bank_r[offset];
1473   return m_sr_bank_r[offset];
14551474}
14561475
1457static WRITE8_HANDLER( pc6001sr_bank_rn_w )
1476WRITE8_MEMBER(pc6001_state::pc6001sr_bank_rn_w)
14581477{
1459   pc6001_state *state = space->machine().driver_data<pc6001_state>();
14601478   static const char *const bank_name[8] = { "bank1","bank2","bank3", "bank4", "bank5", "bank6", "bank7", "bank8" };
1461   UINT8 *ROM = space->machine().region("maincpu")->base();
1479   UINT8 *ROM = machine().region("maincpu")->base();
14621480   UINT8 bank_num;
14631481
1464   state->m_sr_bank_r[offset] = data;
1482   m_sr_bank_r[offset] = data;
14651483   bank_num = data & 0x0f;
14661484
14671485   switch(data & 0xf0)
14681486   {
1469      case 0xf0: memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_SYSROM_1(bank_num)]); break;
1470      case 0xe0: memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_SYSROM_2(bank_num)]); break;
1471      case 0xd0: memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_CGROM1(bank_num)]); break;
1472      case 0xc0: memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_EXROM0(bank_num)]); break;
1473      case 0xb0: memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_EXROM1(bank_num)]); break;
1474      case 0x20: memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_EXRAM0(bank_num)]); break;
1475      case 0x00: memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_WRAM0(bank_num)]); break;
1476      default:   memory_set_bankptr(space->machine(), bank_name[offset], &ROM[SR_NULL(bank_num)]); break;
1487      case 0xf0: memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_SYSROM_1(bank_num)]); break;
1488      case 0xe0: memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_SYSROM_2(bank_num)]); break;
1489      case 0xd0: memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_CGROM1(bank_num)]); break;
1490      case 0xc0: memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_EXROM0(bank_num)]); break;
1491      case 0xb0: memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_EXROM1(bank_num)]); break;
1492      case 0x20: memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_EXRAM0(bank_num)]); break;
1493      case 0x00: memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_WRAM0(bank_num)]); break;
1494      default:   memory_set_bankptr(machine(), bank_name[offset], &ROM[SR_NULL(bank_num)]); break;
14771495   }
14781496}
14791497
1480static READ8_HANDLER( pc6001sr_bank_wn_r )
1498READ8_MEMBER(pc6001_state::pc6001sr_bank_wn_r)
14811499{
1482   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1483   return state->m_sr_bank_w[offset];
1500   return m_sr_bank_w[offset];
14841501}
14851502
1486static WRITE8_HANDLER( pc6001sr_bank_wn_w )
1503WRITE8_MEMBER(pc6001_state::pc6001sr_bank_wn_w)
14871504{
1488   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1489   state->m_sr_bank_w[offset] = data;
1505   m_sr_bank_w[offset] = data;
14901506}
14911507
14921508#define SR_WRAM_BANK_W(_v_) \
14931509{ \
1494   pc6001_state *state = space->machine().driver_data<pc6001_state>(); \
1495   UINT8 *ROM = space->machine().region("maincpu")->base(); \
1510   UINT8 *ROM = machine().region("maincpu")->base(); \
14961511   UINT8 bank_num; \
1497   bank_num = state->m_sr_bank_w[_v_] & 0x0f; \
1498   if((state->m_sr_bank_w[_v_] & 0xf0) != 0x20) \
1512   bank_num = m_sr_bank_w[_v_] & 0x0f; \
1513   if((m_sr_bank_w[_v_] & 0xf0) != 0x20) \
14991514      ROM[offset+(SR_WRAM0(bank_num))] = data; \
15001515   else \
15011516      ROM[offset+(SR_EXRAM0(bank_num))] = data; \
15021517} \
15031518
1504static WRITE8_HANDLER( sr_work_ram0_w ) { SR_WRAM_BANK_W(0); }
1505static WRITE8_HANDLER( sr_work_ram1_w ) { SR_WRAM_BANK_W(1); }
1506static WRITE8_HANDLER( sr_work_ram2_w ) { SR_WRAM_BANK_W(2); }
1507static WRITE8_HANDLER( sr_work_ram3_w ) { SR_WRAM_BANK_W(3); }
1508static WRITE8_HANDLER( sr_work_ram4_w ) { SR_WRAM_BANK_W(4); }
1509static WRITE8_HANDLER( sr_work_ram5_w ) { SR_WRAM_BANK_W(5); }
1510static WRITE8_HANDLER( sr_work_ram6_w ) { SR_WRAM_BANK_W(6); }
1511static WRITE8_HANDLER( sr_work_ram7_w ) { SR_WRAM_BANK_W(7); }
1519WRITE8_MEMBER(pc6001_state::sr_work_ram0_w){ SR_WRAM_BANK_W(0); }
1520WRITE8_MEMBER(pc6001_state::sr_work_ram1_w){ SR_WRAM_BANK_W(1); }
1521WRITE8_MEMBER(pc6001_state::sr_work_ram2_w){ SR_WRAM_BANK_W(2); }
1522WRITE8_MEMBER(pc6001_state::sr_work_ram3_w){ SR_WRAM_BANK_W(3); }
1523WRITE8_MEMBER(pc6001_state::sr_work_ram4_w){ SR_WRAM_BANK_W(4); }
1524WRITE8_MEMBER(pc6001_state::sr_work_ram5_w){ SR_WRAM_BANK_W(5); }
1525WRITE8_MEMBER(pc6001_state::sr_work_ram6_w){ SR_WRAM_BANK_W(6); }
1526WRITE8_MEMBER(pc6001_state::sr_work_ram7_w){ SR_WRAM_BANK_W(7); }
15121527
1513static WRITE8_HANDLER( pc6001sr_mode_w )
1528WRITE8_MEMBER(pc6001_state::pc6001sr_mode_w)
15141529{
1515   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1516   state->m_sr_video_mode = data;
1530   m_sr_video_mode = data;
15171531
15181532   if(data & 1)
15191533      assert("PC-6001SR in Mk-2 compatibility mode not yet supported!\n");
15201534}
15211535
1522static WRITE8_HANDLER( pc6001sr_vram_bank_w )
1536WRITE8_MEMBER(pc6001_state::pc6001sr_vram_bank_w)
15231537{
1524   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1525   UINT8 *work_ram = space->machine().region("maincpu")->base();
1538   UINT8 *work_ram = machine().region("maincpu")->base();
15261539
1527   state->m_video_ram = work_ram + 0x70000 + ((data & 0x0f)*0x1000);
1540   m_video_ram = work_ram + 0x70000 + ((data & 0x0f)*0x1000);
15281541}
15291542
1530static WRITE8_HANDLER ( pc6001sr_system_latch_w )
1543WRITE8_MEMBER(pc6001_state::pc6001sr_system_latch_w)
15311544{
1532   pc6001_state *state = space->machine().driver_data<pc6001_state>();
1533   if((!(state->m_sys_latch & 8)) && data & 0x8) //PLAY tape cmd
1545   if((!(m_sys_latch & 8)) && data & 0x8) //PLAY tape cmd
15341546   {
1535      state->m_cas_switch = 1;
1536      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
1537      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_PLAY,CASSETTE_MASK_UISTATE);
1547      m_cas_switch = 1;
1548      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
1549      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_PLAY,CASSETTE_MASK_UISTATE);
15381550   }
1539   if((state->m_sys_latch & 8) && ((data & 0x8) == 0)) //STOP tape cmd
1551   if((m_sys_latch & 8) && ((data & 0x8) == 0)) //STOP tape cmd
15401552   {
1541      state->m_cas_switch = 0;
1542      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
1543      //space->machine().device(CASSETTE_TAG )->change_state(CASSETTE_STOPPED,CASSETTE_MASK_UISTATE);
1544      //state->m_irq_vector = 0x00;
1545      //cputag_set_input_line(space->machine(),"maincpu", 0, ASSERT_LINE);
1553      m_cas_switch = 0;
1554      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
1555      //machine().device(CASSETTE_TAG )->change_state(CASSETTE_STOPPED,CASSETTE_MASK_UISTATE);
1556      //m_irq_vector = 0x00;
1557      //cputag_set_input_line(machine(),"maincpu", 0, ASSERT_LINE);
15461558   }
15471559
1548   state->m_sys_latch = data;
1560   m_sys_latch = data;
15491561
1550   state->m_timer_irq_mask = data & 1;
1551   //vram_bank_change(space->machine(),(state->m_ex_vram_bank & 0x06) | ((state->m_sys_latch & 0x06) << 4));
1562   m_timer_irq_mask = data & 1;
1563   //vram_bank_change(machine(),(m_ex_vram_bank & 0x06) | ((m_sys_latch & 0x06) << 4));
15521564
15531565   //printf("%02x B0\n",data);
15541566}
15551567
1556static WRITE8_HANDLER(necsr_ppi8255_w)
1568WRITE8_MEMBER(pc6001_state::necsr_ppi8255_w)
15571569{
1558   pc6001_state *state = space->machine().driver_data<pc6001_state>();
15591570   if (offset==3)
15601571   {
15611572      if(data & 1)
1562         state->m_port_c_8255 |=   1<<((data>>1)&0x07);
1573         m_port_c_8255 |=   1<<((data>>1)&0x07);
15631574      else
1564         state->m_port_c_8255 &= ~(1<<((data>>1)&0x07));
1575         m_port_c_8255 &= ~(1<<((data>>1)&0x07));
15651576
15661577      switch(data) {
1567           case 0x08: state->m_port_c_8255 |= 0x88; break;
1568           case 0x09: state->m_port_c_8255 &= 0xf7; break;
1569           case 0x0c: state->m_port_c_8255 |= 0x28; break;
1570           case 0x0d: state->m_port_c_8255 &= 0xf7; break;
1578           case 0x08: m_port_c_8255 |= 0x88; break;
1579           case 0x09: m_port_c_8255 &= 0xf7; break;
1580           case 0x0c: m_port_c_8255 |= 0x28; break;
1581           case 0x0d: m_port_c_8255 &= 0xf7; break;
15711582           default: break;
15721583      }
15731584
1574      state->m_port_c_8255 |= 0xa8;
1585      m_port_c_8255 |= 0xa8;
15751586
15761587      if(0)
15771588      {
1578         UINT8 *gfx_data = space->machine().region("gfx1")->base();
1579         UINT8 *ext_rom = space->machine().region("cart_img")->base();
1589         UINT8 *gfx_data = machine().region("gfx1")->base();
1590         UINT8 *ext_rom = machine().region("cart_img")->base();
15801591
15811592         //printf("%02x\n",data);
15821593
15831594         if((data & 0x0f) == 0x05)
1584            memory_set_bankptr(space->machine(), "bank1", &ext_rom[0x2000]);
1595            memory_set_bankptr(machine(), "bank1", &ext_rom[0x2000]);
15851596         if((data & 0x0f) == 0x04)
1586            memory_set_bankptr(space->machine(), "bank1", &gfx_data[0]);
1597            memory_set_bankptr(machine(), "bank1", &gfx_data[0]);
15871598      }
15881599   }
1589   state->m_ppi->write(*space,offset,data);
1600   m_ppi->write(*&space,offset,data);
15901601}
15911602
15921603
15931604static ADDRESS_MAP_START(pc6001sr_map, AS_PROGRAM, 8, pc6001_state )
15941605   ADDRESS_MAP_UNMAP_HIGH
1595   AM_RANGE(0x0000, 0x1fff) AM_ROMBANK("bank1") AM_WRITE_LEGACY(sr_work_ram0_w)
1596   AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank2") AM_WRITE_LEGACY(sr_work_ram1_w)
1597   AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") AM_WRITE_LEGACY(sr_work_ram2_w)
1598   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") AM_WRITE_LEGACY(sr_work_ram3_w)
1599   AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank5") AM_WRITE_LEGACY(sr_work_ram4_w)
1600   AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank6") AM_WRITE_LEGACY(sr_work_ram5_w)
1601   AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("bank7") AM_WRITE_LEGACY(sr_work_ram6_w)
1602   AM_RANGE(0xe000, 0xffff) AM_ROMBANK("bank8") AM_WRITE_LEGACY(sr_work_ram7_w)
1606   AM_RANGE(0x0000, 0x1fff) AM_ROMBANK("bank1") AM_WRITE(sr_work_ram0_w)
1607   AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank2") AM_WRITE(sr_work_ram1_w)
1608   AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") AM_WRITE(sr_work_ram2_w)
1609   AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") AM_WRITE(sr_work_ram3_w)
1610   AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank5") AM_WRITE(sr_work_ram4_w)
1611   AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank6") AM_WRITE(sr_work_ram5_w)
1612   AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("bank7") AM_WRITE(sr_work_ram6_w)
1613   AM_RANGE(0xe000, 0xffff) AM_ROMBANK("bank8") AM_WRITE(sr_work_ram7_w)
16031614ADDRESS_MAP_END
16041615
16051616static ADDRESS_MAP_START( pc6001sr_io , AS_IO, 8, pc6001_state )
16061617   ADDRESS_MAP_UNMAP_HIGH
16071618   ADDRESS_MAP_GLOBAL_MASK(0xff)
1608   AM_RANGE(0x60, 0x67) AM_READWRITE_LEGACY(pc6001sr_bank_rn_r,pc6001sr_bank_rn_w)
1609   AM_RANGE(0x68, 0x6f) AM_READWRITE_LEGACY(pc6001sr_bank_wn_r,pc6001sr_bank_wn_w)
1619   AM_RANGE(0x60, 0x67) AM_READWRITE(pc6001sr_bank_rn_r,pc6001sr_bank_rn_w)
1620   AM_RANGE(0x68, 0x6f) AM_READWRITE(pc6001sr_bank_wn_r,pc6001sr_bank_wn_w)
16101621   AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w)
16111622   AM_RANGE(0x81, 0x81) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
16121623
1613   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE_LEGACY(nec_ppi8255_r, necsr_ppi8255_w)
1624   AM_RANGE(0x90, 0x93) AM_MIRROR(0x0c) AM_READWRITE(nec_ppi8255_r, necsr_ppi8255_w)
16141625
16151626   AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_address_w)
16161627   AM_RANGE(0xa1, 0xa1) AM_MIRROR(0x0c) AM_DEVWRITE_LEGACY("ay8910", ay8910_data_w)
16171628   AM_RANGE(0xa2, 0xa2) AM_MIRROR(0x0c) AM_DEVREAD_LEGACY("ay8910", ay8910_r)
16181629   AM_RANGE(0xa3, 0xa3) AM_MIRROR(0x0c) AM_NOP
16191630
1620   AM_RANGE(0xb0, 0xb0) AM_WRITE_LEGACY(pc6001sr_system_latch_w)
1631   AM_RANGE(0xb0, 0xb0) AM_WRITE(pc6001sr_system_latch_w)
16211632   /* these are disk related */
16221633//  AM_RANGE(0xb1
16231634//  AM_RANGE(0xb2
16241635//  AM_RANGE(0xb3
16251636
1626//  AM_RANGE(0xc0, 0xc0) AM_WRITE_LEGACY(pc6001m2_col_bank_w)
1627//  AM_RANGE(0xc1, 0xc1) AM_WRITE_LEGACY(pc6001m2_vram_bank_w)
1628//  AM_RANGE(0xc2, 0xc2) AM_WRITE_LEGACY(pc6001m2_opt_bank_w)
1637//  AM_RANGE(0xc0, 0xc0) AM_WRITE(pc6001m2_col_bank_w)
1638//  AM_RANGE(0xc1, 0xc1) AM_WRITE(pc6001m2_vram_bank_w)
1639//  AM_RANGE(0xc2, 0xc2) AM_WRITE(pc6001m2_opt_bank_w)
16291640
1630   AM_RANGE(0xc8, 0xc8) AM_WRITE_LEGACY(pc6001sr_mode_w)
1631   AM_RANGE(0xc9, 0xc9) AM_WRITE_LEGACY(pc6001sr_vram_bank_w)
1641   AM_RANGE(0xc8, 0xc8) AM_WRITE(pc6001sr_mode_w)
1642   AM_RANGE(0xc9, 0xc9) AM_WRITE(pc6001sr_vram_bank_w)
16321643
1633   AM_RANGE(0xd0, 0xdf) AM_READWRITE_LEGACY(pc6601_fdc_r,pc6601_fdc_w) // disk device
1644   AM_RANGE(0xd0, 0xdf) AM_READWRITE(pc6601_fdc_r,pc6601_fdc_w) // disk device
16341645
1635   AM_RANGE(0xe0, 0xe3) AM_MIRROR(0x0c) AM_READWRITE_LEGACY(upd7752_reg_r,upd7752_reg_w)
1646   AM_RANGE(0xe0, 0xe3) AM_MIRROR(0x0c) AM_READWRITE(upd7752_reg_r,upd7752_reg_w)
16361647
1637//  AM_RANGE(0xf0, 0xf0) AM_READWRITE_LEGACY(pc6001m2_bank_r0_r,pc6001m2_bank_r0_w)
1638//  AM_RANGE(0xf1, 0xf1) AM_READWRITE_LEGACY(pc6001m2_bank_r1_r,pc6001m2_bank_r1_w)
1639//  AM_RANGE(0xf2, 0xf2) AM_READWRITE_LEGACY(pc6001m2_bank_w0_r,pc6001m2_bank_w0_w)
1640   AM_RANGE(0xf3, 0xf3) AM_WRITE_LEGACY(pc6001m2_0xf3_w)
1648//  AM_RANGE(0xf0, 0xf0) AM_READWRITE(pc6001m2_bank_r0_r,pc6001m2_bank_r0_w)
1649//  AM_RANGE(0xf1, 0xf1) AM_READWRITE(pc6001m2_bank_r1_r,pc6001m2_bank_r1_w)
1650//  AM_RANGE(0xf2, 0xf2) AM_READWRITE(pc6001m2_bank_w0_r,pc6001m2_bank_w0_w)
1651   AM_RANGE(0xf3, 0xf3) AM_WRITE(pc6001m2_0xf3_w)
16411652//  AM_RANGE(0xf4
16421653//  AM_RANGE(0xf5
1643   AM_RANGE(0xf6, 0xf6) AM_WRITE_LEGACY(pc6001m2_timer_adj_w)
1644   AM_RANGE(0xf7, 0xf7) AM_WRITE_LEGACY(pc6001m2_timer_irqv_w)
1654   AM_RANGE(0xf6, 0xf6) AM_WRITE(pc6001m2_timer_adj_w)
1655   AM_RANGE(0xf7, 0xf7) AM_WRITE(pc6001m2_timer_irqv_w)
16451656ADDRESS_MAP_END
16461657
16471658/* Input ports */
src/mess/drivers/spc1000.c
r14844r14845
3333      spc1000_state *state = machine.driver_data<spc1000_state>();
3434      return state->m_video_ram[0x1000+(ch&0x7F)*16+line];
3535   }
36   DECLARE_WRITE8_MEMBER(spc1000_iplk_w);
37   DECLARE_READ8_MEMBER(spc1000_iplk_r);
38   DECLARE_WRITE8_MEMBER(spc1000_video_ram_w);
39   DECLARE_READ8_MEMBER(spc1000_video_ram_r);
40   DECLARE_READ8_MEMBER(spc1000_keyboard_r);
3641};
3742
3843
r14844r14845
4348   AM_RANGE( 0x8000, 0xffff ) AM_READ_BANK("bank3") AM_WRITE_BANK("bank4")
4449ADDRESS_MAP_END
4550
46static WRITE8_HANDLER(spc1000_iplk_w)
51WRITE8_MEMBER(spc1000_state::spc1000_iplk_w)
4752{
48   spc1000_state *state = space->machine().driver_data<spc1000_state>();
49   state->m_IPLK = state->m_IPLK ? 0 : 1;
50   if (state->m_IPLK == 1) {
51      UINT8 *mem = space->machine().region("maincpu")->base();
52      memory_set_bankptr(space->machine(), "bank1", mem);
53      memory_set_bankptr(space->machine(), "bank3", mem);
53   m_IPLK = m_IPLK ? 0 : 1;
54   if (m_IPLK == 1) {
55      UINT8 *mem = machine().region("maincpu")->base();
56      memory_set_bankptr(machine(), "bank1", mem);
57      memory_set_bankptr(machine(), "bank3", mem);
5458   } else {
55      UINT8 *ram = space->machine().device<ram_device>(RAM_TAG)->pointer();
56      memory_set_bankptr(space->machine(), "bank1", ram);
57      memory_set_bankptr(space->machine(), "bank3", ram + 0x8000);
59      UINT8 *ram = machine().device<ram_device>(RAM_TAG)->pointer();
60      memory_set_bankptr(machine(), "bank1", ram);
61      memory_set_bankptr(machine(), "bank3", ram + 0x8000);
5862   }
5963}
6064
61static READ8_HANDLER(spc1000_iplk_r)
65READ8_MEMBER(spc1000_state::spc1000_iplk_r)
6266{
63   spc1000_state *state = space->machine().driver_data<spc1000_state>();
64   state->m_IPLK = state->m_IPLK ? 0 : 1;
65   if (state->m_IPLK == 1) {
66      UINT8 *mem = space->machine().region("maincpu")->base();
67      memory_set_bankptr(space->machine(), "bank1", mem);
68      memory_set_bankptr(space->machine(), "bank3", mem);
67   m_IPLK = m_IPLK ? 0 : 1;
68   if (m_IPLK == 1) {
69      UINT8 *mem = machine().region("maincpu")->base();
70      memory_set_bankptr(machine(), "bank1", mem);
71      memory_set_bankptr(machine(), "bank3", mem);
6972   } else {
70      UINT8 *ram = space->machine().device<ram_device>(RAM_TAG)->pointer();
71      memory_set_bankptr(space->machine(), "bank1", ram);
72      memory_set_bankptr(space->machine(), "bank3", ram + 0x8000);
73      UINT8 *ram = machine().device<ram_device>(RAM_TAG)->pointer();
74      memory_set_bankptr(machine(), "bank1", ram);
75      memory_set_bankptr(machine(), "bank3", ram + 0x8000);
7376   }
7477   return 0;
7578}
7679
7780
7881
79static WRITE8_HANDLER(spc1000_video_ram_w)
82WRITE8_MEMBER(spc1000_state::spc1000_video_ram_w)
8083{
81   spc1000_state *state = space->machine().driver_data<spc1000_state>();
82   state->m_video_ram[offset] = data;
84   m_video_ram[offset] = data;
8385}
8486
85static READ8_HANDLER(spc1000_video_ram_r)
87READ8_MEMBER(spc1000_state::spc1000_video_ram_r)
8688{
87   spc1000_state *state = space->machine().driver_data<spc1000_state>();
88   return state->m_video_ram[offset];
89   return m_video_ram[offset];
8990}
9091
91static READ8_HANDLER(spc1000_keyboard_r) {
92READ8_MEMBER(spc1000_state::spc1000_keyboard_r){
9293   static const char *const keynames[] = {
9394      "LINE0", "LINE1", "LINE2", "LINE3", "LINE4",
9495      "LINE5", "LINE6", "LINE7", "LINE8", "LINE9"
9596   };
96   return input_port_read(space->machine(), keynames[offset]);
97   return input_port_read(machine(), keynames[offset]);
9798}
9899
99100static WRITE8_DEVICE_HANDLER(spc1000_gmode_w)
r14844r14845
117118
118119static ADDRESS_MAP_START( spc1000_io , AS_IO, 8, spc1000_state )
119120   ADDRESS_MAP_UNMAP_HIGH
120   AM_RANGE(0x0000, 0x1fff) AM_READWRITE_LEGACY(spc1000_video_ram_r, spc1000_video_ram_w)
121   AM_RANGE(0x0000, 0x1fff) AM_READWRITE(spc1000_video_ram_r, spc1000_video_ram_w)
121122   AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_LEGACY("mc6847", spc1000_gmode_r, spc1000_gmode_w)
122   AM_RANGE(0x8000, 0x8009) AM_READ_LEGACY(spc1000_keyboard_r)
123   AM_RANGE(0xA000, 0xA000) AM_READWRITE_LEGACY(spc1000_iplk_r, spc1000_iplk_w)
123   AM_RANGE(0x8000, 0x8009) AM_READ(spc1000_keyboard_r)
124   AM_RANGE(0xA000, 0xA000) AM_READWRITE(spc1000_iplk_r, spc1000_iplk_w)
124125   AM_RANGE(0x4000, 0x4000) AM_DEVWRITE_LEGACY("ay8910", ay8910_address_w)
125126   AM_RANGE(0x4001, 0x4001) AM_DEVREADWRITE_LEGACY("ay8910", ay8910_r, ay8910_data_w)
126127ADDRESS_MAP_END
src/mess/drivers/sgi_ip6.c
r14844r14845
3131      : driver_device(mconfig, type, tag) { }
3232
3333   ip6_regs_t m_ip6_regs;
34   DECLARE_READ32_MEMBER(ip6_unk1_r);
35   DECLARE_WRITE32_MEMBER(ip6_unk1_w);
36   DECLARE_READ32_MEMBER(ip6_unk2_r);
37   DECLARE_WRITE32_MEMBER(ip6_unk2_w);
38   DECLARE_READ32_MEMBER(ip6_unk3_r);
39   DECLARE_WRITE32_MEMBER(ip6_unk3_w);
3440};
3541
3642
r14844r14845
7379***************************************************************************/
7480
7581
76static READ32_HANDLER( ip6_unk1_r )
82READ32_MEMBER(sgi_ip6_state::ip6_unk1_r)
7783{
78   sgi_ip6_state *state = space->machine().driver_data<sgi_ip6_state>();
7984   UINT32 ret = 0;
8085   switch(offset)
8186   {
8287      case 0x0000/4:
8388         if(ACCESSING_BITS_16_31)
8489         {
85            verboselog(space->machine(), 0, "ip6_unk1_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
90            verboselog(machine(), 0, "ip6_unk1_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
8691         }
8792         if(ACCESSING_BITS_0_15)
8893         {
89            verboselog(space->machine(), 0, "ip6_unk1_r: Unknown Halfword 0: %08x & %08x\n", state->m_ip6_regs.unknown_half_0, mem_mask );
90            ret |= state->m_ip6_regs.unknown_half_0;
94            verboselog(machine(), 0, "ip6_unk1_r: Unknown Halfword 0: %08x & %08x\n", m_ip6_regs.unknown_half_0, mem_mask );
95            ret |= m_ip6_regs.unknown_half_0;
9196         }
9297         break;
9398      default:
94         verboselog(space->machine(), 0, "ip6_unk1_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
99         verboselog(machine(), 0, "ip6_unk1_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
95100         break;
96101   }
97102   return ret;
98103}
99104
100static WRITE32_HANDLER( ip6_unk1_w )
105WRITE32_MEMBER(sgi_ip6_state::ip6_unk1_w)
101106{
102   sgi_ip6_state *state = space->machine().driver_data<sgi_ip6_state>();
103107   switch(offset)
104108   {
105109      case 0x0000/4:
106110         if(ACCESSING_BITS_16_31)
107111         {
108            verboselog(space->machine(), 0, "ip6_unk1_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
112            verboselog(machine(), 0, "ip6_unk1_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
109113         }
110114         if(ACCESSING_BITS_0_15)
111115         {
112            verboselog(space->machine(), 0, "ip6_unk1_w: Unknown Halfword 0 = %04x & %04x\n", data & 0x0000ffff, mem_mask & 0x0000ffff );
113            state->m_ip6_regs.unknown_half_0 = data & 0x0000ffff;
116            verboselog(machine(), 0, "ip6_unk1_w: Unknown Halfword 0 = %04x & %04x\n", data & 0x0000ffff, mem_mask & 0x0000ffff );
117            m_ip6_regs.unknown_half_0 = data & 0x0000ffff;
114118         }
115119         break;
116120      default:
117         verboselog(space->machine(), 0, "ip6_unk1_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
121         verboselog(machine(), 0, "ip6_unk1_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
118122         break;
119123   }
120124}
121125
122static READ32_HANDLER( ip6_unk2_r )
126READ32_MEMBER(sgi_ip6_state::ip6_unk2_r)
123127{
124   sgi_ip6_state *state = space->machine().driver_data<sgi_ip6_state>();
125128   UINT32 ret = 0;
126129   switch(offset)
127130   {
128131      case 0x0000/4:
129132         if(!ACCESSING_BITS_24_31)
130133         {
131            verboselog(space->machine(), 0, "ip6_unk2_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
134            verboselog(machine(), 0, "ip6_unk2_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
132135         }
133136         if(ACCESSING_BITS_24_31)
134137         {
135            verboselog(space->machine(), 0, "ip6_unk2_r: Unknown Byte 0 = %02x & %02x\n", state->m_ip6_regs.unknown_byte_0, mem_mask >> 24 );
136            ret |= state->m_ip6_regs.unknown_byte_0 << 24;
138            verboselog(machine(), 0, "ip6_unk2_r: Unknown Byte 0 = %02x & %02x\n", m_ip6_regs.unknown_byte_0, mem_mask >> 24 );
139            ret |= m_ip6_regs.unknown_byte_0 << 24;
137140         }
138141         break;
139142      default:
140         verboselog(space->machine(), 0, "ip6_unk2_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
143         verboselog(machine(), 0, "ip6_unk2_r: Unknown address: %08x & %08x\n", 0x1f880000 + (offset << 2), mem_mask );
141144         break;
142145   }
143146   return ret;
144147}
145148
146static WRITE32_HANDLER( ip6_unk2_w )
149WRITE32_MEMBER(sgi_ip6_state::ip6_unk2_w)
147150{
148   sgi_ip6_state *state = space->machine().driver_data<sgi_ip6_state>();
149151   switch(offset)
150152   {
151153      case 0x0000/4:
152154         if(!ACCESSING_BITS_24_31)
153155         {
154            verboselog(space->machine(), 0, "ip6_unk2_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
156            verboselog(machine(), 0, "ip6_unk2_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
155157         }
156158         if(ACCESSING_BITS_24_31)
157159         {
158            verboselog(space->machine(), 0, "ip6_unk2_w: Unknown Byte 0 = %02x & %02x\n", data >> 24, mem_mask >> 24 );
159            state->m_ip6_regs.unknown_byte_0 = (data & 0xff000000) >> 24;
160            verboselog(machine(), 0, "ip6_unk2_w: Unknown Byte 0 = %02x & %02x\n", data >> 24, mem_mask >> 24 );
161            m_ip6_regs.unknown_byte_0 = (data & 0xff000000) >> 24;
160162         }
161163         break;
162164      default:
163         verboselog(space->machine(), 0, "ip6_unk2_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
165         verboselog(machine(), 0, "ip6_unk2_w: Unknown address: %08x = %08x & %08x\n", 0x1f880000 + (offset << 2), data, mem_mask );
164166         break;
165167   }
166168}
167169
168static READ32_HANDLER(ip6_unk3_r)
170READ32_MEMBER(sgi_ip6_state::ip6_unk3_r)
169171{
170   sgi_ip6_state *state = space->machine().driver_data<sgi_ip6_state>();
171172   UINT32 ret = 0;
172173   if(ACCESSING_BITS_16_23)
173174   {
174      verboselog(space->machine(), 0, "ip6_unk3_r: Unknown Byte 1: %02x & %02x\n", state->m_ip6_regs.unknown_byte_1, (mem_mask >> 16) & 0x000000ff);
175      ret |= state->m_ip6_regs.unknown_byte_1 << 16;
175      verboselog(machine(), 0, "ip6_unk3_r: Unknown Byte 1: %02x & %02x\n", m_ip6_regs.unknown_byte_1, (mem_mask >> 16) & 0x000000ff);
176      ret |= m_ip6_regs.unknown_byte_1 << 16;
176177   }
177178   else
178179   {
179      verboselog(space->machine(), 0, "ip6_unk3_r: Unknown address: %08x & %08x\n", 0x1fb00000 + (offset << 2), mem_mask );
180      verboselog(machine(), 0, "ip6_unk3_r: Unknown address: %08x & %08x\n", 0x1fb00000 + (offset << 2), mem_mask );
180181   }
181182   return ret;
182183}
183184
184static WRITE32_HANDLER(ip6_unk3_w)
185WRITE32_MEMBER(sgi_ip6_state::ip6_unk3_w)
185186{
186   verboselog(space->machine(), 0, "ip6_unk3_w: Unknown address: %08x = %08x & %08x\n", 0x1fb00000 + (offset << 2), data, mem_mask );
187   verboselog(machine(), 0, "ip6_unk3_w: Unknown address: %08x = %08x & %08x\n", 0x1fb00000 + (offset << 2), data, mem_mask );
187188}
188189
189190static INTERRUPT_GEN( sgi_ip6_vbl )
r14844r14845
207208***************************************************************************/
208209
209210static ADDRESS_MAP_START( sgi_ip6_map, AS_PROGRAM, 32, sgi_ip6_state )
210   AM_RANGE( 0x1f880000, 0x1f880003 ) AM_READWRITE_LEGACY(ip6_unk1_r, ip6_unk1_w)
211   AM_RANGE( 0x1fb00000, 0x1fb00003 ) AM_READWRITE_LEGACY(ip6_unk3_r, ip6_unk3_w)
212   AM_RANGE( 0x1fbc004c, 0x1fbc004f ) AM_READWRITE_LEGACY(ip6_unk2_r, ip6_unk2_w)
211   AM_RANGE( 0x1f880000, 0x1f880003 ) AM_READWRITE(ip6_unk1_r, ip6_unk1_w)
212   AM_RANGE( 0x1fb00000, 0x1fb00003 ) AM_READWRITE(ip6_unk3_r, ip6_unk3_w)
213   AM_RANGE( 0x1fbc004c, 0x1fbc004f ) AM_READWRITE(ip6_unk2_r, ip6_unk2_w)
213214   AM_RANGE( 0x1fc00000, 0x1fc3ffff ) AM_ROM AM_REGION( "user1", 0 )
214215ADDRESS_MAP_END
215216
src/mess/drivers/smc777.c
r14844r14845
5252   UINT8 m_keyb_direct;
5353   UINT8 m_pal_mode;
5454   UINT8 m_keyb_cmd;
55   DECLARE_WRITE8_MEMBER(smc777_6845_w);
56   DECLARE_READ8_MEMBER(smc777_vram_r);
57   DECLARE_READ8_MEMBER(smc777_attr_r);
58   DECLARE_READ8_MEMBER(smc777_pcg_r);
59   DECLARE_WRITE8_MEMBER(smc777_vram_w);
60   DECLARE_WRITE8_MEMBER(smc777_attr_w);
61   DECLARE_WRITE8_MEMBER(smc777_pcg_w);
62   DECLARE_READ8_MEMBER(smc777_fbuf_r);
63   DECLARE_WRITE8_MEMBER(smc777_fbuf_w);
64   DECLARE_READ8_MEMBER(smc777_fdc1_r);
65   DECLARE_WRITE8_MEMBER(smc777_fdc1_w);
66   DECLARE_READ8_MEMBER(key_r);
67   DECLARE_WRITE8_MEMBER(key_w);
68   DECLARE_WRITE8_MEMBER(border_col_w);
69   DECLARE_READ8_MEMBER(system_input_r);
70   DECLARE_WRITE8_MEMBER(system_output_w);
71   DECLARE_READ8_MEMBER(smc777_joystick_r);
72   DECLARE_WRITE8_MEMBER(smc777_color_mode_w);
73   DECLARE_WRITE8_MEMBER(smc777_ramdac_w);
74   DECLARE_READ8_MEMBER(display_reg_r);
75   DECLARE_WRITE8_MEMBER(display_reg_w);
76   DECLARE_READ8_MEMBER(smc777_mem_r);
77   DECLARE_WRITE8_MEMBER(smc777_mem_w);
78   DECLARE_READ8_MEMBER(smc777_irq_mask_r);
79   DECLARE_WRITE8_MEMBER(smc777_irq_mask_w);
80   DECLARE_READ8_MEMBER(smc777_io_r);
81   DECLARE_WRITE8_MEMBER(smc777_io_w);
5582};
5683
5784
r14844r14845
197224    return 0;
198225}
199226
200static WRITE8_HANDLER( smc777_6845_w )
227WRITE8_MEMBER(smc777_state::smc777_6845_w)
201228{
202   smc777_state *state = space->machine().driver_data<smc777_state>();
203229   if(offset == 0)
204230   {
205      state->m_addr_latch = data;
206      //mc6845_address_w(space->machine().device("crtc"), 0,data);
231      m_addr_latch = data;
232      //mc6845_address_w(machine().device("crtc"), 0,data);
207233   }
208234   else
209235   {
210      if(state->m_addr_latch == 0x0a)
211         state->m_cursor_raster = data;
212      else if(state->m_addr_latch == 0x0e)
213         state->m_cursor_addr = ((data<<8) & 0x3f00) | (state->m_cursor_addr & 0xff);
214      else if(state->m_addr_latch == 0x0f)
215         state->m_cursor_addr = (state->m_cursor_addr & 0x3f00) | (data & 0xff);
236      if(m_addr_latch == 0x0a)
237         m_cursor_raster = data;
238      else if(m_addr_latch == 0x0e)
239         m_cursor_addr = ((data<<8) & 0x3f00) | (m_cursor_addr & 0xff);
240      else if(m_addr_latch == 0x0f)
241         m_cursor_addr = (m_cursor_addr & 0x3f00) | (data & 0xff);
216242
217      //mc6845_register_w(space->machine().device("crtc"), 0,data);
243      //mc6845_register_w(machine().device("crtc"), 0,data);
218244   }
219245}
220246
221static READ8_HANDLER( smc777_vram_r )
247READ8_MEMBER(smc777_state::smc777_vram_r)
222248{
223   UINT8 *vram = space->machine().region("vram")->base();
249   UINT8 *vram = machine().region("vram")->base();
224250   UINT16 vram_index;
225251
226252   vram_index  = ((offset & 0x0007) << 8);
r14844r14845
229255   return vram[vram_index];
230256}
231257
232static READ8_HANDLER( smc777_attr_r )
258READ8_MEMBER(smc777_state::smc777_attr_r)
233259{
234   UINT8 *attr = space->machine().region("attr")->base();
260   UINT8 *attr = machine().region("attr")->base();
235261   UINT16 vram_index;
236262
237263   vram_index  = ((offset & 0x0007) << 8);
r14844r14845
240266   return attr[vram_index];
241267}
242268
243static READ8_HANDLER( smc777_pcg_r )
269READ8_MEMBER(smc777_state::smc777_pcg_r)
244270{
245   UINT8 *pcg = space->machine().region("pcg")->base();
271   UINT8 *pcg = machine().region("pcg")->base();
246272   UINT16 vram_index;
247273
248274   vram_index  = ((offset & 0x0007) << 8);
r14844r14845
251277   return pcg[vram_index];
252278}
253279
254static WRITE8_HANDLER( smc777_vram_w )
280WRITE8_MEMBER(smc777_state::smc777_vram_w)
255281{
256   UINT8 *vram = space->machine().region("vram")->base();
282   UINT8 *vram = machine().region("vram")->base();
257283   UINT16 vram_index;
258284
259285   vram_index  = ((offset & 0x0007) << 8);
r14844r14845
262288   vram[vram_index] = data;
263289}
264290
265static WRITE8_HANDLER( smc777_attr_w )
291WRITE8_MEMBER(smc777_state::smc777_attr_w)
266292{
267   UINT8 *attr = space->machine().region("attr")->base();
293   UINT8 *attr = machine().region("attr")->base();
268294   UINT16 vram_index;
269295
270296   vram_index  = ((offset & 0x0007) << 8);
r14844r14845
273299   attr[vram_index] = data;
274300}
275301
276static WRITE8_HANDLER( smc777_pcg_w )
302WRITE8_MEMBER(smc777_state::smc777_pcg_w)
277303{
278   UINT8 *pcg = space->machine().region("pcg")->base();
304   UINT8 *pcg = machine().region("pcg")->base();
279305   UINT16 vram_index;
280306
281307   vram_index  = ((offset & 0x0007) << 8);
r14844r14845
283309
284310   pcg[vram_index] = data;
285311
286    gfx_element_mark_dirty(space->machine().gfx[0], vram_index >> 3);
312    gfx_element_mark_dirty(machine().gfx[0], vram_index >> 3);
287313}
288314
289static READ8_HANDLER( smc777_fbuf_r )
315READ8_MEMBER(smc777_state::smc777_fbuf_r)
290316{
291   UINT8 *fbuf = space->machine().region("fbuf")->base();
317   UINT8 *fbuf = machine().region("fbuf")->base();
292318   UINT16 vram_index;
293319
294320   vram_index  = ((offset & 0x007f) << 8);
r14844r14845
297323   return fbuf[vram_index];
298324}
299325
300static WRITE8_HANDLER( smc777_fbuf_w )
326WRITE8_MEMBER(smc777_state::smc777_fbuf_w)
301327{
302   UINT8 *fbuf = space->machine().region("fbuf")->base();
328   UINT8 *fbuf = machine().region("fbuf")->base();
303329   UINT16 vram_index;
304330
305331   vram_index  = ((offset & 0x00ff) << 8);
r14844r14845
324350   }
325351}
326352
327static READ8_HANDLER( smc777_fdc1_r )
353READ8_MEMBER(smc777_state::smc777_fdc1_r)
328354{
329   smc777_state *state = space->machine().driver_data<smc777_state>();
330   device_t* dev = space->machine().device("fdc");
355   device_t* dev = machine().device("fdc");
331356
332   check_floppy_inserted(space->machine());
357   check_floppy_inserted(machine());
333358
334359   switch(offset)
335360   {
r14844r14845
342367      case 0x03:
343368         return wd17xx_data_r(dev,offset) ^ 0xff;
344369      case 0x04: //irq / drq status
345         //popmessage("%02x %02x\n",state->m_fdc_irq_flag,state->m_fdc_drq_flag);
370         //popmessage("%02x %02x\n",m_fdc_irq_flag,m_fdc_drq_flag);
346371
347         return (state->m_fdc_irq_flag ? 0x80 : 0x00) | (state->m_fdc_drq_flag ? 0x00 : 0x40);
372         return (m_fdc_irq_flag ? 0x80 : 0x00) | (m_fdc_drq_flag ? 0x00 : 0x40);
348373   }
349374
350375   return 0x00;
351376}
352377
353static WRITE8_HANDLER( smc777_fdc1_w )
378WRITE8_MEMBER(smc777_state::smc777_fdc1_w)
354379{
355   device_t* dev = space->machine().device("fdc");
380   device_t* dev = machine().device("fdc");
356381
357   check_floppy_inserted(space->machine());
382   check_floppy_inserted(machine());
358383
359384   switch(offset)
360385   {
r14844r14845
392417   drvstate->m_fdc_drq_flag = state;
393418}
394419
395static READ8_HANDLER( key_r )
420READ8_MEMBER(smc777_state::key_r)
396421{
397   smc777_state *state = space->machine().driver_data<smc777_state>();
398422   /*
399423    -x-- ---- shift key
400424    ---- -x-- MCU data ready
401425    ---- ---x handshake bit?
402426    */
403427
404   switch(state->m_keyb_cmd)
428   switch(m_keyb_cmd)
405429   {
406430      case 0x00: //poll keyboard input
407431      {
408432         if(offset == 0)
409            state->m_keyb_press_flag = 0;
433            m_keyb_press_flag = 0;
410434
411         return (offset == 0) ? state->m_keyb_press : ((state->m_shift_press_flag << 6) | (state->m_keyb_press_flag << 2) | (state->m_keyb_press_flag));
435         return (offset == 0) ? m_keyb_press : ((m_shift_press_flag << 6) | (m_keyb_press_flag << 2) | (m_keyb_press_flag));
412436      }
413437      break;
414438      default:
415439      {
416440         //if(offset == 1)
417         //  printf("Unknown keyboard command %02x read-back\n",state->m_keyb_cmd);
441         //  printf("Unknown keyboard command %02x read-back\n",m_keyb_cmd);
418442
419         return (offset == 0) ? 0x00 : (space->machine().rand() & 0x5);
443         return (offset == 0) ? 0x00 : (machine().rand() & 0x5);
420444      }
421445   }
422446
r14844r14845
424448}
425449
426450/* TODO: the packet commands strikes me as something I've already seen before, don't remember where however ... */
427static WRITE8_HANDLER( key_w )
451WRITE8_MEMBER(smc777_state::key_w)
428452{
429   smc777_state *state = space->machine().driver_data<smc777_state>();
430453
431454   if(offset == 1) //keyboard command
432      state->m_keyb_cmd = data;
455      m_keyb_cmd = data;
433456   else
434457   {
435458      // keyboard command param
436459   }
437460}
438461
439static WRITE8_HANDLER( border_col_w )
462WRITE8_MEMBER(smc777_state::border_col_w)
440463{
441   smc777_state *state = space->machine().driver_data<smc777_state>();
442464   if(data & 0xf0)
443465      printf("Special border color enabled %02x\n",data);
444466
445   state->m_backdrop_pen = data & 0xf;
467   m_backdrop_pen = data & 0xf;
446468}
447469
448470
449static READ8_HANDLER( system_input_r )
471READ8_MEMBER(smc777_state::system_input_r)
450472{
451   smc777_state *state = space->machine().driver_data<smc777_state>();
452473
453   printf("System FF R %02x\n",state->m_system_data & 0x0f);
474   printf("System FF R %02x\n",m_system_data & 0x0f);
454475
455   switch(state->m_system_data & 0x0f)
476   switch(m_system_data & 0x0f)
456477   {
457478      case 0x00:
458         return ((state->m_raminh & 1) << 4); //unknown bit, Dragon's Alphabet and Bird Crush relies on this for correct colors
479         return ((m_raminh & 1) << 4); //unknown bit, Dragon's Alphabet and Bird Crush relies on this for correct colors
459480   }
460481
461   return state->m_system_data;
482   return m_system_data;
462483}
463484
464485
465486
466static WRITE8_HANDLER( system_output_w )
487WRITE8_MEMBER(smc777_state::system_output_w)
467488{
468   smc777_state *state = space->machine().driver_data<smc777_state>();
469489   /*
470490    ---x 0000 ram inibit signal
471491    ---x 1001 beep
472492    all the rest is unknown at current time
473493    */
474   state->m_system_data = data;
475   switch(state->m_system_data & 0x0f)
494   m_system_data = data;
495   switch(m_system_data & 0x0f)
476496   {
477497      case 0x00:
478         state->m_raminh_pending_change = ((data & 0x10) >> 4) ^ 1;
479         state->m_raminh_prefetch = (UINT8)(cpu_get_reg(&space->device(), Z80_R)) & 0x7f;
498         m_raminh_pending_change = ((data & 0x10) >> 4) ^ 1;
499         m_raminh_prefetch = (UINT8)(cpu_get_reg(&space.device(), Z80_R)) & 0x7f;
480500         break;
481501      case 0x02: printf("Interlace %s\n",data & 0x10 ? "on" : "off"); break;
482      case 0x05: beep_set_state(space->machine().device(BEEPER_TAG),data & 0x10); break;
502      case 0x05: beep_set_state(machine().device(BEEPER_TAG),data & 0x10); break;
483503      default: printf("System FF W %02x\n",data); break;
484504   }
485505}
486506
487507/* presumably SMC-777 specific */
488static READ8_HANDLER( smc777_joystick_r )
508READ8_MEMBER(smc777_state::smc777_joystick_r)
489509{
490   //smc777_state *state = space->machine().driver_data<smc777_state>();
491510
492   return input_port_read(space->machine(), "JOY_1P");
511   return input_port_read(machine(), "JOY_1P");
493512}
494513
495static WRITE8_HANDLER( smc777_color_mode_w )
514WRITE8_MEMBER(smc777_state::smc777_color_mode_w)
496515{
497   smc777_state *state = space->machine().driver_data<smc777_state>();
498516
499517   switch(data & 0x0f)
500518   {
501      case 0x06: state->m_pal_mode = (data & 0x10) ^ 0x10; break;
519      case 0x06: m_pal_mode = (data & 0x10) ^ 0x10; break;
502520      default: printf("Color FF %02x\n",data); break;
503521   }
504522}
505523
506static WRITE8_HANDLER( smc777_ramdac_w )
524WRITE8_MEMBER(smc777_state::smc777_ramdac_w)
507525{
508   smc777_state *state = space->machine().driver_data<smc777_state>();
509526   UINT8 pal_index;
510527   pal_index = (offset & 0xf00) >> 8;
511528
r14844r14845
514531
515532   switch((offset & 0x3000) >> 12)
516533   {
517      case 0: state->m_pal.r = (data & 0xf0) >> 4; palette_set_color_rgb(space->machine(), pal_index, pal4bit(state->m_pal.r), pal4bit(state->m_pal.g), pal4bit(state->m_pal.b)); break;
518      case 1: state->m_pal.g = (data & 0xf0) >> 4; palette_set_color_rgb(space->machine(), pal_index, pal4bit(state->m_pal.r), pal4bit(state->m_pal.g), pal4bit(state->m_pal.b)); break;
519      case 2: state->m_pal.b = (data & 0xf0) >> 4; palette_set_color_rgb(space->machine(), pal_index, pal4bit(state->m_pal.r), pal4bit(state->m_pal.g), pal4bit(state->m_pal.b)); break;
534      case 0: m_pal.r = (data & 0xf0) >> 4; palette_set_color_rgb(machine(), pal_index, pal4bit(m_pal.r), pal4bit(m_pal.g), pal4bit(m_pal.b)); break;
535      case 1: m_pal.g = (data & 0xf0) >> 4; palette_set_color_rgb(machine(), pal_index, pal4bit(m_pal.r), pal4bit(m_pal.g), pal4bit(m_pal.b)); break;
536      case 2: m_pal.b = (data & 0xf0) >> 4; palette_set_color_rgb(machine(), pal_index, pal4bit(m_pal.r), pal4bit(m_pal.g), pal4bit(m_pal.b)); break;
520537      case 3: printf("RAMdac used with gradient index = 3! pal_index = %02x data = %02x\n",pal_index,data); break;
521538   }
522539}
523540
524static READ8_HANDLER( display_reg_r )
541READ8_MEMBER(smc777_state::display_reg_r)
525542{
526   smc777_state *state = space->machine().driver_data<smc777_state>();
527   return state->m_display_reg;
543   return m_display_reg;
528544}
529545
530546/* x */
531static WRITE8_HANDLER( display_reg_w )
547WRITE8_MEMBER(smc777_state::display_reg_w)
532548{
533   smc777_state *state = space->machine().driver_data<smc777_state>();
534549   /*
535550    x--- ---- width 80 / 40 switch (0 = 640 x 200 1 = 320 x 200)
536551    ---- -x-- mode select?
537552    */
538553
539554   {
540      if((state->m_display_reg & 0x80) != (data & 0x80))
555      if((m_display_reg & 0x80) != (data & 0x80))
541556      {
542         rectangle visarea = space->machine().primary_screen->visible_area();
557         rectangle visarea = machine().primary_screen->visible_area();
543558         int x_width;
544559
545560         x_width = (data & 0x80) ? 320 : 640;
546561
547562         visarea.set(0, (x_width+(CRTC_MIN_X*2)) - 1, 0, (200+(CRTC_MIN_Y*2)) - 1);
548563
549         space->machine().primary_screen->configure(660, 220, visarea, space->machine().primary_screen->frame_period().attoseconds);
564         machine().primary_screen->configure(660, 220, visarea, machine().primary_screen->frame_period().attoseconds);
550565      }
551566   }
552567
553   state->m_display_reg = data;
568   m_display_reg = data;
554569}
555570
556static READ8_HANDLER( smc777_mem_r )
571READ8_MEMBER(smc777_state::smc777_mem_r)
557572{
558   smc777_state *state = space->machine().driver_data<smc777_state>();
559   UINT8 *wram = space->machine().region("wram")->base();
560   UINT8 *bios = space->machine().region("bios")->base();
573   UINT8 *wram = machine().region("wram")->base();
574   UINT8 *bios = machine().region("bios")->base();
561575   UINT8 z80_r;
562576
563   if(state->m_raminh_prefetch != 0xff) //do the bankswitch AFTER that the prefetch instruction is executed (FIXME: this is an hackish implementation)
577   if(m_raminh_prefetch != 0xff) //do the bankswitch AFTER that the prefetch instruction is executed (FIXME: this is an hackish implementation)
564578   {
565      z80_r = (UINT8)cpu_get_reg(&space->device(), Z80_R);
579      z80_r = (UINT8)cpu_get_reg(&space.device(), Z80_R);
566580
567      if(z80_r == ((state->m_raminh_prefetch+2) & 0x7f))
581      if(z80_r == ((m_raminh_prefetch+2) & 0x7f))
568582      {
569         state->m_raminh = state->m_raminh_pending_change;
570         state->m_raminh_prefetch = 0xff;
583         m_raminh = m_raminh_pending_change;
584         m_raminh_prefetch = 0xff;
571585      }
572586   }
573587
574   if(state->m_raminh == 1 && ((offset & 0xc000) == 0))
588   if(m_raminh == 1 && ((offset & 0xc000) == 0))
575589      return bios[offset];
576590
577591   return wram[offset];
578592}
579593
580static WRITE8_HANDLER( smc777_mem_w )
594WRITE8_MEMBER(smc777_state::smc777_mem_w)
581595{
582   //smc777_state *state = space->machine().driver_data<smc777_state>();
583   UINT8 *wram = space->machine().region("wram")->base();
596   UINT8 *wram = machine().region("wram")->base();
584597
585598   wram[offset] = data;
586599}
587600
588static READ8_HANDLER( smc777_irq_mask_r )
601READ8_MEMBER(smc777_state::smc777_irq_mask_r)
589602{
590   smc777_state *state = space->machine().driver_data<smc777_state>();
591603
592   return state->m_irq_mask;
604   return m_irq_mask;
593605}
594606
595static WRITE8_HANDLER( smc777_irq_mask_w )
607WRITE8_MEMBER(smc777_state::smc777_irq_mask_w)
596608{
597   smc777_state *state = space->machine().driver_data<smc777_state>();
598609
599610   if(data & 0xfe)
600611      printf("Irq mask = %02x\n",data & 0xfe);
601612
602   state->m_irq_mask = data & 1;
613   m_irq_mask = data & 1;
603614}
604615
605616static ADDRESS_MAP_START(smc777_mem, AS_PROGRAM, 8, smc777_state )
606617   ADDRESS_MAP_UNMAP_HIGH
607   AM_RANGE(0x0000, 0xffff) AM_READWRITE_LEGACY(smc777_mem_r,smc777_mem_w)
618   AM_RANGE(0x0000, 0xffff) AM_READWRITE(smc777_mem_r,smc777_mem_w)
608619ADDRESS_MAP_END
609620
610static READ8_HANDLER( smc777_io_r )
621READ8_MEMBER(smc777_state::smc777_io_r)
611622{
612623   UINT8 low_offs;
613624
r14844r14845
619630   else if(low_offs >= 0x18 && low_offs <= 0x19) { logerror("6845 read %02x",low_offs & 1); }
620631   else if(low_offs >= 0x1a && low_offs <= 0x1b) { return key_r(space,low_offs & 1); }
621632   else if(low_offs == 0x1c)                 { return system_input_r(space,0); }
622   else if(low_offs == 0x1d)                 { logerror("System and control data R PC=%04x\n",cpu_get_pc(&space->device())); return 0xff; }
633   else if(low_offs == 0x1d)                 { logerror("System and control data R PC=%04x\n",cpu_get_pc(&space.device())); return 0xff; }
623634   else if(low_offs == 0x20)                 { return display_reg_r(space,0); }
624635   else if(low_offs == 0x21)                 { return smc777_irq_mask_r(space,0); }
625   else if(low_offs == 0x25)                 { logerror("RTC read PC=%04x\n",cpu_get_pc(&space->device())); return 0xff; }
626   else if(low_offs == 0x26)                 { logerror("RS-232c RX %04x\n",cpu_get_pc(&space->device())); return 0xff; }
636   else if(low_offs == 0x25)                 { logerror("RTC read PC=%04x\n",cpu_get_pc(&space.device())); return 0xff; }
637   else if(low_offs == 0x26)                 { logerror("RS-232c RX %04x\n",cpu_get_pc(&space.device())); return 0xff; }
627638   else if(low_offs >= 0x28 && low_offs <= 0x2c) { logerror("FDC 2 read %02x\n",low_offs & 7); return 0xff; }
628639   else if(low_offs >= 0x2d && low_offs <= 0x2f) { logerror("RS-232c no. 2 read %02x\n",low_offs & 3); return 0xff; }
629640   else if(low_offs >= 0x30 && low_offs <= 0x34) { return smc777_fdc1_r(space,low_offs & 7); }
r14844r14845
641652   else if(low_offs == 0x7e || low_offs == 0x7f) { logerror("Kanji ROM read %02x\n",low_offs & 1); }
642653   else if(low_offs >= 0x80)                 { return smc777_fbuf_r(space,offset & 0xff7f); }
643654
644   logerror("Undefined read at %04x offset = %02x\n",cpu_get_pc(&space->device()),low_offs);
655   logerror("Undefined read at %04x offset = %02x\n",cpu_get_pc(&space.device()),low_offs);
645656   return 0xff;
646657}
647658
648static WRITE8_HANDLER( smc777_io_w )
659WRITE8_MEMBER(smc777_state::smc777_io_w)
649660{
650661   UINT8 low_offs;
651662
r14844r14845
675686   else if(low_offs >= 0x48 && low_offs <= 0x4f) { logerror("HDD (Winchester) write %02x %02x\n",low_offs & 1,data); } //might be 0x48 - 0x50
676687   else if(low_offs == 0x51)                 { smc777_color_mode_w(space,0,data); }
677688   else if(low_offs == 0x52)                 { smc777_ramdac_w(space,offset & 0xff00,data); }
678   else if(low_offs == 0x53)                 { sn76496_w(space->machine().device("sn1"),0,data); }
689   else if(low_offs == 0x53)                 { sn76496_w(machine().device("sn1"),0,data); }
679690   else if(low_offs >= 0x54 && low_offs <= 0x59) { logerror("VTR Controller write [%02x] %02x\n",low_offs & 7,data); }
680691   else if(low_offs == 0x5a || low_offs == 0x5b) { logerror("RAM Banking write [%02x] %02x\n",low_offs & 1,data); }
681692   else if(low_offs == 0x70)                 { logerror("Auto-start ROM write %02x\n",data); }
r14844r14845
683694   else if(low_offs == 0x75)                 { logerror("VTR Controller ROM write %02x\n",data); }
684695   else if(low_offs == 0x7e || low_offs == 0x7f) { logerror("Kanji ROM write [%02x] %02x\n",low_offs & 1,data); }
685696   else if(low_offs >= 0x80)                 { smc777_fbuf_w(space,offset & 0xff7f,data); }
686   else                                { logerror("Undefined write at %04x offset = %02x data = %02x\n",cpu_get_pc(&space->device()),low_offs,data); }
697   else                                { logerror("Undefined write at %04x offset = %02x data = %02x\n",cpu_get_pc(&space.device()),low_offs,data); }
687698}
688699
689700static ADDRESS_MAP_START( smc777_io , AS_IO, 8, smc777_state )
690701   ADDRESS_MAP_UNMAP_HIGH
691   AM_RANGE(0x0000, 0xffff) AM_READWRITE_LEGACY(smc777_io_r,smc777_io_w)
702   AM_RANGE(0x0000, 0xffff) AM_READWRITE(smc777_io_r,smc777_io_w)
692703ADDRESS_MAP_END
693704
694705/* Input ports */
src/mess/drivers/rt1715.c
r14844r14845
3535
3636   int m_led1_val;
3737   int m_led2_val;
38   DECLARE_WRITE8_MEMBER(rt1715_floppy_enable);
39   DECLARE_READ8_MEMBER(k7658_led1_r);
40   DECLARE_READ8_MEMBER(k7658_led2_r);
41   DECLARE_READ8_MEMBER(k7658_data_r);
42   DECLARE_WRITE8_MEMBER(k7658_data_w);
43   DECLARE_WRITE8_MEMBER(rt1715_rom_disable);
3844};
3945
4046
r14844r14845
4248    FLOPPY
4349***************************************************************************/
4450
45static WRITE8_HANDLER( rt1715_floppy_enable )
51WRITE8_MEMBER(rt1715_state::rt1715_floppy_enable)
4652{
47   logerror("%s: rt1715_floppy_enable %02x\n", space->machine().describe_context(), data);
53   logerror("%s: rt1715_floppy_enable %02x\n", machine().describe_context(), data);
4854}
4955
5056
r14844r14845
5359***************************************************************************/
5460
5561/* si/so led */
56static READ8_HANDLER( k7658_led1_r )
62READ8_MEMBER(rt1715_state::k7658_led1_r)
5763{
58   rt1715_state *state = space->machine().driver_data<rt1715_state>();
59   state->m_led1_val ^= 1;
60   logerror("%s: k7658_led1_r %02x\n", space->machine().describe_context(), state->m_led1_val);
64   m_led1_val ^= 1;
65   logerror("%s: k7658_led1_r %02x\n", machine().describe_context(), m_led1_val);
6166   return 0xff;
6267}
6368
6469/* caps led */
65static READ8_HANDLER( k7658_led2_r )
70READ8_MEMBER(rt1715_state::k7658_led2_r)
6671{
67   rt1715_state *state = space->machine().driver_data<rt1715_state>();
68   state->m_led2_val ^= 1;
69   logerror("%s: k7658_led2_r %02x\n", space->machine().describe_context(), state->m_led2_val);
72   m_led2_val ^= 1;
73   logerror("%s: k7658_led2_r %02x\n", machine().describe_context(), m_led2_val);
7074   return 0xff;
7175}
7276
7377/* read key state */
74static READ8_HANDLER( k7658_data_r )
78READ8_MEMBER(rt1715_state::k7658_data_r)
7579{
7680   UINT8 result = 0xff;
7781
78   if (BIT(offset,  0)) result &= input_port_read(space->machine(), "row_00");
79   if (BIT(offset,  1)) result &= input_port_read(space->machine(), "row_10");
80   if (BIT(offset,  2)) result &= input_port_read(space->machine(), "row_20");
81   if (BIT(offset,  3)) result &= input_port_read(space->machine(), "row_30");
82   if (BIT(offset,  4)) result &= input_port_read(space->machine(), "row_40");
83   if (BIT(offset,  5)) result &= input_port_read(space->machine(), "row_50");
84   if (BIT(offset,  6)) result &= input_port_read(space->machine(), "row_60");
85   if (BIT(offset,  7)) result &= input_port_read(space->machine(), "row_70");
86   if (BIT(offset,  8)) result &= input_port_read(space->machine(), "row_08");
87   if (BIT(offset,  9)) result &= input_port_read(space->machine(), "row_18");
88   if (BIT(offset, 10)) result &= input_port_read(space->machine(), "row_28");
89   if (BIT(offset, 11)) result &= input_port_read(space->machine(), "row_38");
90   if (BIT(offset, 12)) result &= input_port_read(space->machine(), "row_48");
82   if (BIT(offset,  0)) result &= input_port_read(machine(), "row_00");
83   if (BIT(offset,  1)) result &= input_port_read(machine(), "row_10");
84   if (BIT(offset,  2)) result &= input_port_read(machine(), "row_20");
85   if (BIT(offset,  3)) result &= input_port_read(machine(), "row_30");
86   if (BIT(offset,  4)) result &= input_port_read(machine(), "row_40");
87   if (BIT(offset,  5)) result &= input_port_read(machine(), "row_50");
88   if (BIT(offset,  6)) result &= input_port_read(machine(), "row_60");
89   if (BIT(offset,  7)) result &= input_port_read(machine(), "row_70");
90   if (BIT(offset,  8)) result &= input_port_read(machine(), "row_08");
91   if (BIT(offset,  9)) result &= input_port_read(machine(), "row_18");
92   if (BIT(offset, 10)) result &= input_port_read(machine(), "row_28");
93   if (BIT(offset, 11)) result &= input_port_read(machine(), "row_38");
94   if (BIT(offset, 12)) result &= input_port_read(machine(), "row_48");
9195
9296   return result;
9397}
9498
9599/* serial output on D0 */
96static WRITE8_HANDLER( k7658_data_w )
100WRITE8_MEMBER(rt1715_state::k7658_data_w)
97101{
98   logerror("%s: k7658_data_w %02x\n", space->machine().describe_context(), BIT(data, 0));
102   logerror("%s: k7658_data_w %02x\n", machine().describe_context(), BIT(data, 0));
99103}
100104
101105
r14844r14845
115119   memory_set_bankptr(machine, "bank1", machine.region("ipl")->base());
116120}
117121
118static WRITE8_HANDLER( rt1715_rom_disable )
122WRITE8_MEMBER(rt1715_state::rt1715_rom_disable)
119123{
120   logerror("%s: rt1715_set_bank %02x\n", space->machine().describe_context(), data);
124   logerror("%s: rt1715_set_bank %02x\n", machine().describe_context(), data);
121125
122126   /* disable ROM, enable RAM */
123   memory_set_bankptr(space->machine(), "bank1", space->machine().device<ram_device>(RAM_TAG)->pointer());
127   memory_set_bankptr(machine(), "bank1", machine().device<ram_device>(RAM_TAG)->pointer());
124128}
125129
126130/***************************************************************************
r14844r14845
191195   AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE_LEGACY("a30", z80ctc_r, z80ctc_w)
192196   AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE_LEGACY("a29", z80sio_ba_cd_r, z80sio_ba_cd_w)
193197   AM_RANGE(0x18, 0x19) AM_DEVREADWRITE_LEGACY("a26", i8275_r, i8275_w)
194   AM_RANGE(0x20, 0x20) AM_WRITE_LEGACY(rt1715_floppy_enable)
195   AM_RANGE(0x28, 0x28) AM_WRITE_LEGACY(rt1715_rom_disable)
198   AM_RANGE(0x20, 0x20) AM_WRITE(rt1715_floppy_enable)
199   AM_RANGE(0x28, 0x28) AM_WRITE(rt1715_rom_disable)
196200ADDRESS_MAP_END
197201
198202static ADDRESS_MAP_START( k7658_mem, AS_PROGRAM, 8, rt1715_state )
199   AM_RANGE(0x0000, 0xffff) AM_WRITE_LEGACY(k7658_data_w)
203   AM_RANGE(0x0000, 0xffff) AM_WRITE(k7658_data_w)
200204   AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0xf800) AM_ROM
201205ADDRESS_MAP_END
202206
203207static ADDRESS_MAP_START( k7658_io, AS_IO, 8, rt1715_state )
204   AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x8000) AM_READ_LEGACY(k7658_led1_r)
205   AM_RANGE(0x4000, 0x4000) AM_MIRROR(0x8000) AM_READ_LEGACY(k7658_led2_r)
206   AM_RANGE(0x8000, 0x9fff) AM_READ_LEGACY(k7658_data_r)
208   AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x8000) AM_READ(k7658_led1_r)
209   AM_RANGE(0x4000, 0x4000) AM_MIRROR(0x8000) AM_READ(k7658_led2_r)
210   AM_RANGE(0x8000, 0x9fff) AM_READ(k7658_data_r)
207211ADDRESS_MAP_END
208212
209213
src/mess/drivers/ex800.c
r14844r14845
139139      : driver_device(mconfig, type, tag) { }
140140
141141   int m_irq_state;
142   DECLARE_READ8_MEMBER(ex800_porta_r);
143   DECLARE_READ8_MEMBER(ex800_portb_r);
144   DECLARE_READ8_MEMBER(ex800_portc_r);
145   DECLARE_WRITE8_MEMBER(ex800_porta_w);
146   DECLARE_WRITE8_MEMBER(ex800_portb_w);
147   DECLARE_WRITE8_MEMBER(ex800_portc_w);
148   DECLARE_READ8_MEMBER(ex800_devsel_r);
149   DECLARE_WRITE8_MEMBER(ex800_devsel_w);
150   DECLARE_READ8_MEMBER(ex800_gate5a_r);
151   DECLARE_WRITE8_MEMBER(ex800_gate5a_w);
152   DECLARE_READ8_MEMBER(ex800_iosel_r);
153   DECLARE_WRITE8_MEMBER(ex800_iosel_w);
154   DECLARE_READ8_MEMBER(ex800_gate7a_r);
155   DECLARE_WRITE8_MEMBER(ex800_gate7a_w);
142156};
143157
144158
r14844r14845
199213}
200214
201215
202static READ8_HANDLER(ex800_porta_r)
216READ8_MEMBER(ex800_state::ex800_porta_r)
203217{
204   logerror("PA R @%x\n", cpu_get_pc(&space->device()));
205   return space->machine().rand();
218   logerror("PA R @%x\n", cpu_get_pc(&space.device()));
219   return machine().rand();
206220}
207221
208static READ8_HANDLER(ex800_portb_r)
222READ8_MEMBER(ex800_state::ex800_portb_r)
209223{
210   logerror("PB R @%x\n", cpu_get_pc(&space->device()));
211   return space->machine().rand();
224   logerror("PB R @%x\n", cpu_get_pc(&space.device()));
225   return machine().rand();
212226}
213227
214static READ8_HANDLER(ex800_portc_r)
228READ8_MEMBER(ex800_state::ex800_portc_r)
215229{
216   logerror("PC R @%x\n", cpu_get_pc(&space->device()));
217   return space->machine().rand();
230   logerror("PC R @%x\n", cpu_get_pc(&space.device()));
231   return machine().rand();
218232}
219233
220static WRITE8_HANDLER(ex800_porta_w)
234WRITE8_MEMBER(ex800_state::ex800_porta_w)
221235{
222236   if (PA6) logerror("BNK0 selected.\n");
223237   if (PA7) logerror("BNK1 selected.\n");
224238
225   logerror("PA W %x @%x\n", data, cpu_get_pc(&space->device()));
239   logerror("PA W %x @%x\n", data, cpu_get_pc(&space.device()));
226240}
227241
228static WRITE8_HANDLER(ex800_portb_w)
242WRITE8_MEMBER(ex800_state::ex800_portb_w)
229243{
230244   if (data & 3)
231      logerror("PB0/1 Line feed @%x\n", cpu_get_pc(&space->device()));
245      logerror("PB0/1 Line feed @%x\n", cpu_get_pc(&space.device()));
232246   if (!(data & 4))
233      logerror("PB2 Line feed @%x\n", cpu_get_pc(&space->device()));
247      logerror("PB2 Line feed @%x\n", cpu_get_pc(&space.device()));
234248   if (data & 8)
235      logerror("PB3 Online LED on @%x\n", cpu_get_pc(&space->device()));
249      logerror("PB3 Online LED on @%x\n", cpu_get_pc(&space.device()));
236250   else
237      logerror("PB3 Online LED off @%x\n", cpu_get_pc(&space->device()));
251      logerror("PB3 Online LED off @%x\n", cpu_get_pc(&space.device()));
238252   if (data & 16)
239      logerror("PB4 Serial @%x\n", cpu_get_pc(&space->device()));
253      logerror("PB4 Serial @%x\n", cpu_get_pc(&space.device()));
240254   if (data & 32)
241      logerror("PB4 Serial @%x\n", cpu_get_pc(&space->device()));
255      logerror("PB4 Serial @%x\n", cpu_get_pc(&space.device()));
242256   if (data & 64)
243      logerror("PB4 Serial @%x\n", cpu_get_pc(&space->device()));
257      logerror("PB4 Serial @%x\n", cpu_get_pc(&space.device()));
244258   if (data & 128)
245      logerror("PB3 Paper empty LED on @%x\n", cpu_get_pc(&space->device()));
259      logerror("PB3 Paper empty LED on @%x\n", cpu_get_pc(&space.device()));
246260   else
247      logerror("PB3 Paper empty LED off @%x\n", cpu_get_pc(&space->device()));
261      logerror("PB3 Paper empty LED off @%x\n", cpu_get_pc(&space.device()));
248262
249//  logerror("PB W %x @%x\n", data, cpu_get_pc(&space->device()));
263//  logerror("PB W %x @%x\n", data, cpu_get_pc(&space.device()));
250264}
251265
252static WRITE8_HANDLER(ex800_portc_w)
266WRITE8_MEMBER(ex800_state::ex800_portc_w)
253267{
254   device_t *speaker = space->machine().device(BEEPER_TAG);
268   device_t *speaker = machine().device(BEEPER_TAG);
255269   if (data & 0x80)
256270      beep_set_state(speaker, 0);
257271   else
258272      beep_set_state(speaker, 1);
259273
260   logerror("PC W %x @%x\n", data, cpu_get_pc(&space->device()));
274   logerror("PC W %x @%x\n", data, cpu_get_pc(&space.device()));
261275}
262276
263277
264278/* Memory mapped I/O access */
265279
266static READ8_HANDLER(ex800_devsel_r)
280READ8_MEMBER(ex800_state::ex800_devsel_r)
267281{
268   logerror("DEVSEL R @%x with offset %x\n", cpu_get_pc(&space->device()), offset);
269   return space->machine().rand();
282   logerror("DEVSEL R @%x with offset %x\n", cpu_get_pc(&space.device()), offset);
283   return machine().rand();
270284}
271285
272static WRITE8_HANDLER(ex800_devsel_w)
286WRITE8_MEMBER(ex800_state::ex800_devsel_w)
273287{
274   logerror("DEVSEL W %x @%x with offset %x\n", data, cpu_get_pc(&space->device()), offset);
288   logerror("DEVSEL W %x @%x with offset %x\n", data, cpu_get_pc(&space.device()), offset);
275289}
276290
277static READ8_HANDLER(ex800_gate5a_r)
291READ8_MEMBER(ex800_state::ex800_gate5a_r)
278292{
279   logerror("GATE5A R @%x with offset %x\n", cpu_get_pc(&space->device()), offset);
280   return space->machine().rand();
293   logerror("GATE5A R @%x with offset %x\n", cpu_get_pc(&space.device()), offset);
294   return machine().rand();
281295}
282296
283static WRITE8_HANDLER(ex800_gate5a_w)
297WRITE8_MEMBER(ex800_state::ex800_gate5a_w)
284298{
285   logerror("GATE5A W %x @%x with offset %x\n", data, cpu_get_pc(&space->device()), offset);
299   logerror("GATE5A W %x @%x with offset %x\n", data, cpu_get_pc(&space.device()), offset);
286300}
287301
288static READ8_HANDLER(ex800_iosel_r)
302READ8_MEMBER(ex800_state::ex800_iosel_r)
289303{
290   logerror("IOSEL R @%x with offset %x\n", cpu_get_pc(&space->device()), offset);
291   return space->machine().rand();
304   logerror("IOSEL R @%x with offset %x\n", cpu_get_pc(&space.device()), offset);
305   return machine().rand();
292306}
293307
294static WRITE8_HANDLER(ex800_iosel_w)
308WRITE8_MEMBER(ex800_state::ex800_iosel_w)
295309{
296   logerror("IOSEL W %x @%x with offset %x\n", data, cpu_get_pc(&space->device()), offset);
310   logerror("IOSEL W %x @%x with offset %x\n", data, cpu_get_pc(&space.device()), offset);
297311}
298312
299static READ8_HANDLER(ex800_gate7a_r)
313READ8_MEMBER(ex800_state::ex800_gate7a_r)
300314{
301   logerror("GATE7A R @%x with offset %x\n", cpu_get_pc(&space->device()), offset);
302   return space->machine().rand();
315   logerror("GATE7A R @%x with offset %x\n", cpu_get_pc(&space.device()), offset);
316   return machine().rand();
303317}
304318
305static WRITE8_HANDLER(ex800_gate7a_w)
319WRITE8_MEMBER(ex800_state::ex800_gate7a_w)
306320{
307   logerror("GATE7A W %x @%x with offset %x\n", data, cpu_get_pc(&space->device()), offset);
321   logerror("GATE7A W %x @%x with offset %x\n", data, cpu_get_pc(&space.device()), offset);
308322}
309323
310324
r14844r14845
316330static ADDRESS_MAP_START( ex800_mem, AS_PROGRAM, 8, ex800_state )
317331   AM_RANGE(0x0000, 0x7fff) AM_ROM AM_REGION("maincpu", 0)
318332   AM_RANGE(0x8000, 0xbfff) AM_RAM /* external RAM */
319   AM_RANGE(0xc000, 0xc7ff) AM_MIRROR(0x1800) AM_READWRITE_LEGACY(ex800_devsel_r, ex800_devsel_w)
320   AM_RANGE(0xe000, 0xe7ff) AM_READWRITE_LEGACY(ex800_gate5a_r, ex800_gate5a_w)
321   AM_RANGE(0xe800, 0xefff) AM_READWRITE_LEGACY(ex800_iosel_r, ex800_iosel_w)
322   AM_RANGE(0xf000, 0xf001) AM_MIRROR(0x07fc) AM_READ_LEGACY(ex800_gate7a_r)
323   AM_RANGE(0xf002, 0xf003) AM_MIRROR(0x07fc) AM_WRITE_LEGACY(ex800_gate7a_w)
333   AM_RANGE(0xc000, 0xc7ff) AM_MIRROR(0x1800) AM_READWRITE(ex800_devsel_r, ex800_devsel_w)
334   AM_RANGE(0xe000, 0xe7ff) AM_READWRITE(ex800_gate5a_r, ex800_gate5a_w)
335   AM_RANGE(0xe800, 0xefff) AM_READWRITE(ex800_iosel_r, ex800_iosel_w)
336   AM_RANGE(0xf000, 0xf001) AM_MIRROR(0x07fc) AM_READ(ex800_gate7a_r)
337   AM_RANGE(0xf002, 0xf003) AM_MIRROR(0x07fc) AM_WRITE(ex800_gate7a_w)
324338   AM_RANGE(0xf800, 0xfeff) AM_NOP /* not connected */
325339   AM_RANGE(0xff00, 0xffff) AM_RAM /* internal CPU RAM */
326340ADDRESS_MAP_END
327341
328342
329343static ADDRESS_MAP_START( ex800_io, AS_IO, 8, ex800_state )
330   AM_RANGE(UPD7810_PORTA, UPD7810_PORTA) AM_READ_LEGACY(ex800_porta_r) AM_WRITE_LEGACY(ex800_porta_w)
331   AM_RANGE(UPD7810_PORTB, UPD7810_PORTB) AM_READ_LEGACY(ex800_portb_r) AM_WRITE_LEGACY(ex800_portb_w)
332   AM_RANGE(UPD7810_PORTC, UPD7810_PORTC) AM_READ_LEGACY(ex800_portc_r) AM_WRITE_LEGACY(ex800_portc_w)
344   AM_RANGE(UPD7810_PORTA, UPD7810_PORTA) AM_READ(ex800_porta_r) AM_WRITE(ex800_porta_w)
345   AM_RANGE(UPD7810_PORTB, UPD7810_PORTB) AM_READ(ex800_portb_r) AM_WRITE(ex800_portb_w)
346   AM_RANGE(UPD7810_PORTC, UPD7810_PORTC) AM_READ(ex800_portc_r) AM_WRITE(ex800_portc_w)
333347ADDRESS_MAP_END
334348
335349
src/mess/drivers/tvc.c
r14844r14845
2222   UINT8 m_keyline;
2323   UINT8 m_flipflop;
2424   UINT8 m_col[4];
25   DECLARE_WRITE8_MEMBER(tvc_bank_w);
26   DECLARE_WRITE8_MEMBER(tvc_video_mode_w);
27   DECLARE_WRITE8_MEMBER(tvc_palette_w);
28   DECLARE_WRITE8_MEMBER(tvc_keyboard_w);
29   DECLARE_READ8_MEMBER(tvc_keyboard_r);
30   DECLARE_READ8_MEMBER(tvc_flipflop_r);
31   DECLARE_WRITE8_MEMBER(tvc_flipflop_w);
32   DECLARE_READ8_MEMBER(tvc_port59_r);
33   DECLARE_WRITE8_MEMBER(tvc_port0_w);
2534};
2635
2736
r14844r14845
7887   }
7988}
8089
81static WRITE8_HANDLER( tvc_bank_w )
90WRITE8_MEMBER(tvc_state::tvc_bank_w)
8291{
83   tvc_set_mem_page(space->machine(), data);
92   tvc_set_mem_page(machine(), data);
8493}
8594
86static WRITE8_HANDLER( tvc_video_mode_w )
95WRITE8_MEMBER(tvc_state::tvc_video_mode_w)
8796{
88   tvc_state *state = space->machine().driver_data<tvc_state>();
89   state->m_video_mode = data & 0x03;
97   m_video_mode = data & 0x03;
9098}
9199
92100
93static WRITE8_HANDLER( tvc_palette_w )
101WRITE8_MEMBER(tvc_state::tvc_palette_w)
94102{
95   tvc_state *state = space->machine().driver_data<tvc_state>();
96103   //  0 I 0 R | 0 G 0 B
97104   //  0 0 0 0 | I R G B
98105   int i = ((data&0x40)>>3) | ((data&0x10)>>2) | ((data&0x04)>>1) | (data&0x01);
99106
100   state->m_col[offset] = i;
107   m_col[offset] = i;
101108}
102109
103static WRITE8_HANDLER( tvc_keyboard_w )
110WRITE8_MEMBER(tvc_state::tvc_keyboard_w)
104111{
105   tvc_state *state = space->machine().driver_data<tvc_state>();
106   state->m_keyline = data;
112   m_keyline = data;
107113}
108114
109static READ8_HANDLER( tvc_keyboard_r )
115READ8_MEMBER(tvc_state::tvc_keyboard_r)
110116{
111   tvc_state *state = space->machine().driver_data<tvc_state>();
112117   static const char *const keynames[] = {
113118      "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7",
114119      "LINE8", "LINE9", "LINEA", "LINEB", "LINEC", "LINED", "LINEE", "LINEF"
115120   };
116   return input_port_read(space->machine(), keynames[state->m_keyline & 0x0f]);
121   return input_port_read(machine(), keynames[m_keyline & 0x0f]);
117122}
118123
119static READ8_HANDLER( tvc_flipflop_r )
124READ8_MEMBER(tvc_state::tvc_flipflop_r)
120125{
121   tvc_state *state = space->machine().driver_data<tvc_state>();
122   return state->m_flipflop;
126   return m_flipflop;
123127}
124128
125static WRITE8_HANDLER( tvc_flipflop_w )
129WRITE8_MEMBER(tvc_state::tvc_flipflop_w)
126130{
127   tvc_state *state = space->machine().driver_data<tvc_state>();
128   state->m_flipflop |= 0x10;
131   m_flipflop |= 0x10;
129132}
130static READ8_HANDLER( tvc_port59_r )
133READ8_MEMBER(tvc_state::tvc_port59_r)
131134{
132135   return 0xff;
133136}
134137
135static WRITE8_HANDLER( tvc_port0_w )
138WRITE8_MEMBER(tvc_state::tvc_port0_w)
136139{
137140}
138141static ADDRESS_MAP_START(tvc_mem, AS_PROGRAM, 8, tvc_state )
r14844r14845
145148static ADDRESS_MAP_START( tvc_io , AS_IO, 8, tvc_state )
146149   ADDRESS_MAP_UNMAP_HIGH
147150   ADDRESS_MAP_GLOBAL_MASK(0xff)
148   AM_RANGE(0x00, 0x00) AM_WRITE_LEGACY(tvc_port0_w)
149   AM_RANGE(0x02, 0x02) AM_WRITE_LEGACY(tvc_bank_w)
150   AM_RANGE(0x03, 0x03) AM_WRITE_LEGACY(tvc_keyboard_w)
151   AM_RANGE(0x06, 0x06) AM_WRITE_LEGACY(tvc_video_mode_w)
152   AM_RANGE(0x07, 0x07) AM_WRITE_LEGACY(tvc_flipflop_w)
153   AM_RANGE(0x58, 0x58) AM_READ_LEGACY(tvc_keyboard_r)
154   AM_RANGE(0x59, 0x59) AM_READ_LEGACY(tvc_flipflop_r)
155   AM_RANGE(0x5a, 0x5a) AM_READ_LEGACY(tvc_port59_r)
156   AM_RANGE(0x60, 0x64) AM_WRITE_LEGACY(tvc_palette_w)
151   AM_RANGE(0x00, 0x00) AM_WRITE(tvc_port0_w)
152   AM_RANGE(0x02, 0x02) AM_WRITE(tvc_bank_w)
153   AM_RANGE(0x03, 0x03) AM_WRITE(tvc_keyboard_w)
154   AM_RANGE(0x06, 0x06) AM_WRITE(tvc_video_mode_w)
155   AM_RANGE(0x07, 0x07) AM_WRITE(tvc_flipflop_w)
156   AM_RANGE(0x58, 0x58) AM_READ(tvc_keyboard_r)
157   AM_RANGE(0x59, 0x59) AM_READ(tvc_flipflop_r)
158   AM_RANGE(0x5a, 0x5a) AM_READ(tvc_port59_r)
159   AM_RANGE(0x60, 0x64) AM_WRITE(tvc_palette_w)
157160   AM_RANGE(0x70, 0x70) AM_DEVWRITE("crtc", mc6845_device, address_w)
158161   AM_RANGE(0x71, 0x71) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
159162ADDRESS_MAP_END
src/mess/drivers/mz2500.c
r14844r14845
111111   UINT8 m_prev_col_val;
112112   UINT8 m_pio_latchb;
113113   UINT8 m_ym_porta;
114   DECLARE_READ8_MEMBER(bank0_r);
115   DECLARE_READ8_MEMBER(bank1_r);
116   DECLARE_READ8_MEMBER(bank2_r);
117   DECLARE_READ8_MEMBER(bank3_r);
118   DECLARE_READ8_MEMBER(bank4_r);
119   DECLARE_READ8_MEMBER(bank5_r);
120   DECLARE_READ8_MEMBER(bank6_r);
121   DECLARE_READ8_MEMBER(bank7_r);
122   DECLARE_WRITE8_MEMBER(bank0_w);
123   DECLARE_WRITE8_MEMBER(bank1_w);
124   DECLARE_WRITE8_MEMBER(bank2_w);
125   DECLARE_WRITE8_MEMBER(bank3_w);
126   DECLARE_WRITE8_MEMBER(bank4_w);
127   DECLARE_WRITE8_MEMBER(bank5_w);
128   DECLARE_WRITE8_MEMBER(bank6_w);
129   DECLARE_WRITE8_MEMBER(bank7_w);
130   DECLARE_READ8_MEMBER(mz2500_bank_addr_r);
131   DECLARE_WRITE8_MEMBER(mz2500_bank_addr_w);
132   DECLARE_READ8_MEMBER(mz2500_bank_data_r);
133   DECLARE_WRITE8_MEMBER(mz2500_bank_data_w);
134   DECLARE_WRITE8_MEMBER(mz2500_kanji_bank_w);
135   DECLARE_WRITE8_MEMBER(mz2500_dictionary_bank_w);
136   DECLARE_READ8_MEMBER(mz2500_crtc_hvblank_r);
137   DECLARE_WRITE8_MEMBER(mz2500_tv_crtc_w);
138   DECLARE_WRITE8_MEMBER(mz2500_irq_sel_w);
139   DECLARE_WRITE8_MEMBER(mz2500_irq_data_w);
140   DECLARE_WRITE8_MEMBER(mz2500_fdc_w);
141   DECLARE_READ8_MEMBER(mz2500_rom_r);
142   DECLARE_WRITE8_MEMBER(mz2500_rom_w);
143   DECLARE_WRITE8_MEMBER(palette4096_io_w);
144   DECLARE_READ8_MEMBER(mz2500_bplane_latch_r);
145   DECLARE_READ8_MEMBER(mz2500_rplane_latch_r);
146   DECLARE_READ8_MEMBER(mz2500_gplane_latch_r);
147   DECLARE_READ8_MEMBER(mz2500_iplane_latch_r);
148   DECLARE_WRITE8_MEMBER(mz2500_cg_addr_w);
149   DECLARE_WRITE8_MEMBER(mz2500_cg_data_w);
150   DECLARE_WRITE8_MEMBER(timer_w);
151   DECLARE_READ8_MEMBER(mz2500_joystick_r);
152   DECLARE_WRITE8_MEMBER(mz2500_joystick_w);
153   DECLARE_READ8_MEMBER(mz2500_kanji_r);
154   DECLARE_WRITE8_MEMBER(mz2500_kanji_w);
155   DECLARE_READ8_MEMBER(rp5c15_8_r);
156   DECLARE_WRITE8_MEMBER(rp5c15_8_w);
157   DECLARE_READ8_MEMBER(mz2500_emm_data_r);
158   DECLARE_WRITE8_MEMBER(mz2500_emm_addr_w);
159   DECLARE_WRITE8_MEMBER(mz2500_emm_data_w);
160   UINT8 mz2500_cg_latch_compare();
161   UINT8 mz2500_ram_read(UINT16 offset, UINT8 bank_num);
162   void mz2500_ram_write(UINT16 offset, UINT8 data, UINT8 bank_num);
114163};
115164
116165
r14844r14845
664713   }
665714}
666715
667static UINT8 mz2500_cg_latch_compare(mz2500_state *state)
716UINT8 mz2500_state::mz2500_cg_latch_compare()
668717{
669   UINT8 compare_val = state->m_cg_reg[0x07] & 0xf;
718   UINT8 compare_val = m_cg_reg[0x07] & 0xf;
670719   UINT8 pix_val;
671720   UINT8 res;
672721   UINT16 i;
r14844r14845
674723
675724   for(i=1;i<0x100;i<<=1)
676725   {
677      pix_val = ((state->m_cg_latch[0] & i) ? 1 : 0) | ((state->m_cg_latch[1] & i) ? 2 : 0) | ((state->m_cg_latch[2] & i) ? 4 : 0) | ((state->m_cg_latch[3] & i) ? 8 : 0);
726      pix_val = ((m_cg_latch[0] & i) ? 1 : 0) | ((m_cg_latch[1] & i) ? 2 : 0) | ((m_cg_latch[2] & i) ? 4 : 0) | ((m_cg_latch[3] & i) ? 8 : 0);
678727      if(pix_val == compare_val)
679728         res|=i;
680729   }
r14844r14845
682731   return res;
683732}
684733
685static UINT8 mz2500_ram_read(running_machine &machine, UINT16 offset, UINT8 bank_num)
734UINT8 mz2500_state::mz2500_ram_read(UINT16 offset, UINT8 bank_num)
686735{
687   mz2500_state *state = machine.driver_data<mz2500_state>();
688   UINT8 *ram = machine.region("maincpu")->base();
689   UINT8 cur_bank = state->m_bank_val[bank_num];
736   UINT8 *ram = machine().region("maincpu")->base();
737   UINT8 cur_bank = m_bank_val[bank_num];
690738
691739   switch(cur_bank)
692740   {
r14844r14845
696744      case 0x33:
697745      {
698746         // READ MODIFY WRITE
699         if(state->m_cg_reg[0x0e] == 0x3)
747         if(m_cg_reg[0x0e] == 0x3)
700748         {
701749            // ...
702750         }
703751         else
704752         {
705753            int plane;
706            state->m_cg_latch[0] = ram[offset+((cur_bank & 3)*0x2000)+0x40000]; //B
707            state->m_cg_latch[1] = ram[offset+((cur_bank & 3)*0x2000)+0x44000]; //R
708            state->m_cg_latch[2] = ram[offset+((cur_bank & 3)*0x2000)+0x48000]; //G
709            state->m_cg_latch[3] = ram[offset+((cur_bank & 3)*0x2000)+0x4c000]; //I
710            plane = state->m_cg_reg[0x07] & 3;
754            m_cg_latch[0] = ram[offset+((cur_bank & 3)*0x2000)+0x40000]; //B
755            m_cg_latch[1] = ram[offset+((cur_bank & 3)*0x2000)+0x44000]; //R
756            m_cg_latch[2] = ram[offset+((cur_bank & 3)*0x2000)+0x48000]; //G
757            m_cg_latch[3] = ram[offset+((cur_bank & 3)*0x2000)+0x4c000]; //I
758            plane = m_cg_reg[0x07] & 3;
711759
712            if(state->m_cg_reg[0x07] & 0x10)
713               return mz2500_cg_latch_compare(state);
760            if(m_cg_reg[0x07] & 0x10)
761               return mz2500_cg_latch_compare();
714762            else
715               return state->m_cg_latch[plane];
763               return m_cg_latch[plane];
716764         }
717765      }
718766      break;
719767      case 0x39:
720768      {
721         if(state->m_kanji_bank & 0x80) //kanji ROM
769         if(m_kanji_bank & 0x80) //kanji ROM
722770         {
723            UINT8 *knj_rom = machine.region("kanji")->base();
771            UINT8 *knj_rom = machine().region("kanji")->base();
724772
725            return knj_rom[(offset & 0x7ff)+((state->m_kanji_bank & 0x7f)*0x800)];
773            return knj_rom[(offset & 0x7ff)+((m_kanji_bank & 0x7f)*0x800)];
726774         }
727775         else //PCG RAM
728776         {
729            UINT8 *pcg_ram = machine.region("pcg")->base();
777            UINT8 *pcg_ram = machine().region("pcg")->base();
730778
731779            return pcg_ram[offset];
732780         }
r14844r14845
734782      break;
735783      case 0x3a:
736784      {
737         UINT8 *dic_rom = machine.region("dictionary")->base();
785         UINT8 *dic_rom = machine().region("dictionary")->base();
738786
739         return dic_rom[(offset & 0x1fff) + ((state->m_dic_bank & 0x1f)*0x2000)];
787         return dic_rom[(offset & 0x1fff) + ((m_dic_bank & 0x1f)*0x2000)];
740788      }
741789      break;
742790      case 0x3c:
r14844r14845
744792      case 0x3e:
745793      case 0x3f:
746794      {
747         UINT8 *phone_rom = machine.region("phone")->base();
795         UINT8 *phone_rom = machine().region("phone")->base();
748796
749797         return phone_rom[offset+(cur_bank & 3)*0x2000];
750798      }
r14844r14845
755803   return 0xff;
756804}
757805
758static void mz2500_ram_write(running_machine &machine, UINT16 offset, UINT8 data, UINT8 bank_num)
806void mz2500_state::mz2500_ram_write(UINT16 offset, UINT8 data, UINT8 bank_num)
759807{
760   mz2500_state *state = machine.driver_data<mz2500_state>();
761   UINT8 *ram = machine.region("maincpu")->base();
762   UINT8 cur_bank = state->m_bank_val[bank_num];
808   UINT8 *ram = machine().region("maincpu")->base();
809   UINT8 cur_bank = m_bank_val[bank_num];
763810
764811//  if(cur_bank >= 0x30 && cur_bank <= 0x33)
765//      printf("CG REG = %02x %02x %02x %02x | offset = %04x | data = %02x\n",state->m_cg_reg[0],state->m_cg_reg[1],state->m_cg_reg[2],state->m_cg_reg[3],offset,data);
812//      printf("CG REG = %02x %02x %02x %02x | offset = %04x | data = %02x\n",m_cg_reg[0],m_cg_reg[1],m_cg_reg[2],m_cg_reg[3],offset,data);
766813
767814   switch(cur_bank)
768815   {
r14844r14845
772819      case 0x33:
773820      {
774821         // READ MODIFY WRITE
775         if(state->m_cg_reg[0x0e] == 0x3)
822         if(m_cg_reg[0x0e] == 0x3)
776823         {
777824            // ...
778825         }
779826         else
780827         {
781            if((state->m_cg_reg[0x05] & 0xc0) == 0x00) //replace
828            if((m_cg_reg[0x05] & 0xc0) == 0x00) //replace
782829            {
783               if(state->m_cg_reg[5] & 1) //B
830               if(m_cg_reg[5] & 1) //B
784831               {
785                  ram[offset+((cur_bank & 3)*0x2000)+0x40000] &= ~state->m_cg_reg[6];
786                  ram[offset+((cur_bank & 3)*0x2000)+0x40000] |= (state->m_cg_reg[4] & 1) ? (data & state->m_cg_reg[0] & state->m_cg_reg[6]) : 0;
832                  ram[offset+((cur_bank & 3)*0x2000)+0x40000] &= ~m_cg_reg[6];
833                  ram[offset+((cur_bank & 3)*0x2000)+0x40000] |= (m_cg_reg[4] & 1) ? (data & m_cg_reg[0] & m_cg_reg[6]) : 0;
787834               }
788               if(state->m_cg_reg[5] & 2) //R
835               if(m_cg_reg[5] & 2) //R
789836               {
790                  ram[offset+((cur_bank & 3)*0x2000)+0x44000] &= ~state->m_cg_reg[6];
791                  ram[offset+((cur_bank & 3)*0x2000)+0x44000] |= (state->m_cg_reg[4] & 2) ? (data & state->m_cg_reg[1] & state->m_cg_reg[6]) : 0;
837                  ram[offset+((cur_bank & 3)*0x2000)+0x44000] &= ~m_cg_reg[6];
838                  ram[offset+((cur_bank & 3)*0x2000)+0x44000] |= (m_cg_reg[4] & 2) ? (data & m_cg_reg[1] & m_cg_reg[6]) : 0;
792839               }
793               if(state->m_cg_reg[5] & 4) //G
840               if(m_cg_reg[5] & 4) //G
794841               {
795                  ram[offset+((cur_bank & 3)*0x2000)+0x48000] &= ~state->m_cg_reg[6];
796                  ram[offset+((cur_bank & 3)*0x2000)+0x48000] |= (state->m_cg_reg[4] & 4) ? (data & state->m_cg_reg[2] & state->m_cg_reg[6]) : 0;
842                  ram[offset+((cur_bank & 3)*0x2000)+0x48000] &= ~m_cg_reg[6];
843                  ram[offset+((cur_bank & 3)*0x2000)+0x48000] |= (m_cg_reg[4] & 4) ? (data & m_cg_reg[2] & m_cg_reg[6]) : 0;
797844               }
798               if(state->m_cg_reg[5] & 8) //I
845               if(m_cg_reg[5] & 8) //I
799846               {
800                  ram[offset+((cur_bank & 3)*0x2000)+0x4c000] &= ~state->m_cg_reg[6];
801                  ram[offset+((cur_bank & 3)*0x2000)+0x4c000] |= (state->m_cg_reg[4] & 8) ? (data & state->m_cg_reg[3] & state->m_cg_reg[6]) : 0;
847                  ram[offset+((cur_bank & 3)*0x2000)+0x4c000] &= ~m_cg_reg[6];
848                  ram[offset+((cur_bank & 3)*0x2000)+0x4c000] |= (m_cg_reg[4] & 8) ? (data & m_cg_reg[3] & m_cg_reg[6]) : 0;
802849               }
803850            }
804            else if((state->m_cg_reg[0x05] & 0xc0) == 0x40) //pset
851            else if((m_cg_reg[0x05] & 0xc0) == 0x40) //pset
805852            {
806               if(state->m_cg_reg[5] & 1) //B
853               if(m_cg_reg[5] & 1) //B
807854               {
808855                  ram[offset+((cur_bank & 3)*0x2000)+0x40000] &= ~data;
809                  ram[offset+((cur_bank & 3)*0x2000)+0x40000] |= (state->m_cg_reg[4] & 1) ? (data & state->m_cg_reg[0]) : 0;
856                  ram[offset+((cur_bank & 3)*0x2000)+0x40000] |= (m_cg_reg[4] & 1) ? (data & m_cg_reg[0]) : 0;
810857               }
811               if(state->m_cg_reg[5] & 2) //R
858               if(m_cg_reg[5] & 2) //R
812859               {
813860                  ram[offset+((cur_bank & 3)*0x2000)+0x44000] &= ~data;
814                  ram[offset+((cur_bank & 3)*0x2000)+0x44000] |= (state->m_cg_reg[4] & 2) ? (data & state->m_cg_reg[1]) : 0;
861                  ram[offset+((cur_bank & 3)*0x2000)+0x44000] |= (m_cg_reg[4] & 2) ? (data & m_cg_reg[1]) : 0;
815862               }
816               if(state->m_cg_reg[5] & 4) //G
863               if(m_cg_reg[5] & 4) //G
817864               {
818865                  ram[offset+((cur_bank & 3)*0x2000)+0x48000] &= ~data;
819                  ram[offset+((cur_bank & 3)*0x2000)+0x48000] |= (state->m_cg_reg[4] & 4) ? (data & state->m_cg_reg[2]) : 0;
866                  ram[offset+((cur_bank & 3)*0x2000)+0x48000] |= (m_cg_reg[4] & 4) ? (data & m_cg_reg[2]) : 0;
820867               }
821               if(state->m_cg_reg[5] & 8) //I
868               if(m_cg_reg[5] & 8) //I
822869               {
823870                  ram[offset+((cur_bank & 3)*0x2000)+0x4c000] &= ~data;
824                  ram[offset+((cur_bank & 3)*0x2000)+0x4c000] |= (state->m_cg_reg[4] & 8) ? (data & state->m_cg_reg[3]) : 0;
871                  ram[offset+((cur_bank & 3)*0x2000)+0x4c000] |= (m_cg_reg[4] & 8) ? (data & m_cg_reg[3]) : 0;
825872               }
826873            }
827874         }
r14844r14845
845892      case 0x39:
846893      {
847894         ram[offset+cur_bank*0x2000] = data;
848         if(state->m_kanji_bank & 0x80) //kanji ROM
895         if(m_kanji_bank & 0x80) //kanji ROM
849896         {
850897            //NOP
851898         }
852899         else //PCG RAM
853900         {
854            UINT8 *pcg_ram = machine.region("pcg")->base();
901            UINT8 *pcg_ram = machine().region("pcg")->base();
855902            pcg_ram[offset] = data;
856903            if((offset & 0x1800) == 0x0000)
857               gfx_element_mark_dirty(machine.gfx[3], (offset) >> 3);
904               gfx_element_mark_dirty(machine().gfx[3], (offset) >> 3);
858905            else
859               gfx_element_mark_dirty(machine.gfx[4], (offset & 0x7ff) >> 3);
906               gfx_element_mark_dirty(machine().gfx[4], (offset & 0x7ff) >> 3);
860907         }
861908         break;
862909      }
r14844r14845
877924   }
878925}
879926
880static READ8_HANDLER( bank0_r ) { return mz2500_ram_read(space->machine(), offset, 0); }
881static READ8_HANDLER( bank1_r ) { return mz2500_ram_read(space->machine(), offset, 1); }
882static READ8_HANDLER( bank2_r ) { return mz2500_ram_read(space->machine(), offset, 2); }
883static READ8_HANDLER( bank3_r ) { return mz2500_ram_read(space->machine(), offset, 3); }
884static READ8_HANDLER( bank4_r ) { return mz2500_ram_read(space->machine(), offset, 4); }
885static READ8_HANDLER( bank5_r ) { return mz2500_ram_read(space->machine(), offset, 5); }
886static READ8_HANDLER( bank6_r ) { return mz2500_ram_read(space->machine(), offset, 6); }
887static READ8_HANDLER( bank7_r ) { return mz2500_ram_read(space->machine(), offset, 7); }
888static WRITE8_HANDLER( bank0_w ) { mz2500_ram_write(space->machine(), offset, data, 0); }
889static WRITE8_HANDLER( bank1_w ) { mz2500_ram_write(space->machine(), offset, data, 1); }
890static WRITE8_HANDLER( bank2_w ) { mz2500_ram_write(space->machine(), offset, data, 2); }
891static WRITE8_HANDLER( bank3_w ) { mz2500_ram_write(space->machine(), offset, data, 3); }
892static WRITE8_HANDLER( bank4_w ) { mz2500_ram_write(space->machine(), offset, data, 4); }
893static WRITE8_HANDLER( bank5_w ) { mz2500_ram_write(space->machine(), offset, data, 5); }
894static WRITE8_HANDLER( bank6_w ) { mz2500_ram_write(space->machine(), offset, data, 6); }
895static WRITE8_HANDLER( bank7_w ) { mz2500_ram_write(space->machine(), offset, data, 7); }
927READ8_MEMBER(mz2500_state::bank0_r){ return mz2500_ram_read(offset, 0); }
928READ8_MEMBER(mz2500_state::bank1_r){ return mz2500_ram_read(offset, 1); }
929READ8_MEMBER(mz2500_state::bank2_r){ return mz2500_ram_read(offset, 2); }
930READ8_MEMBER(mz2500_state::bank3_r){ return mz2500_ram_read(offset, 3); }
931READ8_MEMBER(mz2500_state::bank4_r){ return mz2500_ram_read(offset, 4); }
932READ8_MEMBER(mz2500_state::bank5_r){ return mz2500_ram_read(offset, 5); }
933READ8_MEMBER(mz2500_state::bank6_r){ return mz2500_ram_read(offset, 6); }
934READ8_MEMBER(mz2500_state::bank7_r){ return mz2500_ram_read(offset, 7); }
935WRITE8_MEMBER(mz2500_state::bank0_w){ mz2500_ram_write(offset, data, 0); }
936WRITE8_MEMBER(mz2500_state::bank1_w){ mz2500_ram_write(offset, data, 1); }
937WRITE8_MEMBER(mz2500_state::bank2_w){ mz2500_ram_write(offset, data, 2); }
938WRITE8_MEMBER(mz2500_state::bank3_w){ mz2500_ram_write(offset, data, 3); }
939WRITE8_MEMBER(mz2500_state::bank4_w){ mz2500_ram_write(offset, data, 4); }
940WRITE8_MEMBER(mz2500_state::bank5_w){ mz2500_ram_write(offset, data, 5); }
941WRITE8_MEMBER(mz2500_state::bank6_w){ mz2500_ram_write(offset, data, 6); }
942WRITE8_MEMBER(mz2500_state::bank7_w){ mz2500_ram_write(offset, data, 7); }
896943
897944
898static READ8_HANDLER( mz2500_bank_addr_r )
945READ8_MEMBER(mz2500_state::mz2500_bank_addr_r)
899946{
900   mz2500_state *state = space->machine().driver_data<mz2500_state>();
901   return state->m_bank_addr;
947   return m_bank_addr;
902948}
903949
904static WRITE8_HANDLER( mz2500_bank_addr_w )
950WRITE8_MEMBER(mz2500_state::mz2500_bank_addr_w)
905951{
906   mz2500_state *state = space->machine().driver_data<mz2500_state>();
907952//  printf("%02x\n",data);
908   state->m_bank_addr = data & 7;
953   m_bank_addr = data & 7;
909954}
910955
911static READ8_HANDLER( mz2500_bank_data_r )
956READ8_MEMBER(mz2500_state::mz2500_bank_data_r)
912957{
913   mz2500_state *state = space->machine().driver_data<mz2500_state>();
914958   UINT8 res;
915959
916   res = state->m_bank_val[state->m_bank_addr];
960   res = m_bank_val[m_bank_addr];
917961
918   state->m_bank_addr++;
919   state->m_bank_addr&=7;
962   m_bank_addr++;
963   m_bank_addr&=7;
920964
921965   return res;
922966}
923967
924static WRITE8_HANDLER( mz2500_bank_data_w )
968WRITE8_MEMBER(mz2500_state::mz2500_bank_data_w)
925969{
926   mz2500_state *state = space->machine().driver_data<mz2500_state>();
927//  UINT8 *ROM = space->machine().region("maincpu")->base();
970//  UINT8 *ROM = machine().region("maincpu")->base();
928971//  static const char *const bank_name[] = { "bank0", "bank1", "bank2", "bank3", "bank4", "bank5", "bank6", "bank7" };
929972
930   state->m_bank_val[state->m_bank_addr] = data & 0x3f;
973   m_bank_val[m_bank_addr] = data & 0x3f;
931974
932975//  if((data*2) >= 0x70)
933//  printf("%s %02x\n",bank_name[state->m_bank_addr],state->m_bank_val[state->m_bank_addr]*2);
976//  printf("%s %02x\n",bank_name[m_bank_addr],m_bank_val[m_bank_addr]*2);
934977
935//  memory_set_bankptr(space->machine(), bank_name[state->m_bank_addr], &ROM[state->m_bank_val[state->m_bank_addr]*0x2000]);
978//  memory_set_bankptr(machine(), bank_name[m_bank_addr], &ROM[m_bank_val[m_bank_addr]*0x2000]);
936979
937   state->m_bank_addr++;
938   state->m_bank_addr&=7;
980   m_bank_addr++;
981   m_bank_addr&=7;
939982}
940983
941static WRITE8_HANDLER( mz2500_kanji_bank_w )
984WRITE8_MEMBER(mz2500_state::mz2500_kanji_bank_w)
942985{
943   mz2500_state *state = space->machine().driver_data<mz2500_state>();
944   state->m_kanji_bank = data;
986   m_kanji_bank = data;
945987}
946988
947static WRITE8_HANDLER( mz2500_dictionary_bank_w )
989WRITE8_MEMBER(mz2500_state::mz2500_dictionary_bank_w)
948990{
949   mz2500_state *state = space->machine().driver_data<mz2500_state>();
950   state->m_dic_bank = data;
991   m_dic_bank = data;
951992}
952993
953994/* 0xf4 - 0xf7 all returns vblank / hblank states */
954static READ8_HANDLER( mz2500_crtc_hvblank_r )
995READ8_MEMBER(mz2500_state::mz2500_crtc_hvblank_r)
955996{
956997   UINT8 vblank_bit, hblank_bit;
957998
958   vblank_bit = space->machine().primary_screen->vblank() ? 0 : 1;
959   hblank_bit = space->machine().primary_screen->hblank() ? 0 : 2;
999   vblank_bit = machine().primary_screen->vblank() ? 0 : 1;
1000   hblank_bit = machine().primary_screen->hblank() ? 0 : 2;
9601001
9611002   return vblank_bit | hblank_bit;
9621003}
r14844r14845
10001041   return val;
10011042}
10021043
1003static WRITE8_HANDLER( mz2500_tv_crtc_w )
1044WRITE8_MEMBER(mz2500_state::mz2500_tv_crtc_w)
10041045{
1005   mz2500_state *state = space->machine().driver_data<mz2500_state>();
10061046   switch(offset)
10071047   {
1008      case 0: state->m_text_reg_index = data; break;
1048      case 0: m_text_reg_index = data; break;
10091049      case 1:
1010         state->m_text_reg[state->m_text_reg_index] = data;
1050         m_text_reg[m_text_reg_index] = data;
10111051
10121052         #if 0
1013         //printf("[%02x] <- %02x\n",state->m_text_reg_index,data);
1053         //printf("[%02x] <- %02x\n",m_text_reg_index,data);
10141054         popmessage("(%02x %02x) (%02x %02x %02x %02x) (%02x %02x %02x) (%02x %02x %02x %02x)"
1015         ,state->m_text_reg[0] & ~0x1e,state->m_text_reg[3]
1016         ,state->m_text_reg[4],state->m_text_reg[5],state->m_text_reg[6],state->m_text_reg[7]
1017         ,state->m_text_reg[8],state->m_text_reg[10],state->m_text_reg[11]
1018         ,state->m_text_reg[12],state->m_text_reg[13],state->m_text_reg[14],state->m_text_reg[15]);
1055         ,m_text_reg[0] & ~0x1e,m_text_reg[3]
1056         ,m_text_reg[4],m_text_reg[5],m_text_reg[6],m_text_reg[7]
1057         ,m_text_reg[8],m_text_reg[10],m_text_reg[11]
1058         ,m_text_reg[12],m_text_reg[13],m_text_reg[14],m_text_reg[15]);
10191059
10201060         #endif
1021         //popmessage("%d %02x %d %02x %d %d",state->m_text_reg[3],state->m_text_reg[4],state->m_text_reg[5],state->m_text_reg[6],state->m_text_reg[7]*8,state->m_text_reg[8]*8);
1061         //popmessage("%d %02x %d %02x %d %d",m_text_reg[3],m_text_reg[4],m_text_reg[5],m_text_reg[6],m_text_reg[7]*8,m_text_reg[8]*8);
10221062
1023         mz2500_reconfigure_screen(space->machine());
1063         mz2500_reconfigure_screen(machine());
10241064
1025         if(state->m_text_reg_index == 0x0a) // set 256 color palette
1065         if(m_text_reg_index == 0x0a) // set 256 color palette
10261066         {
10271067            int i,r,g,b;
10281068            UINT8 b_param,r_param,g_param;
r14844r14845
10481088               bit2 = i & 0x40 ? 4 : 0;
10491089               g = bit0|bit1|bit2;
10501090
1051               palette_set_color_rgb(space->machine(), i+0x100,pal3bit(r),pal3bit(g),pal3bit(b));
1091               palette_set_color_rgb(machine(), i+0x100,pal3bit(r),pal3bit(g),pal3bit(b));
10521092            }
10531093         }
1054         if(state->m_text_reg_index >= 0x80 && state->m_text_reg_index <= 0x8f) //Bitmap 16 clut registers
1094         if(m_text_reg_index >= 0x80 && m_text_reg_index <= 0x8f) //Bitmap 16 clut registers
10551095         {
10561096            /*
10571097                ---x ---- priority
10581098                ---- xxxx clut number
10591099                */
1060            state->m_clut16[state->m_text_reg_index & 0xf] = data & 0x1f;
1061            //printf("%02x -> [%02x]\n",state->m_text_reg[state->m_text_reg_index],state->m_text_reg_index);
1100            m_clut16[m_text_reg_index & 0xf] = data & 0x1f;
1101            //printf("%02x -> [%02x]\n",m_text_reg[m_text_reg_index],m_text_reg_index);
10621102
10631103            {
10641104               int i;
10651105
10661106               for(i=0;i<0x10;i++)
10671107               {
1068                  state->m_clut256[(state->m_text_reg_index & 0xf) | (i << 4)] = (((data & 0x1f) << 4) | i);
1108                  m_clut256[(m_text_reg_index & 0xf) | (i << 4)] = (((data & 0x1f) << 4) | i);
10691109               }
10701110            }
10711111         }
10721112         break;
10731113      case 2: /* CG Mask reg (priority mixer) */
1074         state->m_cg_mask = data;
1114         m_cg_mask = data;
10751115         break;
10761116      case 3:
10771117         /* Font size reg */
1078         state->m_text_font_reg = data & 1;
1079         mz2500_reconfigure_screen(space->machine());
1118         m_text_font_reg = data & 1;
1119         mz2500_reconfigure_screen(machine());
10801120         break;
10811121   }
10821122}
10831123
1084static WRITE8_HANDLER( mz2500_irq_sel_w )
1124WRITE8_MEMBER(mz2500_state::mz2500_irq_sel_w)
10851125{
1086   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1087   state->m_irq_sel = data;
1088   //printf("%02x\n",state->m_irq_sel);
1126   m_irq_sel = data;
1127   //printf("%02x\n",m_irq_sel);
10891128   // activeness is trusted, see Tower of Druaga
1090   state->m_irq_mask[0] = (data & 0x08); //CRTC
1091   state->m_irq_mask[1] = (data & 0x04); //i8253
1092   state->m_irq_mask[2] = (data & 0x02); //printer
1093   state->m_irq_mask[3] = (data & 0x01); //RP5c15
1129   m_irq_mask[0] = (data & 0x08); //CRTC
1130   m_irq_mask[1] = (data & 0x04); //i8253
1131   m_irq_mask[2] = (data & 0x02); //printer
1132   m_irq_mask[3] = (data & 0x01); //RP5c15
10941133}
10951134
1096static WRITE8_HANDLER( mz2500_irq_data_w )
1135WRITE8_MEMBER(mz2500_state::mz2500_irq_data_w)
10971136{
1098   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1099   if(state->m_irq_sel & 0x80)
1100      state->m_irq_vector[0] = data; //CRTC
1101   if(state->m_irq_sel & 0x40)
1102      state->m_irq_vector[1] = data; //i8253
1103   if(state->m_irq_sel & 0x20)
1104      state->m_irq_vector[2] = data; //printer
1105   if(state->m_irq_sel & 0x10)
1106      state->m_irq_vector[3] = data; //RP5c15
1137   if(m_irq_sel & 0x80)
1138      m_irq_vector[0] = data; //CRTC
1139   if(m_irq_sel & 0x40)
1140      m_irq_vector[1] = data; //i8253
1141   if(m_irq_sel & 0x20)
1142      m_irq_vector[2] = data; //printer
1143   if(m_irq_sel & 0x10)
1144      m_irq_vector[3] = data; //RP5c15
11071145
1108//  popmessage("%02x %02x %02x %02x",state->m_irq_vector[0],state->m_irq_vector[1],state->m_irq_vector[2],state->m_irq_vector[3]);
1146//  popmessage("%02x %02x %02x %02x",m_irq_vector[0],m_irq_vector[1],m_irq_vector[2],m_irq_vector[3]);
11091147}
11101148
1111static WRITE8_HANDLER( mz2500_fdc_w )
1149WRITE8_MEMBER(mz2500_state::mz2500_fdc_w)
11121150{
1113   device_t* dev = space->machine().device("mb8877a");
1151   device_t* dev = machine().device("mb8877a");
11141152
11151153   switch(offset+0xdc)
11161154   {
11171155      case 0xdc:
11181156         wd17xx_set_drive(dev,data & 3);
1119         floppy_mon_w(floppy_get_device(space->machine(), data & 3), (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
1120         floppy_drive_set_ready_state(floppy_get_device(space->machine(), data & 3), 1,0);
1157         floppy_mon_w(floppy_get_device(machine(), data & 3), (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
1158         floppy_drive_set_ready_state(floppy_get_device(machine(), data & 3), 1,0);
11211159         break;
11221160      case 0xdd:
11231161         wd17xx_set_side(dev,(data & 1));
r14844r14845
11561194};
11571195
11581196static ADDRESS_MAP_START(mz2500_map, AS_PROGRAM, 8, mz2500_state )
1159   AM_RANGE(0x0000, 0x1fff) AM_READWRITE_LEGACY(bank0_r,bank0_w)
1160   AM_RANGE(0x2000, 0x3fff) AM_READWRITE_LEGACY(bank1_r,bank1_w)
1161   AM_RANGE(0x4000, 0x5fff) AM_READWRITE_LEGACY(bank2_r,bank2_w)
1162   AM_RANGE(0x6000, 0x7fff) AM_READWRITE_LEGACY(bank3_r,bank3_w)
1163   AM_RANGE(0x8000, 0x9fff) AM_READWRITE_LEGACY(bank4_r,bank4_w)
1164   AM_RANGE(0xa000, 0xbfff) AM_READWRITE_LEGACY(bank5_r,bank5_w)
1165   AM_RANGE(0xc000, 0xdfff) AM_READWRITE_LEGACY(bank6_r,bank6_w)
1166   AM_RANGE(0xe000, 0xffff) AM_READWRITE_LEGACY(bank7_r,bank7_w)
1197   AM_RANGE(0x0000, 0x1fff) AM_READWRITE(bank0_r,bank0_w)
1198   AM_RANGE(0x2000, 0x3fff) AM_READWRITE(bank1_r,bank1_w)
1199   AM_RANGE(0x4000, 0x5fff) AM_READWRITE(bank2_r,bank2_w)
1200   AM_RANGE(0x6000, 0x7fff) AM_READWRITE(bank3_r,bank3_w)
1201   AM_RANGE(0x8000, 0x9fff) AM_READWRITE(bank4_r,bank4_w)
1202   AM_RANGE(0xa000, 0xbfff) AM_READWRITE(bank5_r,bank5_w)
1203   AM_RANGE(0xc000, 0xdfff) AM_READWRITE(bank6_r,bank6_w)
1204   AM_RANGE(0xe000, 0xffff) AM_READWRITE(bank7_r,bank7_w)
11671205ADDRESS_MAP_END
11681206
11691207
1170static READ8_HANDLER( mz2500_rom_r )
1208READ8_MEMBER(mz2500_state::mz2500_rom_r)
11711209{
1172   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1173   UINT8 *rom = space->machine().region("rom")->base();
1210   UINT8 *rom = machine().region("rom")->base();
11741211   UINT8 res;
11751212
1176   state->m_lrom_index = (cpu_get_reg(space->machine().device("maincpu"), Z80_B));
1213   m_lrom_index = (cpu_get_reg(machine().device("maincpu"), Z80_B));
11771214
1178   state->m_rom_index = (state->m_rom_index & 0xffff00) | (state->m_lrom_index & 0xff);
1215   m_rom_index = (m_rom_index & 0xffff00) | (m_lrom_index & 0xff);
11791216
1180   res = rom[state->m_rom_index];
1217   res = rom[m_rom_index];
11811218
11821219   return res;
11831220}
11841221
1185static WRITE8_HANDLER( mz2500_rom_w )
1222WRITE8_MEMBER(mz2500_state::mz2500_rom_w)
11861223{
1187   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1188   state->m_hrom_index = (cpu_get_reg(space->machine().device("maincpu"), Z80_B));
1224   m_hrom_index = (cpu_get_reg(machine().device("maincpu"), Z80_B));
11891225
1190   state->m_rom_index = (data << 8) | (state->m_rom_index & 0x0000ff) | ((state->m_hrom_index & 0xff)<<16);
1226   m_rom_index = (data << 8) | (m_rom_index & 0x0000ff) | ((m_hrom_index & 0xff)<<16);
11911227   //printf("%02x\n",data);
11921228}
11931229
11941230/* sets 16 color entries out of 4096 possible combinations */
1195static WRITE8_HANDLER( palette4096_io_w )
1231WRITE8_MEMBER(mz2500_state::palette4096_io_w)
11961232{
1197   mz2500_state *state = space->machine().driver_data<mz2500_state>();
11981233   UINT8 pal_index;
11991234   UINT8 pal_entry;
12001235
1201   pal_index = cpu_get_reg(space->machine().device("maincpu"), Z80_B);
1236   pal_index = cpu_get_reg(machine().device("maincpu"), Z80_B);
12021237   pal_entry = (pal_index & 0x1e) >> 1;
12031238
12041239   if(pal_index & 1)
1205      state->m_pal[pal_entry].g = (data & 0x0f);
1240      m_pal[pal_entry].g = (data & 0x0f);
12061241   else
12071242   {
1208      state->m_pal[pal_entry].r = (data & 0xf0) >> 4;
1209      state->m_pal[pal_entry].b = data & 0x0f;
1243      m_pal[pal_entry].r = (data & 0xf0) >> 4;
1244      m_pal[pal_entry].b = data & 0x0f;
12101245   }
12111246
1212   palette_set_color_rgb(space->machine(), pal_entry+0x10, pal4bit(state->m_pal[pal_entry].r), pal4bit(state->m_pal[pal_entry].g), pal4bit(state->m_pal[pal_entry].b));
1247   palette_set_color_rgb(machine(), pal_entry+0x10, pal4bit(m_pal[pal_entry].r), pal4bit(m_pal[pal_entry].g), pal4bit(m_pal[pal_entry].b));
12131248}
12141249
12151250static READ8_DEVICE_HANDLER( mz2500_wd17xx_r )
r14844r14845
12241259   wd17xx_w(device, offset, data ^ state->m_fdc_reverse);
12251260}
12261261
1227static READ8_HANDLER( mz2500_bplane_latch_r )
1262READ8_MEMBER(mz2500_state::mz2500_bplane_latch_r)
12281263{
1229   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1230   if(state->m_cg_reg[7] & 0x10)
1231      return mz2500_cg_latch_compare(state);
1264   if(m_cg_reg[7] & 0x10)
1265      return mz2500_cg_latch_compare();
12321266   else
1233      return state->m_cg_latch[0];
1267      return m_cg_latch[0];
12341268}
12351269
12361270
1237static READ8_HANDLER( mz2500_rplane_latch_r )
1271READ8_MEMBER(mz2500_state::mz2500_rplane_latch_r)
12381272{
1239   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1240   if(state->m_cg_reg[0x07] & 0x10)
1273   if(m_cg_reg[0x07] & 0x10)
12411274   {
12421275      UINT8 vblank_bit;
12431276
1244      vblank_bit = space->machine().primary_screen->vblank() ? 0 : 0x80 | state->m_cg_clear_flag;
1277      vblank_bit = machine().primary_screen->vblank() ? 0 : 0x80 | m_cg_clear_flag;
12451278
12461279      return vblank_bit;
12471280   }
12481281   else
1249      return state->m_cg_latch[1];
1282      return m_cg_latch[1];
12501283}
12511284
1252static READ8_HANDLER( mz2500_gplane_latch_r )
1285READ8_MEMBER(mz2500_state::mz2500_gplane_latch_r)
12531286{
1254   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1255   return state->m_cg_latch[2];
1287   return m_cg_latch[2];
12561288}
12571289
1258static READ8_HANDLER( mz2500_iplane_latch_r )
1290READ8_MEMBER(mz2500_state::mz2500_iplane_latch_r)
12591291{
1260   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1261   return state->m_cg_latch[3];
1292   return m_cg_latch[3];
12621293}
12631294
12641295/*
r14844r14845
129113220x18: CG color masking
12921323*/
12931324
1294static WRITE8_HANDLER( mz2500_cg_addr_w )
1325WRITE8_MEMBER(mz2500_state::mz2500_cg_addr_w)
12951326{
1296   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1297   state->m_cg_reg_index = data;
1327   m_cg_reg_index = data;
12981328}
12991329
1300static WRITE8_HANDLER( mz2500_cg_data_w )
1330WRITE8_MEMBER(mz2500_state::mz2500_cg_data_w)
13011331{
1302   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1303   state->m_cg_reg[state->m_cg_reg_index & 0x1f] = data;
1332   m_cg_reg[m_cg_reg_index & 0x1f] = data;
13041333
1305   if((state->m_cg_reg_index & 0x1f) == 0x08) //accessing VS LO reg clears VS HI reg
1306      state->m_cg_reg[0x09] = 0;
1334   if((m_cg_reg_index & 0x1f) == 0x08) //accessing VS LO reg clears VS HI reg
1335      m_cg_reg[0x09] = 0;
13071336
1308   if((state->m_cg_reg_index & 0x1f) == 0x0a) //accessing VE LO reg clears VE HI reg
1309      state->m_cg_reg[0x0b] = 0;
1337   if((m_cg_reg_index & 0x1f) == 0x0a) //accessing VE LO reg clears VE HI reg
1338      m_cg_reg[0x0b] = 0;
13101339
1311   if((state->m_cg_reg_index & 0x1f) == 0x05 && (state->m_cg_reg[0x05] & 0xc0) == 0x80) //clear bitmap buffer
1340   if((m_cg_reg_index & 0x1f) == 0x05 && (m_cg_reg[0x05] & 0xc0) == 0x80) //clear bitmap buffer
13121341   {
13131342      UINT32 i;
1314      UINT8 *vram = space->machine().region("maincpu")->base();
1343      UINT8 *vram = machine().region("maincpu")->base();
13151344      UINT32 layer_bank;
13161345
1317      layer_bank = (state->m_cg_reg[0x0e] & 0x80) ? 0x10000 : 0x00000;
1346      layer_bank = (m_cg_reg[0x0e] & 0x80) ? 0x10000 : 0x00000;
13181347
13191348      /* TODO: this isn't yet 100% accurate */
1320      if(state->m_cg_reg[0x05] & 1)
1349      if(m_cg_reg[0x05] & 1)
13211350      {
13221351         for(i=0;i<0x4000;i++)
13231352            vram[i+0x40000+layer_bank] = 0x00; //clear B
13241353      }
1325      if(state->m_cg_reg[0x05] & 2)
1354      if(m_cg_reg[0x05] & 2)
13261355      {
13271356         for(i=0;i<0x4000;i++)
13281357            vram[i+0x44000+layer_bank] = 0x00; //clear R
13291358      }
1330      if(state->m_cg_reg[0x05] & 4)
1359      if(m_cg_reg[0x05] & 4)
13311360      {
13321361         for(i=0;i<0x4000;i++)
13331362            vram[i+0x48000+layer_bank] = 0x00; //clear G
13341363      }
1335      if(state->m_cg_reg[0x05] & 8)
1364      if(m_cg_reg[0x05] & 8)
13361365      {
13371366         for(i=0;i<0x4000;i++)
13381367            vram[i+0x4c000+layer_bank] = 0x00; //clear I
13391368      }
1340      state->m_cg_clear_flag = 1;
1369      m_cg_clear_flag = 1;
13411370   }
13421371
13431372   {
1344      mz2500_reconfigure_screen(space->machine());
1373      mz2500_reconfigure_screen(machine());
13451374   }
13461375
1347   if(state->m_cg_reg_index & 0x80) //enable auto-inc
1348      state->m_cg_reg_index = (state->m_cg_reg_index & 0xfc) | ((state->m_cg_reg_index + 1) & 0x03);
1376   if(m_cg_reg_index & 0x80) //enable auto-inc
1377      m_cg_reg_index = (m_cg_reg_index & 0xfc) | ((m_cg_reg_index + 1) & 0x03);
13491378}
13501379
1351static WRITE8_HANDLER( timer_w )
1380WRITE8_MEMBER(mz2500_state::timer_w)
13521381{
1353   device_t *pit8253 = space->machine().device("pit");
1382   device_t *pit8253 = machine().device("pit");
13541383
13551384   pit8253_gate0_w(pit8253, 1);
13561385   pit8253_gate1_w(pit8253, 1);
r14844r14845
13611390}
13621391
13631392
1364static READ8_HANDLER( mz2500_joystick_r )
1393READ8_MEMBER(mz2500_state::mz2500_joystick_r)
13651394{
1366   mz2500_state *state = space->machine().driver_data<mz2500_state>();
13671395   UINT8 res,dir_en,in_r;
13681396
13691397   res = 0xff;
1370   in_r = ~input_port_read(space->machine(), state->m_joy_mode & 0x40 ? "JOY_2P" : "JOY_1P");
1398   in_r = ~input_port_read(machine(), m_joy_mode & 0x40 ? "JOY_2P" : "JOY_1P");
13711399
1372   if(state->m_joy_mode & 0x40)
1400   if(m_joy_mode & 0x40)
13731401   {
1374      if(!(state->m_joy_mode & 0x04)) res &= ~0x20;
1375      if(!(state->m_joy_mode & 0x08)) res &= ~0x10;
1376      dir_en = (state->m_joy_mode & 0x20) ? 0 : 1;
1402      if(!(m_joy_mode & 0x04)) res &= ~0x20;
1403      if(!(m_joy_mode & 0x08)) res &= ~0x10;
1404      dir_en = (m_joy_mode & 0x20) ? 0 : 1;
13771405   }
13781406   else
13791407   {
1380      if(!(state->m_joy_mode & 0x01)) res &= ~0x20;
1381      if(!(state->m_joy_mode & 0x02)) res &= ~0x10;
1382      dir_en = (state->m_joy_mode & 0x10) ? 0 : 1;
1408      if(!(m_joy_mode & 0x01)) res &= ~0x20;
1409      if(!(m_joy_mode & 0x02)) res &= ~0x10;
1410      dir_en = (m_joy_mode & 0x10) ? 0 : 1;
13831411   }
13841412
13851413   if(dir_en)
r14844r14845
13901418   return res;
13911419}
13921420
1393static WRITE8_HANDLER( mz2500_joystick_w )
1421WRITE8_MEMBER(mz2500_state::mz2500_joystick_w)
13941422{
1395   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1396   state->m_joy_mode = data;
1423   m_joy_mode = data;
13971424}
13981425
13991426
1400static READ8_HANDLER( mz2500_kanji_r )
1427READ8_MEMBER(mz2500_state::mz2500_kanji_r)
14011428{
1402   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1403   UINT8 *knj2_rom = space->machine().region("kanji2")->base();
1429   UINT8 *knj2_rom = machine().region("kanji2")->base();
14041430
14051431   printf("Read from kanji 2 ROM\n");
14061432
1407   return knj2_rom[(state->m_kanji_index << 1) | (offset & 1)];
1433   return knj2_rom[(m_kanji_index << 1) | (offset & 1)];
14081434}
14091435
1410static WRITE8_HANDLER( mz2500_kanji_w )
1436WRITE8_MEMBER(mz2500_state::mz2500_kanji_w)
14111437{
1412   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1413   (offset & 1) ? (state->m_kanji_index = (data << 8) | (state->m_kanji_index & 0xff)) : (state->m_kanji_index = (data & 0xff) | (state->m_kanji_index & 0xff00));
1438   (offset & 1) ? (m_kanji_index = (data << 8) | (m_kanji_index & 0xff)) : (m_kanji_index = (data & 0xff) | (m_kanji_index & 0xff00));
14141439}
14151440
1416static READ8_HANDLER( rp5c15_8_r )
1441READ8_MEMBER(mz2500_state::rp5c15_8_r)
14171442{
1418   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1419   UINT8 rtc_index = (cpu_get_reg(space->machine().device("maincpu"), Z80_B));
1443   UINT8 rtc_index = (cpu_get_reg(machine().device("maincpu"), Z80_B));
14201444
1421   return state->m_rtc->read(*space, rtc_index);
1445   return m_rtc->read(*&space, rtc_index);
14221446}
14231447
1424static WRITE8_HANDLER( rp5c15_8_w )
1448WRITE8_MEMBER(mz2500_state::rp5c15_8_w)
14251449{
1426   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1427   UINT8 rtc_index = (cpu_get_reg(space->machine().device("maincpu"), Z80_B));
1450   UINT8 rtc_index = (cpu_get_reg(machine().device("maincpu"), Z80_B));
14281451
1429   state->m_rtc->write(*space, rtc_index, data);
1452   m_rtc->write(*&space, rtc_index, data);
14301453}
14311454
14321455
1433static READ8_HANDLER( mz2500_emm_data_r )
1456READ8_MEMBER(mz2500_state::mz2500_emm_data_r)
14341457{
1435   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1436   UINT8 *emm_ram = space->machine().region("emm")->base();
1458   UINT8 *emm_ram = machine().region("emm")->base();
14371459   UINT8 emm_lo_index;
14381460
1439   emm_lo_index = (cpu_get_reg(space->machine().device("maincpu"), Z80_B));
1461   emm_lo_index = (cpu_get_reg(machine().device("maincpu"), Z80_B));
14401462
1441   state->m_emm_offset = (state->m_emm_offset & 0xffff00) | (emm_lo_index & 0xff);
1463   m_emm_offset = (m_emm_offset & 0xffff00) | (emm_lo_index & 0xff);
14421464
1443   if(state->m_emm_offset < 0x100000) //emm max size
1444      return emm_ram[state->m_emm_offset];
1465   if(m_emm_offset < 0x100000) //emm max size
1466      return emm_ram[m_emm_offset];
14451467
14461468   return 0xff;
14471469}
14481470
1449static WRITE8_HANDLER( mz2500_emm_addr_w )
1471WRITE8_MEMBER(mz2500_state::mz2500_emm_addr_w)
14501472{
1451   mz2500_state *state = space->machine().driver_data<mz2500_state>();
14521473   UINT8 emm_hi_index;
14531474
1454   emm_hi_index = (cpu_get_reg(space->machine().device("maincpu"), Z80_B));
1475   emm_hi_index = (cpu_get_reg(machine().device("maincpu"), Z80_B));
14551476
1456   state->m_emm_offset = ((emm_hi_index & 0xff) << 16) | ((data & 0xff) << 8) | (state->m_emm_offset & 0xff);
1477   m_emm_offset = ((emm_hi_index & 0xff) << 16) | ((data & 0xff) << 8) | (m_emm_offset & 0xff);
14571478}
14581479
1459static WRITE8_HANDLER( mz2500_emm_data_w )
1480WRITE8_MEMBER(mz2500_state::mz2500_emm_data_w)
14601481{
1461   mz2500_state *state = space->machine().driver_data<mz2500_state>();
1462   UINT8 *emm_ram = space->machine().region("emm")->base();
1482   UINT8 *emm_ram = machine().region("emm")->base();
14631483   UINT8 emm_lo_index;
14641484
1465   emm_lo_index = (cpu_get_reg(space->machine().device("maincpu"), Z80_B));
1485   emm_lo_index = (cpu_get_reg(machine().device("maincpu"), Z80_B));
14661486
1467   state->m_emm_offset = (state->m_emm_offset & 0xffff00) | (emm_lo_index & 0xff);
1487   m_emm_offset = (m_emm_offset & 0xffff00) | (emm_lo_index & 0xff);
14681488
1469   if(state->m_emm_offset < 0x100000) //emm max size
1470      emm_ram[state->m_emm_offset] = data;
1489   if(m_emm_offset < 0x100000) //emm max size
1490      emm_ram[m_emm_offset] = data;
14711491}
14721492
14731493static ADDRESS_MAP_START(mz2500_io, AS_IO, 8, mz2500_state )
r14844r14845
14771497//  AM_RANGE(0x98, 0x99) ADPCM, unknown type, custom?
14781498   AM_RANGE(0xa0, 0xa3) AM_DEVREADWRITE_LEGACY("z80sio",z80sio_ba_cd_r,z80sio_ba_cd_w)
14791499//  AM_RANGE(0xa4, 0xa5) AM_READWRITE_LEGACY(sasi_r, sasi_w)
1480   AM_RANGE(0xa8, 0xa8) AM_WRITE_LEGACY(mz2500_rom_w)
1481   AM_RANGE(0xa9, 0xa9) AM_READ_LEGACY(mz2500_rom_r)
1482   AM_RANGE(0xac, 0xac) AM_WRITE_LEGACY(mz2500_emm_addr_w)
1483   AM_RANGE(0xad, 0xad) AM_READ_LEGACY(mz2500_emm_data_r) AM_WRITE_LEGACY(mz2500_emm_data_w)
1484   AM_RANGE(0xae, 0xae) AM_WRITE_LEGACY(palette4096_io_w)
1500   AM_RANGE(0xa8, 0xa8) AM_WRITE(mz2500_rom_w)
1501   AM_RANGE(0xa9, 0xa9) AM_READ(mz2500_rom_r)
1502   AM_RANGE(0xac, 0xac) AM_WRITE(mz2500_emm_addr_w)
1503   AM_RANGE(0xad, 0xad) AM_READ(mz2500_emm_data_r) AM_WRITE(mz2500_emm_data_w)
1504   AM_RANGE(0xae, 0xae) AM_WRITE(palette4096_io_w)
14851505//  AM_RANGE(0xb0, 0xb3) AM_READWRITE_LEGACY(sio_r,sio_w)
1486   AM_RANGE(0xb4, 0xb4) AM_READWRITE_LEGACY(mz2500_bank_addr_r,mz2500_bank_addr_w)
1487   AM_RANGE(0xb5, 0xb5) AM_READWRITE_LEGACY(mz2500_bank_data_r,mz2500_bank_data_w)
1506   AM_RANGE(0xb4, 0xb4) AM_READWRITE(mz2500_bank_addr_r,mz2500_bank_addr_w)
1507   AM_RANGE(0xb5, 0xb5) AM_READWRITE(mz2500_bank_data_r,mz2500_bank_data_w)
14881508   AM_RANGE(0xb7, 0xb7) AM_WRITENOP
1489   AM_RANGE(0xb8, 0xb9) AM_READWRITE_LEGACY(mz2500_kanji_r,mz2500_kanji_w)
1490   AM_RANGE(0xbc, 0xbc) AM_READ_LEGACY(mz2500_bplane_latch_r) AM_WRITE_LEGACY(mz2500_cg_addr_w)
1491   AM_RANGE(0xbd, 0xbd) AM_READ_LEGACY(mz2500_rplane_latch_r) AM_WRITE_LEGACY(mz2500_cg_data_w)
1492   AM_RANGE(0xbe, 0xbe) AM_READ_LEGACY(mz2500_gplane_latch_r)
1493   AM_RANGE(0xbf, 0xbf) AM_READ_LEGACY(mz2500_iplane_latch_r)
1494   AM_RANGE(0xc6, 0xc6) AM_WRITE_LEGACY(mz2500_irq_sel_w)
1495   AM_RANGE(0xc7, 0xc7) AM_WRITE_LEGACY(mz2500_irq_data_w)
1509   AM_RANGE(0xb8, 0xb9) AM_READWRITE(mz2500_kanji_r,mz2500_kanji_w)
1510   AM_RANGE(0xbc, 0xbc) AM_READ(mz2500_bplane_latch_r) AM_WRITE(mz2500_cg_addr_w)
1511   AM_RANGE(0xbd, 0xbd) AM_READ(mz2500_rplane_latch_r) AM_WRITE(mz2500_cg_data_w)
1512   AM_RANGE(0xbe, 0xbe) AM_READ(mz2500_gplane_latch_r)
1513   AM_RANGE(0xbf, 0xbf) AM_READ(mz2500_iplane_latch_r)
1514   AM_RANGE(0xc6, 0xc6) AM_WRITE(mz2500_irq_sel_w)
1515   AM_RANGE(0xc7, 0xc7) AM_WRITE(mz2500_irq_data_w)
14961516   AM_RANGE(0xc8, 0xc9) AM_DEVREADWRITE_LEGACY("ym", ym2203_r, ym2203_w)
14971517//  AM_RANGE(0xca, 0xca) AM_READWRITE_LEGACY(voice_r,voice_w)
1498   AM_RANGE(0xcc, 0xcc) AM_READWRITE_LEGACY(rp5c15_8_r, rp5c15_8_w)
1499   AM_RANGE(0xce, 0xce) AM_WRITE_LEGACY(mz2500_dictionary_bank_w)
1500   AM_RANGE(0xcf, 0xcf) AM_WRITE_LEGACY(mz2500_kanji_bank_w)
1518   AM_RANGE(0xcc, 0xcc) AM_READWRITE(rp5c15_8_r, rp5c15_8_w)
1519   AM_RANGE(0xce, 0xce) AM_WRITE(mz2500_dictionary_bank_w)
1520   AM_RANGE(0xcf, 0xcf) AM_WRITE(mz2500_kanji_bank_w)
15011521   AM_RANGE(0xd8, 0xdb) AM_DEVREADWRITE_LEGACY("mb8877a", mz2500_wd17xx_r, mz2500_wd17xx_w)
1502   AM_RANGE(0xdc, 0xdd) AM_WRITE_LEGACY(mz2500_fdc_w)
1522   AM_RANGE(0xdc, 0xdd) AM_WRITE(mz2500_fdc_w)
15031523   AM_RANGE(0xde, 0xde) AM_WRITENOP
15041524   AM_RANGE(0xe0, 0xe3) AM_DEVREADWRITE("i8255_0", i8255_device, read, write)
15051525    AM_RANGE(0xe4, 0xe7) AM_DEVREADWRITE_LEGACY("pit", pit8253_r, pit8253_w)
15061526   AM_RANGE(0xe8, 0xeb) AM_DEVREADWRITE_LEGACY("z80pio_1", z80pio_ba_cd_r, z80pio_ba_cd_w)
1507   AM_RANGE(0xef, 0xef) AM_READWRITE_LEGACY(mz2500_joystick_r,mz2500_joystick_w)
1508    AM_RANGE(0xf0, 0xf3) AM_WRITE_LEGACY(timer_w)
1509   AM_RANGE(0xf4, 0xf7) AM_READ_LEGACY(mz2500_crtc_hvblank_r) AM_WRITE_LEGACY(mz2500_tv_crtc_w)
1527   AM_RANGE(0xef, 0xef) AM_READWRITE(mz2500_joystick_r,mz2500_joystick_w)
1528    AM_RANGE(0xf0, 0xf3) AM_WRITE(timer_w)
1529   AM_RANGE(0xf4, 0xf7) AM_READ(mz2500_crtc_hvblank_r) AM_WRITE(mz2500_tv_crtc_w)
15101530//  AM_RANGE(0xf8, 0xf9) AM_READWRITE_LEGACY(extrom_r,extrom_w)
15111531ADDRESS_MAP_END
15121532
src/mess/drivers/ti99_2.c
r14844r14845
9292   int m_ROM_paged;
9393   int m_irq_state;
9494   int m_KeyRow;
95   DECLARE_WRITE8_MEMBER(ti99_2_write_kbd);
96   DECLARE_WRITE8_MEMBER(ti99_2_write_misc_cru);
9597};
9698
9799
r14844r14845
110112   state->m_ROM_paged = 1;
111113}
112114
113#define TI99_2_32_ROMPAGE0 (space->machine().region("maincpu")->base()+0x4000)
114#define TI99_2_32_ROMPAGE1 (space->machine().region("maincpu")->base()+0x10000)
115#define TI99_2_32_ROMPAGE0 (machine().region("maincpu")->base()+0x4000)
116#define TI99_2_32_ROMPAGE1 (machine().region("maincpu")->base()+0x10000)
115117
116118static MACHINE_RESET( ti99_2 )
117119{
r14844r14845
217219/* current keyboard row */
218220
219221/* write the current keyboard row */
220static WRITE8_HANDLER ( ti99_2_write_kbd )
222WRITE8_MEMBER(ti99_2_state::ti99_2_write_kbd)
221223{
222   ti99_2_state *state = space->machine().driver_data<ti99_2_state>();
223224   offset &= 0x7;  /* other address lines are not decoded */
224225
225226   if (offset <= 2)
226227   {
227228      /* this implementation is just a guess */
228229      if (data)
229         state->m_KeyRow |= 1 << offset;
230         m_KeyRow |= 1 << offset;
230231      else
231         state->m_KeyRow &= ~ (1 << offset);
232         m_KeyRow &= ~ (1 << offset);
232233   }
233234   /* now, we handle ROM paging */
234   if (state->m_ROM_paged)
235   if (m_ROM_paged)
235236   {   /* if we have paged ROMs, page according to S0 keyboard interface line */
236      memory_set_bankptr(space->machine(), "bank1", (state->m_KeyRow == 0) ? TI99_2_32_ROMPAGE1 : TI99_2_32_ROMPAGE0);
237      memory_set_bankptr(machine(), "bank1", (m_KeyRow == 0) ? TI99_2_32_ROMPAGE1 : TI99_2_32_ROMPAGE0);
237238   }
238239}
239240
240static WRITE8_HANDLER ( ti99_2_write_misc_cru )
241WRITE8_MEMBER(ti99_2_state::ti99_2_write_misc_cru)
241242{
242243   offset &= 0x7;  /* other address lines are not decoded */
243244
r14844r14845
281282static ADDRESS_MAP_START(ti99_2_io, AS_IO, 8, ti99_2_state )
282283   AM_RANGE(0x0E00, 0x0E7f) AM_READ_LEGACY(ti99_2_read_kbd)
283284   AM_RANGE(0x0E80, 0x0Eff) AM_READ_LEGACY(ti99_2_read_misc_cru)
284   AM_RANGE(0x7000, 0x73ff) AM_WRITE_LEGACY(ti99_2_write_kbd)
285   AM_RANGE(0x7400, 0x77ff) AM_WRITE_LEGACY(ti99_2_write_misc_cru)
285   AM_RANGE(0x7000, 0x73ff) AM_WRITE(ti99_2_write_kbd)
286   AM_RANGE(0x7400, 0x77ff) AM_WRITE(ti99_2_write_misc_cru)
286287ADDRESS_MAP_END
287288
288289
src/mess/drivers/multi8.c
r14844r14845
6262   UINT8 m_pen_clut[8];
6363   UINT8 m_bw_mode;
6464   UINT16 m_knj_addr;
65   DECLARE_READ8_MEMBER(ay8912_0_r);
66   DECLARE_READ8_MEMBER(ay8912_1_r);
6567};
6668
6769#define mc6845_h_char_total    (state->m_crtc_vreg[0])
r14844r14845
321323   }
322324}
323325
324static READ8_HANDLER( ay8912_0_r ) { return ay8910_r(space->machine().device("aysnd"),0); }
325static READ8_HANDLER( ay8912_1_r ) { return ay8910_r(space->machine().device("aysnd"),1); }
326READ8_MEMBER(multi8_state::ay8912_0_r){ return ay8910_r(machine().device("aysnd"),0); }
327READ8_MEMBER(multi8_state::ay8912_1_r){ return ay8910_r(machine().device("aysnd"),1); }
326328
327329READ8_MEMBER( multi8_state::multi8_kanji_r )
328330{
r14844r14845
347349   AM_RANGE(0x00, 0x00) AM_READ(key_input_r) AM_WRITENOP//keyboard
348350   AM_RANGE(0x01, 0x01) AM_READ(key_status_r) AM_WRITENOP//keyboard
349351   AM_RANGE(0x18, 0x19) AM_DEVWRITE_LEGACY("aysnd", ay8910_address_data_w)
350   AM_RANGE(0x18, 0x18) AM_READ_LEGACY(ay8912_0_r)
351   AM_RANGE(0x1a, 0x1a) AM_READ_LEGACY(ay8912_1_r)
352   AM_RANGE(0x18, 0x18) AM_READ(ay8912_0_r)
353   AM_RANGE(0x1a, 0x1a) AM_READ(ay8912_1_r)
352354   AM_RANGE(0x1c, 0x1d) AM_WRITE(multi8_6845_w)
353355//  AM_RANGE(0x20, 0x21) //sio, cmt
354356//  AM_RANGE(0x24, 0x27) //pit
src/mess/drivers/vtech1.c
r14844r14845
187187   int m_fdc_write;
188188   int m_fdc_offs;
189189   int m_fdc_latch;
190   DECLARE_READ8_MEMBER(vtech1_fdc_r);
191   DECLARE_WRITE8_MEMBER(vtech1_fdc_w);
192   DECLARE_READ8_MEMBER(vtech1_serial_r);
193   DECLARE_WRITE8_MEMBER(vtech1_serial_w);
194   DECLARE_READ8_MEMBER(vtech1_lightpen_r);
195   DECLARE_READ8_MEMBER(vtech1_joystick_r);
196   DECLARE_READ8_MEMBER(vtech1_keyboard_r);
197   DECLARE_WRITE8_MEMBER(vtech1_latch_w);
198   DECLARE_WRITE8_MEMBER(vtech1_memory_bank_w);
199   DECLARE_WRITE8_MEMBER(vtech1_video_bank_w);
190200};
191201
192202
r14844r14845
309319   }
310320}
311321
312static READ8_HANDLER( vtech1_fdc_r )
322READ8_MEMBER(vtech1_state::vtech1_fdc_r)
313323{
314   vtech1_state *vtech1 = space->machine().driver_data<vtech1_state>();
315324   int data = 0xff;
316325
317326   switch (offset)
318327   {
319328   case 1: /* data (read-only) */
320      if (vtech1->m_fdc_bits > 0)
329      if (m_fdc_bits > 0)
321330      {
322         if( vtech1->m_fdc_status & 0x80 )
323            vtech1->m_fdc_bits--;
324         data = (vtech1->m_data >> vtech1->m_fdc_bits) & 0xff;
331         if( m_fdc_status & 0x80 )
332            m_fdc_bits--;
333         data = (m_data >> m_fdc_bits) & 0xff;
325334         if (LOG_VTECH1_FDC) {
326335            logerror("vtech1_fdc_r bits %d%d%d%d%d%d%d%d\n",
327336               (data>>7)&1,(data>>6)&1,(data>>5)&1,(data>>4)&1,
328337               (data>>3)&1,(data>>2)&1,(data>>1)&1,(data>>0)&1 );
329338         }
330339      }
331      if (vtech1->m_fdc_bits == 0)
340      if (m_fdc_bits == 0)
332341      {
333         vtech1->m_data = vtech1->m_fdc_data[vtech1->m_fdc_offs];
342         m_data = m_fdc_data[m_fdc_offs];
334343         if (LOG_VTECH1_FDC)
335            logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, vtech1->m_fdc_offs, vtech1->m_data);
336         if(vtech1->m_fdc_status & 0x80)
344            logerror("vtech1_fdc_r %d : data ($%04X) $%02X\n", offset, m_fdc_offs, m_data);
345         if(m_fdc_status & 0x80)
337346         {
338            vtech1->m_fdc_bits = 8;
339            vtech1->m_fdc_offs = (vtech1->m_fdc_offs + 1) % TRKSIZE_FM;
347            m_fdc_bits = 8;
348            m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM;
340349         }
341         vtech1->m_fdc_status &= ~0x80;
350         m_fdc_status &= ~0x80;
342351      }
343352      break;
344353   case 2: /* polling (read-only) */
345354      /* fake */
346      if (vtech1->m_drive >= 0)
347         vtech1->m_fdc_status |= 0x80;
348      data = vtech1->m_fdc_status;
355      if (m_drive >= 0)
356         m_fdc_status |= 0x80;
357      data = m_fdc_status;
349358      break;
350359   case 3: /* write protect status (read-only) */
351      if (vtech1->m_drive >= 0)
352         data = vtech1->m_fdc_wrprot[vtech1->m_drive];
360      if (m_drive >= 0)
361         data = m_fdc_wrprot[m_drive];
353362      if (LOG_VTECH1_FDC)
354363         logerror("vtech1_fdc_r %d : write_protect $%02X\n", offset, data);
355364      break;
r14844r14845
357366   return data;
358367}
359368
360static WRITE8_HANDLER( vtech1_fdc_w )
369WRITE8_MEMBER(vtech1_state::vtech1_fdc_w)
361370{
362   vtech1_state *vtech1 = space->machine().driver_data<vtech1_state>();
363371   int drive;
364372
365373   switch (offset)
366374   {
367375   case 0: /* latch (write-only) */
368376      drive = (data & 0x10) ? 0 : (data & 0x80) ? 1 : -1;
369      if (drive != vtech1->m_drive)
377      if (drive != m_drive)
370378      {
371         vtech1->m_drive = drive;
372         if (vtech1->m_drive >= 0)
373            vtech1_get_track(space->machine());
379         m_drive = drive;
380         if (m_drive >= 0)
381            vtech1_get_track(machine());
374382      }
375      if (vtech1->m_drive >= 0)
383      if (m_drive >= 0)
376384      {
377         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(vtech1->m_fdc_latch)) ||
378            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(vtech1->m_fdc_latch)) ||
379            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(vtech1->m_fdc_latch)) ||
380            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(vtech1->m_fdc_latch)))
385         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI1(m_fdc_latch)) ||
386            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI2(m_fdc_latch)) ||
387            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI3(m_fdc_latch)) ||
388            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI0(m_fdc_latch)))
381389         {
382            if (vtech1->m_fdc_track_x2[vtech1->m_drive] > 0)
383               vtech1->m_fdc_track_x2[vtech1->m_drive]--;
390            if (m_fdc_track_x2[m_drive] > 0)
391               m_fdc_track_x2[m_drive]--;
384392            if (LOG_VTECH1_FDC)
385               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepout track #%2d.%d\n", offset, data, vtech1->m_drive, vtech1->m_fdc_track_x2[vtech1->m_drive]/2,5*(vtech1->m_fdc_track_x2[vtech1->m_drive]&1));
386            if ((vtech1->m_fdc_track_x2[vtech1->m_drive] & 1) == 0)
387               vtech1_get_track(space->machine());
393               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepout track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1));
394            if ((m_fdc_track_x2[m_drive] & 1) == 0)
395               vtech1_get_track(machine());
388396         }
389397         else
390         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(vtech1->m_fdc_latch)) ||
391            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(vtech1->m_fdc_latch)) ||
392            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(vtech1->m_fdc_latch)) ||
393            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(vtech1->m_fdc_latch)))
398         if ((PHI0(data) && !(PHI1(data) || PHI2(data) || PHI3(data)) && PHI3(m_fdc_latch)) ||
399            (PHI1(data) && !(PHI0(data) || PHI2(data) || PHI3(data)) && PHI0(m_fdc_latch)) ||
400            (PHI2(data) && !(PHI0(data) || PHI1(data) || PHI3(data)) && PHI1(m_fdc_latch)) ||
401            (PHI3(data) && !(PHI0(data) || PHI1(data) || PHI2(data)) && PHI2(m_fdc_latch)))
394402         {
395            if (vtech1->m_fdc_track_x2[vtech1->m_drive] < 2*40)
396               vtech1->m_fdc_track_x2[vtech1->m_drive]++;
403            if (m_fdc_track_x2[m_drive] < 2*40)
404               m_fdc_track_x2[m_drive]++;
397405            if (LOG_VTECH1_FDC)
398               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepin track #%2d.%d\n", offset, data, vtech1->m_drive, vtech1->m_fdc_track_x2[vtech1->m_drive]/2,5*(vtech1->m_fdc_track_x2[vtech1->m_drive]&1));
399            if ((vtech1->m_fdc_track_x2[vtech1->m_drive] & 1) == 0)
400               vtech1_get_track(space->machine());
406               logerror("vtech1_fdc_w(%d) $%02X drive %d: stepin track #%2d.%d\n", offset, data, m_drive, m_fdc_track_x2[m_drive]/2,5*(m_fdc_track_x2[m_drive]&1));
407            if ((m_fdc_track_x2[m_drive] & 1) == 0)
408               vtech1_get_track(machine());
401409         }
402410         if ((data & 0x40) == 0)
403411         {
404            vtech1->m_data <<= 1;
405            if ((vtech1->m_fdc_latch ^ data) & 0x20)
406               vtech1->m_data |= 1;
407            if ((vtech1->m_fdc_edge ^= 1) == 0)
412            m_data <<= 1;
413            if ((m_fdc_latch ^ data) & 0x20)
414               m_data |= 1;
415            if ((m_fdc_edge ^= 1) == 0)
408416            {
409               vtech1->m_fdc_bits--;
417               m_fdc_bits--;
410418
411               if (vtech1->m_fdc_bits == 0)
419               if (m_fdc_bits == 0)
412420               {
413421                  UINT8 value = 0;
414                  vtech1->m_data &= 0xffff;
415                  if (vtech1->m_data & 0x4000 ) value |= 0x80;
416                  if (vtech1->m_data & 0x1000 ) value |= 0x40;
417                  if (vtech1->m_data & 0x0400 ) value |= 0x20;
418                  if (vtech1->m_data & 0x0100 ) value |= 0x10;
419                  if (vtech1->m_data & 0x0040 ) value |= 0x08;
420                  if (vtech1->m_data & 0x0010 ) value |= 0x04;
421                  if (vtech1->m_data & 0x0004 ) value |= 0x02;
422                  if (vtech1->m_data & 0x0001 ) value |= 0x01;
422                  m_data &= 0xffff;
423                  if (m_data & 0x4000 ) value |= 0x80;
424                  if (m_data & 0x1000 ) value |= 0x40;
425                  if (m_data & 0x0400 ) value |= 0x20;
426                  if (m_data & 0x0100 ) value |= 0x10;
427                  if (m_data & 0x0040 ) value |= 0x08;
428                  if (m_data & 0x0010 ) value |= 0x04;
429                  if (m_data & 0x0004 ) value |= 0x02;
430                  if (m_data & 0x0001 ) value |= 0x01;
423431                  if (LOG_VTECH1_FDC)
424                     logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, vtech1->m_fdc_offs, vtech1->m_fdc_data[vtech1->m_fdc_offs], value, vtech1->m_data);
425                  vtech1->m_fdc_data[vtech1->m_fdc_offs] = value;
426                  vtech1->m_fdc_offs = (vtech1->m_fdc_offs + 1) % TRKSIZE_FM;
427                  vtech1->m_fdc_write++;
428                  vtech1->m_fdc_bits = 8;
432                     logerror("vtech1_fdc_w(%d) data($%04X) $%02X <- $%02X ($%04X)\n", offset, m_fdc_offs, m_fdc_data[m_fdc_offs], value, m_data);
433                  m_fdc_data[m_fdc_offs] = value;
434                  m_fdc_offs = (m_fdc_offs + 1) % TRKSIZE_FM;
435                  m_fdc_write++;
436                  m_fdc_bits = 8;
429437               }
430438            }
431439         }
432440         /* change of write signal? */
433         if ((vtech1->m_fdc_latch ^ data) & 0x40)
441         if ((m_fdc_latch ^ data) & 0x40)
434442         {
435443            /* falling edge? */
436            if (vtech1->m_fdc_latch & 0x40)
444            if (m_fdc_latch & 0x40)
437445            {
438               vtech1->m_fdc_start = vtech1->m_fdc_offs;
439               vtech1->m_fdc_edge = 0;
446               m_fdc_start = m_fdc_offs;
447               m_fdc_edge = 0;
440448            }
441449            else
442450            {
443451               /* data written to track before? */
444               if (vtech1->m_fdc_write)
445                  vtech1_put_track(space->machine());
452               if (m_fdc_write)
453                  vtech1_put_track(machine());
446454            }
447            vtech1->m_fdc_bits = 8;
448            vtech1->m_fdc_write = 0;
455            m_fdc_bits = 8;
456            m_fdc_write = 0;
449457         }
450458      }
451      vtech1->m_fdc_latch = data;
459      m_fdc_latch = data;
452460      break;
453461   }
454462}
r14844r14845
489497    RS232 SERIAL
490498***************************************************************************/
491499
492static READ8_HANDLER( vtech1_serial_r )
500READ8_MEMBER(vtech1_state::vtech1_serial_r)
493501{
494502   logerror("vtech1_serial_r offset $%02x\n", offset);
495503   return 0xff;
496504}
497505
498static WRITE8_HANDLER( vtech1_serial_w )
506WRITE8_MEMBER(vtech1_state::vtech1_serial_w)
499507{
500508   logerror("vtech1_serial_w $%02x, offset %02x\n", data, offset);
501509}
r14844r14845
505513    INPUTS
506514***************************************************************************/
507515
508static READ8_HANDLER( vtech1_lightpen_r )
516READ8_MEMBER(vtech1_state::vtech1_lightpen_r)
509517{
510518   logerror("vtech1_lightpen_r(%d)\n", offset);
511519   return 0xff;
512520}
513521
514static READ8_HANDLER( vtech1_joystick_r )
522READ8_MEMBER(vtech1_state::vtech1_joystick_r)
515523{
516524   int result = 0xff;
517525
518   if (!BIT(offset, 0)) result &= input_port_read(space->machine(), "joystick_0");
519   if (!BIT(offset, 1)) result &= input_port_read(space->machine(), "joystick_0_arm");
520   if (!BIT(offset, 2)) result &= input_port_read(space->machine(), "joystick_1");
521   if (!BIT(offset, 3)) result &= input_port_read(space->machine(), "joystick_1_arm");
526   if (!BIT(offset, 0)) result &= input_port_read(machine(), "joystick_0");
527   if (!BIT(offset, 1)) result &= input_port_read(machine(), "joystick_0_arm");
528   if (!BIT(offset, 2)) result &= input_port_read(machine(), "joystick_1");
529   if (!BIT(offset, 3)) result &= input_port_read(machine(), "joystick_1_arm");
522530
523531   return result;
524532}
525533
526static READ8_HANDLER( vtech1_keyboard_r )
534READ8_MEMBER(vtech1_state::vtech1_keyboard_r)
527535{
528   vtech1_state *vtech1 = space->machine().driver_data<vtech1_state>();
529536   UINT8 result = 0x3f;
530537
531538   /* bit 0 to 5, keyboard input */
532   if (!BIT(offset, 0)) result &= input_port_read(space->machine(), "keyboard_0");
533   if (!BIT(offset, 1)) result &= input_port_read(space->machine(), "keyboard_1");
534   if (!BIT(offset, 2)) result &= input_port_read(space->machine(), "keyboard_2");
535   if (!BIT(offset, 3)) result &= input_port_read(space->machine(), "keyboard_3");
536   if (!BIT(offset, 4)) result &= input_port_read(space->machine(), "keyboard_4");
537   if (!BIT(offset, 5)) result &= input_port_read(space->machine(), "keyboard_5");
538   if (!BIT(offset, 6)) result &= input_port_read(space->machine(), "keyboard_6");
539   if (!BIT(offset, 7)) result &= input_port_read(space->machine(), "keyboard_7");
539   if (!BIT(offset, 0)) result &= input_port_read(machine(), "keyboard_0");
540   if (!BIT(offset, 1)) result &= input_port_read(machine(), "keyboard_1");
541   if (!BIT(offset, 2)) result &= input_port_read(machine(), "keyboard_2");
542   if (!BIT(offset, 3)) result &= input_port_read(machine(), "keyboard_3");
543   if (!BIT(offset, 4)) result &= input_port_read(machine(), "keyboard_4");
544   if (!BIT(offset, 5)) result &= input_port_read(machine(), "keyboard_5");
545   if (!BIT(offset, 6)) result &= input_port_read(machine(), "keyboard_6");
546   if (!BIT(offset, 7)) result &= input_port_read(machine(), "keyboard_7");
540547
541548   /* bit 6, cassette input */
542   result |= ((vtech1->m_cassette->input()) > 0 ? 1 : 0) << 6;
549   result |= ((m_cassette->input()) > 0 ? 1 : 0) << 6;
543550
544551   /* bit 7, field sync */
545   result |= vtech1->m_mc6847->fs_r() << 7;
552   result |= m_mc6847->fs_r() << 7;
546553
547554   return result;
548555}
r14844r14845
552559    I/O LATCH
553560***************************************************************************/
554561
555static WRITE8_HANDLER( vtech1_latch_w )
562WRITE8_MEMBER(vtech1_state::vtech1_latch_w)
556563{
557   vtech1_state *vtech1 = space->machine().driver_data<vtech1_state>();
558564
559565   if (LOG_VTECH1_LATCH)
560566      logerror("vtech1_latch_w $%02X\n", data);
561567
562568   /* bit 1, SHRG mod (if installed) */
563   if (vtech1->m_videoram_size == 0x2000)
569   if (m_videoram_size == 0x2000)
564570   {
565      vtech1->m_mc6847->gm0_w(BIT(data, 1));
566      vtech1->m_mc6847->gm2_w(BIT(data, 1));
571      m_mc6847->gm0_w(BIT(data, 1));
572      m_mc6847->gm2_w(BIT(data, 1));
567573   }
568574
569575   /* bit 2, cassette out */
570   vtech1->m_cassette->output( BIT(data, 2) ? +1.0 : -1.0);
576   m_cassette->output( BIT(data, 2) ? +1.0 : -1.0);
571577
572578   /* bit 3 and 4, vdc mode control lines */
573   vtech1->m_mc6847->ag_w(BIT(data, 3));
574   vtech1->m_mc6847->css_w(BIT(data, 4));
579   m_mc6847->ag_w(BIT(data, 3));
580   m_mc6847->css_w(BIT(data, 4));
575581
576582   /* bit 0 and 5, speaker */
577   speaker_level_w(vtech1->m_speaker, (BIT(data, 5) << 1) | BIT(data, 0));
583   speaker_level_w(m_speaker, (BIT(data, 5) << 1) | BIT(data, 0));
578584}
579585
580586
r14844r14845
582588    MEMORY BANKING
583589***************************************************************************/
584590
585static WRITE8_HANDLER( vtech1_memory_bank_w )
591WRITE8_MEMBER(vtech1_state::vtech1_memory_bank_w)
586592{
587   vtech1_state *vtech1 = space->machine().driver_data<vtech1_state>();
588593
589594   logerror("vtech1_memory_bank_w $%02X\n", data);
590595
591596   if (data >= 1)
592      if ((data <= 3 && vtech1->m_ram_size == 66*1024) || (vtech1->m_ram_size == 4098*1024))
593         memory_set_bank(space->machine(), "bank3", data - 1);
597      if ((data <= 3 && m_ram_size == 66*1024) || (m_ram_size == 4098*1024))
598         memory_set_bank(machine(), "bank3", data - 1);
594599}
595600
596static WRITE8_HANDLER( vtech1_video_bank_w )
601WRITE8_MEMBER(vtech1_state::vtech1_video_bank_w)
597602{
598603   logerror("vtech1_video_bank_w $%02X\n", data);
599   memory_set_bank(space->machine(), "bank4", data & 0x03);
604   memory_set_bank(machine(), "bank4", data & 0x03);
600605}
601606
602607
r14844r14845
697702   AM_RANGE(0x0000, 0x3fff) AM_ROM   /* basic rom */
698703   AM_RANGE(0x4000, 0x5fff) AM_ROM   /* dos rom or other catridges */
699704   AM_RANGE(0x6000, 0x67ff) AM_ROM   /* reserved for cartridges */
700   AM_RANGE(0x6800, 0x6fff) AM_READWRITE_LEGACY(vtech1_keyboard_r, vtech1_latch_w)
705   AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w)
701706   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_BASE(m_videoram) /* (6847) */
702707   AM_RANGE(0x7800, 0x7fff) AM_RAMBANK("bank1") /* 2k user ram */
703708   AM_RANGE(0x8000, 0xbfff) AM_NOP /* 16k ram expansion */
r14844r14845
708713   AM_RANGE(0x0000, 0x3fff) AM_ROM   /* basic rom */
709714   AM_RANGE(0x4000, 0x5fff) AM_ROM   /* dos rom or other catridges */
710715   AM_RANGE(0x6000, 0x67ff) AM_ROM   /* reserved for cartridges */
711   AM_RANGE(0x6800, 0x6fff) AM_READWRITE_LEGACY(vtech1_keyboard_r, vtech1_latch_w)
716   AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w)
712717   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_BASE(m_videoram) /* U7 (6847) */
713718   AM_RANGE(0x7800, 0x8fff) AM_RAMBANK("bank1") /* 6k user ram */
714719   AM_RANGE(0x9000, 0xcfff) AM_NOP /* 16k ram expansion */
r14844r14845
719724   AM_RANGE(0x0000, 0x3fff) AM_ROM   /* basic rom */
720725   AM_RANGE(0x4000, 0x5fff) AM_ROM   /* dos rom or other catridges */
721726   AM_RANGE(0x6000, 0x67ff) AM_ROM   /* reserved for cartridges */
722   AM_RANGE(0x6800, 0x6fff) AM_READWRITE_LEGACY(vtech1_keyboard_r, vtech1_latch_w)
727   AM_RANGE(0x6800, 0x6fff) AM_READWRITE(vtech1_keyboard_r, vtech1_latch_w)
723728   AM_RANGE(0x7000, 0x77ff) AM_RAM AM_BASE(m_videoram) /* (6847) */
724729   AM_RANGE(0x7800, 0xb7ff) AM_RAMBANK("bank1") /* 16k user ram */
725730   AM_RANGE(0xb800, 0xf7ff) AM_NOP /* 16k ram expansion */
r14844r14845
731736   AM_RANGE(0x00, 0x00) AM_DEVREAD_LEGACY("centronics", vtech1_printer_r)
732737   AM_RANGE(0x0d, 0x0d) AM_DEVWRITE_LEGACY("centronics", vtech1_strobe_w)
733738   AM_RANGE(0x0e, 0x0e) AM_DEVWRITE("centronics", centronics_device, write)
734   AM_RANGE(0x10, 0x1f) AM_READWRITE_LEGACY(vtech1_fdc_r, vtech1_fdc_w)
735   AM_RANGE(0x20, 0x2f) AM_READ_LEGACY(vtech1_joystick_r)
736   AM_RANGE(0x30, 0x3f) AM_READWRITE_LEGACY(vtech1_serial_r, vtech1_serial_w)
737   AM_RANGE(0x40, 0x4f) AM_READ_LEGACY(vtech1_lightpen_r)
738   AM_RANGE(0x70, 0x7f) AM_WRITE_LEGACY(vtech1_memory_bank_w)
739   AM_RANGE(0x10, 0x1f) AM_READWRITE(vtech1_fdc_r, vtech1_fdc_w)
740   AM_RANGE(0x20, 0x2f) AM_READ(vtech1_joystick_r)
741   AM_RANGE(0x30, 0x3f) AM_READWRITE(vtech1_serial_r, vtech1_serial_w)
742   AM_RANGE(0x40, 0x4f) AM_READ(vtech1_lightpen_r)
743   AM_RANGE(0x70, 0x7f) AM_WRITE(vtech1_memory_bank_w)
739744ADDRESS_MAP_END
740745
741746static ADDRESS_MAP_START( vtech1_shrg_io, AS_IO, 8, vtech1_state )
742747   AM_IMPORT_FROM(vtech1_io)
743   AM_RANGE(0xd0, 0xdf) AM_WRITE_LEGACY(vtech1_video_bank_w)
748   AM_RANGE(0xd0, 0xdf) AM_WRITE(vtech1_video_bank_w)
744749ADDRESS_MAP_END
745750
746751
src/mess/drivers/atm.c
r14844r14845
1010#include "machine/ram.h"
1111
1212
13class atm_state : public driver_device
13class atm_state : public spectrum_state
1414{
1515public:
1616   atm_state(const machine_config &mconfig, device_type type, const char *tag)
17      : driver_device(mconfig, type, tag) { }
17      : spectrum_state(mconfig, type, tag) { }
1818
19   DECLARE_WRITE8_MEMBER(atm_port_7ffd_w);
1920};
2021
2122
r14844r14845
7778   memory_set_bankptr(machine, "bank1", machine.region("maincpu")->base() + 0x010000 + (state->m_ROMSelection<<14));
7879}
7980
80static WRITE8_HANDLER(atm_port_7ffd_w)
81WRITE8_MEMBER(atm_state::atm_port_7ffd_w)
8182{
82   spectrum_state *state = space->machine().driver_data<spectrum_state>();
8383
8484   /* disable paging */
85   if (state->m_port_7ffd_data & 0x20)
85   if (m_port_7ffd_data & 0x20)
8686      return;
8787
8888   /* store new state */
89   state->m_port_7ffd_data = data;
89   m_port_7ffd_data = data;
9090
9191   /* update memory */
92   atm_update_memory(space->machine());
92   atm_update_memory(machine());
9393}
9494
95static ADDRESS_MAP_START (atm_io, AS_IO, 8, spectrum_state )
95static ADDRESS_MAP_START (atm_io, AS_IO, 8, atm_state )
9696   ADDRESS_MAP_UNMAP_HIGH
9797   AM_RANGE(0x001f, 0x001f) AM_DEVREADWRITE_LEGACY(BETA_DISK_TAG, betadisk_status_r,betadisk_command_w) AM_MIRROR(0xff00)
9898   AM_RANGE(0x003f, 0x003f) AM_DEVREADWRITE_LEGACY(BETA_DISK_TAG, betadisk_track_r,betadisk_track_w) AM_MIRROR(0xff00)
r14844r14845
100100   AM_RANGE(0x007f, 0x007f) AM_DEVREADWRITE_LEGACY(BETA_DISK_TAG, betadisk_data_r,betadisk_data_w) AM_MIRROR(0xff00)
101101   AM_RANGE(0x00fe, 0x00fe) AM_READWRITE_LEGACY(spectrum_port_fe_r,spectrum_port_fe_w) AM_MIRROR(0xff00) AM_MASK(0xffff)
102102   AM_RANGE(0x00ff, 0x00ff) AM_DEVREADWRITE_LEGACY(BETA_DISK_TAG, betadisk_state_r, betadisk_param_w) AM_MIRROR(0xff00)
103   AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(atm_port_7ffd_w)  AM_MIRROR(0x3ffd)
103   AM_RANGE(0x4000, 0x4000) AM_WRITE(atm_port_7ffd_w)  AM_MIRROR(0x3ffd)
104104   AM_RANGE(0x8000, 0x8000) AM_DEVWRITE_LEGACY("ay8912", ay8910_data_w) AM_MIRROR(0x3ffd)
105105   AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE_LEGACY("ay8912", ay8910_r, ay8910_address_w) AM_MIRROR(0x3ffd)
106106ADDRESS_MAP_END
src/mess/drivers/pockstat.c
r14844r14845
102102   UINT32 m_lcd_control;
103103   INT32 m_ps_flash_write_enable_count;
104104   INT32 m_ps_flash_write_count;
105   DECLARE_READ32_MEMBER(ps_ftlb_r);
106   DECLARE_WRITE32_MEMBER(ps_ftlb_w);
107   DECLARE_READ32_MEMBER(ps_intc_r);
108   DECLARE_WRITE32_MEMBER(ps_intc_w);
109   DECLARE_READ32_MEMBER(ps_timer_r);
110   DECLARE_WRITE32_MEMBER(ps_timer_w);
111   DECLARE_READ32_MEMBER(ps_clock_r);
112   DECLARE_WRITE32_MEMBER(ps_clock_w);
113   DECLARE_READ32_MEMBER(ps_rtc_r);
114   DECLARE_WRITE32_MEMBER(ps_rtc_w);
115   DECLARE_READ32_MEMBER(ps_lcd_r);
116   DECLARE_WRITE32_MEMBER(ps_lcd_w);
117   DECLARE_READ32_MEMBER(ps_rombank_r);
118   DECLARE_WRITE32_MEMBER(ps_flash_w);
119   DECLARE_READ32_MEMBER(ps_audio_r);
120   DECLARE_WRITE32_MEMBER(ps_audio_w);
121   DECLARE_WRITE32_MEMBER(ps_dac_w);
105122};
106123
107124
r14844r14845
150167
151168
152169// Flash TLB
153static READ32_HANDLER( ps_ftlb_r );
154static WRITE32_HANDLER( ps_ftlb_w );
155170
171
172
156173// Interrupt Controller
157174static UINT32 ps_intc_get_interrupt_line(running_machine &machine, UINT32 line);
158175static void ps_intc_set_interrupt_line(running_machine &machine, UINT32 line, int state);
159static READ32_HANDLER( ps_intc_r );
160static WRITE32_HANDLER( ps_intc_w );
161176
177
178
162179// Timers
163180static TIMER_CALLBACK( timer_tick );
164181static void ps_timer_start(running_machine &machine, int index);
165static READ32_HANDLER( ps_timer_r );
166static WRITE32_HANDLER( ps_timer_w );
167182
183
184
168185// Clock
169static READ32_HANDLER( ps_clock_r );
170static WRITE32_HANDLER( ps_clock_w );
171186
187
188
172189// RTC
173190static TIMER_CALLBACK( rtc_tick );
174static READ32_HANDLER( ps_rtc_r );
175static WRITE32_HANDLER( ps_rtc_w );
176191
192
193
177194#define PS_INT_BTN_ACTION      0x00000001 // "Action button"
178195#define PS_INT_BTN_RIGHT      0x00000002 // "Right button"
179196#define PS_INT_BTN_LEFT         0x00000004 // "Left button"
r14844r14845
192209#define PS_INT_FIQ_MASK         0x00002040
193210#define PS_INT_STATUS_MASK      0x0000021f
194211
195static READ32_HANDLER( ps_ftlb_r )
212READ32_MEMBER(pockstat_state::ps_ftlb_r)
196213{
197   pockstat_state *state = space->machine().driver_data<pockstat_state>();
198214   switch(offset)
199215   {
200216      case 0x0000/4:
201         verboselog(space->machine(), 0, "ps_ftlb_r: FlashROM TLB Control = %08x & %08x\n", state->m_ftlb_regs.control, mem_mask );
202         return state->m_ftlb_regs.control | 1; // ???
217         verboselog(machine(), 0, "ps_ftlb_r: FlashROM TLB Control = %08x & %08x\n", m_ftlb_regs.control, mem_mask );
218         return m_ftlb_regs.control | 1; // ???
203219      case 0x0004/4:
204         verboselog(space->machine(), 0, "ps_ftlb_r: Unknown (F_STAT) = %08x & %08x\n", state->m_ftlb_regs.stat, mem_mask );
205         return state->m_ftlb_regs.stat;
220         verboselog(machine(), 0, "ps_ftlb_r: Unknown (F_STAT) = %08x & %08x\n", m_ftlb_regs.stat, mem_mask );
221         return m_ftlb_regs.stat;
206222      case 0x0008/4:
207         verboselog(space->machine(), 0, "ps_ftlb_r: FlashROM TLB Valid Tag = %08x & %08x\n", state->m_ftlb_regs.valid, mem_mask );
208         return state->m_ftlb_regs.valid;
223         verboselog(machine(), 0, "ps_ftlb_r: FlashROM TLB Valid Tag = %08x & %08x\n", m_ftlb_regs.valid, mem_mask );
224         return m_ftlb_regs.valid;
209225      case 0x000c/4:
210         verboselog(space->machine(), 0, "ps_ftlb_r: Unknown (F_WAIT1) = %08x & %08x\n", state->m_ftlb_regs.wait1, mem_mask );
211         return state->m_ftlb_regs.wait1;
226         verboselog(machine(), 0, "ps_ftlb_r: Unknown (F_WAIT1) = %08x & %08x\n", m_ftlb_regs.wait1, mem_mask );
227         return m_ftlb_regs.wait1;
212228      case 0x0010/4:
213         verboselog(space->machine(), 0, "ps_ftlb_r: Unknown (F_WAIT2) = %08x & %08x\n", state->m_ftlb_regs.wait2 | 0x04, mem_mask );
214         return state->m_ftlb_regs.wait2 | 0x04;
229         verboselog(machine(), 0, "ps_ftlb_r: Unknown (F_WAIT2) = %08x & %08x\n", m_ftlb_regs.wait2 | 0x04, mem_mask );
230         return m_ftlb_regs.wait2 | 0x04;
215231      case 0x0100/4:
216232      case 0x0104/4:
217233      case 0x0108/4:
r14844r14845
228244      case 0x0134/4:
229245      case 0x0138/4:
230246      case 0x013c/4:
231         verboselog(space->machine(), 0, "ps_ftlb_r: FlashROM TLB Entry %d = %08x & %08x\n", offset - 0x100/4, state->m_ftlb_regs.entry[offset - 0x100/4], mem_mask );
232         return state->m_ftlb_regs.entry[offset - 0x100/4];
247         verboselog(machine(), 0, "ps_ftlb_r: FlashROM TLB Entry %d = %08x & %08x\n", offset - 0x100/4, m_ftlb_regs.entry[offset - 0x100/4], mem_mask );
248         return m_ftlb_regs.entry[offset - 0x100/4];
233249      case 0x0300/4:
234         verboselog(space->machine(), 0, "ps_ftlb_r: Unknown (F_SN) = %08x & %08x\n", state->m_ftlb_regs.serial, mem_mask );
235         return state->m_ftlb_regs.serial;
250         verboselog(machine(), 0, "ps_ftlb_r: Unknown (F_SN) = %08x & %08x\n", m_ftlb_regs.serial, mem_mask );
251         return m_ftlb_regs.serial;
236252      default:
237         verboselog(space->machine(), 0, "ps_ftlb_r: Unknown Register %08x & %08x\n", 0x06000000 + (offset << 2), mem_mask );
253         verboselog(machine(), 0, "ps_ftlb_r: Unknown Register %08x & %08x\n", 0x06000000 + (offset << 2), mem_mask );
238254         break;
239255   }
240256   return 0;
241257}
242258
243static WRITE32_HANDLER( ps_ftlb_w )
259WRITE32_MEMBER(pockstat_state::ps_ftlb_w)
244260{
245   pockstat_state *state = space->machine().driver_data<pockstat_state>();
246261   switch(offset)
247262   {
248263      case 0x0000/4:
249         verboselog(space->machine(), 0, "ps_ftlb_w: FlashROM TLB Control = %08x & %08x\n", data, mem_mask );
250         COMBINE_DATA(&state->m_ftlb_regs.control);
264         verboselog(machine(), 0, "ps_ftlb_w: FlashROM TLB Control = %08x & %08x\n", data, mem_mask );
265         COMBINE_DATA(&m_ftlb_regs.control);
251266         break;
252267      case 0x0004/4:
253         verboselog(space->machine(), 0, "ps_ftlb_w: Unknown (F_STAT) = %08x & %08x\n", data, mem_mask );
254         COMBINE_DATA(&state->m_ftlb_regs.stat);
268         verboselog(machine(), 0, "ps_ftlb_w: Unknown (F_STAT) = %08x & %08x\n", data, mem_mask );
269         COMBINE_DATA(&m_ftlb_regs.stat);
255270         break;
256271      case 0x0008/4:
257         verboselog(space->machine(), 0, "ps_ftlb_w: FlashROM TLB Valid Tag = %08x & %08x\n", data, mem_mask );
258         COMBINE_DATA(&state->m_ftlb_regs.valid);
272         verboselog(machine(), 0, "ps_ftlb_w: FlashROM TLB Valid Tag = %08x & %08x\n", data, mem_mask );
273         COMBINE_DATA(&m_ftlb_regs.valid);
259274         break;
260275      case 0x000c/4:
261         verboselog(space->machine(), 0, "ps_ftlb_w: Unknown (F_WAIT1) = %08x & %08x\n", data, mem_mask );
262         COMBINE_DATA(&state->m_ftlb_regs.wait1);
276         verboselog(machine(), 0, "ps_ftlb_w: Unknown (F_WAIT1) = %08x & %08x\n", data, mem_mask );
277         COMBINE_DATA(&m_ftlb_regs.wait1);
263278         break;
264279      case 0x0010/4:
265         verboselog(space->machine(), 0, "ps_ftlb_w: Unknown (F_WAIT2) = %08x & %08x\n", data, mem_mask );
266         COMBINE_DATA(&state->m_ftlb_regs.wait2);
280         verboselog(machine(), 0, "ps_ftlb_w: Unknown (F_WAIT2) = %08x & %08x\n", data, mem_mask );
281         COMBINE_DATA(&m_ftlb_regs.wait2);
267282         break;
268283      case 0x0100/4:
269284      case 0x0104/4:
r14844r14845
281296      case 0x0134/4:
282297      case 0x0138/4:
283298      case 0x013c/4:
284         verboselog(space->machine(), 0, "ps_ftlb_w: FlashROM TLB Entry %d = %08x & %08x\n", offset - 0x100/4, data, mem_mask );
285         COMBINE_DATA(&state->m_ftlb_regs.entry[offset - 0x100/4]);
299         verboselog(machine(), 0, "ps_ftlb_w: FlashROM TLB Entry %d = %08x & %08x\n", offset - 0x100/4, data, mem_mask );
300         COMBINE_DATA(&m_ftlb_regs.entry[offset - 0x100/4]);
286301         break;
287302      case 0x0300/4:
288         verboselog(space->machine(), 0, "ps_ftlb_w: Unknown (F_SN) = %08x & %08x\n", data, mem_mask );
289         COMBINE_DATA(&state->m_ftlb_regs.serial);
303         verboselog(machine(), 0, "ps_ftlb_w: Unknown (F_SN) = %08x & %08x\n", data, mem_mask );
304         COMBINE_DATA(&m_ftlb_regs.serial);
290305         break;
291306      default:
292         verboselog(space->machine(), 0, "ps_ftlb_w: Unknown Register %08x = %08x & %08x\n", 0x06000000 + (offset << 2), data, mem_mask );
307         verboselog(machine(), 0, "ps_ftlb_w: Unknown Register %08x = %08x & %08x\n", 0x06000000 + (offset << 2), data, mem_mask );
293308         break;
294309   }
295310}
r14844r14845
337352   }
338353}
339354
340static READ32_HANDLER( ps_intc_r )
355READ32_MEMBER(pockstat_state::ps_intc_r)
341356{
342   pockstat_state *state = space->machine().driver_data<pockstat_state>();
343357   switch(offset)
344358   {
345359      case 0x0000/4:
346         verboselog(space->machine(), 0, "ps_intc_r: Held Interrupt = %08x & %08x\n", state->m_intc_regs.hold, mem_mask );
347         return state->m_intc_regs.hold;
360         verboselog(machine(), 0, "ps_intc_r: Held Interrupt = %08x & %08x\n", m_intc_regs.hold, mem_mask );
361         return m_intc_regs.hold;
348362      case 0x0004/4:
349         verboselog(space->machine(), 0, "ps_intc_r: Interrupt Status = %08x & %08x\n", state->m_intc_regs.status, mem_mask );
350         return state->m_intc_regs.status;
363         verboselog(machine(), 0, "ps_intc_r: Interrupt Status = %08x & %08x\n", m_intc_regs.status, mem_mask );
364         return m_intc_regs.status;
351365      case 0x0008/4:
352         verboselog(space->machine(), 0, "ps_intc_r: Interrupt Enable = %08x & %08x\n", state->m_intc_regs.enable, mem_mask );
353         return state->m_intc_regs.enable;
366         verboselog(machine(), 0, "ps_intc_r: Interrupt Enable = %08x & %08x\n", m_intc_regs.enable, mem_mask );
367         return m_intc_regs.enable;
354368      case 0x000c/4:
355         verboselog(space->machine(), 0, "ps_intc_r: Interrupt Mask (Invalid Read) = %08x & %08x\n", 0, mem_mask );
369         verboselog(machine(), 0, "ps_intc_r: Interrupt Mask (Invalid Read) = %08x & %08x\n", 0, mem_mask );
356370         return 0;
357371      case 0x0010/4:
358         verboselog(space->machine(), 0, "ps_intc_r: Interrupt Acknowledge (Invalid Read) = %08x & %08x\n", 0, mem_mask );
372         verboselog(machine(), 0, "ps_intc_r: Interrupt Acknowledge (Invalid Read) = %08x & %08x\n", 0, mem_mask );
359373         return 0;
360374      default:
361         verboselog(space->machine(), 0, "ps_intc_r: Unknown Register %08x & %08x\n", 0x0a000000 + (offset << 2), mem_mask );
375         verboselog(machine(), 0, "ps_intc_r: Unknown Register %08x & %08x\n", 0x0a000000 + (offset << 2), mem_mask );
362376         break;
363377   }
364378   return 0;
365379}
366380
367static WRITE32_HANDLER( ps_intc_w )
381WRITE32_MEMBER(pockstat_state::ps_intc_w)
368382{
369   pockstat_state *state = space->machine().driver_data<pockstat_state>();
370383   switch(offset)
371384   {
372385      case 0x0000/4:
373         verboselog(space->machine(), 0, "ps_intc_w: Held Interrupt (Invalid Write) = %08x & %08x\n", data, mem_mask );
386         verboselog(machine(), 0, "ps_intc_w: Held Interrupt (Invalid Write) = %08x & %08x\n", data, mem_mask );
374387         break;
375388      case 0x0004/4:
376         verboselog(space->machine(), 0, "ps_intc_w: Interrupt Status (Invalid Write) = %08x & %08x\n", data, mem_mask );
389         verboselog(machine(), 0, "ps_intc_w: Interrupt Status (Invalid Write) = %08x & %08x\n", data, mem_mask );
377390         break;
378391      case 0x0008/4:
379         verboselog(space->machine(), 0, "ps_intc_w: Interrupt Enable = %08x & %08x\n", data, mem_mask );
380         state->m_intc_regs.enable |= data;
381         //COMBINE_DATA(&state->m_intc_regs.enable);
382         //state->m_intc_regs.status &= state->m_intc_regs.enable;
383         //state->m_intc_regs.hold &= state->m_intc_regs.enable;
384         ps_intc_set_interrupt_line(space->machine(), 0, 0);
392         verboselog(machine(), 0, "ps_intc_w: Interrupt Enable = %08x & %08x\n", data, mem_mask );
393         m_intc_regs.enable |= data;
394         //COMBINE_DATA(&m_intc_regs.enable);
395         //m_intc_regs.status &= m_intc_regs.enable;
396         //m_intc_regs.hold &= m_intc_regs.enable;
397         ps_intc_set_interrupt_line(machine(), 0, 0);
385398         break;
386399      case 0x000c/4:
387         verboselog(space->machine(), 0, "ps_intc_w: Interrupt Mask = %08x & %08x\n", data, mem_mask );
388         state->m_intc_regs.enable &= ~data;
389         COMBINE_DATA(&state->m_intc_regs.mask);
390         //state->m_intc_regs.status &= state->m_intc_regs.enable;
391         //state->m_intc_regs.hold &= state->m_intc_regs.enable;
392         ps_intc_set_interrupt_line(space->machine(), 0, 0);
400         verboselog(machine(), 0, "ps_intc_w: Interrupt Mask = %08x & %08x\n", data, mem_mask );
401         m_intc_regs.enable &= ~data;
402         COMBINE_DATA(&m_intc_regs.mask);
403         //m_intc_regs.status &= m_intc_regs.enable;
404         //m_intc_regs.hold &= m_intc_regs.enable;
405         ps_intc_set_interrupt_line(machine(), 0, 0);
393406         break;
394407      case 0x0010/4:
395         verboselog(space->machine(), 0, "ps_intc_w: Interrupt Acknowledge = %08x & %08x\n", data, mem_mask );
396         state->m_intc_regs.hold &= ~data;
397         state->m_intc_regs.status &= ~data;
398         ps_intc_set_interrupt_line(space->machine(), 0, 0);
399         //COMBINE_DATA(&state->m_intc_regs.acknowledge);
408         verboselog(machine(), 0, "ps_intc_w: Interrupt Acknowledge = %08x & %08x\n", data, mem_mask );
409         m_intc_regs.hold &= ~data;
410         m_intc_regs.status &= ~data;
411         ps_intc_set_interrupt_line(machine(), 0, 0);
412         //COMBINE_DATA(&m_intc_regs.acknowledge);
400413         break;
401414      default:
402         verboselog(space->machine(), 0, "ps_intc_w: Unknown Register %08x = %08x & %08x\n", 0x0a000000 + (offset << 2), data, mem_mask );
415         verboselog(machine(), 0, "ps_intc_w: Unknown Register %08x = %08x & %08x\n", 0x0a000000 + (offset << 2), data, mem_mask );
403416         break;
404417   }
405418}
r14844r14845
436449   state->m_timer_regs.timer[index].timer->adjust(period, index);
437450}
438451
439static READ32_HANDLER( ps_timer_r )
452READ32_MEMBER(pockstat_state::ps_timer_r)
440453{
441   pockstat_state *state = space->machine().driver_data<pockstat_state>();
442454   switch(offset)
443455   {
444456      case 0x0000/4:
445457      case 0x0010/4:
446458      case 0x0020/4:
447         verboselog(space->machine(), 0, "ps_timer_r: Timer %d Period = %08x & %08x\n", offset / (0x10/4), state->m_timer_regs.timer[offset / (0x10/4)].period, mem_mask );
448         return state->m_timer_regs.timer[offset / (0x10/4)].period;
459         verboselog(machine(), 0, "ps_timer_r: Timer %d Period = %08x & %08x\n", offset / (0x10/4), m_timer_regs.timer[offset / (0x10/4)].period, mem_mask );
460         return m_timer_regs.timer[offset / (0x10/4)].period;
449461      case 0x0004/4:
450462      case 0x0014/4:
451463      case 0x0024/4:
452         verboselog(space->machine(), 0, "ps_timer_r: Timer %d Count = %08x & %08x\n", offset / (0x10/4), state->m_timer_regs.timer[offset / (0x10/4)].count, mem_mask );
453         if(state->m_timer_regs.timer[offset / (0x10/4)].control & 4)
464         verboselog(machine(), 0, "ps_timer_r: Timer %d Count = %08x & %08x\n", offset / (0x10/4), m_timer_regs.timer[offset / (0x10/4)].count, mem_mask );
465         if(m_timer_regs.timer[offset / (0x10/4)].control & 4)
454466         {
455            state->m_timer_regs.timer[offset / (0x10/4)].count--;
456            if(state->m_timer_regs.timer[offset / (0x10/4)].count > state->m_timer_regs.timer[offset / (0x10/4)].period)
467            m_timer_regs.timer[offset / (0x10/4)].count--;
468            if(m_timer_regs.timer[offset / (0x10/4)].count > m_timer_regs.timer[offset / (0x10/4)].period)
457469            {
458               state->m_timer_regs.timer[offset / (0x10/4)].count = state->m_timer_regs.timer[offset / (0x10/4)].period;
470               m_timer_regs.timer[offset / (0x10/4)].count = m_timer_regs.timer[offset / (0x10/4)].period;
459471            }
460            return --state->m_timer_regs.timer[offset / (0x10/4)].count;
472            return --m_timer_regs.timer[offset / (0x10/4)].count;
461473         }
462         return state->m_timer_regs.timer[offset / (0x10/4)].count;
474         return m_timer_regs.timer[offset / (0x10/4)].count;
463475      case 0x0008/4:
464476      case 0x0018/4:
465477      case 0x0028/4:
466         verboselog(space->machine(), 0, "ps_timer_r: Timer %d Control = %08x & %08x\n", offset / (0x10/4), state->m_timer_regs.timer[offset / (0x10/4)].control, mem_mask );
467         return state->m_timer_regs.timer[offset / (0x10/4)].control;
478         verboselog(machine(), 0, "ps_timer_r: Timer %d Control = %08x & %08x\n", offset / (0x10/4), m_timer_regs.timer[offset / (0x10/4)].control, mem_mask );
479         return m_timer_regs.timer[offset / (0x10/4)].control;
468480      default:
469         verboselog(space->machine(), 0, "ps_timer_r: Unknown Register %08x & %08x\n", 0x0a800000 + (offset << 2), mem_mask );
481         verboselog(machine(), 0, "ps_timer_r: Unknown Register %08x & %08x\n", 0x0a800000 + (offset << 2), mem_mask );
470482         break;
471483   }
472484   return 0;
473485}
474486
475static WRITE32_HANDLER( ps_timer_w )
487WRITE32_MEMBER(pockstat_state::ps_timer_w)
476488{
477   pockstat_state *state = space->machine().driver_data<pockstat_state>();
478489   switch(offset)
479490   {
480491      case 0x0000/4:
481492      case 0x0010/4:
482493      case 0x0020/4:
483         verboselog(space->machine(), 0, "ps_timer_w: Timer %d Period = %08x & %08x\n", offset / (0x10/4), data, mem_mask );
484         COMBINE_DATA(&state->m_timer_regs.timer[offset / (0x10/4)].period);
494         verboselog(machine(), 0, "ps_timer_w: Timer %d Period = %08x & %08x\n", offset / (0x10/4), data, mem_mask );
495         COMBINE_DATA(&m_timer_regs.timer[offset / (0x10/4)].period);
485496         break;
486497      case 0x0004/4:
487498      case 0x0014/4:
488499      case 0x0024/4:
489         verboselog(space->machine(), 0, "ps_timer_w: Timer %d Count = %08x & %08x\n", offset / (0x10/4), data, mem_mask );
490         COMBINE_DATA(&state->m_timer_regs.timer[offset / (0x10/4)].count);
500         verboselog(machine(), 0, "ps_timer_w: Timer %d Count = %08x & %08x\n", offset / (0x10/4), data, mem_mask );
501         COMBINE_DATA(&m_timer_regs.timer[offset / (0x10/4)].count);
491502         break;
492503      case 0x0008/4:
493504      case 0x0018/4:
494505      case 0x0028/4:
495         verboselog(space->machine(), 0, "ps_timer_w: Timer %d Control = %08x & %08x\n", offset / (0x10/4), data, mem_mask );
496         COMBINE_DATA(&state->m_timer_regs.timer[offset / (0x10/4)].control);
497         if(state->m_timer_regs.timer[offset / (0x10/4)].control & 4)
506         verboselog(machine(), 0, "ps_timer_w: Timer %d Control = %08x & %08x\n", offset / (0x10/4), data, mem_mask );
507         COMBINE_DATA(&m_timer_regs.timer[offset / (0x10/4)].control);
508         if(m_timer_regs.timer[offset / (0x10/4)].control & 4)
498509         {
499            ps_timer_start(space->machine(), offset / (0x10/4));
510            ps_timer_start(machine(), offset / (0x10/4));
500511         }
501512         else
502513         {
503            state->m_timer_regs.timer[offset / (0x10/4)].timer->adjust(attotime::never, offset / (0x10/4));
514            m_timer_regs.timer[offset / (0x10/4)].timer->adjust(attotime::never, offset / (0x10/4));
504515         }
505516         break;
506517      default:
507         verboselog(space->machine(), 0, "ps_timer_w: Unknown Register %08x = %08x & %08x\n", 0x0a800000 + (offset << 2), data, mem_mask );
518         verboselog(machine(), 0, "ps_timer_w: Unknown Register %08x = %08x & %08x\n", 0x0a800000 + (offset << 2), data, mem_mask );
508519         break;
509520   }
510521}
511522
512static READ32_HANDLER( ps_clock_r )
523READ32_MEMBER(pockstat_state::ps_clock_r)
513524{
514   pockstat_state *state = space->machine().driver_data<pockstat_state>();
515525   switch(offset)
516526   {
517527      case 0x0000/4:
518         verboselog(space->machine(), 0, "ps_clock_r: Clock Mode = %08x & %08x\n", state->m_clock_regs.mode | 0x10, mem_mask );
519         return state->m_clock_regs.mode | PS_CLOCK_STEADY;
528         verboselog(machine(), 0, "ps_clock_r: Clock Mode = %08x & %08x\n", m_clock_regs.mode | 0x10, mem_mask );
529         return m_clock_regs.mode | PS_CLOCK_STEADY;
520530      case 0x0004/4:
521         verboselog(space->machine(), 0, "ps_clock_r: Clock Control = %08x & %08x\n", state->m_clock_regs.control, mem_mask );
522         return state->m_clock_regs.control;
531         verboselog(machine(), 0, "ps_clock_r: Clock Control = %08x & %08x\n", m_clock_regs.control, mem_mask );
532         return m_clock_regs.control;
523533      default:
524         verboselog(space->machine(), 0, "ps_clock_r: Unknown Register %08x & %08x\n", 0x0b000000 + (offset << 2), mem_mask );
534         verboselog(machine(), 0, "ps_clock_r: Unknown Register %08x & %08x\n", 0x0b000000 + (offset << 2), mem_mask );
525535         break;
526536   }
527537   return 0;
528538}
529539
530static WRITE32_HANDLER( ps_clock_w )
540WRITE32_MEMBER(pockstat_state::ps_clock_w)
531541{
532   pockstat_state *state = space->machine().driver_data<pockstat_state>();
533542   switch(offset)
534543   {
535544      case 0x0000/4:
536         verboselog(space->machine(), 0, "ps_clock_w: Clock Mode = %08x & %08x\n", data, mem_mask );
537         COMBINE_DATA(&state->m_clock_regs.mode);
538         space->machine().device("maincpu")->set_unscaled_clock(CPU_FREQ[state->m_clock_regs.mode & 0x0f]);
545         verboselog(machine(), 0, "ps_clock_w: Clock Mode = %08x & %08x\n", data, mem_mask );
546         COMBINE_DATA(&m_clock_regs.mode);
547         machine().device("maincpu")->set_unscaled_clock(CPU_FREQ[m_clock_regs.mode & 0x0f]);
539548         break;
540549      case 0x0004/4:
541         verboselog(space->machine(), 0, "ps_clock_w: Clock Control = %08x & %08x\n", data, mem_mask );
542         COMBINE_DATA(&state->m_clock_regs.control);
550         verboselog(machine(), 0, "ps_clock_w: Clock Control = %08x & %08x\n", data, mem_mask );
551         COMBINE_DATA(&m_clock_regs.control);
543552         break;
544553      default:
545         verboselog(space->machine(), 0, "ps_clock_w: Unknown Register %08x = %08x & %08x\n", 0x0b000000 + (offset << 2), data, mem_mask );
554         verboselog(machine(), 0, "ps_clock_w: Unknown Register %08x = %08x & %08x\n", 0x0b000000 + (offset << 2), data, mem_mask );
546555         break;
547556   }
548557}
r14844r14845
594603   state->m_rtc_regs.timer->adjust(attotime::from_hz(1));
595604}
596605
597static READ32_HANDLER( ps_rtc_r )
606READ32_MEMBER(pockstat_state::ps_rtc_r)
598607{
599   pockstat_state *state = space->machine().driver_data<pockstat_state>();
600608   switch(offset)
601609   {
602610      case 0x0000/4:
603         verboselog(space->machine(), 0, "ps_rtc_r: RTC Mode = %08x & %08x\n", state->m_rtc_regs.mode, mem_mask );
604         return state->m_rtc_regs.mode;
611         verboselog(machine(), 0, "ps_rtc_r: RTC Mode = %08x & %08x\n", m_rtc_regs.mode, mem_mask );
612         return m_rtc_regs.mode;
605613      case 0x0004/4:
606         verboselog(space->machine(), 0, "ps_rtc_r: RTC Control = %08x & %08x\n", state->m_rtc_regs.control, mem_mask );
607         return state->m_rtc_regs.control;
614         verboselog(machine(), 0, "ps_rtc_r: RTC Control = %08x & %08x\n", m_rtc_regs.control, mem_mask );
615         return m_rtc_regs.control;
608616      case 0x0008/4:
609         verboselog(space->machine(), 0, "ps_rtc_r: RTC Time = %08x & %08x\n", state->m_rtc_regs.time, mem_mask );
610         return state->m_rtc_regs.time;
617         verboselog(machine(), 0, "ps_rtc_r: RTC Time = %08x & %08x\n", m_rtc_regs.time, mem_mask );
618         return m_rtc_regs.time;
611619      case 0x000c/4:
612         verboselog(space->machine(), 0, "ps_rtc_r: RTC Date = %08x & %08x\n", state->m_rtc_regs.date, mem_mask );
613         return state->m_rtc_regs.date;
620         verboselog(machine(), 0, "ps_rtc_r: RTC Date = %08x & %08x\n", m_rtc_regs.date, mem_mask );
621         return m_rtc_regs.date;
614622      default:
615         verboselog(space->machine(), 0, "ps_rtc_r: Unknown Register %08x & %08x\n", 0x0b800000 + (offset << 2), mem_mask );
623         verboselog(machine(), 0, "ps_rtc_r: Unknown Register %08x & %08x\n", 0x0b800000 + (offset << 2), mem_mask );
616624         break;
617625   }
618626   return 0;
619627}
620628
621static WRITE32_HANDLER( ps_rtc_w )
629WRITE32_MEMBER(pockstat_state::ps_rtc_w)
622630{
623   pockstat_state *state = space->machine().driver_data<pockstat_state>();
624631   switch(offset)
625632   {
626633      case 0x0000/4:
627         verboselog(space->machine(), 0, "ps_rtc_w: RTC Mode = %08x & %08x\n", data, mem_mask );
628         COMBINE_DATA(&state->m_rtc_regs.mode);
634         verboselog(machine(), 0, "ps_rtc_w: RTC Mode = %08x & %08x\n", data, mem_mask );
635         COMBINE_DATA(&m_rtc_regs.mode);
629636         break;
630637      case 0x0004/4:
631         verboselog(space->machine(), 0, "ps_rtc_w: RTC Control = %08x & %08x\n", data, mem_mask );
632         if(state->m_rtc_regs.control == 1 && data == 1)
638         verboselog(machine(), 0, "ps_rtc_w: RTC Control = %08x & %08x\n", data, mem_mask );
639         if(m_rtc_regs.control == 1 && data == 1)
633640         {
634            switch(state->m_rtc_regs.mode >> 1)
641            switch(m_rtc_regs.mode >> 1)
635642            {
636643               case 0: // Seconds
637                  state->m_rtc_regs.time += 0x00000001;
638                  if((state->m_rtc_regs.time & 0x0000000f) == 0x0000000a)
644                  m_rtc_regs.time += 0x00000001;
645                  if((m_rtc_regs.time & 0x0000000f) == 0x0000000a)
639646                  {
640                     state->m_rtc_regs.time &= 0xfffffff0;
641                     state->m_rtc_regs.time += 0x00000010;
642                     if((state->m_rtc_regs.time & 0x000000ff) == 0x00000060)
647                     m_rtc_regs.time &= 0xfffffff0;
648                     m_rtc_regs.time += 0x00000010;
649                     if((m_rtc_regs.time & 0x000000ff) == 0x00000060)
643650                     {
644                        state->m_rtc_regs.time &= 0xffffff00;
651                        m_rtc_regs.time &= 0xffffff00;
645652                     }
646653                  }
647654                  break;
648655               case 1: // Minutes
649                  state->m_rtc_regs.time += 0x00000100;
650                  if((state->m_rtc_regs.time & 0x00000f00) == 0x00000a00)
656                  m_rtc_regs.time += 0x00000100;
657                  if((m_rtc_regs.time & 0x00000f00) == 0x00000a00)
651658                  {
652                     state->m_rtc_regs.time &= 0xfffff0ff;
653                     state->m_rtc_regs.time += 0x00001000;
654                     if((state->m_rtc_regs.time & 0x0000ff00) == 0x00006000)
659                     m_rtc_regs.time &= 0xfffff0ff;
660                     m_rtc_regs.time += 0x00001000;
661                     if((m_rtc_regs.time & 0x0000ff00) == 0x00006000)
655662                     {
656                        state->m_rtc_regs.time &= 0xffff00ff;
663                        m_rtc_regs.time &= 0xffff00ff;
657664                     }
658665                  }
659666                  break;
660667               case 2: // Hours
661                  state->m_rtc_regs.time += 0x00010000;
662                  if((state->m_rtc_regs.time & 0x00ff0000) == 0x00240000)
668                  m_rtc_regs.time += 0x00010000;
669                  if((m_rtc_regs.time & 0x00ff0000) == 0x00240000)
663670                  {
664                     state->m_rtc_regs.time &= 0xff00ffff;
671                     m_rtc_regs.time &= 0xff00ffff;
665672                  }
666                  else if((state->m_rtc_regs.time & 0x000f0000) == 0x000a0000)
673                  else if((m_rtc_regs.time & 0x000f0000) == 0x000a0000)
667674                  {
668                     state->m_rtc_regs.time &= 0xfff0ffff;
669                     state->m_rtc_regs.time += 0x00100000;
675                     m_rtc_regs.time &= 0xfff0ffff;
676                     m_rtc_regs.time += 0x00100000;
670677                  }
671678                  break;
672679               case 3: // Day of the week
673                  state->m_rtc_regs.time += 0x01000000;
674                  if((state->m_rtc_regs.time & 0x0f000000) == 0x08000000)
680                  m_rtc_regs.time += 0x01000000;
681                  if((m_rtc_regs.time & 0x0f000000) == 0x08000000)
675682                  {
676                     state->m_rtc_regs.time &= 0xf0ffffff;
677                     state->m_rtc_regs.time |= 0x01000000;
683                     m_rtc_regs.time &= 0xf0ffffff;
684                     m_rtc_regs.time |= 0x01000000;
678685                  }
679686                  break;
680687               case 4: // Day
681                  state->m_rtc_regs.date += 0x00000001;
682                  if((state->m_rtc_regs.date & 0x000000ff) == 0x00000032)
688                  m_rtc_regs.date += 0x00000001;
689                  if((m_rtc_regs.date & 0x000000ff) == 0x00000032)
683690                  {
684                     state->m_rtc_regs.date &= 0xffffff00;
691                     m_rtc_regs.date &= 0xffffff00;
685692                  }
686                  else if((state->m_rtc_regs.date & 0x0000000f) == 0x0000000a)
693                  else if((m_rtc_regs.date & 0x0000000f) == 0x0000000a)
687694                  {
688                     state->m_rtc_regs.date &= 0xfffffff0;
689                     state->m_rtc_regs.date += 0x00000010;
695                     m_rtc_regs.date &= 0xfffffff0;
696                     m_rtc_regs.date += 0x00000010;
690697                  }
691698                  break;
692699               case 5: // Month
693                  state->m_rtc_regs.date += 0x00000100;
694                  if((state->m_rtc_regs.date & 0x0000ff00) == 0x00001300)
700                  m_rtc_regs.date += 0x00000100;
701                  if((m_rtc_regs.date & 0x0000ff00) == 0x00001300)
695702                  {
696                     state->m_rtc_regs.date &= 0xffffff00;
697                     state->m_rtc_regs.date |= 0x00000001;
703                     m_rtc_regs.date &= 0xffffff00;
704                     m_rtc_regs.date |= 0x00000001;
698705                  }
699                  else if((state->m_rtc_regs.date & 0x00000f00) == 0x00000a00)
706                  else if((m_rtc_regs.date & 0x00000f00) == 0x00000a00)
700707                  {
701                     state->m_rtc_regs.date &= 0xfffff0ff;
702                     state->m_rtc_regs.date += 0x00001000;
708                     m_rtc_regs.date &= 0xfffff0ff;
709                     m_rtc_regs.date += 0x00001000;
703710                  }
704711                  break;
705712               case 6: // Year (LSB)
706                  state->m_rtc_regs.date += 0x00010000;
707                  if((state->m_rtc_regs.date & 0x000f0000) == 0x000a0000)
713                  m_rtc_regs.date += 0x00010000;
714                  if((m_rtc_regs.date & 0x000f0000) == 0x000a0000)
708715                  {
709                     state->m_rtc_regs.date &= 0xfff0ffff;
710                     state->m_rtc_regs.date += 0x00100000;
711                     if((state->m_rtc_regs.date & 0x00f00000) == 0x00a00000)
716                     m_rtc_regs.date &= 0xfff0ffff;
717                     m_rtc_regs.date += 0x00100000;
718                     if((m_rtc_regs.date & 0x00f00000) == 0x00a00000)
712719                     {
713                        state->m_rtc_regs.date &= 0xff00ffff;
720                        m_rtc_regs.date &= 0xff00ffff;
714721                     }
715722                  }
716723                  break;
717724               case 7: // Year (MSB)
718725                  break;
719726            }
720            state->m_rtc_regs.control = 0;
727            m_rtc_regs.control = 0;
721728         }
722         else if(state->m_rtc_regs.control == 0)
729         else if(m_rtc_regs.control == 0)
723730         {
724            COMBINE_DATA(&state->m_rtc_regs.control);
731            COMBINE_DATA(&m_rtc_regs.control);
725732         }
726733         break;
727734      default:
728         verboselog(space->machine(), 0, "ps_rtc_w: Unknown Register %08x = %08x & %08x\n", 0x0b800000 + (offset << 2), data, mem_mask );
735         verboselog(machine(), 0, "ps_rtc_w: Unknown Register %08x = %08x & %08x\n", 0x0b800000 + (offset << 2), data, mem_mask );
729736         break;
730737   }
731738}
732739
733740
734static READ32_HANDLER( ps_lcd_r )
741READ32_MEMBER(pockstat_state::ps_lcd_r)
735742{
736   pockstat_state *state = space->machine().driver_data<pockstat_state>();
737743   switch(offset)
738744   {
739745      case 0x0000/4:
740         verboselog(space->machine(), 0, "ps_lcd_r: LCD Control = %08x & %08x\n", state->m_lcd_control | 0x100, mem_mask );
741         return state->m_lcd_control;
746         verboselog(machine(), 0, "ps_lcd_r: LCD Control = %08x & %08x\n", m_lcd_control | 0x100, mem_mask );
747         return m_lcd_control;
742748      default:
743         verboselog(space->machine(), 0, "ps_lcd_r: Unknown Register %08x & %08x\n", 0x0d000000 + (offset << 2), mem_mask );
749         verboselog(machine(), 0, "ps_lcd_r: Unknown Register %08x & %08x\n", 0x0d000000 + (offset << 2), mem_mask );
744750         break;
745751   }
746752   return 0;
747753}
748754
749static WRITE32_HANDLER( ps_lcd_w )
755WRITE32_MEMBER(pockstat_state::ps_lcd_w)
750756{
751   pockstat_state *state = space->machine().driver_data<pockstat_state>();
752757   switch(offset)
753758   {
754759      case 0x0000/4:
755         verboselog(space->machine(), 0, "ps_lcd_w: LCD Control = %08x & %08x\n", data, mem_mask );
756         COMBINE_DATA(&state->m_lcd_control);
760         verboselog(machine(), 0, "ps_lcd_w: LCD Control = %08x & %08x\n", data, mem_mask );
761         COMBINE_DATA(&m_lcd_control);
757762         break;
758763      default:
759         verboselog(space->machine(), 0, "ps_lcd_w: Unknown Register %08x = %08x & %08x\n", 0x0d000000 + (offset << 2), data, mem_mask );
764         verboselog(machine(), 0, "ps_lcd_w: Unknown Register %08x = %08x & %08x\n", 0x0d000000 + (offset << 2), data, mem_mask );
760765         break;
761766   }
762767}
r14844r14845
772777   ps_intc_set_interrupt_line(field.machine(), PS_INT_BTN_UP,   (buttons & 16) ? 1 : 0);
773778}
774779
775static READ32_HANDLER(ps_rombank_r)
780READ32_MEMBER(pockstat_state::ps_rombank_r)
776781{
777   pockstat_state *state = space->machine().driver_data<pockstat_state>();
778782   INT32 bank = (offset >> 11) & 0x0f;
779783   int index = 0;
780784   for(index = 0; index < 32; index++)
781785   {
782      if(state->m_ftlb_regs.valid & (1 << index))
786      if(m_ftlb_regs.valid & (1 << index))
783787      {
784         if(state->m_ftlb_regs.entry[index] == bank)
788         if(m_ftlb_regs.entry[index] == bank)
785789         {
786790            //printf( "Address %08x is assigned to %08x in entry %d\n", 0x02000000 + (offset << 2), index * 0x2000 + ((offset << 2) & 0x1fff), index );
787            return space->machine().region("flash")->u32(index * (0x2000/4) + (offset & (0x1fff/4)));
791            return machine().region("flash")->u32(index * (0x2000/4) + (offset & (0x1fff/4)));
788792         }
789793      }
790794   }
791   return space->machine().region("flash")->u32(offset & 0x7fff);
795   return machine().region("flash")->u32(offset & 0x7fff);
792796}
793797
794798
795799// Horrible hack, probably wrong
796static WRITE32_HANDLER(ps_flash_w)
800WRITE32_MEMBER(pockstat_state::ps_flash_w)
797801{
798   pockstat_state *state = space->machine().driver_data<pockstat_state>();
799802   if(offset == (0x55a8/4))
800803   {
801      state->m_ps_flash_write_enable_count++;
804      m_ps_flash_write_enable_count++;
802805      return;
803806   }
804807   if(offset == (0x2a54/4))
805808   {
806      state->m_ps_flash_write_enable_count++;
809      m_ps_flash_write_enable_count++;
807810      return;
808811   }
809   if(state->m_ps_flash_write_enable_count == 3)
812   if(m_ps_flash_write_enable_count == 3)
810813   {
811      state->m_ps_flash_write_enable_count = 0;
812      state->m_ps_flash_write_count = 0x40;
814      m_ps_flash_write_enable_count = 0;
815      m_ps_flash_write_count = 0x40;
813816      return;
814817   }
815   if(state->m_ps_flash_write_count)
818   if(m_ps_flash_write_count)
816819   {
817      state->m_ps_flash_write_count--;
818      COMBINE_DATA(&((UINT32*)(*space->machine().region("flash")))[offset]);
820      m_ps_flash_write_count--;
821      COMBINE_DATA(&((UINT32*)(*machine().region("flash")))[offset]);
819822   }
820823}
821824
822static READ32_HANDLER( ps_audio_r )
825READ32_MEMBER(pockstat_state::ps_audio_r)
823826{
824   verboselog(space->machine(), 0, "ps_audio_r: Unknown Read: %08x = %08x & %08x\n", 0xd800000 + (offset << 2), 0x10, mem_mask);
827   verboselog(machine(), 0, "ps_audio_r: Unknown Read: %08x = %08x & %08x\n", 0xd800000 + (offset << 2), 0x10, mem_mask);
825828   return 0;
826829}
827830
828static WRITE32_HANDLER( ps_audio_w )
831WRITE32_MEMBER(pockstat_state::ps_audio_w)
829832{
830   verboselog(space->machine(), 0, "ps_audio_w: Unknown Write: %08x = %08x & %08x\n", 0xd800000 + (offset << 2), data, mem_mask);
833   verboselog(machine(), 0, "ps_audio_w: Unknown Write: %08x = %08x & %08x\n", 0xd800000 + (offset << 2), data, mem_mask);
831834}
832835
833static WRITE32_HANDLER( ps_dac_w )
836WRITE32_MEMBER(pockstat_state::ps_dac_w)
834837{
835   dac_data_16_w(space->machine().device("dac"), (UINT16)((data + 0x8000) & 0x0000ffff));
838   dac_data_16_w(machine().device("dac"), (UINT16)((data + 0x8000) & 0x0000ffff));
836839}
837840
838841static ADDRESS_MAP_START(pockstat_mem, AS_PROGRAM, 32, pockstat_state )
839842   AM_RANGE(0x00000000, 0x000007ff) AM_RAM
840   AM_RANGE(0x02000000, 0x02ffffff) AM_READ_LEGACY(ps_rombank_r)
843   AM_RANGE(0x02000000, 0x02ffffff) AM_READ(ps_rombank_r)
841844   AM_RANGE(0x04000000, 0x04003fff) AM_ROM AM_REGION("maincpu", 0)
842   AM_RANGE(0x06000000, 0x06000307) AM_READWRITE_LEGACY(ps_ftlb_r, ps_ftlb_w)
843   AM_RANGE(0x08000000, 0x0801ffff) AM_ROM AM_WRITE_LEGACY(ps_flash_w) AM_REGION("flash", 0)
844   AM_RANGE(0x0a000000, 0x0a000013) AM_READWRITE_LEGACY(ps_intc_r, ps_intc_w)
845   AM_RANGE(0x0a800000, 0x0a80002b) AM_READWRITE_LEGACY(ps_timer_r, ps_timer_w)
846   AM_RANGE(0x0b000000, 0x0b000007) AM_READWRITE_LEGACY(ps_clock_r, ps_clock_w)
847   AM_RANGE(0x0b800000, 0x0b80000f) AM_READWRITE_LEGACY(ps_rtc_r, ps_rtc_w)
848   AM_RANGE(0x0d000000, 0x0d000003) AM_READWRITE_LEGACY(ps_lcd_r, ps_lcd_w)
845   AM_RANGE(0x06000000, 0x06000307) AM_READWRITE(ps_ftlb_r, ps_ftlb_w)
846   AM_RANGE(0x08000000, 0x0801ffff) AM_ROM AM_WRITE(ps_flash_w) AM_REGION("flash", 0)
847   AM_RANGE(0x0a000000, 0x0a000013) AM_READWRITE(ps_intc_r, ps_intc_w)
848   AM_RANGE(0x0a800000, 0x0a80002b) AM_READWRITE(ps_timer_r, ps_timer_w)
849   AM_RANGE(0x0b000000, 0x0b000007) AM_READWRITE(ps_clock_r, ps_clock_w)
850   AM_RANGE(0x0b800000, 0x0b80000f) AM_READWRITE(ps_rtc_r, ps_rtc_w)
851   AM_RANGE(0x0d000000, 0x0d000003) AM_READWRITE(ps_lcd_r, ps_lcd_w)
849852   AM_RANGE(0x0d000100, 0x0d00017f) AM_RAM AM_BASE(m_lcd_buffer)
850   AM_RANGE(0x0d80000c, 0x0d80000f) AM_READWRITE_LEGACY(ps_audio_r, ps_audio_w)
851   AM_RANGE(0x0d800014, 0x0d800017) AM_WRITE_LEGACY(ps_dac_w)
853   AM_RANGE(0x0d80000c, 0x0d80000f) AM_READWRITE(ps_audio_r, ps_audio_w)
854   AM_RANGE(0x0d800014, 0x0d800017) AM_WRITE(ps_dac_w)
852855ADDRESS_MAP_END
853856
854857/* Input ports */
src/mess/drivers/fp6000.c
r14844r14845
3737   struct {
3838      UINT16 cmd;
3939   }m_key;
40   DECLARE_READ8_MEMBER(fp6000_pcg_r);
41   DECLARE_WRITE8_MEMBER(fp6000_pcg_w);
42   DECLARE_WRITE8_MEMBER(fp6000_6845_address_w);
43   DECLARE_WRITE8_MEMBER(fp6000_6845_data_w);
44   DECLARE_READ8_MEMBER(fp6000_key_r);
45   DECLARE_WRITE8_MEMBER(fp6000_key_w);
46   DECLARE_READ16_MEMBER(unk_r);
47   DECLARE_READ16_MEMBER(ex_board_r);
48   DECLARE_READ16_MEMBER(pit_r);
4049};
4150
4251static VIDEO_START( fp6000 )
r14844r14845
126135   return 0;
127136}
128137
129static READ8_HANDLER( fp6000_pcg_r )
138READ8_MEMBER(fp6000_state::fp6000_pcg_r)
130139{
131   fp6000_state *state = space->machine().driver_data<fp6000_state>();
132140
133   return state->m_char_rom[offset];
141   return m_char_rom[offset];
134142}
135143
136static WRITE8_HANDLER( fp6000_pcg_w )
144WRITE8_MEMBER(fp6000_state::fp6000_pcg_w)
137145{
138   fp6000_state *state = space->machine().driver_data<fp6000_state>();
139146
140   state->m_char_rom[offset] = data;
141   gfx_element_mark_dirty(space->machine().gfx[0], offset >> 4);
147   m_char_rom[offset] = data;
148   gfx_element_mark_dirty(machine().gfx[0], offset >> 4);
142149}
143150
144static WRITE8_HANDLER( fp6000_6845_address_w )
151WRITE8_MEMBER(fp6000_state::fp6000_6845_address_w)
145152{
146   fp6000_state *state = space->machine().driver_data<fp6000_state>();
147153
148   state->m_crtc_index = data;
149   state->m_mc6845->address_w(*space, offset, data);
154   m_crtc_index = data;
155   m_mc6845->address_w(*&space, offset, data);
150156}
151157
152static WRITE8_HANDLER( fp6000_6845_data_w )
158WRITE8_MEMBER(fp6000_state::fp6000_6845_data_w)
153159{
154   fp6000_state *state = space->machine().driver_data<fp6000_state>();
155160
156   state->m_crtc_vreg[state->m_crtc_index] = data;
157   state->m_mc6845->register_w(*space, offset, data);
161   m_crtc_vreg[m_crtc_index] = data;
162   m_mc6845->register_w(*&space, offset, data);
158163}
159164
160165static ADDRESS_MAP_START(fp6000_map, AS_PROGRAM, 16, fp6000_state )
r14844r14845
162167   AM_RANGE(0x00000,0xbffff) AM_RAM
163168   AM_RANGE(0xc0000,0xdffff) AM_RAM AM_BASE(m_gvram)//gvram
164169   AM_RANGE(0xe0000,0xe0fff) AM_RAM AM_BASE(m_vram)
165   AM_RANGE(0xe7000,0xe7fff) AM_READWRITE8_LEGACY(fp6000_pcg_r,fp6000_pcg_w,0xffff)
170   AM_RANGE(0xe7000,0xe7fff) AM_READWRITE8(fp6000_pcg_r,fp6000_pcg_w,0xffff)
166171   AM_RANGE(0xf0000,0xfffff) AM_ROM AM_REGION("ipl", 0)
167172ADDRESS_MAP_END
168173
169174/* Hack until I understand what UART is this one ... */
170static READ8_HANDLER( fp6000_key_r )
175READ8_MEMBER(fp6000_state::fp6000_key_r)
171176{
172   fp6000_state *state = space->machine().driver_data<fp6000_state>();
173177
174178   if(offset)
175179   {
176      switch(state->m_key.cmd)
180      switch(m_key.cmd)
177181      {
178182         case 0x7e15: return 3;
179183         case 0x1b15: return 1;
180184         case 0x2415: return 0;
181         default: printf("%04x\n",state->m_key.cmd);
185         default: printf("%04x\n",m_key.cmd);
182186      }
183187      return 0;
184188   }
r14844r14845
186190   return 0x40;
187191}
188192
189static WRITE8_HANDLER( fp6000_key_w )
193WRITE8_MEMBER(fp6000_state::fp6000_key_w)
190194{
191   fp6000_state *state = space->machine().driver_data<fp6000_state>();
192195
193196   if(offset)
194      state->m_key.cmd = (data & 0xff) | (state->m_key.cmd << 8);
197      m_key.cmd = (data & 0xff) | (m_key.cmd << 8);
195198   else
196      state->m_key.cmd = (data << 8) | (state->m_key.cmd & 0xff);
199      m_key.cmd = (data << 8) | (m_key.cmd & 0xff);
197200}
198201
199static READ16_HANDLER( unk_r )
202READ16_MEMBER(fp6000_state::unk_r)
200203{
201204   return 0x40;
202205}
203206
204static READ16_HANDLER( ex_board_r )
207READ16_MEMBER(fp6000_state::ex_board_r)
205208{
206209   return 0xffff;
207210}
208211
209static READ16_HANDLER( pit_r )
212READ16_MEMBER(fp6000_state::pit_r)
210213{
211   return space->machine().rand();
214   return machine().rand();
212215}
213216
214217static ADDRESS_MAP_START(fp6000_io, AS_IO, 16, fp6000_state )
215218   ADDRESS_MAP_UNMAP_HIGH
216   AM_RANGE(0x08, 0x09) AM_READ_LEGACY(ex_board_r) // BIOS of some sort ...
219   AM_RANGE(0x08, 0x09) AM_READ(ex_board_r) // BIOS of some sort ...
217220   AM_RANGE(0x0a, 0x0b) AM_READ_PORT("DSW") // installed RAM id?
218221   AM_RANGE(0x10, 0x11) AM_READNOP
219   AM_RANGE(0x20, 0x23) AM_READWRITE8_LEGACY(fp6000_key_r,fp6000_key_w,0x00ff)
220   AM_RANGE(0x38, 0x39) AM_READ_LEGACY(pit_r) // pit?
221   AM_RANGE(0x70, 0x71) AM_WRITE8_LEGACY(fp6000_6845_address_w,0x00ff)
222   AM_RANGE(0x72, 0x73) AM_WRITE8_LEGACY(fp6000_6845_data_w,0x00ff)
223   AM_RANGE(0x74, 0x75) AM_READ_LEGACY(unk_r) //bit 6 busy flag
222   AM_RANGE(0x20, 0x23) AM_READWRITE8(fp6000_key_r,fp6000_key_w,0x00ff)
223   AM_RANGE(0x38, 0x39) AM_READ(pit_r) // pit?
224   AM_RANGE(0x70, 0x71) AM_WRITE8(fp6000_6845_address_w,0x00ff)
225   AM_RANGE(0x72, 0x73) AM_WRITE8(fp6000_6845_data_w,0x00ff)
226   AM_RANGE(0x74, 0x75) AM_READ(unk_r) //bit 6 busy flag
224227ADDRESS_MAP_END
225228
226229/* Input ports */
src/mess/drivers/jr100.c
r14844r14845
3535   UINT8 m_speaker;
3636   UINT16 m_t1latch;
3737   UINT8 m_beep_en;
38   DECLARE_WRITE8_MEMBER(jr100_via_w);
3839};
3940
4041
4142
4243
43static WRITE8_HANDLER( jr100_via_w )
44WRITE8_MEMBER(jr100_state::jr100_via_w)
4445{
45   jr100_state *state = space->machine().driver_data<jr100_state>();
4646   /* ACR: beeper masking */
4747   if(offset == 0x0b)
4848   {
4949      //printf("BEEP %s\n",((data & 0xe0) == 0xe0) ? "ON" : "OFF");
50      state->m_beep_en = ((data & 0xe0) == 0xe0);
50      m_beep_en = ((data & 0xe0) == 0xe0);
5151
52      if(!state->m_beep_en)
53         beep_set_state(space->machine().device(BEEPER_TAG),0);
52      if(!m_beep_en)
53         beep_set_state(machine().device(BEEPER_TAG),0);
5454   }
5555
5656   /* T1L-L */
5757   if(offset == 0x04)
5858   {
59      state->m_t1latch = (state->m_t1latch & 0xff00) | (data & 0xff);
59      m_t1latch = (m_t1latch & 0xff00) | (data & 0xff);
6060      //printf("BEEP T1CL %02x\n",data);
6161   }
6262
6363   /* T1L-H */
6464   if(offset == 0x05)
6565   {
66      state->m_t1latch = (state->m_t1latch & 0xff) | ((data & 0xff) << 8);
66      m_t1latch = (m_t1latch & 0xff) | ((data & 0xff) << 8);
6767      //printf("BEEP T1CH %02x\n",data);
6868
6969      /* writing here actually enables the beeper, if above masking condition is satisfied */
70      if(state->m_beep_en)
70      if(m_beep_en)
7171      {
72         beep_set_state(space->machine().device(BEEPER_TAG),1);
73         beep_set_frequency(space->machine().device(BEEPER_TAG),894886.25 / (double)(state->m_t1latch) / 2.0);
72         beep_set_state(machine().device(BEEPER_TAG),1);
73         beep_set_frequency(machine().device(BEEPER_TAG),894886.25 / (double)(m_t1latch) / 2.0);
7474      }
7575   }
76   via6522_device *via = space->machine().device<via6522_device>("via");
77   via->write(*space,offset,data);
76   via6522_device *via = machine().device<via6522_device>("via");
77   via->write(*&space,offset,data);
7878}
7979
8080static ADDRESS_MAP_START(jr100_mem, AS_PROGRAM, 8, jr100_state )
r14844r14845
8282   AM_RANGE(0x0000, 0x3fff) AM_RAM AM_BASE(m_ram)
8383   AM_RANGE(0xc000, 0xc0ff) AM_RAM AM_BASE(m_pcg)
8484   AM_RANGE(0xc100, 0xc3ff) AM_RAM AM_BASE(m_vram)
85   AM_RANGE(0xc800, 0xc80f) AM_DEVREAD("via", via6522_device, read) AM_WRITE_LEGACY(jr100_via_w)
85   AM_RANGE(0xc800, 0xc80f) AM_DEVREAD("via", via6522_device, read) AM_WRITE(jr100_via_w)
8686   AM_RANGE(0xe000, 0xffff) AM_ROM
8787ADDRESS_MAP_END
8888
src/mess/drivers/pk8000.c
r14844r14845
2525      : driver_device(mconfig, type, tag) { }
2626
2727   UINT8 m_keyboard_line;
28   DECLARE_READ8_MEMBER(pk8000_joy_1_r);
29   DECLARE_READ8_MEMBER(pk8000_joy_2_r);
2830};
2931
3032
r14844r14845
155157   DEVCB_HANDLER(pk8000_84_portc_w)
156158};
157159
158static READ8_HANDLER(pk8000_joy_1_r)
160READ8_MEMBER(pk8000_state::pk8000_joy_1_r)
159161{
160   UINT8 retVal = (cassette_device_image(space->machine())->input() > 0.0038 ? 0x80 : 0);
161   retVal |= input_port_read(space->machine(), "JOY1") & 0x7f;
162   UINT8 retVal = (cassette_device_image(machine())->input() > 0.0038 ? 0x80 : 0);
163   retVal |= input_port_read(machine(), "JOY1") & 0x7f;
162164   return retVal;
163165}
164static READ8_HANDLER(pk8000_joy_2_r)
166READ8_MEMBER(pk8000_state::pk8000_joy_2_r)
165167{
166   UINT8 retVal = (cassette_device_image(space->machine())->input() > 0.0038 ? 0x80 : 0);
167   retVal |= input_port_read(space->machine(), "JOY2") & 0x7f;
168   UINT8 retVal = (cassette_device_image(machine())->input() > 0.0038 ? 0x80 : 0);
169   retVal |= input_port_read(machine(), "JOY2") & 0x7f;
168170   return retVal;
169171}
170172
r14844r14845
181183   AM_RANGE(0x80, 0x83) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write)
182184   AM_RANGE(0x84, 0x87) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write)
183185   AM_RANGE(0x88, 0x88) AM_READWRITE_LEGACY(pk8000_video_color_r,pk8000_video_color_w)
184   AM_RANGE(0x8c, 0x8c) AM_READ_LEGACY(pk8000_joy_1_r)
185   AM_RANGE(0x8d, 0x8d) AM_READ_LEGACY(pk8000_joy_2_r)
186   AM_RANGE(0x8c, 0x8c) AM_READ(pk8000_joy_1_r)
187   AM_RANGE(0x8d, 0x8d) AM_READ(pk8000_joy_2_r)
186188   AM_RANGE(0x90, 0x90) AM_READWRITE_LEGACY(pk8000_text_start_r,pk8000_text_start_w)
187189   AM_RANGE(0x91, 0x91) AM_READWRITE_LEGACY(pk8000_chargen_start_r,pk8000_chargen_start_w)
188190   AM_RANGE(0x92, 0x92) AM_READWRITE_LEGACY(pk8000_video_start_r,pk8000_video_start_w)
src/mess/drivers/sgi_ip2.c
r14844r14845
6969   UINT8 m_mbp;
7070
7171   required_device<generic_terminal_device> m_terminal;
72   DECLARE_READ8_MEMBER(sgi_ip2_m_but_r);
73   DECLARE_WRITE8_MEMBER(sgi_ip2_m_but_w);
74   DECLARE_READ16_MEMBER(sgi_ip2_m_quad_r);
75   DECLARE_WRITE16_MEMBER(sgi_ip2_m_quad_w);
76   DECLARE_READ16_MEMBER(sgi_ip2_swtch_r);
77   DECLARE_READ8_MEMBER(sgi_ip2_clock_ctl_r);
78   DECLARE_WRITE8_MEMBER(sgi_ip2_clock_ctl_w);
79   DECLARE_READ8_MEMBER(sgi_ip2_clock_data_r);
80   DECLARE_WRITE8_MEMBER(sgi_ip2_clock_data_w);
81   DECLARE_READ8_MEMBER(sgi_ip2_os_base_r);
82   DECLARE_WRITE8_MEMBER(sgi_ip2_os_base_w);
83   DECLARE_READ16_MEMBER(sgi_ip2_status_r);
84   DECLARE_WRITE16_MEMBER(sgi_ip2_status_w);
85   DECLARE_READ8_MEMBER(sgi_ip2_parctl_r);
86   DECLARE_WRITE8_MEMBER(sgi_ip2_parctl_w);
87   DECLARE_READ8_MEMBER(sgi_ip2_mbp_r);
88   DECLARE_WRITE8_MEMBER(sgi_ip2_mbp_w);
89   DECLARE_READ32_MEMBER(sgi_ip2_ptmap_r);
90   DECLARE_WRITE32_MEMBER(sgi_ip2_ptmap_w);
91   DECLARE_READ16_MEMBER(sgi_ip2_tdbase_r);
92   DECLARE_WRITE16_MEMBER(sgi_ip2_tdbase_w);
93   DECLARE_READ16_MEMBER(sgi_ip2_tdlmt_r);
94   DECLARE_WRITE16_MEMBER(sgi_ip2_tdlmt_w);
95   DECLARE_READ16_MEMBER(sgi_ip2_stkbase_r);
96   DECLARE_WRITE16_MEMBER(sgi_ip2_stkbase_w);
97   DECLARE_READ16_MEMBER(sgi_ip2_stklmt_r);
98   DECLARE_WRITE16_MEMBER(sgi_ip2_stklmt_w);
7299};
73100
74101
r14844r14845
104131#define BOARD_REV2      0x50   /* Board revision - #2 */
105132
106133
107static READ8_HANDLER(sgi_ip2_m_but_r)
134READ8_MEMBER(sgi_ip2_state::sgi_ip2_m_but_r)
108135{
109   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
110   verboselog(space->machine(), 0, "sgi_ip2_m_but_r: %02x\n", state->m_mbut | BOARD_REV1);
111   return state->m_mbut | BOARD_REV1;
136   verboselog(machine(), 0, "sgi_ip2_m_but_r: %02x\n", m_mbut | BOARD_REV1);
137   return m_mbut | BOARD_REV1;
112138}
113139
114static WRITE8_HANDLER(sgi_ip2_m_but_w)
140WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_m_but_w)
115141{
116   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
117   verboselog(space->machine(), 0, "sgi_ip2_m_but_w: %02x\n", data);
118   state->m_mbut = data;
142   verboselog(machine(), 0, "sgi_ip2_m_but_w: %02x\n", data);
143   m_mbut = data;
119144}
120145
121146#define MOUSE_XFIRE      0x01   /* X Quadrature Fired, active low */
r14844r14845
124149#define MOUSE_YCHANGE   0x08   /* MOUSE_YCHANGE ? y-- : y++ */
125150
126151
127static READ16_HANDLER(sgi_ip2_m_quad_r)
152READ16_MEMBER(sgi_ip2_state::sgi_ip2_m_quad_r)
128153{
129   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
130   verboselog(space->machine(), 0, "sgi_ip2_m_quad_r: %04x\n", state->m_mquad);
131   return state->m_mquad;
154   verboselog(machine(), 0, "sgi_ip2_m_quad_r: %04x\n", m_mquad);
155   return m_mquad;
132156}
133157
134static WRITE16_HANDLER(sgi_ip2_m_quad_w)
158WRITE16_MEMBER(sgi_ip2_state::sgi_ip2_m_quad_w)
135159{
136   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
137   verboselog(space->machine(), 0, "sgi_ip2_m_quad_w = %04x & %04x\n", data, mem_mask);
138   COMBINE_DATA(&state->m_mquad);
160   verboselog(machine(), 0, "sgi_ip2_m_quad_w = %04x & %04x\n", data, mem_mask);
161   COMBINE_DATA(&m_mquad);
139162}
140163
141static READ16_HANDLER(sgi_ip2_swtch_r)
164READ16_MEMBER(sgi_ip2_state::sgi_ip2_swtch_r)
142165{
143   verboselog(space->machine(), 0, "sgi_ip2_swtch_r: %04x\n", input_port_read(space->machine(), "SWTCH"));
144   return input_port_read(space->machine(), "SWTCH");
166   verboselog(machine(), 0, "sgi_ip2_swtch_r: %04x\n", input_port_read(machine(), "SWTCH"));
167   return input_port_read(machine(), "SWTCH");
145168}
146169
147static READ8_HANDLER(sgi_ip2_clock_ctl_r)
170READ8_MEMBER(sgi_ip2_state::sgi_ip2_clock_ctl_r)
148171{
149   mc146818_device *rtc = space->machine().device<mc146818_device>("rtc");
150   UINT8 ret = rtc->read(*space, 1);
151   verboselog(space->machine(), 1, "sgi_ip2_clock_ctl_r: %02x\n", ret);
172   mc146818_device *rtc = machine().device<mc146818_device>("rtc");
173   UINT8 ret = rtc->read(*&space, 1);
174   verboselog(machine(), 1, "sgi_ip2_clock_ctl_r: %02x\n", ret);
152175   return ret;
153176}
154177
155static WRITE8_HANDLER(sgi_ip2_clock_ctl_w)
178WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_clock_ctl_w)
156179{
157   verboselog(space->machine(), 1, "sgi_ip2_clock_ctl_w: %02x\n", data);
158   mc146818_device *rtc = space->machine().device<mc146818_device>("rtc");
159   rtc->write(*space, 1, data);
180   verboselog(machine(), 1, "sgi_ip2_clock_ctl_w: %02x\n", data);
181   mc146818_device *rtc = machine().device<mc146818_device>("rtc");
182   rtc->write(*&space, 1, data);
160183}
161184
162static READ8_HANDLER(sgi_ip2_clock_data_r)
185READ8_MEMBER(sgi_ip2_state::sgi_ip2_clock_data_r)
163186{
164   mc146818_device *rtc = space->machine().device<mc146818_device>("rtc");
165   UINT8 ret = rtc->read(*space, 0);
187   mc146818_device *rtc = machine().device<mc146818_device>("rtc");
188   UINT8 ret = rtc->read(*&space, 0);
166189
167   verboselog(space->machine(), 1, "sgi_ip2_clock_data_r: %02x\n", ret);
190   verboselog(machine(), 1, "sgi_ip2_clock_data_r: %02x\n", ret);
168191   return ret;
169192}
170193
171static WRITE8_HANDLER(sgi_ip2_clock_data_w)
194WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_clock_data_w)
172195{
173   verboselog(space->machine(), 1, "sgi_ip2_clock_data_w: %02x\n", data);
174   mc146818_device *rtc = space->machine().device<mc146818_device>("rtc");
175   rtc->write(*space, 0, data);
196   verboselog(machine(), 1, "sgi_ip2_clock_data_w: %02x\n", data);
197   mc146818_device *rtc = machine().device<mc146818_device>("rtc");
198   rtc->write(*&space, 0, data);
176199}
177200
178201
179static READ8_HANDLER(sgi_ip2_os_base_r)
202READ8_MEMBER(sgi_ip2_state::sgi_ip2_os_base_r)
180203{
181204   switch(offset)
182205   {
183206      default:
184         verboselog(space->machine(), 0, "sgi_ip2_os_base_r: Unknown Register %08x\n", 0x36000000 + offset);
207         verboselog(machine(), 0, "sgi_ip2_os_base_r: Unknown Register %08x\n", 0x36000000 + offset);
185208         break;
186209   }
187210   return 0;
188211}
189212
190static WRITE8_HANDLER(sgi_ip2_os_base_w)
213WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_os_base_w)
191214{
192215   switch(offset)
193216   {
194217      default:
195         verboselog(space->machine(), 0, "sgi_ip2_os_base_w: Unknown Register %08x = %02x\n", 0x36000000 + offset, data);
218         verboselog(machine(), 0, "sgi_ip2_os_base_w: Unknown Register %08x = %02x\n", 0x36000000 + offset, data);
196219         break;
197220   }
198221}
199222
200static READ16_HANDLER(sgi_ip2_status_r)
223READ16_MEMBER(sgi_ip2_state::sgi_ip2_status_r)
201224{
202225   switch(offset)
203226   {
204227      default:
205         verboselog(space->machine(), 0, "sgi_ip2_status_r: Unknown Register %08x & %04x\n", 0x38000000 + (offset << 1), mem_mask);
228         verboselog(machine(), 0, "sgi_ip2_status_r: Unknown Register %08x & %04x\n", 0x38000000 + (offset << 1), mem_mask);
206229         break;
207230   }
208231   return 0;
209232}
210233
211static WRITE16_HANDLER(sgi_ip2_status_w)
234WRITE16_MEMBER(sgi_ip2_state::sgi_ip2_status_w)
212235{
213236   switch(offset)
214237   {
215238      default:
216         verboselog(space->machine(), 0, "sgi_ip2_status_w: Unknown Register %08x = %04x & %04x\n", 0x38000000 + (offset << 1), data, mem_mask);
239         verboselog(machine(), 0, "sgi_ip2_status_w: Unknown Register %08x = %04x & %04x\n", 0x38000000 + (offset << 1), data, mem_mask);
217240         break;
218241   }
219242}
r14844r14845
228251#define PAR_MBW      0x80   /* Check parity on multibus writes */
229252
230253
231static READ8_HANDLER(sgi_ip2_parctl_r)
254READ8_MEMBER(sgi_ip2_state::sgi_ip2_parctl_r)
232255{
233   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
234   verboselog(space->machine(), 0, "sgi_ip2_parctl_r: %02x\n", state->m_parctl);
235   return state->m_parctl;
256   verboselog(machine(), 0, "sgi_ip2_parctl_r: %02x\n", m_parctl);
257   return m_parctl;
236258}
237259
238static WRITE8_HANDLER(sgi_ip2_parctl_w)
260WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_parctl_w)
239261{
240   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
241   verboselog(space->machine(), 0, "sgi_ip2_parctl_w: %02x\n", data);
242   state->m_parctl = data;
262   verboselog(machine(), 0, "sgi_ip2_parctl_w: %02x\n", data);
263   m_parctl = data;
243264}
244265
245266#define MBP_DCACC   0x01   /* Display controller access (I/O page 4) */
r14844r14845
252273#define MBP_HMACC   0x80   /* Allow upper memory access (0x8nnnnn - 0xfnnnnn) */
253274
254275
255static READ8_HANDLER(sgi_ip2_mbp_r)
276READ8_MEMBER(sgi_ip2_state::sgi_ip2_mbp_r)
256277{
257   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
258   verboselog(space->machine(), 0, "sgi_ip2_mbp_r: %02x\n", state->m_mbp);
259   return state->m_mbp;
278   verboselog(machine(), 0, "sgi_ip2_mbp_r: %02x\n", m_mbp);
279   return m_mbp;
260280}
261281
262static WRITE8_HANDLER(sgi_ip2_mbp_w)
282WRITE8_MEMBER(sgi_ip2_state::sgi_ip2_mbp_w)
263283{
264   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
265   verboselog(space->machine(), 0, "sgi_ip2_mbp_w: %02x\n", data);
266   state->m_mbp = data;
284   verboselog(machine(), 0, "sgi_ip2_mbp_w: %02x\n", data);
285   m_mbp = data;
267286}
268287
269288
270static READ32_HANDLER(sgi_ip2_ptmap_r)
289READ32_MEMBER(sgi_ip2_state::sgi_ip2_ptmap_r)
271290{
272   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
273   verboselog(space->machine(), 0, "sgi_ip2_ptmap_r: %08x = %08x & %08x\n", 0x3b000000 + (offset << 2), state->m_ptmap[offset], mem_mask);
274   return state->m_ptmap[offset];
291   verboselog(machine(), 0, "sgi_ip2_ptmap_r: %08x = %08x & %08x\n", 0x3b000000 + (offset << 2), m_ptmap[offset], mem_mask);
292   return m_ptmap[offset];
275293}
276294
277static WRITE32_HANDLER(sgi_ip2_ptmap_w)
295WRITE32_MEMBER(sgi_ip2_state::sgi_ip2_ptmap_w)
278296{
279   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
280   verboselog(space->machine(), 0, "sgi_ip2_ptmap_w: %08x = %08x & %08x\n", 0x3b000000 + (offset << 2), data, mem_mask);
281   COMBINE_DATA(&state->m_ptmap[offset]);
297   verboselog(machine(), 0, "sgi_ip2_ptmap_w: %08x = %08x & %08x\n", 0x3b000000 + (offset << 2), data, mem_mask);
298   COMBINE_DATA(&m_ptmap[offset]);
282299}
283300
284301
285static READ16_HANDLER(sgi_ip2_tdbase_r)
302READ16_MEMBER(sgi_ip2_state::sgi_ip2_tdbase_r)
286303{
287   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
288   verboselog(space->machine(), 0, "sgi_ip2_tdbase_r: %04x\n", state->m_tdbase);
289   return state->m_tdbase;
304   verboselog(machine(), 0, "sgi_ip2_tdbase_r: %04x\n", m_tdbase);
305   return m_tdbase;
290306}
291307
292static WRITE16_HANDLER(sgi_ip2_tdbase_w)
308WRITE16_MEMBER(sgi_ip2_state::sgi_ip2_tdbase_w)
293309{
294   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
295   verboselog(space->machine(), 0, "sgi_ip2_tdbase_w: %04x & %04x\n", data, mem_mask);
296   COMBINE_DATA(&state->m_tdbase);
310   verboselog(machine(), 0, "sgi_ip2_tdbase_w: %04x & %04x\n", data, mem_mask);
311   COMBINE_DATA(&m_tdbase);
297312}
298313
299314
300static READ16_HANDLER(sgi_ip2_tdlmt_r)
315READ16_MEMBER(sgi_ip2_state::sgi_ip2_tdlmt_r)
301316{
302   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
303   verboselog(space->machine(), 0, "sgi_ip2_tdlmt_r: %04x\n", state->m_tdlmt);
304   return state->m_tdlmt;
317   verboselog(machine(), 0, "sgi_ip2_tdlmt_r: %04x\n", m_tdlmt);
318   return m_tdlmt;
305319}
306320
307static WRITE16_HANDLER(sgi_ip2_tdlmt_w)
321WRITE16_MEMBER(sgi_ip2_state::sgi_ip2_tdlmt_w)
308322{
309   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
310   verboselog(space->machine(), 0, "sgi_ip2_tdlmt_w: %04x & %04x\n", data, mem_mask);
311   COMBINE_DATA(&state->m_tdlmt);
323   verboselog(machine(), 0, "sgi_ip2_tdlmt_w: %04x & %04x\n", data, mem_mask);
324   COMBINE_DATA(&m_tdlmt);
312325}
313326
314327
315static READ16_HANDLER(sgi_ip2_stkbase_r)
328READ16_MEMBER(sgi_ip2_state::sgi_ip2_stkbase_r)
316329{
317   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
318   verboselog(space->machine(), 0, "sgi_ip2_stkbase_r: %04x\n", state->m_stkbase);
319   return state->m_stkbase;
330   verboselog(machine(), 0, "sgi_ip2_stkbase_r: %04x\n", m_stkbase);
331   return m_stkbase;
320332}
321333
322static WRITE16_HANDLER(sgi_ip2_stkbase_w)
334WRITE16_MEMBER(sgi_ip2_state::sgi_ip2_stkbase_w)
323335{
324   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
325   verboselog(space->machine(), 0, "sgi_ip2_stkbase_w: %04x & %04x\n", data, mem_mask);
326   COMBINE_DATA(&state->m_stkbase);
336   verboselog(machine(), 0, "sgi_ip2_stkbase_w: %04x & %04x\n", data, mem_mask);
337   COMBINE_DATA(&m_stkbase);
327338}
328339
329340
330static READ16_HANDLER(sgi_ip2_stklmt_r)
341READ16_MEMBER(sgi_ip2_state::sgi_ip2_stklmt_r)
331342{
332   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
333   verboselog(space->machine(), 0, "sgi_ip2_stklmt_r: %04x\n", state->m_stklmt);
334   return state->m_stklmt;
343   verboselog(machine(), 0, "sgi_ip2_stklmt_r: %04x\n", m_stklmt);
344   return m_stklmt;
335345}
336346
337static WRITE16_HANDLER(sgi_ip2_stklmt_w)
347WRITE16_MEMBER(sgi_ip2_state::sgi_ip2_stklmt_w)
338348{
339   sgi_ip2_state *state = space->machine().driver_data<sgi_ip2_state>();
340   verboselog(space->machine(), 0, "sgi_ip2_stklmt_w: %04x & %04x\n", data, mem_mask);
341   COMBINE_DATA(&state->m_stklmt);
349   verboselog(machine(), 0, "sgi_ip2_stklmt_w: %04x & %04x\n", data, mem_mask);
350   COMBINE_DATA(&m_stklmt);
342351}
343352
344353static WRITE8_DEVICE_HANDLER( sgi_kbd_put )
r14844r14845
373382   AM_RANGE(0x00000000, 0x00ffffff) AM_RAM AM_BASE(m_mainram)
374383   AM_RANGE(0x02100000, 0x0210ffff) AM_RAM AM_BASE(m_bss) // ??? I don't understand the need for this...
375384   AM_RANGE(0x30000000, 0x30017fff) AM_ROM AM_REGION("user1", 0)
376   AM_RANGE(0x30800000, 0x30800003) AM_READWRITE8_LEGACY(sgi_ip2_m_but_r,       sgi_ip2_m_but_w,      0xffffffff)
377   AM_RANGE(0x31000000, 0x31000003) AM_READWRITE16_LEGACY(sgi_ip2_m_quad_r,      sgi_ip2_m_quad_w,      0xffffffff)
378   AM_RANGE(0x31800000, 0x31800003) AM_READ16_LEGACY(sgi_ip2_swtch_r,                              0xffffffff)
385   AM_RANGE(0x30800000, 0x30800003) AM_READWRITE8(sgi_ip2_m_but_r,       sgi_ip2_m_but_w,      0xffffffff)
386   AM_RANGE(0x31000000, 0x31000003) AM_READWRITE16(sgi_ip2_m_quad_r,      sgi_ip2_m_quad_w,      0xffffffff)
387   AM_RANGE(0x31800000, 0x31800003) AM_READ16(sgi_ip2_swtch_r,                              0xffffffff)
379388   AM_RANGE(0x32000000, 0x3200000f) AM_DEVREADWRITE8_LEGACY("duart68681a",      duart68681_r,      duart68681_w, 0xffffffff)
380389   AM_RANGE(0x32800000, 0x3280000f) AM_DEVREADWRITE8_LEGACY("duart68681b",      duart68681_r,      duart68681_w, 0xffffffff)
381390   AM_RANGE(0x33000000, 0x330007ff) AM_RAM
382   AM_RANGE(0x34000000, 0x34000003) AM_READWRITE8_LEGACY(sgi_ip2_clock_ctl_r,    sgi_ip2_clock_ctl_w,   0xffffffff)
383   AM_RANGE(0x35000000, 0x35000003) AM_READWRITE8_LEGACY(sgi_ip2_clock_data_r,   sgi_ip2_clock_data_w,   0xffffffff)
384   AM_RANGE(0x36000000, 0x36000003) AM_READWRITE8_LEGACY(sgi_ip2_os_base_r,      sgi_ip2_os_base_w,      0xffffffff)
385   AM_RANGE(0x38000000, 0x38000003) AM_READWRITE16_LEGACY(sgi_ip2_status_r,      sgi_ip2_status_w,      0xffffffff)
386   AM_RANGE(0x39000000, 0x39000003) AM_READWRITE8_LEGACY(sgi_ip2_parctl_r,      sgi_ip2_parctl_w,      0xffffffff)
387   AM_RANGE(0x3a000000, 0x3a000003) AM_READWRITE8_LEGACY(sgi_ip2_mbp_r,         sgi_ip2_mbp_w,         0xffffffff)
388   AM_RANGE(0x3b000000, 0x3b003fff) AM_READWRITE_LEGACY(sgi_ip2_ptmap_r, sgi_ip2_ptmap_w) AM_BASE(m_ptmap)
389   AM_RANGE(0x3c000000, 0x3c000003) AM_READWRITE16_LEGACY(sgi_ip2_tdbase_r,      sgi_ip2_tdbase_w,      0xffffffff)
390   AM_RANGE(0x3d000000, 0x3d000003) AM_READWRITE16_LEGACY(sgi_ip2_tdlmt_r,      sgi_ip2_tdlmt_w,      0xffffffff)
391   AM_RANGE(0x3e000000, 0x3e000003) AM_READWRITE16_LEGACY(sgi_ip2_stkbase_r,      sgi_ip2_stkbase_w,      0xffffffff)
392   AM_RANGE(0x3f000000, 0x3f000003) AM_READWRITE16_LEGACY(sgi_ip2_stklmt_r,      sgi_ip2_stklmt_w,      0xffffffff)
391   AM_RANGE(0x34000000, 0x34000003) AM_READWRITE8(sgi_ip2_clock_ctl_r,    sgi_ip2_clock_ctl_w,   0xffffffff)
392   AM_RANGE(0x35000000, 0x35000003) AM_READWRITE8(sgi_ip2_clock_data_r,   sgi_ip2_clock_data_w,   0xffffffff)
393   AM_RANGE(0x36000000, 0x36000003) AM_READWRITE8(sgi_ip2_os_base_r,      sgi_ip2_os_base_w,      0xffffffff)
394   AM_RANGE(0x38000000, 0x38000003) AM_READWRITE16(sgi_ip2_status_r,      sgi_ip2_status_w,      0xffffffff)
395   AM_RANGE(0x39000000, 0x39000003) AM_READWRITE8(sgi_ip2_parctl_r,      sgi_ip2_parctl_w,      0xffffffff)
396   AM_RANGE(0x3a000000, 0x3a000003) AM_READWRITE8(sgi_ip2_mbp_r,         sgi_ip2_mbp_w,         0xffffffff)
397   AM_RANGE(0x3b000000, 0x3b003fff) AM_READWRITE(sgi_ip2_ptmap_r, sgi_ip2_ptmap_w) AM_BASE(m_ptmap)
398   AM_RANGE(0x3c000000, 0x3c000003) AM_READWRITE16(sgi_ip2_tdbase_r,      sgi_ip2_tdbase_w,      0xffffffff)
399   AM_RANGE(0x3d000000, 0x3d000003) AM_READWRITE16(sgi_ip2_tdlmt_r,      sgi_ip2_tdlmt_w,      0xffffffff)
400   AM_RANGE(0x3e000000, 0x3e000003) AM_READWRITE16(sgi_ip2_stkbase_r,      sgi_ip2_stkbase_w,      0xffffffff)
401   AM_RANGE(0x3f000000, 0x3f000003) AM_READWRITE16(sgi_ip2_stklmt_r,      sgi_ip2_stklmt_w,      0xffffffff)
393402ADDRESS_MAP_END
394403
395404/***************************************************************************
src/mess/drivers/ti990_4.c
r14844r14845
5555      : driver_device(mconfig, type, tag) { }
5656
5757   device_t *m_terminal;
58   DECLARE_WRITE8_MEMBER(rset_callback);
59   DECLARE_WRITE8_MEMBER(ckon_ckof_callback);
60   DECLARE_WRITE8_MEMBER(lrex_callback);
5861};
5962
6063
r14844r14845
8790}
8891#endif
8992
90static WRITE8_HANDLER ( rset_callback )
93WRITE8_MEMBER(ti990_4_state::rset_callback)
9194{
9295   ti990_cpuboard_reset();
9396
r14844r14845
9699   /* clear controller panel and smi fault LEDs */
97100}
98101
99static WRITE8_HANDLER ( ckon_ckof_callback )
102WRITE8_MEMBER(ti990_4_state::ckon_ckof_callback)
100103{
101   device_t *maincpu = space->machine().device("maincpu");
104   device_t *maincpu = machine().device("maincpu");
102105   ti990_ckon_ckof_callback(maincpu, (offset & 0x1000) ? 1 : 0);
103106}
104107
105static WRITE8_HANDLER ( lrex_callback )
108WRITE8_MEMBER(ti990_4_state::lrex_callback)
106109{
107110   /* right??? */
108   ti990_hold_load(space->machine());
111   ti990_hold_load(machine());
109112}
110113
111114#if VIDEO_911
r14844r14845
211214
212215   /* external instruction decoding */
213216/*  AM_RANGE(0x2000, 0x2fff) AM_WRITE_LEGACY(idle_callback)*/
214   AM_RANGE(0x3000, 0x3fff) AM_WRITE_LEGACY(rset_callback)
215   AM_RANGE(0x5000, 0x6fff) AM_WRITE_LEGACY(ckon_ckof_callback)
216   AM_RANGE(0x7000, 0x7fff) AM_WRITE_LEGACY(lrex_callback)
217   AM_RANGE(0x3000, 0x3fff) AM_WRITE(rset_callback)
218   AM_RANGE(0x5000, 0x6fff) AM_WRITE(ckon_ckof_callback)
219   AM_RANGE(0x7000, 0x7fff) AM_WRITE(lrex_callback)
217220ADDRESS_MAP_END
218221
219222#if 0
src/mess/drivers/paso1600.c
r14844r14845
4848   struct{
4949      UINT8 portb;
5050   }m_keyb;
51   DECLARE_READ8_MEMBER(pc_dma_read_byte);
52   DECLARE_WRITE8_MEMBER(pc_dma_write_byte);
5153};
5254
5355#define mc6845_h_char_total    (state->m_crtc_vreg[0])
r14844r14845
296298{
297299}
298300
299static READ8_HANDLER( pc_dma_read_byte )
301READ8_MEMBER(paso1600_state::pc_dma_read_byte)
300302{
301//  paso1600_state *state = space->machine().driver_data<paso1600_state>();
302   //offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
303   //offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
303304   //  & 0xFF0000;
304305
305   return space->read_byte(offset);
306   return space.read_byte(offset);
306307}
307308
308309
309static WRITE8_HANDLER( pc_dma_write_byte )
310WRITE8_MEMBER(paso1600_state::pc_dma_write_byte)
310311{
311//  paso1600_state *state = space->machine().driver_data<paso1600_state>();
312   //offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
312   //offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
313313   //  & 0xFF0000;
314314
315   space->write_byte(offset, data);
315   space.write_byte(offset, data);
316316}
317317
318318static I8237_INTERFACE( paso1600_dma8237_interface )
319319{
320320   DEVCB_NULL,
321321   DEVCB_NULL,
322   DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte),
323   DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte),
322   DEVCB_DRIVER_MEMBER(paso1600_state, pc_dma_read_byte),
323   DEVCB_DRIVER_MEMBER(paso1600_state, pc_dma_write_byte),
324324   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL },
325325   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL },
326326   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }
src/mess/drivers/rvoice.c
r14844r14845
7777
7878   hd63701y0_t m_hd63701y0;
7979   rvoicepc_t m_rvoicepc;
80   DECLARE_READ8_MEMBER(main_hd63701_internal_registers_r);
81   DECLARE_WRITE8_MEMBER(main_hd63701_internal_registers_w);
8082};
8183
8284
r14844r14845
126128   state->m_hd63701y0.P6CSR = 0x00;
127129}
128130
129static READ8_HANDLER( main_hd63701_internal_registers_r )
131READ8_MEMBER(rvoice_state::main_hd63701_internal_registers_r)
130132{
131   rvoice_state *state = space->machine().driver_data<rvoice_state>();
132133   UINT8 data = 0;
133   logerror("main hd637B01Y0: %04x: read from 0x%02X: ", cpu_get_pc(&space->device()), offset);
134   logerror("main hd637B01Y0: %04x: read from 0x%02X: ", cpu_get_pc(&space.device()), offset);
134135   switch(offset)
135136   {
136137      case 0x00: // Port 1 DDR
r14844r14845
146147         return data;
147148      case 0x02: // Port 1
148149         logerror("Port 1\n");
149         data = state->m_hd63701y0.PORT1;
150         data = m_hd63701y0.PORT1;
150151         break;
151152      case 0x03: // Port 2
152153         logerror("Port 2\n");
153         data = state->m_hd63701y0.PORT1;
154         data = m_hd63701y0.PORT1;
154155         break;
155156      case 0x06: // Port 3
156157         logerror("Port 3\n");
157         data = state->m_hd63701y0.PORT3;
158         data = m_hd63701y0.PORT3;
158159         break;
159160      case 0x07: // Port 4
160161         logerror("Port 4\n");
161         data = state->m_hd63701y0.PORT4;
162         data = m_hd63701y0.PORT4;
162163         break;
163164      case 0x08: // Timer Control/Status Register 1
164165         logerror("Timer Control/Status Register 1\n");
165         data = state->m_hd63701y0.TCSR1;
166         data = m_hd63701y0.TCSR1;
166167         break;
167168      case 0x09: // Free Running Counter (MSB)
168169         logerror("Free Running Counter (MSB)\n");
169         data = state->m_hd63701y0.FRCH;
170         data = m_hd63701y0.FRCH;
170171         break;
171172      case 0x0A: // Free Running Counter (LSB)
172173         logerror("Free Running Counter (LSB)\n");
173         data = state->m_hd63701y0.FRCL;
174         data = m_hd63701y0.FRCL;
174175         break;
175176      // B C (D E)
176177      case 0x0F: // Timer Control/Status Register 2
177178         logerror("Timer Control/Status Register 2\n");
178         data = state->m_hd63701y0.TCSR2;
179         data = m_hd63701y0.TCSR2;
179180         break;
180181      // 10 11 (12)
181182
182183      case 0x14: // RAM/Port 5 Control Register
183184         logerror("RAM/Port 5 Control Register\n");
184         data = state->m_hd63701y0.RP5CR;
185         data = m_hd63701y0.RP5CR;
185186         break;
186187      case 0x15: // Port 5
187188         logerror("Port 5\n");
188         data = state->m_hd63701y0.PORT5;
189         data = m_hd63701y0.PORT5;
189190         break;
190191      case 0x17: // Port 6
191192         logerror("Port 6\n");
192         data = state->m_hd63701y0.PORT6;
193         data = m_hd63701y0.PORT6;
193194         break;
194195      case 0x18: // Port 7
195196         logerror("Port 7\n");
196         data = state->m_hd63701y0.PORT7;
197         data = m_hd63701y0.PORT7;
197198         break;
198199      // 19 1a 1b 1c 1d 1e 1f
199200      case 0x21: // Port 6 Control/Status Register
200201         logerror("Port 6 Control/Status Register\n");
201         data = state->m_hd63701y0.P6CSR;
202         data = m_hd63701y0.P6CSR;
202203         break;
203204      default:
204205         logerror("\n");
r14844r14845
210211}
211212
212213
213static WRITE8_HANDLER( main_hd63701_internal_registers_w )
214WRITE8_MEMBER(rvoice_state::main_hd63701_internal_registers_w)
214215{
215   rvoice_state *state = space->machine().driver_data<rvoice_state>();
216   logerror("main hd637B01Y0: %04x: write to 0x%02X: ", cpu_get_pc(&space->device()), offset);
216   logerror("main hd637B01Y0: %04x: write to 0x%02X: ", cpu_get_pc(&space.device()), offset);
217217   switch(offset)
218218   {
219219      case 0x00: // Port 1 DDR
220220         logerror("Port 1 DDR of %02X\n", data);
221         state->m_hd63701y0.P1DDR = data;
222         state->m_rvoicepc.port1 = (state->m_hd63701y0.PORT1 & state->m_hd63701y0.P1DDR);
221         m_hd63701y0.P1DDR = data;
222         m_rvoicepc.port1 = (m_hd63701y0.PORT1 & m_hd63701y0.P1DDR);
223223         break;
224224      case 0x01: // Port 2 DDR
225225         logerror("Port 2 DDR of %02X\n", data);
226         state->m_hd63701y0.P2DDR = data;
227         state->m_rvoicepc.port2 = (state->m_hd63701y0.PORT2 & state->m_hd63701y0.P2DDR);
226         m_hd63701y0.P2DDR = data;
227         m_rvoicepc.port2 = (m_hd63701y0.PORT2 & m_hd63701y0.P2DDR);
228228         break;
229229      case 0x02: // Port 1
230230         logerror("Port 1 of %02X\n", data);
231         state->m_hd63701y0.PORT1 = data;
232         state->m_rvoicepc.port1 = (state->m_hd63701y0.PORT1 & state->m_hd63701y0.P1DDR);
231         m_hd63701y0.PORT1 = data;
232         m_rvoicepc.port1 = (m_hd63701y0.PORT1 & m_hd63701y0.P1DDR);
233233         break;
234234      case 0x03: // Port 2
235235         logerror("Port 2 of %02X\n", data);
236         state->m_hd63701y0.PORT2 = data;
237         state->m_rvoicepc.port2 = (state->m_hd63701y0.PORT2 & state->m_hd63701y0.P2DDR);
236         m_hd63701y0.PORT2 = data;
237         m_rvoicepc.port2 = (m_hd63701y0.PORT2 & m_hd63701y0.P2DDR);
238238         break;
239239      case 0x04: // Port 3 DDR
240240         logerror("Port 3 DDR of %02X\n", data);
241         state->m_hd63701y0.P3DDR = data;
242         state->m_rvoicepc.port3 = (state->m_hd63701y0.PORT3 & state->m_hd63701y0.P3DDR);
241         m_hd63701y0.P3DDR = data;
242         m_rvoicepc.port3 = (m_hd63701y0.PORT3 & m_hd63701y0.P3DDR);
243243         break;
244244      case 0x05: // Port 4 DDR
245245         logerror("Port 4 DDR of %02X\n", data);
246         state->m_hd63701y0.P4DDR = data;
247         state->m_rvoicepc.port4 = (state->m_hd63701y0.PORT4 & state->m_hd63701y0.P4DDR);
246         m_hd63701y0.P4DDR = data;
247         m_rvoicepc.port4 = (m_hd63701y0.PORT4 & m_hd63701y0.P4DDR);
248248         break;
249249      case 0x06: // Port 3
250250         logerror("Port 3 of %02X\n", data);
251         state->m_hd63701y0.PORT3 = data;
252         state->m_rvoicepc.port3 = (state->m_hd63701y0.PORT3 & state->m_hd63701y0.P3DDR);
251         m_hd63701y0.PORT3 = data;
252         m_rvoicepc.port3 = (m_hd63701y0.PORT3 & m_hd63701y0.P3DDR);
253253         break;
254254      case 0x07: // Port 4
255255         logerror("Port 4 of %02X\n", data);
256         state->m_hd63701y0.PORT4 = data;
257         state->m_rvoicepc.port4 = (state->m_hd63701y0.PORT4 & state->m_hd63701y0.P4DDR);
256         m_hd63701y0.PORT4 = data;
257         m_rvoicepc.port4 = (m_hd63701y0.PORT4 & m_hd63701y0.P4DDR);
258258         break;
259259      case 0x08: // Timer Control/Status Register 1
260260         logerror("Timer Control/Status Register 1 of %02X\n", data);
261         state->m_hd63701y0.TCSR1 = data;
261         m_hd63701y0.TCSR1 = data;
262262         break;
263263      case 0x09: // Free Running Counter (MSB)
264264         logerror("Free Running Counter (MSB) of %02X\n", data);
265         state->m_hd63701y0.FRCH = data;
265         m_hd63701y0.FRCH = data;
266266         break;
267267      case 0x0A: // Free Running Counter (LSB)
268268         logerror("Free Running Counter (LSB) of %02X\n", data);
269         state->m_hd63701y0.FRCL = data;
269         m_hd63701y0.FRCL = data;
270270         break;
271271      // B C (D E)
272272      case 0x0F: // Timer Control/Status Register 2
273273         logerror("Timer Control/Status Register 2 of %02X\n", data);
274         state->m_hd63701y0.TCSR2 = data;
274         m_hd63701y0.TCSR2 = data;
275275         break;
276276      // 10 11 (12)
277277      case 0x13: // TxD Register
278278         logerror("TxD Register of %02X\n", data);
279         state->m_hd63701y0.TDR = data;
279         m_hd63701y0.TDR = data;
280280         break;
281281      case 0x14: // RAM/Port 5 Control Register
282282         logerror("RAM/Port 5 Control Register of %02X\n", data);
283         state->m_hd63701y0.RP5CR = data;
283         m_hd63701y0.RP5CR = data;
284284         break;
285285      case 0x15: // Port 5
286286         logerror("Port 5 of %02X\n", data);
287         state->m_hd63701y0.PORT5 = data;
288         state->m_rvoicepc.port5 = (state->m_hd63701y0.PORT5 & state->m_hd63701y0.P5DDR);
287         m_hd63701y0.PORT5 = data;
288         m_rvoicepc.port5 = (m_hd63701y0.PORT5 & m_hd63701y0.P5DDR);
289289         break;
290290      case 0x16: // Port 6 DDR
291291         logerror("Port 6 DDR of %02X\n", data);
292         state->m_hd63701y0.P6DDR = data;
293         state->m_rvoicepc.port6 = (state->m_hd63701y0.PORT6 & state->m_hd63701y0.P6DDR);
292         m_hd63701y0.P6DDR = data;
293         m_rvoicepc.port6 = (m_hd63701y0.PORT6 & m_hd63701y0.P6DDR);
294294         break;
295295      case 0x17: // Port 6
296296         logerror("Port 6 of %02X\n", data);
297         state->m_hd63701y0.PORT6 = data;
298         state->m_rvoicepc.port6 = (state->m_hd63701y0.PORT6 & state->m_hd63701y0.P6DDR);
297         m_hd63701y0.PORT6 = data;
298         m_rvoicepc.port6 = (m_hd63701y0.PORT6 & m_hd63701y0.P6DDR);
299299         break;
300300      case 0x18: // Port 7
301301         logerror("Port 7 of %02X\n", data);
302         state->m_hd63701y0.PORT7 = data;
303         state->m_rvoicepc.port7 = data;
302         m_hd63701y0.PORT7 = data;
303         m_rvoicepc.port7 = data;
304304         break;
305305      // 19 1a 1b 1c 1d 1e 1f
306306      case 0x20: // Port 5 DDR
307307         logerror("Port 5 DDR of %02X\n", data);
308         state->m_hd63701y0.P5DDR = data;
309         state->m_rvoicepc.port5 = (state->m_hd63701y0.PORT5 & state->m_hd63701y0.P5DDR);
308         m_hd63701y0.P5DDR = data;
309         m_rvoicepc.port5 = (m_hd63701y0.PORT5 & m_hd63701y0.P5DDR);
310310         break;
311311      case 0x21: // Port 6 Control/Status Register
312312         logerror("Port 6 Control/Status Register of %02X\n", data);
313         state->m_hd63701y0.P6CSR = data;
313         m_hd63701y0.P6CSR = data;
314314         break;
315315      default:
316316         logerror("with data of %02X\n", data);
r14844r14845
325325
326326static ADDRESS_MAP_START(hd63701_main_mem, AS_PROGRAM, 8, rvoice_state )
327327   ADDRESS_MAP_UNMAP_HIGH
328   AM_RANGE(0x0000, 0x0027) AM_READWRITE_LEGACY(main_hd63701_internal_registers_r, main_hd63701_internal_registers_w) // INTERNAL REGS
328   AM_RANGE(0x0000, 0x0027) AM_READWRITE(main_hd63701_internal_registers_r, main_hd63701_internal_registers_w) // INTERNAL REGS
329329   AM_RANGE(0x0040, 0x013f) AM_RAM // INTERNAL RAM (overlaps acia)
330330   AM_RANGE(0x0060, 0x007f) AM_DEVREADWRITE("acia65c51", acia6551_device, read, write) // ACIA 65C51
331331   AM_RANGE(0x2000, 0x7fff) AM_RAM // EXTERNAL SRAM
src/mess/drivers/px4.c
r14844r14845
5656    MACROS
5757***************************************************************************/
5858
59#define ART_TX_ENABLED   (BIT(px4->m_artcr, 0))
59#define ART_TX_ENABLED   (BIT(m_artcr, 0))
6060#define ART_RX_ENABLED   (BIT(px4->m_artcr, 2))
6161
6262#define ART_DATA      (BIT(px4->m_artmr, 2))   /* number of data bits, 7 or 8 */
r14844r14845
128128   /* external devices */
129129   device_t *m_sio_device;
130130   device_t *m_rs232c_device;
131   DECLARE_READ8_MEMBER(px4_icrlc_r);
132   DECLARE_WRITE8_MEMBER(px4_ctrl1_w);
133   DECLARE_READ8_MEMBER(px4_icrhc_r);
134   DECLARE_WRITE8_MEMBER(px4_cmdr_w);
135   DECLARE_READ8_MEMBER(px4_icrlb_r);
136   DECLARE_WRITE8_MEMBER(px4_ctrl2_w);
137   DECLARE_READ8_MEMBER(px4_icrhb_r);
138   DECLARE_READ8_MEMBER(px4_isr_r);
139   DECLARE_WRITE8_MEMBER(px4_ier_w);
140   DECLARE_READ8_MEMBER(px4_str_r);
141   DECLARE_WRITE8_MEMBER(px4_bankr_w);
142   DECLARE_READ8_MEMBER(px4_sior_r);
143   DECLARE_WRITE8_MEMBER(px4_sior_w);
144   DECLARE_WRITE8_MEMBER(px4_vadr_w);
145   DECLARE_WRITE8_MEMBER(px4_yoff_w);
146   DECLARE_WRITE8_MEMBER(px4_fr_w);
147   DECLARE_WRITE8_MEMBER(px4_spur_w);
148   DECLARE_READ8_MEMBER(px4_ctgif_r);
149   DECLARE_WRITE8_MEMBER(px4_ctgif_w);
150   DECLARE_READ8_MEMBER(px4_artdir_r);
151   DECLARE_WRITE8_MEMBER(px4_artdor_w);
152   DECLARE_READ8_MEMBER(px4_artsr_r);
153   DECLARE_WRITE8_MEMBER(px4_artmr_w);
154   DECLARE_READ8_MEMBER(px4_iostr_r);
155   DECLARE_WRITE8_MEMBER(px4_artcr_w);
156   DECLARE_WRITE8_MEMBER(px4_swr_w);
157   DECLARE_WRITE8_MEMBER(px4_ioctlr_w);
158   DECLARE_WRITE8_MEMBER(px4_ramdisk_address_w);
159   DECLARE_READ8_MEMBER(px4_ramdisk_data_r);
160   DECLARE_WRITE8_MEMBER(px4_ramdisk_data_w);
161   DECLARE_READ8_MEMBER(px4_ramdisk_control_r);
131162};
132163
133164
r14844r14845
317348}
318349
319350/* input capture register low command trigger */
320static READ8_HANDLER( px4_icrlc_r )
351READ8_MEMBER(px4_state::px4_icrlc_r)
321352{
322   px4_state *px4 = space->machine().driver_data<px4_state>();
323353
324354   if (VERBOSE)
325      logerror("%s: px4_icrlc_r\n", space->machine().describe_context());
355      logerror("%s: px4_icrlc_r\n", machine().describe_context());
326356
327357   /* latch value */
328   px4->m_frc_latch = px4->m_frc_value;
358   m_frc_latch = m_frc_value;
329359
330   return px4->m_frc_latch & 0xff;
360   return m_frc_latch & 0xff;
331361}
332362
333363/* control register 1 */
334static WRITE8_HANDLER( px4_ctrl1_w )
364WRITE8_MEMBER(px4_state::px4_ctrl1_w)
335365{
336   px4_state *px4 = space->machine().driver_data<px4_state>();
337366   int baud;
338367
339368   if (VERBOSE)
340      logerror("%s: px4_ctrl1_w (0x%02x)\n", space->machine().describe_context(), data);
369      logerror("%s: px4_ctrl1_w (0x%02x)\n", machine().describe_context(), data);
341370
342371   /* baudrate generator */
343372   baud = data >> 4;
344373
345374   if (baud <= 12)
346375   {
347      px4->m_transmit_timer->adjust(attotime::zero, 0, attotime::from_hz(XTAL_7_3728MHz/2/transmit_rate[baud]));
348      px4->m_receive_timer->adjust(attotime::zero, 0, attotime::from_hz(XTAL_7_3728MHz/2/receive_rate[baud]));
376      m_transmit_timer->adjust(attotime::zero, 0, attotime::from_hz(XTAL_7_3728MHz/2/transmit_rate[baud]));
377      m_receive_timer->adjust(attotime::zero, 0, attotime::from_hz(XTAL_7_3728MHz/2/receive_rate[baud]));
349378   }
350379
351   px4->m_ctrl1 = data;
380   m_ctrl1 = data;
352381}
353382
354383/* input capture register high command trigger */
355static READ8_HANDLER( px4_icrhc_r )
384READ8_MEMBER(px4_state::px4_icrhc_r)
356385{
357   px4_state *px4 = space->machine().driver_data<px4_state>();
358386
359387   if (VERBOSE)
360      logerror("%s: px4_icrhc_r\n", space->machine().describe_context());
388      logerror("%s: px4_icrhc_r\n", machine().describe_context());
361389
362   return (px4->m_frc_latch >> 8) & 0xff;
390   return (m_frc_latch >> 8) & 0xff;
363391}
364392
365393/* command register */
366static WRITE8_HANDLER( px4_cmdr_w )
394WRITE8_MEMBER(px4_state::px4_cmdr_w)
367395{
368   px4_state *px4 = space->machine().driver_data<px4_state>();
369396
370397   if (VERBOSE)
371      logerror("%s: px4_cmdr_w (0x%02x)\n", space->machine().describe_context(), data);
398      logerror("%s: px4_cmdr_w (0x%02x)\n", machine().describe_context(), data);
372399
373400   /* clear overflow interrupt? */
374401   if (BIT(data, 2))
375402   {
376      px4->m_isr &= ~INT3_OVF;
377      gapnit_interrupt(space->machine());
403      m_isr &= ~INT3_OVF;
404      gapnit_interrupt(machine());
378405   }
379406}
380407
381408/* input capture register low barcode trigger */
382static READ8_HANDLER( px4_icrlb_r )
409READ8_MEMBER(px4_state::px4_icrlb_r)
383410{
384   px4_state *px4 = space->machine().driver_data<px4_state>();
385411
386412   if (VERBOSE)
387      logerror("%s: px4_icrlb_r\n", space->machine().describe_context());
413      logerror("%s: px4_icrlb_r\n", machine().describe_context());
388414
389   return px4->m_icrb & 0xff;
415   return m_icrb & 0xff;
390416}
391417
392418/* control register 2 */
393static WRITE8_HANDLER( px4_ctrl2_w )
419WRITE8_MEMBER(px4_state::px4_ctrl2_w)
394420{
395   px4_state *px4 = space->machine().driver_data<px4_state>();
396421
397422   if (VERBOSE)
398      logerror("%s: px4_ctrl2_w (0x%02x)\n", space->machine().describe_context(), data);
423      logerror("%s: px4_ctrl2_w (0x%02x)\n", machine().describe_context(), data);
399424
400425   /* bit 0, MIC, cassette output */
401   px4->m_ext_cas->output( BIT(data, 0) ? -1.0 : +1.0);
426   m_ext_cas->output( BIT(data, 0) ? -1.0 : +1.0);
402427
403428   /* bit 1, RMT, cassette motor */
404429   if (BIT(data, 1))
405430   {
406      px4->m_ext_cas->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
407      px4->m_ext_cas_timer->adjust(attotime::zero, 0, attotime::from_hz(44100));
431      m_ext_cas->change_state(CASSETTE_MOTOR_ENABLED,CASSETTE_MASK_MOTOR);
432      m_ext_cas_timer->adjust(attotime::zero, 0, attotime::from_hz(44100));
408433   }
409434   else
410435   {
411      px4->m_ext_cas->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
412      px4->m_ext_cas_timer->adjust(attotime::zero);
436      m_ext_cas->change_state(CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
437      m_ext_cas_timer->adjust(attotime::zero);
413438   }
414439}
415440
416441/* input capture register high barcode trigger */
417static READ8_HANDLER( px4_icrhb_r )
442READ8_MEMBER(px4_state::px4_icrhb_r)
418443{
419   px4_state *px4 = space->machine().driver_data<px4_state>();
420444
421445   if (VERBOSE)
422      logerror("%s: px4_icrhb_r\n", space->machine().describe_context());
446      logerror("%s: px4_icrhb_r\n", machine().describe_context());
423447
424448   /* clear icf interrupt */
425   px4->m_isr &= ~INT2_ICF;
426   gapnit_interrupt(space->machine());
449   m_isr &= ~INT2_ICF;
450   gapnit_interrupt(machine());
427451
428   return (px4->m_icrb >> 8) & 0xff;
452   return (m_icrb >> 8) & 0xff;
429453}
430454
431455/* interrupt status register */
432static READ8_HANDLER( px4_isr_r )
456READ8_MEMBER(px4_state::px4_isr_r)
433457{
434   px4_state *px4 = space->machine().driver_data<px4_state>();
435458
436459   if (VERBOSE)
437      logerror("%s: px4_isr_r\n", space->machine().describe_context());
460      logerror("%s: px4_isr_r\n", machine().describe_context());
438461
439   return px4->m_isr;
462   return m_isr;
440463}
441464
442465/* interrupt enable register */
443static WRITE8_HANDLER( px4_ier_w )
466WRITE8_MEMBER(px4_state::px4_ier_w)
444467{
445   px4_state *px4 = space->machine().driver_data<px4_state>();
446468
447469   if (VERBOSE)
448      logerror("%s: px4_ier_w (0x%02x)\n", space->machine().describe_context(), data);
470      logerror("%s: px4_ier_w (0x%02x)\n", machine().describe_context(), data);
449471
450   px4->m_ier = data;
451   gapnit_interrupt(space->machine());
472   m_ier = data;
473   gapnit_interrupt(machine());
452474}
453475
454476/* status register */
455static READ8_HANDLER( px4_str_r )
477READ8_MEMBER(px4_state::px4_str_r)
456478{
457   px4_state *px4 = space->machine().driver_data<px4_state>();
458479   UINT8 result = 0;
459480
460481   if (VERBOSE)
461      logerror("%s: px4_str_r\n", space->machine().describe_context());
482      logerror("%s: px4_str_r\n", machine().describe_context());
462483
463   result |= (px4->m_ext_cas)->input() > 0 ? 1 : 0;
484   result |= (m_ext_cas)->input() > 0 ? 1 : 0;
464485   result |= 1 << 1;   /* BCRD, barcode reader input */
465486   result |= 1 << 2;   /* RDY signal from 7805 */
466487   result |= 1 << 3;   /* RDYSIO, enable access to the 7805 */
467   result |= px4->m_bankr & 0xf0;   /* bit 4-7, BANK - memory bank */
488   result |= m_bankr & 0xf0;   /* bit 4-7, BANK - memory bank */
468489
469490   return result;
470491}
r14844r14845
497518}
498519
499520/* bank register */
500static WRITE8_HANDLER( px4_bankr_w )
521WRITE8_MEMBER(px4_state::px4_bankr_w)
501522{
502   px4_state *px4 = space->machine().driver_data<px4_state>();
503   address_space *space_program = space->machine().device("maincpu")->memory().space(AS_PROGRAM);
523   address_space *space_program = machine().device("maincpu")->memory().space(AS_PROGRAM);
504524
505525   if (VERBOSE)
506      logerror("%s: px4_bankr_w (0x%02x)\n", space->machine().describe_context(), data);
526      logerror("%s: px4_bankr_w (0x%02x)\n", machine().describe_context(), data);
507527
508   px4->m_bankr = data;
528   m_bankr = data;
509529
510530   /* bank switch */
511531   switch (data >> 4)
r14844r14845
514534      /* system bank */
515535      space_program->install_read_bank(0x0000, 0x7fff, "bank1");
516536      space_program->nop_write(0x0000, 0x7fff);
517      memory_set_bankptr(space->machine(), "bank1", space->machine().region("os")->base());
537      memory_set_bankptr(machine(), "bank1", machine().region("os")->base());
518538      space_program->install_readwrite_bank(0x8000, 0xffff, "bank2");
519      memory_set_bankptr(space->machine(), "bank2", px4->m_ram->pointer() + 0x8000);
539      memory_set_bankptr(machine(), "bank2", m_ram->pointer() + 0x8000);
520540      break;
521541
522542   case 0x04:
523543      /* memory */
524544      space_program->install_readwrite_bank(0x0000, 0xffff, "bank1");
525      memory_set_bankptr(space->machine(), "bank1", px4->m_ram->pointer());
545      memory_set_bankptr(machine(), "bank1", m_ram->pointer());
526546      break;
527547
528548   case 0x08: install_rom_capsule(space_program, 0x2000, "capsule1"); break;
r14844r14845
540560}
541561
542562/* serial io register */
543static READ8_HANDLER( px4_sior_r )
563READ8_MEMBER(px4_state::px4_sior_r)
544564{
545   px4_state *px4 = space->machine().driver_data<px4_state>();
546565
547566   if (VERBOSE)
548      logerror("%s: px4_sior_r 0x%02x\n", space->machine().describe_context(), px4->m_sior);
567      logerror("%s: px4_sior_r 0x%02x\n", machine().describe_context(), m_sior);
549568
550   return px4->m_sior;
569   return m_sior;
551570}
552571
553572/* serial io register */
554static WRITE8_HANDLER( px4_sior_w )
573WRITE8_MEMBER(px4_state::px4_sior_w)
555574{
556   px4_state *px4 = space->machine().driver_data<px4_state>();
557575
558576   if (VERBOSE)
559      logerror("%s: px4_sior_w (0x%02x)\n", space->machine().describe_context(), data);
577      logerror("%s: px4_sior_w (0x%02x)\n", machine().describe_context(), data);
560578
561   px4->m_sior = data;
579   m_sior = data;
562580
563581   switch (data)
564582   {
r14844r14845
574592      if (VERBOSE)
575593         logerror("7508 cmd: Read Status\n");
576594
577      if (px4->m_interrupt_status != 0)
595      if (m_interrupt_status != 0)
578596      {
579597         if (VERBOSE)
580            logerror("> 7508 has interrupts pending: 0x%02x\n", px4->m_interrupt_status);
598            logerror("> 7508 has interrupts pending: 0x%02x\n", m_interrupt_status);
581599
582600         /* signal the interrupt(s) */
583         px4->m_sior = 0xc1 | px4->m_interrupt_status;
584         px4->m_interrupt_status = 0x00;
601         m_sior = 0xc1 | m_interrupt_status;
602         m_interrupt_status = 0x00;
585603      }
586      else if (px4->m_key_status != 0xff)
604      else if (m_key_status != 0xff)
587605      {
588         px4->m_sior = px4->m_key_status;
589         px4->m_key_status = 0xff;
606         m_sior = m_key_status;
607         m_key_status = 0xff;
590608      }
591609      else
592610      {
593611         /* nothing happenend */
594         px4->m_sior = 0xbf;
612         m_sior = 0xbf;
595613      }
596614
597615      break;
r14844r14845
609627      if (VERBOSE)
610628         logerror("7508 cmd: KB Interrupt OFF\n");
611629
612      px4->m_key_int_enabled = FALSE;
630      m_key_int_enabled = FALSE;
613631      break;
614632
615633   case 0x16:
r14844r14845
617635      if (VERBOSE)
618636         logerror("7508 cmd: KB Interrupt ON\n");
619637
620      px4->m_key_int_enabled = TRUE;
638      m_key_int_enabled = TRUE;
621639      break;
622640
623641   case 0x07: if (VERBOSE) logerror("7508 cmd: Clock Read\n"); break;
r14844r14845
629647         logerror("7508 cmd: Power Switch Read\n");
630648
631649      /* indicate that the power switch is in the "ON" position */
632      px4->m_sior = 0x01;
650      m_sior = 0x01;
633651      break;
634652
635653   case 0x09: if (VERBOSE) logerror("7508 cmd: Alarm Read\n"); break;
r14844r14845
641659
642660      if (VERBOSE)
643661         logerror("7508 cmd: DIP Switch Read\n");
644      px4->m_sior = input_port_read(space->machine(), "dips");
662      m_sior = input_port_read(machine(), "dips");
645663      break;
646664
647665   case 0x0b: if (VERBOSE) logerror("7508 cmd: Stop Key Interrupt disable\n"); break;
r14844r14845
654672      if (VERBOSE)
655673         logerror("7508 cmd: 1 sec. Interrupt OFF\n");
656674
657      px4->m_one_sec_int_enabled = FALSE;
675      m_one_sec_int_enabled = FALSE;
658676      break;
659677
660678   case 0x1d:
r14844r14845
662680      if (VERBOSE)
663681         logerror("7508 cmd: 1 sec. Interrupt ON\n");
664682
665      px4->m_one_sec_int_enabled = TRUE;
683      m_one_sec_int_enabled = TRUE;
666684      break;
667685
668686   case 0x0e:
r14844r14845
670688      if (VERBOSE)
671689         logerror("7508 cmd: KB Clear\n");
672690
673      px4->m_sior = 0xbf;
691      m_sior = 0xbf;
674692      break;
675693
676694   case 0x0f: if (VERBOSE) logerror("7508 cmd: System Reset\n"); break;
r14844r14845
683701***************************************************************************/
684702
685703/* vram start address register */
686static WRITE8_HANDLER( px4_vadr_w )
704WRITE8_MEMBER(px4_state::px4_vadr_w)
687705{
688   px4_state *px4 = space->machine().driver_data<px4_state>();
689706
690707   if (VERBOSE)
691      logerror("%s: px4_vadr_w (0x%02x)\n", space->machine().describe_context(), data);
708      logerror("%s: px4_vadr_w (0x%02x)\n", machine().describe_context(), data);
692709
693   px4->m_vadr = data;
710   m_vadr = data;
694711}
695712
696713/* y offset register */
697static WRITE8_HANDLER( px4_yoff_w )
714WRITE8_MEMBER(px4_state::px4_yoff_w)
698715{
699   px4_state *px4 = space->machine().driver_data<px4_state>();
700716
701717   if (VERBOSE)
702      logerror("%s: px4_yoff_w (0x%02x)\n", space->machine().describe_context(), data);
718      logerror("%s: px4_yoff_w (0x%02x)\n", machine().describe_context(), data);
703719
704   px4->m_yoff = data;
720   m_yoff = data;
705721}
706722
707723/* frame register */
708static WRITE8_HANDLER( px4_fr_w )
724WRITE8_MEMBER(px4_state::px4_fr_w)
709725{
710726   if (VERBOSE)
711      logerror("%s: px4_fr_w (0x%02x)\n", space->machine().describe_context(), data);
727      logerror("%s: px4_fr_w (0x%02x)\n", machine().describe_context(), data);
712728}
713729
714730/* speed-up register */
715static WRITE8_HANDLER( px4_spur_w )
731WRITE8_MEMBER(px4_state::px4_spur_w)
716732{
717733   if (VERBOSE)
718      logerror("%s: px4_spur_w (0x%02x)\n", space->machine().describe_context(), data);
734      logerror("%s: px4_spur_w (0x%02x)\n", machine().describe_context(), data);
719735}
720736
721737
r14844r14845
727743{
728744   px4_state *px4 = machine.driver_data<px4_state>();
729745
730   if (ART_TX_ENABLED)
746   if (BIT(px4->m_artcr, 0))// ART_TX_ENABLED
731747   {
732748
733749   }
r14844r14845
744760}
745761
746762/* cartridge interface */
747static READ8_HANDLER( px4_ctgif_r )
763READ8_MEMBER(px4_state::px4_ctgif_r)
748764{
749765   if (VERBOSE)
750      logerror("%s: px4_ctgif_r @ 0x%02x\n", space->machine().describe_context(), offset);
766      logerror("%s: px4_ctgif_r @ 0x%02x\n", machine().describe_context(), offset);
751767
752768   return 0xff;
753769}
754770
755771/* cartridge interface */
756static WRITE8_HANDLER( px4_ctgif_w )
772WRITE8_MEMBER(px4_state::px4_ctgif_w)
757773{
758774   if (VERBOSE)
759      logerror("%s: px4_ctgif_w (0x%02x @ 0x%02x)\n", space->machine().describe_context(), data, offset);
775      logerror("%s: px4_ctgif_w (0x%02x @ 0x%02x)\n", machine().describe_context(), data, offset);
760776}
761777
762778/* art data input register */
763static READ8_HANDLER( px4_artdir_r )
779READ8_MEMBER(px4_state::px4_artdir_r)
764780{
765   px4_state *px4 = space->machine().driver_data<px4_state>();
766781
767782   if (VERBOSE)
768      logerror("%s: px4_artdir_r\n", space->machine().describe_context());
783      logerror("%s: px4_artdir_r\n", machine().describe_context());
769784
770   return px4->m_artdir;
785   return m_artdir;
771786}
772787
773788/* art data output register */
774static WRITE8_HANDLER( px4_artdor_w )
789WRITE8_MEMBER(px4_state::px4_artdor_w)
775790{
776   px4_state *px4 = space->machine().driver_data<px4_state>();
777791
778792   if (VERBOSE)
779      logerror("%s: px4_artdor_w (0x%02x)\n", space->machine().describe_context(), data);
793      logerror("%s: px4_artdor_w (0x%02x)\n", machine().describe_context(), data);
780794
781795   /* clear ready */
782   px4->m_artsr &= ~ART_TXRDY;
796   m_artsr &= ~ART_TXRDY;
783797
784   px4->m_artdor = data;
798   m_artdor = data;
785799}
786800
787801/* art status register */
788static READ8_HANDLER( px4_artsr_r )
802READ8_MEMBER(px4_state::px4_artsr_r)
789803{
790   px4_state *px4 = space->machine().driver_data<px4_state>();
791804   UINT8 result = 0;
792805
793806   if (VERBOSE)
794      logerror("%s: px4_artsr_r\n", space->machine().describe_context());
807      logerror("%s: px4_artsr_r\n", machine().describe_context());
795808
796   result |= px4_rs232c_dsr(px4->m_rs232c_device) << 7;
809   result |= px4_rs232c_dsr(m_rs232c_device) << 7;
797810
798   return result | px4->m_artsr;
811   return result | m_artsr;
799812}
800813
801814/* art mode register */
802static WRITE8_HANDLER( px4_artmr_w )
815WRITE8_MEMBER(px4_state::px4_artmr_w)
803816{
804   px4_state *px4 = space->machine().driver_data<px4_state>();
805817
806818   if (VERBOSE)
807      logerror("%s: px4_artmr_w (0x%02x)\n", space->machine().describe_context(), data);
819      logerror("%s: px4_artmr_w (0x%02x)\n", machine().describe_context(), data);
808820
809   px4->m_artmr = data;
821   m_artmr = data;
810822}
811823
812824/* io status register */
813static READ8_HANDLER( px4_iostr_r )
825READ8_MEMBER(px4_state::px4_iostr_r)
814826{
815   px4_state *px4 = space->machine().driver_data<px4_state>();
816827   UINT8 result = 0;
817828
818829   if (VERBOSE)
819      logerror("%s: px4_iostr_r\n", space->machine().describe_context());
830      logerror("%s: px4_iostr_r\n", machine().describe_context());
820831
821   result |= px4->m_centronics->busy_r() << 0;
822   result |= !px4->m_centronics->pe_r() << 1;
823   result |= px4_sio_pin(px4->m_sio_device) << 2;
824   result |= px4_sio_rxd(px4->m_sio_device) << 3;
825   result |= px4_rs232c_dcd(px4->m_rs232c_device) << 4;
826   result |= px4_rs232c_cts(px4->m_rs232c_device) << 5;
832   result |= m_centronics->busy_r() << 0;
833   result |= !m_centronics->pe_r() << 1;
834   result |= px4_sio_pin(m_sio_device) << 2;
835   result |= px4_sio_rxd(m_sio_device) << 3;
836   result |= px4_rs232c_dcd(m_rs232c_device) << 4;
837   result |= px4_rs232c_cts(m_rs232c_device) << 5;
827838   result |= 1 << 6;   /* bit 6, csel, cartridge option select signal, set to 'other mode' */
828839   result |= 0 << 7;   /* bit 7, caud - audio input from cartridge */
829840
r14844r14845
831842}
832843
833844/* art command register */
834static WRITE8_HANDLER( px4_artcr_w )
845WRITE8_MEMBER(px4_state::px4_artcr_w)
835846{
836   px4_state *px4 = space->machine().driver_data<px4_state>();
837847
838848   if (VERBOSE)
839      logerror("%s: px4_artcr_w (0x%02x)\n", space->machine().describe_context(), data);
849      logerror("%s: px4_artcr_w (0x%02x)\n", machine().describe_context(), data);
840850
841   px4->m_artcr = data;
851   m_artcr = data;
842852
843853   /* bit 0, txe - transmit enable */
844854   if (!ART_TX_ENABLED)
845855   {
846856      /* force high when disabled */
847      px4_sio_txd(px4->m_sio_device, ASSERT_LINE);
848      px4_rs232c_txd(px4->m_rs232c_device, ASSERT_LINE);
857      px4_sio_txd(m_sio_device, ASSERT_LINE);
858      px4_rs232c_txd(m_rs232c_device, ASSERT_LINE);
849859   }
850860
851861   /* bit 3, sbrk - break output */
852862   if (ART_TX_ENABLED && BIT(data, 3))
853863   {
854864      /* force low when enabled and transmit enabled */
855      px4_sio_txd(px4->m_sio_device, CLEAR_LINE);
856      px4_rs232c_txd(px4->m_rs232c_device, CLEAR_LINE);
865      px4_sio_txd(m_sio_device, CLEAR_LINE);
866      px4_rs232c_txd(m_rs232c_device, CLEAR_LINE);
857867   }
858868
859869   /* error reset */
860870   if (BIT(data, 4))
861      px4->m_artsr &= ~(ART_PE | ART_OE | ART_FE);
871      m_artsr &= ~(ART_PE | ART_OE | ART_FE);
862872
863   px4_rs232c_dtr(px4->m_rs232c_device, BIT(data, 1));
864   px4_rs232c_rts(px4->m_rs232c_device, BIT(data, 5));
873   px4_rs232c_dtr(m_rs232c_device, BIT(data, 1));
874   px4_rs232c_rts(m_rs232c_device, BIT(data, 5));
865875}
866876
867877/* switch register */
868static WRITE8_HANDLER( px4_swr_w )
878WRITE8_MEMBER(px4_state::px4_swr_w)
869879{
870   px4_state *px4 = space->machine().driver_data<px4_state>();
871880
872881   if (VERBOSE)
873      logerror("%s: px4_swr_w (0x%02x)\n", space->machine().describe_context(), data);
882      logerror("%s: px4_swr_w (0x%02x)\n", machine().describe_context(), data);
874883
875   px4->m_swr = data;
884   m_swr = data;
876885}
877886
878887/* io control register */
879static WRITE8_HANDLER( px4_ioctlr_w )
888WRITE8_MEMBER(px4_state::px4_ioctlr_w)
880889{
881   px4_state *px4 = space->machine().driver_data<px4_state>();
882890
883891   if (VERBOSE)
884      logerror("%s: px4_ioctlr_w (0x%02x)\n", space->machine().describe_context(), data);
892      logerror("%s: px4_ioctlr_w (0x%02x)\n", machine().describe_context(), data);
885893
886   px4->m_centronics->strobe_w(!BIT(data, 0));
887   px4->m_centronics->init_prime_w(BIT(data, 1));
894   m_centronics->strobe_w(!BIT(data, 0));
895   m_centronics->init_prime_w(BIT(data, 1));
888896
889   px4_sio_pout(px4->m_sio_device, BIT(data, 2));
897   px4_sio_pout(m_sio_device, BIT(data, 2));
890898
891899   /* bit 3, cartridge reset */
892900
r14844r14845
962970    EXTERNAL RAM-DISK
963971***************************************************************************/
964972
965static WRITE8_HANDLER( px4_ramdisk_address_w )
973WRITE8_MEMBER(px4_state::px4_ramdisk_address_w)
966974{
967   px4_state *px4 = space->machine().driver_data<px4_state>();
968975
969976   switch (offset)
970977   {
971   case 0x00: px4->m_ramdisk_address = (px4->m_ramdisk_address & 0xffff00) | data; break;
972   case 0x01: px4->m_ramdisk_address = (px4->m_ramdisk_address & 0xff00ff) | (data << 8); break;
973   case 0x02: px4->m_ramdisk_address = (px4->m_ramdisk_address & 0x00ffff) | ((data & 0x07) << 16); break;
978   case 0x00: m_ramdisk_address = (m_ramdisk_address & 0xffff00) | data; break;
979   case 0x01: m_ramdisk_address = (m_ramdisk_address & 0xff00ff) | (data << 8); break;
980   case 0x02: m_ramdisk_address = (m_ramdisk_address & 0x00ffff) | ((data & 0x07) << 16); break;
974981   }
975982}
976983
977static READ8_HANDLER( px4_ramdisk_data_r )
984READ8_MEMBER(px4_state::px4_ramdisk_data_r)
978985{
979   px4_state *px4 = space->machine().driver_data<px4_state>();
980986   UINT8 ret = 0xff;
981987
982   if (px4->m_ramdisk_address < 0x20000)
988   if (m_ramdisk_address < 0x20000)
983989   {
984990      /* read from ram */
985      ret = px4->m_ramdisk[px4->m_ramdisk_address];
991      ret = m_ramdisk[m_ramdisk_address];
986992   }
987   else if (px4->m_ramdisk_address < 0x40000)
993   else if (m_ramdisk_address < 0x40000)
988994   {
989995      /* read from rom */
990      ret = space->machine().region("ramdisk")->base()[px4->m_ramdisk_address];
996      ret = machine().region("ramdisk")->base()[m_ramdisk_address];
991997   }
992998
993   px4->m_ramdisk_address = (px4->m_ramdisk_address & 0xffff00) | ((px4->m_ramdisk_address & 0xff) + 1);
999   m_ramdisk_address = (m_ramdisk_address & 0xffff00) | ((m_ramdisk_address & 0xff) + 1);
9941000
9951001   return ret;
9961002}
9971003
998static WRITE8_HANDLER( px4_ramdisk_data_w )
1004WRITE8_MEMBER(px4_state::px4_ramdisk_data_w)
9991005{
1000   px4_state *px4 = space->machine().driver_data<px4_state>();
10011006
1002   if (px4->m_ramdisk_address < 0x20000)
1003      px4->m_ramdisk[px4->m_ramdisk_address] = data;
1007   if (m_ramdisk_address < 0x20000)
1008      m_ramdisk[m_ramdisk_address] = data;
10041009
1005   px4->m_ramdisk_address = (px4->m_ramdisk_address & 0xffff00) | ((px4->m_ramdisk_address & 0xff) + 1);
1010   m_ramdisk_address = (m_ramdisk_address & 0xffff00) | ((m_ramdisk_address & 0xff) + 1);
10061011}
10071012
1008static READ8_HANDLER( px4_ramdisk_control_r )
1013READ8_MEMBER(px4_state::px4_ramdisk_control_r)
10091014{
10101015   /* bit 7 determines the presence of a ram-disk */
10111016   return 0x7f;
r14844r14845
11331138   ADDRESS_MAP_UNMAP_HIGH
11341139   ADDRESS_MAP_GLOBAL_MASK(0xff)
11351140   /* gapnit, 0x00-0x07 */
1136   AM_RANGE(0x00, 0x00) AM_READWRITE_LEGACY(px4_icrlc_r, px4_ctrl1_w)
1137   AM_RANGE(0x01, 0x01) AM_READWRITE_LEGACY(px4_icrhc_r, px4_cmdr_w)
1138   AM_RANGE(0x02, 0x02) AM_READWRITE_LEGACY(px4_icrlb_r, px4_ctrl2_w)
1139   AM_RANGE(0x03, 0x03) AM_READ_LEGACY(px4_icrhb_r)
1140   AM_RANGE(0x04, 0x04) AM_READWRITE_LEGACY(px4_isr_r, px4_ier_w)
1141   AM_RANGE(0x05, 0x05) AM_READWRITE_LEGACY(px4_str_r, px4_bankr_w)
1142   AM_RANGE(0x06, 0x06) AM_READWRITE_LEGACY(px4_sior_r, px4_sior_w)
1141   AM_RANGE(0x00, 0x00) AM_READWRITE(px4_icrlc_r, px4_ctrl1_w)
1142   AM_RANGE(0x01, 0x01) AM_READWRITE(px4_icrhc_r, px4_cmdr_w)
1143   AM_RANGE(0x02, 0x02) AM_READWRITE(px4_icrlb_r, px4_ctrl2_w)
1144   AM_RANGE(0x03, 0x03) AM_READ(px4_icrhb_r)
1145   AM_RANGE(0x04, 0x04) AM_READWRITE(px4_isr_r, px4_ier_w)
1146   AM_RANGE(0x05, 0x05) AM_READWRITE(px4_str_r, px4_bankr_w)
1147   AM_RANGE(0x06, 0x06) AM_READWRITE(px4_sior_r, px4_sior_w)
11431148   AM_RANGE(0x07, 0x07) AM_NOP
11441149   /* gapndl, 0x08-0x0f */
1145   AM_RANGE(0x08, 0x08) AM_WRITE_LEGACY(px4_vadr_w)
1146   AM_RANGE(0x09, 0x09) AM_WRITE_LEGACY(px4_yoff_w)
1147   AM_RANGE(0x0a, 0x0a) AM_WRITE_LEGACY(px4_fr_w)
1148   AM_RANGE(0x0b, 0x0b) AM_WRITE_LEGACY(px4_spur_w)
1150   AM_RANGE(0x08, 0x08) AM_WRITE(px4_vadr_w)
1151   AM_RANGE(0x09, 0x09) AM_WRITE(px4_yoff_w)
1152   AM_RANGE(0x0a, 0x0a) AM_WRITE(px4_fr_w)
1153   AM_RANGE(0x0b, 0x0b) AM_WRITE(px4_spur_w)
11491154   AM_RANGE(0x0c, 0x0f) AM_NOP
11501155   /* gapnio, 0x10-0x1f */
1151   AM_RANGE(0x10, 0x13) AM_READWRITE_LEGACY(px4_ctgif_r, px4_ctgif_w)
1152   AM_RANGE(0x14, 0x14) AM_READWRITE_LEGACY(px4_artdir_r, px4_artdor_w)
1153   AM_RANGE(0x15, 0x15) AM_READWRITE_LEGACY(px4_artsr_r, px4_artmr_w)
1154   AM_RANGE(0x16, 0x16) AM_READWRITE_LEGACY(px4_iostr_r, px4_artcr_w)
1156   AM_RANGE(0x10, 0x13) AM_READWRITE(px4_ctgif_r, px4_ctgif_w)
1157   AM_RANGE(0x14, 0x14) AM_READWRITE(px4_artdir_r, px4_artdor_w)
1158   AM_RANGE(0x15, 0x15) AM_READWRITE(px4_artsr_r, px4_artmr_w)
1159   AM_RANGE(0x16, 0x16) AM_READWRITE(px4_iostr_r, px4_artcr_w)
11551160   AM_RANGE(0x17, 0x17) AM_DEVWRITE("centronics", centronics_device, write)
1156   AM_RANGE(0x18, 0x18) AM_WRITE_LEGACY(px4_swr_w)
1157   AM_RANGE(0x19, 0x19) AM_WRITE_LEGACY(px4_ioctlr_w)
1161   AM_RANGE(0x18, 0x18) AM_WRITE(px4_swr_w)
1162   AM_RANGE(0x19, 0x19) AM_WRITE(px4_ioctlr_w)
11581163   AM_RANGE(0x1a, 0x1f) AM_NOP
11591164ADDRESS_MAP_END
11601165
11611166static ADDRESS_MAP_START( px4p_io, AS_IO, 8, px4_state )
11621167   AM_IMPORT_FROM(px4_io)
1163   AM_RANGE(0x90, 0x92) AM_WRITE_LEGACY(px4_ramdisk_address_w)
1164   AM_RANGE(0x93, 0x93) AM_READWRITE_LEGACY(px4_ramdisk_data_r, px4_ramdisk_data_w)
1165   AM_RANGE(0x94, 0x94) AM_READ_LEGACY(px4_ramdisk_control_r)
1168   AM_RANGE(0x90, 0x92) AM_WRITE(px4_ramdisk_address_w)
1169   AM_RANGE(0x93, 0x93) AM_READWRITE(px4_ramdisk_data_r, px4_ramdisk_data_w)
1170   AM_RANGE(0x94, 0x94) AM_READ(px4_ramdisk_control_r)
11661171ADDRESS_MAP_END
11671172
11681173
src/mess/drivers/mmodular.c
r14844r14845
137137   UINT8 lcd_char;
138138   //UINT8 led7;
139139   UINT8 latch_data;
140   DECLARE_WRITE8_MEMBER(write_polgar_IO);
141   DECLARE_WRITE8_MEMBER(write_LCD_polgar);
142   DECLARE_READ8_MEMBER(read_1ff1_sfortea);
143   DECLARE_READ8_MEMBER(read_1ff0_sfortea);
144   DECLARE_WRITE8_MEMBER(write_latch_sfortea);
145   DECLARE_WRITE8_MEMBER(write_lcd_IO_sfortea);
146   DECLARE_WRITE8_MEMBER(write_LCD_academy);
147//   DECLARE_WRITE16_MEMBER(diablo68_aciawrite);
148//   DECLARE_READ16_MEMBER(diablo68_aciaread);
149   DECLARE_WRITE16_MEMBER(diablo68_reg_select);
150   DECLARE_WRITE16_MEMBER(diablo68_write_LCD);
151   DECLARE_WRITE8_MEMBER(milano_write_LED);
152   DECLARE_WRITE8_MEMBER(megaiv_write_LED);
153   DECLARE_WRITE8_MEMBER(academy_write_LED);
154   DECLARE_WRITE8_MEMBER(academy_inhibitNMI);
155   DECLARE_WRITE32_MEMBER(write_LED_BPL32);
156   DECLARE_WRITE8_MEMBER(polgar_write_LED);
157   DECLARE_WRITE8_MEMBER(monteciv_write_LCD);
158   DECLARE_WRITE8_MEMBER(monteciv_3007);
159   DECLARE_WRITE8_MEMBER(monteciv_3005);
160   DECLARE_WRITE8_MEMBER(monteciv_3006);
161   DECLARE_WRITE8_MEMBER(academy_write_board);
162   DECLARE_WRITE8_MEMBER(milano_write_board);
163   DECLARE_READ8_MEMBER(milano_read_board);
164   DECLARE_READ8_MEMBER(read_keys);
165   DECLARE_READ8_MEMBER(read_keys_megaiv);
166   DECLARE_READ32_MEMBER(read_keys_BPL32);
167   DECLARE_WRITE8_MEMBER(beep_academy);
168   DECLARE_WRITE8_MEMBER(megaiv_IO);
169   DECLARE_WRITE8_MEMBER(monteciv_select_line);
170   DECLARE_READ8_MEMBER(read_keys_board_monteciv);
171   DECLARE_READ8_MEMBER(read_keys_board_academy);
172   DECLARE_WRITE32_MEMBER(write_board_BPL32);
173   DECLARE_READ32_MEMBER(read_buttons_gen32);
174   DECLARE_READ32_MEMBER(read_buttons_van32);
175   DECLARE_READ16_MEMBER(read_buttons_van16);
176   DECLARE_WRITE32_MEMBER(write_LCD_data_32);
177   DECLARE_WRITE16_MEMBER(write_LCD_data);
178   DECLARE_WRITE32_MEMBER(write_IOenables_32);
179   DECLARE_WRITE16_MEMBER(write_IOenables);
180   DECLARE_READ32_MEMBER(read_unknown1_32);
181   DECLARE_READ16_MEMBER(read_unknown1);
182   DECLARE_WRITE32_MEMBER(write_unknown2_32);
183   DECLARE_WRITE16_MEMBER(write_unknown2);
184   DECLARE_READ32_MEMBER(read_unknown3_32);
185   DECLARE_READ16_MEMBER(read_unknown3);
186   DECLARE_READ32_MEMBER(read_1800000);
187   DECLARE_WRITE32_MEMBER(write_1000000);
140188};
141189
142190static const hd44780_interface chess_display =
r14844r14845
182230   return NOT_VALID;
183231}
184232
185static WRITE8_HANDLER ( write_polgar_IO )
233WRITE8_MEMBER(polgar_state::write_polgar_IO)
186234{
187   polgar_state *state = space->machine().driver_data<polgar_state>();
188235   int i;
189236
190237   if (BIT(data,1)) {
191      hd44780_device *hd44780 = space->machine().device<hd44780_device>("hd44780");
238      hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
192239      if (BIT(data,0)) {
193         hd44780->data_write(*space, 128, state->lcd_char);
240         hd44780->data_write(*&space, 128, lcd_char);
194241      } else {
195         hd44780->control_write(*space, 128, state->lcd_char);
242         hd44780->control_write(*&space, 128, lcd_char);
196243      }
197244   }
198245
199   if (BIT(data,2) || BIT(data,3)) beep_set_state(space->machine().device("beep"),1); else beep_set_state(space->machine().device("beep"),0);
246   if (BIT(data,2) || BIT(data,3)) beep_set_state(machine().device("beep"),1); else beep_set_state(machine().device("beep"),0);
200247
201248   if (BIT(data,7) && BIT(data, 4)) {
202249      for (i = 0;i < 8;i++)
203      output_set_led_value(i,!BIT(state->latch_data,i));
250      output_set_led_value(i,!BIT(latch_data,i));
204251   }
205252   else if (BIT(data,6) && BIT(data,5)) {
206253      for (i = 0;i < 8;i++)
207      output_set_led_value(10+i,!BIT(state->latch_data,7-i));
254      output_set_led_value(10+i,!BIT(latch_data,7-i));
208255   }
209   else if (!data && (!strcmp(space->machine().system().name,"milano"))) {
256   else if (!data && (!strcmp(machine().system().name,"milano"))) {
210257      for (i=0;i<8;i++) {
211         output_set_led_value(i,!BIT(state->latch_data,i));
212         output_set_led_value(10+i,!BIT(state->latch_data,7-i));
258         output_set_led_value(i,!BIT(latch_data,i));
259         output_set_led_value(10+i,!BIT(latch_data,7-i));
213260      }
214261   }
215262
r14844r14845
219266}
220267
221268
222static WRITE8_HANDLER ( write_LCD_polgar )
269WRITE8_MEMBER(polgar_state::write_LCD_polgar)
223270{
224   polgar_state *state = space->machine().driver_data<polgar_state>();
225271
226   state->lcd_char = data;
272   lcd_char = data;
227273
228274   logerror("LCD Data = %d %02x [%c]\n",data,data,(data&0xff));
229275
230276}
231277
232static READ8_HANDLER ( read_1ff1_sfortea )
278READ8_MEMBER(polgar_state::read_1ff1_sfortea)
233279{
234280   UINT8 data;
235   data = input_port_read(space->machine(),  "BUTTONS_SFOR1");
281   data = input_port_read(machine(),  "BUTTONS_SFOR1");
236282   logerror("1ff0 data %02x\n",data);
237283   return 0;
238284//  return data;
239285}
240286
241static READ8_HANDLER ( read_1ff0_sfortea )
287READ8_MEMBER(polgar_state::read_1ff0_sfortea)
242288{
243289   UINT8 data;
244   data = input_port_read(space->machine(),  "BUTTONS_SFOR2");
290   data = input_port_read(machine(),  "BUTTONS_SFOR2");
245291   logerror("1ff0 data %02x\n",data);
246292   return 0;
247293//  return data;
r14844r14845
256302
257303
258304
259static WRITE8_HANDLER ( write_latch_sfortea )
305WRITE8_MEMBER(polgar_state::write_latch_sfortea)
260306{
261307   sfortea_latch = data;
262308   logerror("latch data %02x\n",data);
r14844r14845
264310
265311}
266312
267static WRITE8_HANDLER ( write_lcd_IO_sfortea )
313WRITE8_MEMBER(polgar_state::write_lcd_IO_sfortea)
268314{
269315/* bits
2703167
r14844r14845
280326
281327   if (BIT(sfortea_latch,2))
282328   {
283      hd44780_device *hd44780 = space->machine().device<hd44780_device>("hd44780");
329      hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
284330      if(BIT(sfortea_latch,0)) {
285         hd44780->data_write(*space, 128, data);
331         hd44780->data_write(*&space, 128, data);
286332         logerror("LCD DTA = %02x\n",data);
287333      } else {
288334         if (BIT(data,7)) {
289335            if ((data & 0x7f) >= 0x40) data -= 56;  // adjust for 16x1 display as 2 sets of 8
290336         }
291         hd44780->control_write(*space, 128, data);
337         hd44780->control_write(*&space, 128, data);
292338         logerror("LCD CMD = %02x\n",data);
293339      }
294340   }
295341}
296342
297static WRITE8_HANDLER ( write_LCD_academy )
343WRITE8_MEMBER(polgar_state::write_LCD_academy)
298344{
299   hd44780_device *hd44780 = space->machine().device<hd44780_device>("hd44780");
345   hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
300346
301347   if (offset) {
302      hd44780->data_write(*space, 128, data);
348      hd44780->data_write(*&space, 128, data);
303349   } else {
304      hd44780->control_write(*space, 128, data);
350      hd44780->control_write(*&space, 128, data);
305351   }
306352}
307353
308//  AM_RANGE( 0x3a0000,0x3a0000 ) AM_READ_LEGACY(diablo68_write_LCD)
309//  AM_RANGE( 0x3c0000,0x3c0000 ) AM_READ_LEGACY(diablo68_reg_select)
354//  AM_RANGE( 0x3a0000,0x3a0000 ) AM_READ(diablo68_write_LCD)
355//  AM_RANGE( 0x3c0000,0x3c0000 ) AM_READ(diablo68_reg_select)
310356
311/*static WRITE16_HANDLER ( diablo68_aciawrite )
357/*WRITE16_MEMBER(polgar_state::diablo68_aciawrite)
312358{
313//  device_t *acia = space->machine().device("acia65c51");
359//  device_t *acia = machine().device("acia65c51");
314360//  acia_6551_w(acia, offset & 0x03, data >> 8);
315361//  printf("ACIA write data %04x offset %02x\n",data,offset);
316362    logerror("ACIA write data %04x offset %02x\n",data,offset);
317363}
318364
319static READ16_HANDLER ( diablo68_aciaread )
365READ16_MEMBER(polgar_state::diablo68_aciaread)
320366{
321//  device_t *acia = space->machine().device("acia65c51");
367//  device_t *acia = machine().device("acia65c51");
322368    UINT16 result;
323369//  result = acia_6551_r(acia, offset & 0x03);
324370//  logerror("ACIA read offset %02x\n",offset);
r14844r14845
330376}
331377*/
332378
333static WRITE16_HANDLER ( diablo68_reg_select )
379WRITE16_MEMBER(polgar_state::diablo68_reg_select)
334380{
335381   diablo68_3c0000 = data >> 8;
336382   //printf("3c0000 = %04x\n",data>>8);
r14844r14845
339385}
340386
341387
342static WRITE16_HANDLER ( diablo68_write_LCD )
388WRITE16_MEMBER(polgar_state::diablo68_write_LCD)
343389{
344   hd44780_device *hd44780 = space->machine().device<hd44780_device>("hd44780");
390   hd44780_device *hd44780 = machine().device<hd44780_device>("hd44780");
345391   data >>= 8;
346392   if (!(diablo68_3c0000 & 0x02)) {
347393      if (BIT(data,7)) {
348394         if ((data & 0x7f) >= 0x40) data -= 56;  // adjust for 16x1 display as 2 sets of 8
349395      }
350      hd44780->control_write(*space, 128, data);
396      hd44780->control_write(*&space, 128, data);
351397//      logerror("Control %02x\n", data);
352398//      printf("Control %02x\n", data);
353399   } else {
354      hd44780->data_write(*space, 128, data);
400      hd44780->data_write(*&space, 128, data);
355401//      printf("LCDdata %04x [%c]\n", data,data);
356402//      logerror("LCDdata %04x [%c]\n", data,data);
357403   }
r14844r14845
360406
361407}
362408
363static WRITE8_HANDLER ( milano_write_LED )
409WRITE8_MEMBER(polgar_state::milano_write_LED)
364410{
365411   UINT8 LED_offset = 100;
366412   if (data == 0xff)   output_set_led_value(LED_offset+offset,1);
r14844r14845
369415   //logerror("LEDs  Offset = %d Data = %d\n",offset,data);
370416}
371417
372static WRITE8_HANDLER ( megaiv_write_LED )
418WRITE8_MEMBER(polgar_state::megaiv_write_LED)
373419{
374if (BIT(data,7)) beep_set_state(space->machine().device("beep"),1); else beep_set_state(space->machine().device("beep"),0);
420if (BIT(data,7)) beep_set_state(machine().device("beep"),1); else beep_set_state(machine().device("beep"),0);
375421output_set_led_value(102,BIT(data,1)?1:0);
376422output_set_led_value(107,BIT(data,6)?1:0);
377423
r14844r14845
382428}
383429
384430
385static WRITE8_HANDLER ( academy_write_LED )
431WRITE8_MEMBER(polgar_state::academy_write_LED)
386432{
387433int found = 0;
388434
r14844r14845
431477   found = 1;
432478}
433479
434if (BIT(data,7)) beep_set_state(space->machine().device("beep"),1); else beep_set_state(space->machine().device("beep"),0);
435if (BIT(data,1)) beep_set_state(space->machine().device("beep"),1); else beep_set_state(space->machine().device("beep"),0);
480if (BIT(data,7)) beep_set_state(machine().device("beep"),1); else beep_set_state(machine().device("beep"),0);
481if (BIT(data,1)) beep_set_state(machine().device("beep"),1); else beep_set_state(machine().device("beep"),0);
436482//  logerror("LEDs  FUNC = %02x found = %d\n",data,found);
437483   if (!found) {
438484      logerror("unknown LED mask %d\n",data);
r14844r14845
441487}
442488
443489
444static WRITE8_HANDLER ( academy_inhibitNMI )
490WRITE8_MEMBER(polgar_state::academy_inhibitNMI)
445491{
446492   academyallowNMI = data;
447493
448494}
449495
450496
451static WRITE32_HANDLER ( write_LED_BPL32 )
497WRITE32_MEMBER(polgar_state::write_LED_BPL32)
452498{
453499   int i;
454500
r14844r14845
463509}
464510
465511
466static WRITE8_HANDLER ( polgar_write_LED )
512WRITE8_MEMBER(polgar_state::polgar_write_LED)
467513{
468514#define LED_offset 100
469   polgar_state *state = space->machine().driver_data<polgar_state>();
470515
471516   data &= 0x80;
472517
473518   if (data == 0) {
474      state->led_status &= 255-(1<<offset);
519      led_status &= 255-(1<<offset);
475520   } else {
476      state->led_status|=1<<offset;
521      led_status|=1<<offset;
477522   }
478523
479   if (offset < 6) output_set_led_value(LED_offset+offset, state->led_status&1<<offset?1:0);
524   if (offset < 6) output_set_led_value(LED_offset+offset, led_status&1<<offset?1:0);
480525   logerror("LEDs  Offset = %d Data = %d\n",offset,data);
481526}
482527
r14844r14845
494539   return data;
495540}
496541
497static WRITE8_HANDLER ( monteciv_write_LCD )
542WRITE8_MEMBER(polgar_state::monteciv_write_LCD)
498543// first write == 00 (start) then 8 writes (to 74595) x 4 chars, then ff to finish
499544{
500545   static UINT8 charstodisplay[4] = { 0,0,0,0 };
r14844r14845
561606//    printf("$3004 %02x %02x \n",data,tempchar);
562607}
563608
564static WRITE8_HANDLER ( monteciv_3007 )
609WRITE8_MEMBER(polgar_state::monteciv_3007)
565610{
566611//    logerror("$3007 SELECTTOP %02x\n",data);
567612//    printf("$3007 SELECTTOP %02x\n",data);
r14844r14845
569614    montecivtopnew = 1;
570615}
571616
572static WRITE8_HANDLER ( monteciv_3005 )
617WRITE8_MEMBER(polgar_state::monteciv_3005)
573618{
574619//    logerror("$3005 SELECTBOT %02x\n",data);
575620//    printf("$3005 SELECTBOT %02x\n",data);
r14844r14845
577622    montecivbotnew = 1;
578623}
579624
580static WRITE8_HANDLER ( monteciv_3006 )
625WRITE8_MEMBER(polgar_state::monteciv_3006)
581626{
582627    logerror("$3006 CLK %02x\n",data);
583628//    printf("$3006 CLK %02x\n",data);
584629}
585630
586631
587static WRITE8_HANDLER ( academy_write_board )
632WRITE8_MEMBER(polgar_state::academy_write_board)
588633{
589   polgar_state *state = space->machine().driver_data<polgar_state>();
590634
591   state->latch_data = data;
635   latch_data = data;
592636//    logerror("acad_write_latch %02x\n",data);
593   if (data != 0xff) mboard_write_board_8(space,0, data);
637   if (data != 0xff) mboard_write_board_8(&space,0, data);
594638}
595639
596static WRITE8_HANDLER ( milano_write_board )
640WRITE8_MEMBER(polgar_state::milano_write_board)
597641{
598   polgar_state *state = space->machine().driver_data<polgar_state>();
599642
600   state->latch_data = data;
643   latch_data = data;
601644}
602645
603static READ8_HANDLER(milano_read_board)
646READ8_MEMBER(polgar_state::milano_read_board)
604647{
605648   int line;
606   polgar_state *state = space->machine().driver_data<polgar_state>();
607649   static const char *const board_lines[8] =
608650         { "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" };
609651
610652   UINT8 data = 0x00;
611653   UINT8 tmp; // = 0xff;
612654
613   if (state->latch_data)
655   if (latch_data)
614656   {
615      line = get_first_cleared_bit(state->latch_data);
616      tmp = input_port_read(space->machine(),  board_lines[line]);
657      line = get_first_cleared_bit(latch_data);
658      tmp = input_port_read(machine(),  board_lines[line]);
617659
618660      if (tmp != 0xff)
619661         data = convert_imputmask(tmp);
r14844r14845
624666
625667}
626668
627static READ8_HANDLER(read_keys)
669READ8_MEMBER(polgar_state::read_keys)
628670{
629671   UINT8 data;
630672   static const char *const keynames[1][8] =
r14844r14845
632674      { "KEY1_0", "KEY1_1", "KEY1_2", "KEY1_3", "KEY1_4", "KEY1_5", "KEY1_6", "KEY1_7" }
633675   };
634676
635   data = input_port_read(space->machine(), keynames[0][offset]);
677   data = input_port_read(machine(), keynames[0][offset]);
636678   // logerror("Keyboard Port = %s Data = %d\n  ", ((led_status & 0x80) == 0x00) ? keynames[0][offset] : keynames[1][offset], data);
637679   return data | 0x7f;
638680}
639681
640static READ8_HANDLER(read_keys_megaiv)
682READ8_MEMBER(polgar_state::read_keys_megaiv)
641683{
642684   UINT8 data;
643685   static const char *const keynames[1][8] =
r14844r14845
645687      { "KEY1_0", "KEY1_1", "KEY1_2", "KEY1_3", "KEY1_4", "KEY1_5", "KEY1_6", "KEY1_7" }
646688   };
647689
648   data = input_port_read(space->machine(), keynames[0][offset]);
690   data = input_port_read(machine(), keynames[0][offset]);
649691   logerror("Keyboard Port = %s Data = %d\n  ", keynames[0][offset] , data);
650692   return data | 0x7f;
651693}
652694
653695
654static READ32_HANDLER(read_keys_BPL32)
696READ32_MEMBER(polgar_state::read_keys_BPL32)
655697{
656698   UINT32 data = 0;
657699   UINT8 tmp = 0xff, line = 0;
r14844r14845
659701         { "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" };
660702
661703   if (BPL32latch_data == 0xff) {
662      tmp = input_port_read(space->machine(),  "BUTTONS_BPL");
704      tmp = input_port_read(machine(),  "BUTTONS_BPL");
663705      logerror("Keyboard Port Offset = %d tmp %d\n", offset,tmp);
664706
665707      data = tmp << 24;
r14844r14845
667709      if (BPL32latch_data & 0x7f) {
668710         logerror("ReadingBoard %02x\n",BPL32latch_data);
669711         line = get_first_cleared_bit(BPL32latch_data);
670         tmp = input_port_read(space->machine(),  board_lines[line]);
712         tmp = input_port_read(machine(),  board_lines[line]);
671713
672714         if (tmp != 0xff)
673715            data = convert_imputmask(tmp) << 24;
r14844r14845
678720   return data;
679721}
680722
681static WRITE8_HANDLER(beep_academy)
723WRITE8_MEMBER(polgar_state::beep_academy)
682724{
683   if (!BIT(data,7)) beep_set_state(space->machine().device("beep"),1); else beep_set_state(space->machine().device("beep"),0);
725   if (!BIT(data,7)) beep_set_state(machine().device("beep"),1); else beep_set_state(machine().device("beep"),0);
684726}
685727
686static WRITE8_HANDLER(megaiv_IO)
728WRITE8_MEMBER(polgar_state::megaiv_IO)
687729{
688//  if (BIT(data,0)) beep_set_state(space->machine->device("beep"),1); else beep_set_state(space->machine->device("beep"),0);
730//  if (BIT(data,0)) beep_set_state(machine->device("beep"),1); else beep_set_state(machine->device("beep"),0);
689731   logerror("$2400 = %02x\n",data);
690732   latch2400 = data;
691733}
692734
693735
694static WRITE8_HANDLER( monteciv_select_line )
736WRITE8_MEMBER(polgar_state::monteciv_select_line)
695737{
696738   monteciv_select[offset] = data;
697739}
698740
699741// FIXME : unlike polgar, academy shares port IO for keys and board, and i just can't seem to get the board latched right (H7 and H8 are always flashing) -- Cow
700static READ8_HANDLER(read_keys_board_monteciv)
742READ8_MEMBER(polgar_state::read_keys_board_monteciv)
701743{
702744   UINT8 data = 0;
703745
704746   if (monteciv_select[0] == 0xff && monteciv_select[1] == 0xff) {
705         data = mboard_read_board_8(space,0);
747         data = mboard_read_board_8(&space,0);
706748   } else {
707749      if (monteciv_select[0] == 0x0) {
708         data = input_port_read(space->machine(),  "BUTTONS_MONTE2");
750         data = input_port_read(machine(),  "BUTTONS_MONTE2");
709751#if 0
710752         if (data) {
711753            output_set_digit_value(0,64);
r14844r14845
720762         }
721763#endif
722764      } else {
723         data = input_port_read(space->machine(),  "BUTTONS_MONTE1");
765         data = input_port_read(machine(),  "BUTTONS_MONTE1");
724766      }
725767   }
726768   return data;
r14844r14845
728770
729771
730772// FIXME : unlike polgar, academy shares port IO for keys and board, and I just can't seem to get the board latched right (H7 and H8 are always flashing) -- Cow
731static READ8_HANDLER(read_keys_board_academy)
773READ8_MEMBER(polgar_state::read_keys_board_academy)
732774{
733775//  static int startup = 0;
734   polgar_state *state = space->machine().driver_data<polgar_state>();
735776   UINT8 data = 0;
736777//  UINT8 tmp = 0xff, line = 0;
737778//  static const char *const board_lines[8] =
738779//          { "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" };
739780
740   if (state->latch_data == 0xff) {
741      data = input_port_read(space->machine(),  "BUTTONS_ACAD");
781   if (latch_data == 0xff) {
782      data = input_port_read(machine(),  "BUTTONS_ACAD");
742783   } else {
743//      if (state->latch_data & 0x7f) {
744      data = mboard_read_board_8(space,0);
784//      if (latch_data & 0x7f) {
785      data = mboard_read_board_8(&space,0);
745786//      data = milano_read_board(space,0);
746787
747//          logerror("ReadingBoard %02x\n",state->latch_data);
748//          line = get_first_cleared_bit(state->latch_data);
749//          tmp = input_port_read(space->machine,  board_lines[line]);
750//          mboard_write_board_8(space,0, state->latch_data);
751//          data = mboard_read_board_8(space,0);
752//          logerror("BoardRead Port Offset = %d data %02x Latch %02x\n", offset,data,state->latch_data);
753//          printf  ("BoardRead Port Offset = %d data %02x Latch %02x\n", offset,data,state->latch_data);
788//          logerror("ReadingBoard %02x\n",latch_data);
789//          line = get_first_cleared_bit(latch_data);
790//          tmp = input_port_read(machine,  board_lines[line]);
791//          mboard_write_board_8(&space,0, latch_data);
792//          data = mboard_read_board_8(&space,0);
793//          logerror("BoardRead Port Offset = %d data %02x Latch %02x\n", offset,data,latch_data);
794//          printf  ("BoardRead Port Offset = %d data %02x Latch %02x\n", offset,data,latch_data);
754795//      } else {
755796//          logerror("no keys or board\n");
756797//      }
757798   }
758//  logerror("Keyboard Port Offset = %d tmp %d Latch %d\n", offset,tmp,state->latch_data);
799//  logerror("Keyboard Port Offset = %d tmp %d Latch %d\n", offset,tmp,latch_data);
759800//  logerror("Keyboard Port = %s Data = %d Offset = %d tmp %d line %02x\n", keynames[0][line], data, offset,tmp,line);
760801   return data;
761802}
r14844r14845
773814}
774815
775816
776static WRITE32_HANDLER( write_board_BPL32 )
817WRITE32_MEMBER(polgar_state::write_board_BPL32)
777818{
778819   BPL32latch_data = data >> 24;
779820   logerror("Write BPL32 board Data Latch %08x Offset: %08x\n",BPL32latch_data,offset);
780821
781822}
782823
783static READ32_HANDLER( read_buttons_gen32 )
824READ32_MEMBER(polgar_state::read_buttons_gen32)
784825{
785826   UINT32 data;
786827   static const char *const keynames[4] = { "BUTTON_1", "BUTTON_2", "", "BUTTON_3" };
787828
788   data = input_port_read(space->machine(), keynames[offset]);
829   data = input_port_read(machine(), keynames[offset]);
789830
790831   data = data|data<<8|data<<16|data<<24;  // this might not be needed if MAME does handle odd alignment over 32bit boundaries right
791832   logerror("Read from Buttons: %08x %08x\n",offset,data);
792833   return data;
793834}
794835
795static READ32_HANDLER( read_buttons_van32 )
836READ32_MEMBER(polgar_state::read_buttons_van32)
796837{
797838   UINT32 data;
798839   static const char *const keynames[4] = { "BUTTON_1", "", "BUTTON_2", "BUTTON_3" };
799840
800841
801   data = input_port_read(space->machine(), keynames[offset]);
842   data = input_port_read(machine(), keynames[offset]);
802843
803844   data = data << 8;
804845   logerror("Read from Buttons: %08x %08x\n",offset,data);
805846   return data;
806847}
807848
808static READ16_HANDLER( read_buttons_van16 )
849READ16_MEMBER(polgar_state::read_buttons_van16)
809850{
810851   UINT16 data;
811852   static const char *const keynames[3] = { "BUTTON_1", "BUTTON_2", "BUTTON_3" };
812853
813854
814   data = input_port_read(space->machine(), keynames[offset>>1]) << 8;
855   data = input_port_read(machine(), keynames[offset>>1]) << 8;
815856
816857   logerror("Read from %06x offset: %x %04x\n",0xf00000,offset,data);
817858   return data;
818859}
819860
820static WRITE32_HANDLER( write_LCD_data_32 )
861WRITE32_MEMBER(polgar_state::write_LCD_data_32)
821862{
822863
823864//  printf("Write LCD Data Latch %08x o: %08x\n",data,offset);
824865   logerror("Write LCD Data Latch %08x o: %08x\n",data,offset);
825866   lcd32_char = data>>24;
826//  cpu_adjust_icount(space->cpu,-5000);
867//  cpu_adjust_icount(cpu,-5000);
827868
828869}
829870
830static WRITE16_HANDLER( write_LCD_data )
871WRITE16_MEMBER(polgar_state::write_LCD_data)
831872{
832873
833874   lcd32_char = data>>8;
r14844r14845
867908
868909}
869910
870static WRITE32_HANDLER( write_IOenables_32 ) {
911WRITE32_MEMBER(polgar_state::write_IOenables_32){
871912
872   write_IOenable(data>>24,space);
913   write_IOenable(data>>24,&space);
873914}
874915
875static WRITE16_HANDLER( write_IOenables )
916WRITE16_MEMBER(polgar_state::write_IOenables)
876917{
877   write_IOenable(data>>8,space);
918   write_IOenable(data>>8,&space);
878919}
879920
880921/* Unknown read/write */
881922
882static READ32_HANDLER( read_unknown1_32 )
923READ32_MEMBER(polgar_state::read_unknown1_32)
883924{
884925   logerror("Read from unknown1 offset: %x\n",offset);
885926    return 0xff00ff00;
886927}
887928
888static READ16_HANDLER( read_unknown1 )
929READ16_MEMBER(polgar_state::read_unknown1)
889930{
890931   logerror("Read from %06x offset: %x\n",0xe80002,offset);
891932    return 0xff00;
892933}
893934
894static WRITE32_HANDLER( write_unknown2_32 )
935WRITE32_MEMBER(polgar_state::write_unknown2_32)
895936{
896937   //unknown2_data = data;
897938   logerror("Write to   unknown2 data: %04x\n",data);
898939}
899940
900static WRITE16_HANDLER( write_unknown2 )
941WRITE16_MEMBER(polgar_state::write_unknown2)
901942{
902943   //unknown2_data = data;
903944   logerror("Write from %06x data: %04x\n",0xe80004,data);
904945}
905946
906static READ32_HANDLER( read_unknown3_32 )
947READ32_MEMBER(polgar_state::read_unknown3_32)
907948{
908   logerror("Read from unknown3 offset: %x %08x\n",offset,(unsigned int) cpu_get_reg(space->machine().device("maincpu"), M68K_PC));
949   logerror("Read from unknown3 offset: %x %08x\n",offset,(unsigned int) cpu_get_reg(machine().device("maincpu"), M68K_PC));
909950   return 0xffffffff;
910951   //return unknown2_data|unknown2_data<<24;
911952
912953}
913954
914static READ16_HANDLER( read_unknown3 )
955READ16_MEMBER(polgar_state::read_unknown3)
915956{
916957   logerror("Read from %06x offset: %x\n",0xe80006,offset);
917958   return 0xffff;
r14844r14845
919960
920961}
921962
922static READ32_HANDLER( read_1800000 )
963READ32_MEMBER(polgar_state::read_1800000)
923964{
924965   logerror("Read from RISC2500 1800000\n");
925966   return 0;
926967}
927968
928static WRITE32_HANDLER( write_1000000 )
969WRITE32_MEMBER(polgar_state::write_1000000)
929970{
930971   logerror("Write to  RISC2500 1000000\n");
931972}
r14844r14845
10701111   AM_RANGE( 0x2400, 0x2400 ) AM_WRITE_LEGACY(mboard_write_LED_8 )      // Chessboard
10711112   AM_RANGE( 0x2800, 0x2800 ) AM_WRITE_LEGACY(mboard_write_board_8)      // Chessboard
10721113   AM_RANGE( 0x3000, 0x3000 ) AM_READ_LEGACY(mboard_read_board_8 )      // Chessboard
1073   AM_RANGE( 0x3400, 0x3405 ) AM_WRITE_LEGACY(polgar_write_LED)   // Function LEDs
1074   AM_RANGE( 0x2c00, 0x2c07 ) AM_READ_LEGACY(read_keys)
1075   AM_RANGE( 0x2004, 0x2004 ) AM_WRITE_LEGACY(write_polgar_IO )   // LCD Instr. Reg + Beeper
1076   AM_RANGE( 0x2000, 0x2000 ) AM_WRITE_LEGACY(write_LCD_polgar )           // LCD Char Reg.
1114   AM_RANGE( 0x3400, 0x3405 ) AM_WRITE(polgar_write_LED)   // Function LEDs
1115   AM_RANGE( 0x2c00, 0x2c07 ) AM_READ(read_keys)
1116   AM_RANGE( 0x2004, 0x2004 ) AM_WRITE(write_polgar_IO )   // LCD Instr. Reg + Beeper
1117   AM_RANGE( 0x2000, 0x2000 ) AM_WRITE(write_LCD_polgar )           // LCD Char Reg.
10771118   AM_RANGE( 0x4000, 0xffff ) AM_ROM
10781119ADDRESS_MAP_END
10791120
10801121static ADDRESS_MAP_START(sfortea_mem , AS_PROGRAM, 8, polgar_state )
10811122   AM_RANGE( 0x0000, 0x1fef ) AM_RAM
1082   AM_RANGE( 0x1ff6, 0x1ff6 ) AM_WRITE_LEGACY(write_latch_sfortea)   // IO control
1083   AM_RANGE( 0x1ff7, 0x1ff7 ) AM_WRITE_LEGACY(write_lcd_IO_sfortea)   // LCD Char Reg.
1123   AM_RANGE( 0x1ff6, 0x1ff6 ) AM_WRITE(write_latch_sfortea)   // IO control
1124   AM_RANGE( 0x1ff7, 0x1ff7 ) AM_WRITE(write_lcd_IO_sfortea)   // LCD Char Reg.
10841125//  AM_RANGE( 0x1ffc, 0x1fff ) AM_DEVREADWRITE_LEGACY("acia65c51", acia_6551_r,acia_6551_w)
1085   AM_RANGE( 0x1ff1, 0x1ff1 ) AM_READ_LEGACY(read_1ff1_sfortea )
1086   AM_RANGE( 0x1ff0, 0x1ff0 ) AM_READ_LEGACY(read_1ff0_sfortea )
1126   AM_RANGE( 0x1ff1, 0x1ff1 ) AM_READ(read_1ff1_sfortea )
1127   AM_RANGE( 0x1ff0, 0x1ff0 ) AM_READ(read_1ff0_sfortea )
10871128   AM_RANGE( 0x2000, 0xffff ) AM_ROM
10881129ADDRESS_MAP_END
10891130
r14844r14845
10971138   AM_RANGE( 0xc8000004 , 0xc8000007 )  AM_WRITE_LEGACY(mboard_write_board_32 )
10981139   AM_RANGE( 0xd0000000 , 0xd0000003 )  AM_WRITE_LEGACY(mboard_write_LED_32 )
10991140   AM_RANGE( 0xd0000004 , 0xd0000007 )  AM_WRITE_LEGACY(mboard_write_LED_32 )
1100   AM_RANGE( 0xf0000004 , 0xf0000013 )  AM_READ_LEGACY(read_buttons_gen32 )
1101   AM_RANGE( 0xe0000000 , 0xe0000003 )  AM_WRITE_LEGACY(write_LCD_data_32 )
1102   AM_RANGE( 0xe0000010 , 0xe0000013 )  AM_WRITE_LEGACY(write_IOenables_32 )
1103   AM_RANGE( 0xd8000008 , 0xd800000b )  AM_WRITE_LEGACY(write_unknown2_32 )
1104   AM_RANGE( 0xd8000004 , 0xd8000007 )  AM_READ_LEGACY(read_unknown1_32 )
1105   AM_RANGE( 0xd800000c , 0xd800000f )  AM_READ_LEGACY(read_unknown3_32 )
1141   AM_RANGE( 0xf0000004 , 0xf0000013 )  AM_READ(read_buttons_gen32 )
1142   AM_RANGE( 0xe0000000 , 0xe0000003 )  AM_WRITE(write_LCD_data_32 )
1143   AM_RANGE( 0xe0000010 , 0xe0000013 )  AM_WRITE(write_IOenables_32 )
1144   AM_RANGE( 0xd8000008 , 0xd800000b )  AM_WRITE(write_unknown2_32 )
1145   AM_RANGE( 0xd8000004 , 0xd8000007 )  AM_READ(read_unknown1_32 )
1146   AM_RANGE( 0xd800000c , 0xd800000f )  AM_READ(read_unknown3_32 )
11061147
11071148   AM_RANGE( 0x40000000, 0x4007ffff )  AM_RAM      /* 512KB */
11081149   AM_RANGE( 0x80000000, 0x8003ffff )  AM_RAM      /* 256KB */
r14844r14845
11131154static ADDRESS_MAP_START(bpl32_mem, AS_PROGRAM, 32, polgar_state )
11141155
11151156   AM_RANGE( 0x000000,  0x03ffff )  AM_ROM
1116   AM_RANGE( 0x800000 , 0x800003 )  AM_READ_LEGACY(read_keys_BPL32 )
1117   AM_RANGE( 0x900000 , 0x900003 )  AM_WRITE_LEGACY(write_board_BPL32 )
1118   AM_RANGE( 0xa00000 , 0xa00003 )  AM_WRITE_LEGACY(write_LED_BPL32 )
1119   AM_RANGE( 0xc00000 , 0xc00003 )  AM_WRITE_LEGACY(write_LCD_data_32 )
1120   AM_RANGE( 0xb00000 , 0xb00003 )  AM_WRITE_LEGACY(write_IOenables_32 )
1157   AM_RANGE( 0x800000 , 0x800003 )  AM_READ(read_keys_BPL32 )
1158   AM_RANGE( 0x900000 , 0x900003 )  AM_WRITE(write_board_BPL32 )
1159   AM_RANGE( 0xa00000 , 0xa00003 )  AM_WRITE(write_LED_BPL32 )
1160   AM_RANGE( 0xc00000 , 0xc00003 )  AM_WRITE(write_LCD_data_32 )
1161   AM_RANGE( 0xb00000 , 0xb00003 )  AM_WRITE(write_IOenables_32 )
11211162   AM_RANGE( 0x400000 , 0x4fffff )  AM_RAM      /* 1024KB */
11221163   AM_RANGE( 0xd00000 , 0xd07fff )  AM_RAM AM_BASE_LEGACY(&save_ram32) AM_SHARE("nvram")
11231164
r14844r14845
11301171   AM_RANGE( 0x800000fc , 0x800000ff )  AM_READ_LEGACY(mboard_read_board_32 )
11311172   AM_RANGE( 0x88000000 , 0x88000007 )  AM_WRITE_LEGACY(mboard_write_board_32 )
11321173   AM_RANGE( 0x90000000 , 0x90000007 )  AM_WRITE_LEGACY(mboard_write_LED_32 )
1133   AM_RANGE( 0x800000ec , 0x800000ff )  AM_READ_LEGACY(read_buttons_van32 )
1134   AM_RANGE( 0xa0000000 , 0xa0000003 )  AM_WRITE_LEGACY(write_LCD_data_32 )
1135   AM_RANGE( 0xa0000010 , 0xa0000013 )  AM_WRITE_LEGACY(write_IOenables_32 )
1136   AM_RANGE( 0x98000008 , 0x9800000b )  AM_WRITE_LEGACY(write_unknown2_32 )
1137   AM_RANGE( 0x98000004 , 0x98000007 )  AM_READ_LEGACY(read_unknown1_32 )
1138   AM_RANGE( 0x9800000c , 0x9800000f )  AM_READ_LEGACY(read_unknown3_32 )
1174   AM_RANGE( 0x800000ec , 0x800000ff )  AM_READ(read_buttons_van32 )
1175   AM_RANGE( 0xa0000000 , 0xa0000003 )  AM_WRITE(write_LCD_data_32 )
1176   AM_RANGE( 0xa0000010 , 0xa0000013 )  AM_WRITE(write_IOenables_32 )
1177   AM_RANGE( 0x98000008 , 0x9800000b )  AM_WRITE(write_unknown2_32 )
1178   AM_RANGE( 0x98000004 , 0x98000007 )  AM_READ(read_unknown1_32 )
1179   AM_RANGE( 0x9800000c , 0x9800000f )  AM_READ(read_unknown3_32 )
11391180
11401181   AM_RANGE( 0x40000000, 0x400fffff )  AM_RAM      /* 1024KB */
11411182   AM_RANGE( 0xa8000000, 0xa8007fff )  AM_RAM AM_BASE_LEGACY(&save_ram32) AM_SHARE("nvram")
r14844r14845
11501191   AM_RANGE( 0x800000fc , 0x800000ff )  AM_READ_LEGACY(mboard_read_board_32 )
11511192   AM_RANGE( 0x88000000 , 0x88000007 )  AM_WRITE_LEGACY(mboard_write_board_32 )
11521193   AM_RANGE( 0x90000000 , 0x90000007 )  AM_WRITE_LEGACY(mboard_write_LED_32 )
1153   AM_RANGE( 0x800000ec , 0x800000ff )  AM_READ_LEGACY(read_buttons_van32 )
1154   AM_RANGE( 0xa0000000 , 0xa0000003 )  AM_WRITE_LEGACY(write_LCD_data_32 )
1155   AM_RANGE( 0xa0000010 , 0xa0000013 )  AM_WRITE_LEGACY(write_IOenables_32 )
1156   AM_RANGE( 0x98000008 , 0x9800000b )  AM_WRITE_LEGACY(write_unknown2_32 )
1157   AM_RANGE( 0x98000004 , 0x98000007 )  AM_READ_LEGACY(read_unknown1_32 )
1158   AM_RANGE( 0x9800000c , 0x9800000f )  AM_READ_LEGACY(read_unknown3_32 )
1194   AM_RANGE( 0x800000ec , 0x800000ff )  AM_READ(read_buttons_van32 )
1195   AM_RANGE( 0xa0000000 , 0xa0000003 )  AM_WRITE(write_LCD_data_32 )
1196   AM_RANGE( 0xa0000010 , 0xa0000013 )  AM_WRITE(write_IOenables_32 )
1197   AM_RANGE( 0x98000008 , 0x9800000b )  AM_WRITE(write_unknown2_32 )
1198   AM_RANGE( 0x98000004 , 0x98000007 )  AM_READ(read_unknown1_32 )
1199   AM_RANGE( 0x9800000c , 0x9800000f )  AM_READ(read_unknown3_32 )
11591200
11601201   AM_RANGE( 0x40000000, 0x400fffff )  AM_RAM
11611202   AM_RANGE( 0xa8000000, 0xa8007fff )  AM_RAM AM_BASE_LEGACY(&save_ram32) AM_SHARE("nvram")
r14844r14845
11651206static ADDRESS_MAP_START(risc_mem, AS_PROGRAM, 32, polgar_state )
11661207
11671208   AM_RANGE( 0x02000000,  0x0201ffff )  AM_ROM AM_REGION("maincpu", 0) // AM_MIRROR(0x2000000)
1168   AM_RANGE( 0x01000000,  0x01000003 )  AM_WRITE_LEGACY(write_1000000 )
1169   AM_RANGE( 0x01800000,  0x01800003 )  AM_READ_LEGACY(read_1800000 )
1209   AM_RANGE( 0x01000000,  0x01000003 )  AM_WRITE(write_1000000 )
1210   AM_RANGE( 0x01800000,  0x01800003 )  AM_READ(read_1800000 )
11701211   AM_RANGE( 0x00000000,  0x0001ffff )  AM_RAM
11711212
11721213 ADDRESS_MAP_END
r14844r14845
11781219   AM_RANGE( 0xc00000 , 0xc00001 )  AM_READ_LEGACY(mboard_read_board_16 )
11791220   AM_RANGE( 0xc80000 , 0xc80001 )  AM_WRITE_LEGACY(mboard_write_board_16 )
11801221   AM_RANGE( 0xd00000 , 0xd00001 )  AM_WRITE_LEGACY(mboard_write_LED_16 )
1181   AM_RANGE( 0xf00000 , 0xf00009 )  AM_READ_LEGACY(read_buttons_van16 )
1182   AM_RANGE( 0xd80000 , 0xd80001 )  AM_WRITE_LEGACY(write_LCD_data )
1183   AM_RANGE( 0xd80008 , 0xd80009 )  AM_WRITE_LEGACY(write_IOenables )
1184   AM_RANGE( 0xe80004 , 0xe80005 )  AM_WRITE_LEGACY(write_unknown2 )
1185   AM_RANGE( 0xe80002 , 0xe80003 )  AM_READ_LEGACY(read_unknown1 )
1186   AM_RANGE( 0xe80006 , 0xe80007 )  AM_READ_LEGACY(read_unknown3 )
1222   AM_RANGE( 0xf00000 , 0xf00009 )  AM_READ(read_buttons_van16 )
1223   AM_RANGE( 0xd80000 , 0xd80001 )  AM_WRITE(write_LCD_data )
1224   AM_RANGE( 0xd80008 , 0xd80009 )  AM_WRITE(write_IOenables )
1225   AM_RANGE( 0xe80004 , 0xe80005 )  AM_WRITE(write_unknown2 )
1226   AM_RANGE( 0xe80002 , 0xe80003 )  AM_READ(read_unknown1 )
1227   AM_RANGE( 0xe80006 , 0xe80007 )  AM_READ(read_unknown3 )
11871228
11881229   AM_RANGE( 0x400000, 0x47ffff )  AM_RAM      /* 512KB */
11891230   AM_RANGE( 0x800000, 0x803fff )  AM_RAM AM_BASE_LEGACY(&save_ram) AM_SHARE("nvram")
r14844r14845
11971238   AM_RANGE( 0xc00000 , 0xc00001 )  AM_READ_LEGACY(mboard_read_board_16 )
11981239   AM_RANGE( 0xc80000 , 0xc80001 )  AM_WRITE_LEGACY(mboard_write_board_16 )
11991240   AM_RANGE( 0xd00000 , 0xd00001 )  AM_WRITE_LEGACY(mboard_write_LED_16 )
1200   AM_RANGE( 0xf00000 , 0xf00009 )  AM_READ_LEGACY(read_buttons_van16 )
1201   AM_RANGE( 0xd80000 , 0xd80001 )  AM_WRITE_LEGACY(write_LCD_data )
1202   AM_RANGE( 0xd80008 , 0xd80009 )  AM_WRITE_LEGACY(write_IOenables )
1203//  AM_RANGE( 0xe80004 , 0xe80005 )  AM_WRITE_LEGACY(write_unknown2 )
1204//  AM_RANGE( 0xe80002 , 0xe80003 )  AM_READ_LEGACY(read_unknown1 )
1205//  AM_RANGE( 0xe80006 , 0xe80007 )  AM_READ_LEGACY(read_unknown3 )
1241   AM_RANGE( 0xf00000 , 0xf00009 )  AM_READ(read_buttons_van16 )
1242   AM_RANGE( 0xd80000 , 0xd80001 )  AM_WRITE(write_LCD_data )
1243   AM_RANGE( 0xd80008 , 0xd80009 )  AM_WRITE(write_IOenables )
1244//  AM_RANGE( 0xe80004 , 0xe80005 )  AM_WRITE(write_unknown2 )
1245//  AM_RANGE( 0xe80002 , 0xe80003 )  AM_READ(read_unknown1 )
1246//  AM_RANGE( 0xe80006 , 0xe80007 )  AM_READ(read_unknown3 )
12061247
12071248
12081249   AM_RANGE( 0x400000, 0x47ffff )  AM_RAM      /* 512KB */
r14844r14845
12121253
12131254static ADDRESS_MAP_START(milano_mem , AS_PROGRAM, 8, polgar_state )
12141255   AM_RANGE( 0x0000, 0x1f9f ) AM_RAM
1215   AM_RANGE( 0x1fd0, 0x1fd0 ) AM_WRITE_LEGACY(milano_write_board )      // Chessboard
1216   AM_RANGE( 0x1fe0, 0x1fe0 ) AM_READ_LEGACY(milano_read_board )      // Chessboard
1217   AM_RANGE( 0x1fe8, 0x1fed ) AM_WRITE_LEGACY(milano_write_LED )   // Function LEDs
1218   AM_RANGE( 0x1fd8, 0x1fdf ) AM_READ_LEGACY(read_keys)
1219   AM_RANGE( 0x1ff0, 0x1ff0 ) AM_WRITE_LEGACY(write_polgar_IO)   // IO control
1220   AM_RANGE( 0x1fc0, 0x1fc0 ) AM_WRITE_LEGACY(write_LCD_polgar)   // LCD Char Reg. (latched)
1256   AM_RANGE( 0x1fd0, 0x1fd0 ) AM_WRITE(milano_write_board )      // Chessboard
1257   AM_RANGE( 0x1fe0, 0x1fe0 ) AM_READ(milano_read_board )      // Chessboard
1258   AM_RANGE( 0x1fe8, 0x1fed ) AM_WRITE(milano_write_LED )   // Function LEDs
1259   AM_RANGE( 0x1fd8, 0x1fdf ) AM_READ(read_keys)
1260   AM_RANGE( 0x1ff0, 0x1ff0 ) AM_WRITE(write_polgar_IO)   // IO control
1261   AM_RANGE( 0x1fc0, 0x1fc0 ) AM_WRITE(write_LCD_polgar)   // LCD Char Reg. (latched)
12211262   AM_RANGE( 0x2000, 0xffff ) AM_ROM
12221263ADDRESS_MAP_END
12231264
12241265
12251266static ADDRESS_MAP_START(academy_mem , AS_PROGRAM, 8, polgar_state )
12261267   AM_RANGE( 0x0000, 0x1fff ) AM_RAM
1227   AM_RANGE( 0x2400, 0x2400 ) AM_READ_LEGACY(read_keys_board_academy )
1228   AM_RANGE( 0x2800, 0x2800 ) AM_WRITE_LEGACY(academy_write_board )      // Chessboard
1268   AM_RANGE( 0x2400, 0x2400 ) AM_READ(read_keys_board_academy )
1269   AM_RANGE( 0x2800, 0x2800 ) AM_WRITE(academy_write_board )      // Chessboard
12291270   AM_RANGE( 0x2c00, 0x2c00 ) AM_WRITE_LEGACY(mboard_write_LED_8 )      // Chessboard
1230   AM_RANGE( 0x3002, 0x3002 ) AM_WRITE_LEGACY(beep_academy )
1231   AM_RANGE( 0x3001, 0x3001 ) AM_WRITE_LEGACY(academy_inhibitNMI )
1232   AM_RANGE( 0x3400, 0x3400 ) AM_WRITE_LEGACY(academy_write_LED )
1233   AM_RANGE( 0x3800, 0x3801 ) AM_WRITE_LEGACY(write_LCD_academy )
1271   AM_RANGE( 0x3002, 0x3002 ) AM_WRITE(beep_academy )
1272   AM_RANGE( 0x3001, 0x3001 ) AM_WRITE(academy_inhibitNMI )
1273   AM_RANGE( 0x3400, 0x3400 ) AM_WRITE(academy_write_LED )
1274   AM_RANGE( 0x3800, 0x3801 ) AM_WRITE(write_LCD_academy )
12341275   AM_RANGE( 0x4000, 0xffff ) AM_ROM
12351276ADDRESS_MAP_END
12361277
12371278static ADDRESS_MAP_START(monteciv_mem , AS_PROGRAM, 8, polgar_state )
12381279   AM_RANGE( 0x0000, 0x1fff ) AM_RAM
1239   AM_RANGE( 0x2400, 0x2400 ) AM_READ_LEGACY(read_keys_board_monteciv )
1240   AM_RANGE( 0x2800, 0x2800 ) AM_WRITE_LEGACY(academy_write_board )      // Chessboard
1280   AM_RANGE( 0x2400, 0x2400 ) AM_READ(read_keys_board_monteciv )
1281   AM_RANGE( 0x2800, 0x2800 ) AM_WRITE(academy_write_board )      // Chessboard
12411282   AM_RANGE( 0x2c00, 0x2c00 ) AM_WRITE_LEGACY(mboard_write_LED_8 )      // Chessboard
1242   AM_RANGE( 0x3400, 0x3400 ) AM_WRITE_LEGACY(academy_write_LED )         // Status LEDs
1243   AM_RANGE( 0x3000, 0x3001 ) AM_WRITE_LEGACY(monteciv_select_line )         // Select Keyline
1244   AM_RANGE( 0x3002, 0x3002 ) AM_WRITE_LEGACY(beep_academy )
1245   AM_RANGE( 0x3004, 0x3004 ) AM_WRITE_LEGACY(monteciv_write_LCD )
1246   AM_RANGE( 0x3005, 0x3005 ) AM_WRITE_LEGACY(monteciv_3005 )
1247   AM_RANGE( 0x3007, 0x3007 ) AM_WRITE_LEGACY(monteciv_3007 )
1248   AM_RANGE( 0x3006, 0x3006 ) AM_WRITE_LEGACY(monteciv_3006 )
1249   AM_RANGE( 0x2000, 0x2000 ) AM_WRITE_LEGACY(academy_inhibitNMI )
1283   AM_RANGE( 0x3400, 0x3400 ) AM_WRITE(academy_write_LED )         // Status LEDs
1284   AM_RANGE( 0x3000, 0x3001 ) AM_WRITE(monteciv_select_line )         // Select Keyline
1285   AM_RANGE( 0x3002, 0x3002 ) AM_WRITE(beep_academy )
1286   AM_RANGE( 0x3004, 0x3004 ) AM_WRITE(monteciv_write_LCD )
1287   AM_RANGE( 0x3005, 0x3005 ) AM_WRITE(monteciv_3005 )
1288   AM_RANGE( 0x3007, 0x3007 ) AM_WRITE(monteciv_3007 )
1289   AM_RANGE( 0x3006, 0x3006 ) AM_WRITE(monteciv_3006 )
1290   AM_RANGE( 0x2000, 0x2000 ) AM_WRITE(academy_inhibitNMI )
12501291   AM_RANGE( 0x8000, 0xffff ) AM_ROM
12511292ADDRESS_MAP_END
12521293
12531294static ADDRESS_MAP_START(megaiv_mem , AS_PROGRAM, 8, polgar_state )
12541295   AM_RANGE( 0x0000, 0x1fff ) AM_RAM
1255/// AM_RANGE( 0x2400, 0x2400 ) AM_READ_LEGACY(read_keys_board_monteciv )
1256   AM_RANGE( 0x6800, 0x6800 ) AM_WRITE_LEGACY(academy_write_board )   // 2800 // Chessboard
1296/// AM_RANGE( 0x2400, 0x2400 ) AM_READ(read_keys_board_monteciv )
1297   AM_RANGE( 0x6800, 0x6800 ) AM_WRITE(academy_write_board )   // 2800 // Chessboard
12571298/// AM_RANGE( 0x2c00, 0x2c00 ) AM_WRITE_LEGACY(mboard_write_LED_8 )      // Chessboard
1258/// AM_RANGE( 0x3400, 0x3400 ) AM_WRITE_LEGACY(academy_write_LED )           // Status LEDs
1259   AM_RANGE( 0x4400, 0x4400 ) AM_WRITE_LEGACY(megaiv_write_LED )   // 2400     // Select Keyline
1260   AM_RANGE( 0x7000, 0x7001 ) AM_WRITE_LEGACY(megaiv_IO )         // Select Keyline
1261/// AM_RANGE( 0x3002, 0x3002 ) AM_WRITE_LEGACY(beep_academy )
1262   AM_RANGE( 0x4000, 0x4007 ) AM_READ_LEGACY(read_keys_megaiv ) // 3000-7 fixio
1263   AM_RANGE( 0x2c04, 0x2c04 ) AM_WRITE_LEGACY(monteciv_write_LCD ) // 2c04
1264   AM_RANGE( 0x2c05, 0x2c05 ) AM_WRITE_LEGACY(monteciv_3005 ) // 2c05
1265   AM_RANGE( 0x2c07, 0x2c07 ) AM_WRITE_LEGACY(monteciv_3007 ) // 2c07
1266   AM_RANGE( 0x2c06, 0x2c06 ) AM_WRITE_LEGACY(monteciv_3006 ) // 2c06
1267/// AM_RANGE( 0x2000, 0x2000 ) AM_WRITE_LEGACY(academy_inhibitNMI )
1299/// AM_RANGE( 0x3400, 0x3400 ) AM_WRITE(academy_write_LED )           // Status LEDs
1300   AM_RANGE( 0x4400, 0x4400 ) AM_WRITE(megaiv_write_LED )   // 2400     // Select Keyline
1301   AM_RANGE( 0x7000, 0x7001 ) AM_WRITE(megaiv_IO )         // Select Keyline
1302/// AM_RANGE( 0x3002, 0x3002 ) AM_WRITE(beep_academy )
1303   AM_RANGE( 0x4000, 0x4007 ) AM_READ(read_keys_megaiv ) // 3000-7 fixio
1304   AM_RANGE( 0x2c04, 0x2c04 ) AM_WRITE(monteciv_write_LCD ) // 2c04
1305   AM_RANGE( 0x2c05, 0x2c05 ) AM_WRITE(monteciv_3005 ) // 2c05
1306   AM_RANGE( 0x2c07, 0x2c07 ) AM_WRITE(monteciv_3007 ) // 2c07
1307   AM_RANGE( 0x2c06, 0x2c06 ) AM_WRITE(monteciv_3006 ) // 2c06
1308/// AM_RANGE( 0x2000, 0x2000 ) AM_WRITE(academy_inhibitNMI )
12681309   AM_RANGE( 0x8000, 0xffff ) AM_ROM
12691310ADDRESS_MAP_END
12701311
r14844r14845
12721313   AM_RANGE( 0x00000000, 0x0000ffff ) AM_ROM // OS
12731314//  AM_RANGE( 0x00200000, 0x0020ffff ) AM_ROM AM_REGION("maincpu", 0)
12741315   AM_RANGE( 0x00ff0000, 0x00ff7fff ) AM_ROM AM_REGION("maincpu",10000) // Opening Book
1275//  AM_RANGE( 0x00300000, 0x00300007 ) AM_READ_LEGACY(diablo68_aciaread)
1276//  AM_RANGE( 0x00300000, 0x00300007 ) AM_READ_LEGACY(diablo68_aciawrite)
1316//  AM_RANGE( 0x00300000, 0x00300007 ) AM_READ(diablo68_aciaread)
1317//  AM_RANGE( 0x00300000, 0x00300007 ) AM_READ(diablo68_aciawrite)
12771318//  AM_RANGE( 0x00300002, 0x00300003 ) AM_READ_LEGACY(diablo68_flags)
1278   AM_RANGE( 0x003a0000, 0x003a0001 ) AM_WRITE_LEGACY(diablo68_write_LCD)
1279   AM_RANGE( 0x003c0000, 0x003c0001 ) AM_WRITE_LEGACY(diablo68_reg_select)
1319   AM_RANGE( 0x003a0000, 0x003a0001 ) AM_WRITE(diablo68_write_LCD)
1320   AM_RANGE( 0x003c0000, 0x003c0001 ) AM_WRITE(diablo68_reg_select)
12801321   AM_RANGE( 0x00280000, 0x0028ffff ) AM_RAM  // hash tables
12811322   AM_RANGE( 0x00ff8000, 0x00ffffff ) AM_RAM
12821323ADDRESS_MAP_END
src/mess/drivers/pc8801.c
r14844r14845
226226   struct { UINT8 r, g, b; } m_palram[8];
227227   UINT8 m_dmac_ff;
228228   UINT32 m_knj_addr[2];
229   DECLARE_READ8_MEMBER(pc8801_alu_r);
230   DECLARE_WRITE8_MEMBER(pc8801_alu_w);
231   DECLARE_READ8_MEMBER(pc8801_wram_r);
232   DECLARE_WRITE8_MEMBER(pc8801_wram_w);
233   DECLARE_READ8_MEMBER(pc8801_ext_wram_r);
234   DECLARE_WRITE8_MEMBER(pc8801_ext_wram_w);
235   DECLARE_READ8_MEMBER(pc8801_nbasic_rom_r);
236   DECLARE_READ8_MEMBER(pc8801_n88basic_rom_r);
237   DECLARE_READ8_MEMBER(pc8801_gvram_r);
238   DECLARE_WRITE8_MEMBER(pc8801_gvram_w);
239   DECLARE_READ8_MEMBER(pc8801_high_wram_r);
240   DECLARE_WRITE8_MEMBER(pc8801_high_wram_w);
241   DECLARE_READ8_MEMBER(pc8801ma_dic_r);
242   DECLARE_READ8_MEMBER(pc8801_cdbios_rom_r);
243   DECLARE_READ8_MEMBER(pc8801_mem_r);
244   DECLARE_WRITE8_MEMBER(pc8801_mem_w);
245   DECLARE_READ8_MEMBER(pc8801_ctrl_r);
246   DECLARE_WRITE8_MEMBER(pc8801_ctrl_w);
247   DECLARE_READ8_MEMBER(pc8801_ext_rom_bank_r);
248   DECLARE_WRITE8_MEMBER(pc8801_ext_rom_bank_w);
249   DECLARE_WRITE8_MEMBER(pc8801_gfx_ctrl_w);
250   DECLARE_READ8_MEMBER(pc8801_vram_select_r);
251   DECLARE_WRITE8_MEMBER(pc8801_vram_select_w);
252   DECLARE_WRITE8_MEMBER(i8214_irq_level_w);
253   DECLARE_WRITE8_MEMBER(i8214_irq_mask_w);
254   DECLARE_WRITE8_MEMBER(pc8801_irq_level_w);
255   DECLARE_WRITE8_MEMBER(pc8801_irq_mask_w);
256   DECLARE_READ8_MEMBER(pc8801_window_bank_r);
257   DECLARE_WRITE8_MEMBER(pc8801_window_bank_w);
258   DECLARE_WRITE8_MEMBER(pc8801_window_bank_inc_w);
259   DECLARE_READ8_MEMBER(pc8801_misc_ctrl_r);
260   DECLARE_WRITE8_MEMBER(pc8801_misc_ctrl_w);
261   DECLARE_WRITE8_MEMBER(pc8801_bgpal_w);
262   DECLARE_WRITE8_MEMBER(pc8801_palram_w);
263   DECLARE_WRITE8_MEMBER(pc8801_layer_masking_w);
264   DECLARE_READ8_MEMBER(pc8801_crtc_param_r);
265   DECLARE_WRITE8_MEMBER(pc88_crtc_param_w);
266   DECLARE_READ8_MEMBER(pc8801_crtc_status_r);
267   DECLARE_WRITE8_MEMBER(pc88_crtc_cmd_w);
268   DECLARE_WRITE8_MEMBER(pc8801_dmac_w);
269   DECLARE_WRITE8_MEMBER(pc8801_dmac_mode_w);
270   DECLARE_READ8_MEMBER(pc8801_extram_mode_r);
271   DECLARE_WRITE8_MEMBER(pc8801_extram_mode_w);
272   DECLARE_READ8_MEMBER(pc8801_extram_bank_r);
273   DECLARE_WRITE8_MEMBER(pc8801_extram_bank_w);
274   DECLARE_WRITE8_MEMBER(pc8801_alu_ctrl1_w);
275   DECLARE_WRITE8_MEMBER(pc8801_alu_ctrl2_w);
276   DECLARE_WRITE8_MEMBER(pc8801_pcg8100_w);
277   DECLARE_READ8_MEMBER(sio_status_r);
278   DECLARE_WRITE8_MEMBER(pc8801_txt_cmt_ctrl_w);
279   DECLARE_READ8_MEMBER(pc8801_kanji_r);
280   DECLARE_WRITE8_MEMBER(pc8801_kanji_w);
281   DECLARE_READ8_MEMBER(pc8801_kanji_lv2_r);
282   DECLARE_WRITE8_MEMBER(pc8801_kanji_lv2_w);
283   DECLARE_WRITE8_MEMBER(pc8801_dic_bank_w);
284   DECLARE_WRITE8_MEMBER(pc8801_dic_ctrl_w);
285   DECLARE_READ8_MEMBER(pc8801_cdrom_r);
286   DECLARE_WRITE8_MEMBER(pc8801_cdrom_w);
287   DECLARE_READ8_MEMBER(pc8801_cpuclock_r);
288   DECLARE_READ8_MEMBER(pc8801_baudrate_r);
289   DECLARE_WRITE8_MEMBER(pc8801_baudrate_w);
290   DECLARE_WRITE8_MEMBER(pc8801_rtc_w);
291   DECLARE_WRITE8_MEMBER(upd765_mc_w);
292   DECLARE_READ8_MEMBER(upd765_tc_r);
293   DECLARE_WRITE8_MEMBER(fdc_irq_vector_w);
294   DECLARE_WRITE8_MEMBER(fdc_drive_mode_w);
229295};
230296
231297/*
r14844r14845
623689   return 0;
624690}
625691
626static READ8_HANDLER( pc8801_alu_r )
692READ8_MEMBER(pc8801_state::pc8801_alu_r)
627693{
628   pc8801_state *state = space->machine().driver_data<pc8801_state>();
629694   int i;
630   UINT8 *gvram = space->machine().region("gvram")->base();
695   UINT8 *gvram = machine().region("gvram")->base();
631696   UINT8 b,r,g;
632697
633698   /* store data to ALU regs */
634699   for(i=0;i<3;i++)
635      state->m_alu_reg[i] = gvram[i*0x4000 + offset];
700      m_alu_reg[i] = gvram[i*0x4000 + offset];
636701
637702   b = gvram[offset + 0x0000];
638703   r = gvram[offset + 0x4000];
639704   g = gvram[offset + 0x8000];
640   if(!(state->m_alu_ctrl2 & 1)) { b^=0xff; }
641   if(!(state->m_alu_ctrl2 & 2)) { r^=0xff; }
642   if(!(state->m_alu_ctrl2 & 4)) { g^=0xff; }
705   if(!(m_alu_ctrl2 & 1)) { b^=0xff; }
706   if(!(m_alu_ctrl2 & 2)) { r^=0xff; }
707   if(!(m_alu_ctrl2 & 4)) { g^=0xff; }
643708
644709   return b & r & g;
645710}
646711
647static WRITE8_HANDLER( pc8801_alu_w )
712WRITE8_MEMBER(pc8801_state::pc8801_alu_w)
648713{
649   pc8801_state *state = space->machine().driver_data<pc8801_state>();
650714   int i;
651   UINT8 *gvram = space->machine().region("gvram")->base();
715   UINT8 *gvram = machine().region("gvram")->base();
652716
653   switch(state->m_alu_ctrl2 & 0x30) // alu write mode
717   switch(m_alu_ctrl2 & 0x30) // alu write mode
654718   {
655719      case 0x00: //logic operation
656720      {
r14844r14845
658722
659723         for(i=0;i<3;i++)
660724         {
661            logic_op = (state->m_alu_ctrl1 & (0x11 << i)) >> i;
725            logic_op = (m_alu_ctrl1 & (0x11 << i)) >> i;
662726
663727            switch(logic_op)
664728            {
r14844r14845
674738      case 0x10: // restore data from ALU regs
675739      {
676740         for(i=0;i<3;i++)
677            gvram[i*0x4000 + offset] = state->m_alu_reg[i];
741            gvram[i*0x4000 + offset] = m_alu_reg[i];
678742      }
679743      break;
680744
681745      case 0x20: // swap ALU reg 1 into R GVRAM
682         gvram[0x0000 + offset] = state->m_alu_reg[1];
746         gvram[0x0000 + offset] = m_alu_reg[1];
683747         break;
684748
685749      case 0x30: // swap ALU reg 0 into B GVRAM
686         gvram[0x4000 + offset] = state->m_alu_reg[0];
750         gvram[0x4000 + offset] = m_alu_reg[0];
687751         break;
688752   }
689753}
690754
691755
692static READ8_HANDLER( pc8801_wram_r )
756READ8_MEMBER(pc8801_state::pc8801_wram_r)
693757{
694   UINT8 *work_ram = space->machine().region("wram")->base();
758   UINT8 *work_ram = machine().region("wram")->base();
695759
696760   return work_ram[offset];
697761}
698762
699static WRITE8_HANDLER( pc8801_wram_w )
763WRITE8_MEMBER(pc8801_state::pc8801_wram_w)
700764{
701   UINT8 *work_ram = space->machine().region("wram")->base();
765   UINT8 *work_ram = machine().region("wram")->base();
702766
703767   work_ram[offset] = data;
704768}
705769
706static READ8_HANDLER( pc8801_ext_wram_r )
770READ8_MEMBER(pc8801_state::pc8801_ext_wram_r)
707771{
708   UINT8 *ext_work_ram = space->machine().region("ewram")->base();
772   UINT8 *ext_work_ram = machine().region("ewram")->base();
709773
710774   /* TODO: check max range here */
711775
712776   return ext_work_ram[offset];
713777}
714778
715static WRITE8_HANDLER( pc8801_ext_wram_w )
779WRITE8_MEMBER(pc8801_state::pc8801_ext_wram_w)
716780{
717   UINT8 *ext_work_ram = space->machine().region("ewram")->base();
781   UINT8 *ext_work_ram = machine().region("ewram")->base();
718782
719783   /* TODO: check max range here */
720784
721785   ext_work_ram[offset] = data;
722786}
723787
724static READ8_HANDLER( pc8801_nbasic_rom_r )
788READ8_MEMBER(pc8801_state::pc8801_nbasic_rom_r)
725789{
726   UINT8 *n80_rom = space->machine().region("n80rom")->base();
790   UINT8 *n80_rom = machine().region("n80rom")->base();
727791
728792   return n80_rom[offset];
729793}
730794
731static READ8_HANDLER( pc8801_n88basic_rom_r )
795READ8_MEMBER(pc8801_state::pc8801_n88basic_rom_r)
732796{
733   UINT8 *n88_rom = space->machine().region("n88rom")->base();
797   UINT8 *n88_rom = machine().region("n88rom")->base();
734798
735799   return n88_rom[offset];
736800}
737801
738static READ8_HANDLER( pc8801_gvram_r )
802READ8_MEMBER(pc8801_state::pc8801_gvram_r)
739803{
740   UINT8 *gvram = space->machine().region("gvram")->base();
804   UINT8 *gvram = machine().region("gvram")->base();
741805
742806   return gvram[offset];
743807}
744808
745static WRITE8_HANDLER( pc8801_gvram_w )
809WRITE8_MEMBER(pc8801_state::pc8801_gvram_w)
746810{
747   UINT8 *gvram = space->machine().region("gvram")->base();
811   UINT8 *gvram = machine().region("gvram")->base();
748812
749813   gvram[offset] = data;
750814}
751815
752static READ8_HANDLER( pc8801_high_wram_r )
816READ8_MEMBER(pc8801_state::pc8801_high_wram_r)
753817{
754   UINT8 *hi_work_ram = space->machine().region("hiwram")->base();
818   UINT8 *hi_work_ram = machine().region("hiwram")->base();
755819
756820   return hi_work_ram[offset];
757821}
758822
759static WRITE8_HANDLER( pc8801_high_wram_w )
823WRITE8_MEMBER(pc8801_state::pc8801_high_wram_w)
760824{
761   UINT8 *hi_work_ram = space->machine().region("hiwram")->base();
825   UINT8 *hi_work_ram = machine().region("hiwram")->base();
762826
763827   hi_work_ram[offset] = data;
764828}
765829
766static READ8_HANDLER( pc8801ma_dic_r )
830READ8_MEMBER(pc8801_state::pc8801ma_dic_r)
767831{
768   UINT8 *dic_rom = space->machine().region("dictionary")->base();
832   UINT8 *dic_rom = machine().region("dictionary")->base();
769833
770834   return dic_rom[offset];
771835}
772836
773static READ8_HANDLER( pc8801_cdbios_rom_r )
837READ8_MEMBER(pc8801_state::pc8801_cdbios_rom_r)
774838{
775   UINT8 *cdrom_bios = space->machine().region("cdrom")->base();
839   UINT8 *cdrom_bios = machine().region("cdrom")->base();
776840
777841   return cdrom_bios[offset];
778842}
779843
780static READ8_HANDLER( pc8801_mem_r )
844READ8_MEMBER(pc8801_state::pc8801_mem_r)
781845{
782   pc8801_state *state = space->machine().driver_data<pc8801_state>();
783846   if(offset <= 0x7fff)
784847   {
785      if(state->m_extram_mode & 1)
786         return pc8801_ext_wram_r(space,offset | (state->m_extram_bank * 0x8000));
848      if(m_extram_mode & 1)
849         return pc8801_ext_wram_r(space,offset | (m_extram_bank * 0x8000));
787850
788      if(state->m_gfx_ctrl & 2)
851      if(m_gfx_ctrl & 2)
789852         return pc8801_wram_r(space,offset);
790853
791      if(state->m_has_cdrom && state->m_cdrom_reg[9] & 0x10)
792         return pc8801_cdbios_rom_r(space,(offset & 0x7fff) | ((state->m_gfx_ctrl & 4) ? 0x8000 : 0x0000));
854      if(m_has_cdrom && m_cdrom_reg[9] & 0x10)
855         return pc8801_cdbios_rom_r(space,(offset & 0x7fff) | ((m_gfx_ctrl & 4) ? 0x8000 : 0x0000));
793856
794      if(state->m_gfx_ctrl & 4)
857      if(m_gfx_ctrl & 4)
795858         return pc8801_nbasic_rom_r(space,offset);
796859
797      if(offset >= 0x6000 && offset <= 0x7fff && ((state->m_ext_rom_bank & 1) == 0))
798         return pc8801_n88basic_rom_r(space,0x8000 + (offset & 0x1fff) + (0x2000 * (state->m_misc_ctrl & 3)));
860      if(offset >= 0x6000 && offset <= 0x7fff && ((m_ext_rom_bank & 1) == 0))
861         return pc8801_n88basic_rom_r(space,0x8000 + (offset & 0x1fff) + (0x2000 * (m_misc_ctrl & 3)));
799862
800863      return pc8801_n88basic_rom_r(space,offset);
801864   }
r14844r14845
803866   {
804867      UINT32 window_offset;
805868
806      if(state->m_gfx_ctrl & 6) //wram read select or n basic select banks this as normal wram
869      if(m_gfx_ctrl & 6) //wram read select or n basic select banks this as normal wram
807870         return pc8801_wram_r(space,offset);
808871
809      window_offset = (offset & 0x3ff) + (state->m_window_offset_bank << 8);
872      window_offset = (offset & 0x3ff) + (m_window_offset_bank << 8);
810873
811874      if((window_offset & 0xf000) == 0xf000)
812875         printf("Read from 0xf000 - 0xffff window offset\n"); //accessed by Castle Excellent, no noticeable quirk
813876
814      if(((window_offset & 0xf000) == 0xf000) && (state->m_misc_ctrl & 0x10))
877      if(((window_offset & 0xf000) == 0xf000) && (m_misc_ctrl & 0x10))
815878         return pc8801_high_wram_r(space,window_offset & 0xfff);
816879
817880      return pc8801_wram_r(space,window_offset);
r14844r14845
822885   }
823886   else if(offset >= 0xc000 && offset <= 0xffff)
824887   {
825      if(state->m_has_dictionary && state->m_dic_ctrl)
826         return pc8801ma_dic_r(space,(offset & 0x3fff) + ((state->m_dic_bank & 0x1f) * 0x4000));
888      if(m_has_dictionary && m_dic_ctrl)
889         return pc8801ma_dic_r(space,(offset & 0x3fff) + ((m_dic_bank & 0x1f) * 0x4000));
827890
828      if(state->m_misc_ctrl & 0x40)
891      if(m_misc_ctrl & 0x40)
829892      {
830         state->m_vram_sel = 3;
831         if(state->m_alu_ctrl2 & 0x80)
893         m_vram_sel = 3;
894         if(m_alu_ctrl2 & 0x80)
832895            return pc8801_alu_r(space,offset & 0x3fff);
833896      }
834897
835      if(state->m_vram_sel == 3)
898      if(m_vram_sel == 3)
836899      {
837         if(offset >= 0xf000 && offset <= 0xffff && (state->m_misc_ctrl & 0x10))
900         if(offset >= 0xf000 && offset <= 0xffff && (m_misc_ctrl & 0x10))
838901            return pc8801_high_wram_r(space,offset & 0xfff);
839902
840903         return pc8801_wram_r(space,offset);
841904      }
842905
843      return pc8801_gvram_r(space,(offset & 0x3fff) + (0x4000 * state->m_vram_sel));
906      return pc8801_gvram_r(space,(offset & 0x3fff) + (0x4000 * m_vram_sel));
844907   }
845908
846909   return 0xff;
847910}
848911
849static WRITE8_HANDLER( pc8801_mem_w )
912WRITE8_MEMBER(pc8801_state::pc8801_mem_w)
850913{
851   pc8801_state *state = space->machine().driver_data<pc8801_state>();
852914   if(offset <= 0x7fff)
853915   {
854      if(state->m_extram_mode & 0x10)
855         pc8801_ext_wram_w(space,offset | (state->m_extram_bank * 0x8000),data);
916      if(m_extram_mode & 0x10)
917         pc8801_ext_wram_w(space,offset | (m_extram_bank * 0x8000),data);
856918      else
857919         pc8801_wram_w(space,offset,data);
858920
r14844r14845
860922   }
861923   else if(offset >= 0x8000 && offset <= 0x83ff)
862924   {
863      if(state->m_gfx_ctrl & 6) //wram read select or n basic select banks this as normal wram
925      if(m_gfx_ctrl & 6) //wram read select or n basic select banks this as normal wram
864926         pc8801_wram_w(space,offset,data);
865927      else
866928      {
867929         UINT32 window_offset;
868930
869         window_offset = (offset & 0x3ff) + (state->m_window_offset_bank << 8);
931         window_offset = (offset & 0x3ff) + (m_window_offset_bank << 8);
870932
871933         if((window_offset & 0xf000) == 0xf000)
872934            printf("Write to 0xf000 - 0xffff window offset\n"); //accessed by Castle Excellent, no noticeable quirk
873935
874         if(((window_offset & 0xf000) == 0xf000) && (state->m_misc_ctrl & 0x10))
936         if(((window_offset & 0xf000) == 0xf000) && (m_misc_ctrl & 0x10))
875937            pc8801_high_wram_w(space,window_offset & 0xfff,data);
876938         else
877939            pc8801_wram_w(space,window_offset,data);
r14844r14845
886948   }
887949   else if(offset >= 0xc000 && offset <= 0xffff)
888950   {
889      if(state->m_misc_ctrl & 0x40)
951      if(m_misc_ctrl & 0x40)
890952      {
891         state->m_vram_sel = 3;
892         if(state->m_alu_ctrl2 & 0x80)
953         m_vram_sel = 3;
954         if(m_alu_ctrl2 & 0x80)
893955         {
894956            pc8801_alu_w(space,offset & 0x3fff,data);
895957            return;
896958         }
897959      }
898960
899      if(state->m_vram_sel == 3)
961      if(m_vram_sel == 3)
900962      {
901         if(offset >= 0xf000 && offset <= 0xffff && (state->m_misc_ctrl & 0x10))
963         if(offset >= 0xf000 && offset <= 0xffff && (m_misc_ctrl & 0x10))
902964         {
903965            pc8801_high_wram_w(space,offset & 0xfff,data);
904966            return;
r14844r14845
908970         return;
909971      }
910972
911      pc8801_gvram_w(space,(offset & 0x3fff) + (0x4000 * state->m_vram_sel),data);
973      pc8801_gvram_w(space,(offset & 0x3fff) + (0x4000 * m_vram_sel),data);
912974      return;
913975   }
914976}
915977
916978static ADDRESS_MAP_START( pc8801_mem, AS_PROGRAM, 8, pc8801_state )
917   AM_RANGE(0x0000, 0xffff) AM_READWRITE_LEGACY(pc8801_mem_r,pc8801_mem_w)
979   AM_RANGE(0x0000, 0xffff) AM_READWRITE(pc8801_mem_r,pc8801_mem_w)
918980ADDRESS_MAP_END
919981
920static READ8_HANDLER( pc8801_ctrl_r )
982READ8_MEMBER(pc8801_state::pc8801_ctrl_r)
921983{
922984   /*
923985    11-- ----
r14844r14845
928990    ---- --x- monitor refresh rate DIP-SW
929991    ---- ---x (pbsy?)
930992    */
931   return input_port_read(space->machine(), "CTRL");
993   return input_port_read(machine(), "CTRL");
932994}
933995
934static WRITE8_HANDLER( pc8801_ctrl_w )
996WRITE8_MEMBER(pc8801_state::pc8801_ctrl_w)
935997{
936998   /*
937999    x--- ---- SING (buzzer mask?)
r14844r14845
9411003    ---- --x- upd1990a strobe bit
9421004    */
9431005
944   pc8801_state *state = space->machine().driver_data<pc8801_state>();
9451006
946   state->m_rtc->stb_w((data & 2) >> 1);
947   state->m_rtc->clk_w((data & 4) >> 2);
1007   m_rtc->stb_w((data & 2) >> 1);
1008   m_rtc->clk_w((data & 4) >> 2);
9481009
949   if(((state->m_device_ctrl_data & 0x20) == 0x00) && ((data & 0x20) == 0x20))
950      beep_set_state(space->machine().device(BEEPER_TAG),1);
1010   if(((m_device_ctrl_data & 0x20) == 0x00) && ((data & 0x20) == 0x20))
1011      beep_set_state(machine().device(BEEPER_TAG),1);
9511012
952   if(((state->m_device_ctrl_data & 0x20) == 0x20) && ((data & 0x20) == 0x00))
953      beep_set_state(space->machine().device(BEEPER_TAG),0);
1013   if(((m_device_ctrl_data & 0x20) == 0x20) && ((data & 0x20) == 0x00))
1014      beep_set_state(machine().device(BEEPER_TAG),0);
9541015
9551016   /* TODO: is SING a buzzer mask? Bastard Special relies on this ... */
956   if(state->m_device_ctrl_data & 0x80)
957      beep_set_state(space->machine().device(BEEPER_TAG),0);
1017   if(m_device_ctrl_data & 0x80)
1018      beep_set_state(machine().device(BEEPER_TAG),0);
9581019
959   state->m_device_ctrl_data = data;
1020   m_device_ctrl_data = data;
9601021}
9611022
962static READ8_HANDLER( pc8801_ext_rom_bank_r )
1023READ8_MEMBER(pc8801_state::pc8801_ext_rom_bank_r)
9631024{
964   pc8801_state *state = space->machine().driver_data<pc8801_state>();
965   return state->m_ext_rom_bank;
1025   return m_ext_rom_bank;
9661026}
9671027
968static WRITE8_HANDLER( pc8801_ext_rom_bank_w )
1028WRITE8_MEMBER(pc8801_state::pc8801_ext_rom_bank_w)
9691029{
970   pc8801_state *state = space->machine().driver_data<pc8801_state>();
971   state->m_ext_rom_bank = data;
1030   m_ext_rom_bank = data;
9721031}
9731032
9741033static void pc8801_dynamic_res_change(running_machine &machine)
r14844r14845
9811040   machine.primary_screen->configure(640, 480, visarea, machine.primary_screen->frame_period().attoseconds);
9821041}
9831042
984static WRITE8_HANDLER( pc8801_gfx_ctrl_w )
1043WRITE8_MEMBER(pc8801_state::pc8801_gfx_ctrl_w)
9851044{
986   pc8801_state *state = space->machine().driver_data<pc8801_state>();
9871045   /*
9881046    --x- ---- VRAM y 25 (1) / 20 (0)
9891047    ---x ---- graphic color yes (1) / no (0)
r14844r14845
9931051    ---- ---x VRAM 200 lines (1) / 400 lines (0), 15 KHz / 24 KHz
9941052    */
9951053
996   state->m_gfx_ctrl = data;
1054   m_gfx_ctrl = data;
9971055
998   pc8801_dynamic_res_change(space->machine());
1056   pc8801_dynamic_res_change(machine());
9991057}
10001058
1001static READ8_HANDLER( pc8801_vram_select_r )
1059READ8_MEMBER(pc8801_state::pc8801_vram_select_r)
10021060{
1003   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1004   return 0xf8 | ((state->m_vram_sel == 3) ? 0 : (1 << state->m_vram_sel));
1061   return 0xf8 | ((m_vram_sel == 3) ? 0 : (1 << m_vram_sel));
10051062}
10061063
1007static WRITE8_HANDLER( pc8801_vram_select_w )
1064WRITE8_MEMBER(pc8801_state::pc8801_vram_select_w)
10081065{
1009   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1010   state->m_vram_sel = offset & 3;
1066   m_vram_sel = offset & 3;
10111067}
10121068
10131069#ifdef USE_PROPER_I8214
10141070
1015static WRITE8_HANDLER( i8214_irq_level_w )
1071WRITE8_MEMBER(pc8801_state::i8214_irq_level_w)
10161072{
10171073   if(data & 8)
10181074      m_pic->b_w(7);
r14844r14845
10201076      m_pic->b_w(data & 0x07);
10211077}
10221078
1023static WRITE8_HANDLER( i8214_irq_mask_w )
1079WRITE8_MEMBER(pc8801_state::i8214_irq_mask_w)
10241080{
1025   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1026   state->m_timer_irq_mask = data & 1;
1027   state->m_vblank_irq_mask = data & 2;
1081   m_timer_irq_mask = data & 1;
1082   m_vblank_irq_mask = data & 2;
10281083}
10291084
10301085
10311086#else
1032static WRITE8_HANDLER( pc8801_irq_level_w )
1087WRITE8_MEMBER(pc8801_state::pc8801_irq_level_w)
10331088{
1034   pc8801_state *state = space->machine().driver_data<pc8801_state>();
10351089   if(data & 8)
1036      state->m_i8214_irq_level = 7;
1090      m_i8214_irq_level = 7;
10371091   else
1038      state->m_i8214_irq_level = data & 7;
1092      m_i8214_irq_level = data & 7;
10391093}
10401094
10411095
1042static WRITE8_HANDLER( pc8801_irq_mask_w )
1096WRITE8_MEMBER(pc8801_state::pc8801_irq_mask_w)
10431097{
1044   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1045   state->m_timer_irq_mask = data & 1;
1046   state->m_vrtc_irq_mask = data & 2;
1098   m_timer_irq_mask = data & 1;
1099   m_vrtc_irq_mask = data & 2;
10471100
1048   if(state->m_timer_irq_mask == 0)
1049      state->m_timer_irq_latch = 0;
1101   if(m_timer_irq_mask == 0)
1102      m_timer_irq_latch = 0;
10501103
1051   if(state->m_vrtc_irq_mask == 0)
1052      state->m_vrtc_irq_latch = 0;
1104   if(m_vrtc_irq_mask == 0)
1105      m_vrtc_irq_latch = 0;
10531106
10541107   //if(data & 4)
10551108   //  printf("IRQ mask %02x\n",data);
10561109}
10571110#endif
10581111
1059static READ8_HANDLER( pc8801_window_bank_r )
1112READ8_MEMBER(pc8801_state::pc8801_window_bank_r)
10601113{
1061   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1062   return state->m_window_offset_bank;
1114   return m_window_offset_bank;
10631115}
10641116
1065static WRITE8_HANDLER( pc8801_window_bank_w )
1117WRITE8_MEMBER(pc8801_state::pc8801_window_bank_w)
10661118{
1067   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1068   state->m_window_offset_bank = data;
1119   m_window_offset_bank = data;
10691120}
10701121
1071static WRITE8_HANDLER( pc8801_window_bank_inc_w )
1122WRITE8_MEMBER(pc8801_state::pc8801_window_bank_inc_w)
10721123{
1073   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1074   state->m_window_offset_bank++;
1075   state->m_window_offset_bank&=0xff;
1124   m_window_offset_bank++;
1125   m_window_offset_bank&=0xff;
10761126}
10771127
1078static READ8_HANDLER( pc8801_misc_ctrl_r )
1128READ8_MEMBER(pc8801_state::pc8801_misc_ctrl_r)
10791129{
1080   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1081   return state->m_misc_ctrl;
1130   return m_misc_ctrl;
10821131}
10831132
1084static WRITE8_HANDLER( pc8801_misc_ctrl_w )
1133WRITE8_MEMBER(pc8801_state::pc8801_misc_ctrl_w)
10851134{
1086   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1087   state->m_misc_ctrl = data;
1135   m_misc_ctrl = data;
10881136
10891137   #ifdef USE_PROPER_I8214
1090   state->m_sound_irq_mask = ((data & 0x80) == 0);
1138   m_sound_irq_mask = ((data & 0x80) == 0);
10911139   #else
1092   state->m_sound_irq_mask = ((data & 0x80) == 0);
1140   m_sound_irq_mask = ((data & 0x80) == 0);
10931141
1094   if(state->m_sound_irq_mask == 0)
1095      state->m_sound_irq_latch = 0;
1142   if(m_sound_irq_mask == 0)
1143      m_sound_irq_latch = 0;
10961144   #endif
10971145}
10981146
1099static WRITE8_HANDLER( pc8801_bgpal_w )
1147WRITE8_MEMBER(pc8801_state::pc8801_bgpal_w)
11001148{
11011149   if(data)
11021150      printf("BG Pal %02x\n",data);
11031151}
11041152
1105static WRITE8_HANDLER( pc8801_palram_w )
1153WRITE8_MEMBER(pc8801_state::pc8801_palram_w)
11061154{
1107   pc8801_state *state = space->machine().driver_data<pc8801_state>();
11081155
1109   if(state->m_misc_ctrl & 0x20) //analog palette
1156   if(m_misc_ctrl & 0x20) //analog palette
11101157   {
11111158      if((data & 0x40) == 0)
11121159      {
1113         state->m_palram[offset].b = data & 0x7;
1114         state->m_palram[offset].r = (data & 0x38) >> 3;
1160         m_palram[offset].b = data & 0x7;
1161         m_palram[offset].r = (data & 0x38) >> 3;
11151162      }
11161163      else
11171164      {
1118         state->m_palram[offset].g = data & 0x7;
1165         m_palram[offset].g = data & 0x7;
11191166      }
11201167   }
11211168   else //digital palette
11221169   {
1123      state->m_palram[offset].b = data & 1 ? 7 : 0;
1124      state->m_palram[offset].r = data & 2 ? 7 : 0;
1125      state->m_palram[offset].g = data & 4 ? 7 : 0;
1170      m_palram[offset].b = data & 1 ? 7 : 0;
1171      m_palram[offset].r = data & 2 ? 7 : 0;
1172      m_palram[offset].g = data & 4 ? 7 : 0;
11261173   }
11271174
1128   palette_set_color_rgb(space->machine(), offset, pal3bit(state->m_palram[offset].r), pal3bit(state->m_palram[offset].g), pal3bit(state->m_palram[offset].b));
1175   palette_set_color_rgb(machine(), offset, pal3bit(m_palram[offset].r), pal3bit(m_palram[offset].g), pal3bit(m_palram[offset].b));
11291176}
11301177
1131static WRITE8_HANDLER( pc8801_layer_masking_w )
1178WRITE8_MEMBER(pc8801_state::pc8801_layer_masking_w)
11321179{
1133   pc8801_state *state = space->machine().driver_data<pc8801_state>();
11341180   /*
11351181    ---- x--- green gvram masked flag
11361182    ---- -x-- red gvram masked flag
r14844r14845
11381184    ---- ---x text vram masked
11391185    */
11401186
1141   state->m_layer_mask = data;
1187   m_layer_mask = data;
11421188}
11431189
1144static READ8_HANDLER( pc8801_crtc_param_r )
1190READ8_MEMBER(pc8801_state::pc8801_crtc_param_r)
11451191{
11461192   return 0xff;
11471193}
11481194
1149static WRITE8_HANDLER( pc88_crtc_param_w )
1195WRITE8_MEMBER(pc8801_state::pc88_crtc_param_w)
11501196{
1151   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1152   if(state->m_crtc.param_count < 5)
1197   if(m_crtc.param_count < 5)
11531198   {
1154      state->m_crtc.param[state->m_crtc.cmd][state->m_crtc.param_count] = data;
1155      state->m_crtc.param_count++;
1199      m_crtc.param[m_crtc.cmd][m_crtc.param_count] = data;
1200      m_crtc.param_count++;
11561201   }
11571202}
11581203
1159static READ8_HANDLER( pc8801_crtc_status_r )
1204READ8_MEMBER(pc8801_state::pc8801_crtc_status_r)
11601205{
1161   pc8801_state *state = space->machine().driver_data<pc8801_state>();
11621206   /*
11631207    ---x ---- video enable
11641208    ---- x--- DMA is running
r14844r14845
11671211    ---- ---x light pen input
11681212    */
11691213
1170   return state->m_crtc.status;
1214   return m_crtc.status;
11711215}
11721216
11731217static const char *const crtc_command[] =
r14844r14845
11821226   "Read Status"                  // 7
11831227};
11841228
1185static WRITE8_HANDLER( pc88_crtc_cmd_w )
1229WRITE8_MEMBER(pc8801_state::pc88_crtc_cmd_w)
11861230{
1187   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1188   state->m_crtc.cmd = (data & 0xe0) >> 5;
1189   state->m_crtc.param_count = 0;
1231   m_crtc.cmd = (data & 0xe0) >> 5;
1232   m_crtc.param_count = 0;
11901233
1191   switch(state->m_crtc.cmd)
1234   switch(m_crtc.cmd)
11921235   {
11931236      case 0:  // reset CRTC
1194         state->m_crtc.status &= (~0x16);
1237         m_crtc.status &= (~0x16);
11951238         break;
11961239      case 1:  // start display
1197         state->m_crtc.status |= 0x10;
1198         state->m_crtc.status &= (~0x08);
1240         m_crtc.status |= 0x10;
1241         m_crtc.status &= (~0x08);
11991242         if(data & 1)
12001243            printf("CRTC reverse display ON\n");
12011244         break;
12021245      case 2:  // set irq mask
1203         state->m_crtc.irq_mask = data & 3;
1246         m_crtc.irq_mask = data & 3;
12041247         break;
12051248      case 3:  // read light pen
1206         state->m_crtc.status &= (~0x01);
1249         m_crtc.status &= (~0x01);
12071250         break;
12081251      case 4:  // load cursor position ON/OFF
1209         state->m_crtc.cursor_on = data & 1;
1252         m_crtc.cursor_on = data & 1;
12101253         break;
12111254      case 5:  // reset IRQ
12121255      case 6:  // reset counters
1213         state->m_crtc.status &= (~0x06);
1256         m_crtc.status &= (~0x06);
12141257         break;
12151258   }
12161259
r14844r14845
12181261   //  printf("CRTC cmd %s polled\n",crtc_command[data >> 5]);
12191262}
12201263
1221static WRITE8_HANDLER( pc8801_dmac_w )
1264WRITE8_MEMBER(pc8801_state::pc8801_dmac_w)
12221265{
1223   pc8801_state *state = space->machine().driver_data<pc8801_state>();
12241266
12251267   if(offset & 1)
1226      state->m_dma_counter[offset >> 1] = (state->m_dmac_ff) ? (state->m_dma_counter[offset >> 1]&0xff)|(data<<8) : (state->m_dma_counter[offset >> 1]&0xff00)|(data&0xff);
1268      m_dma_counter[offset >> 1] = (m_dmac_ff) ? (m_dma_counter[offset >> 1]&0xff)|(data<<8) : (m_dma_counter[offset >> 1]&0xff00)|(data&0xff);
12271269   else
1228      state->m_dma_address[offset >> 1] = (state->m_dmac_ff) ? (state->m_dma_address[offset >> 1]&0xff)|(data<<8) : (state->m_dma_address[offset >> 1]&0xff00)|(data&0xff);
1270      m_dma_address[offset >> 1] = (m_dmac_ff) ? (m_dma_address[offset >> 1]&0xff)|(data<<8) : (m_dma_address[offset >> 1]&0xff00)|(data&0xff);
12291271
1230   state->m_dmac_ff ^= 1;
1272   m_dmac_ff ^= 1;
12311273}
12321274
1233static WRITE8_HANDLER( pc8801_dmac_mode_w )
1275WRITE8_MEMBER(pc8801_state::pc8801_dmac_mode_w)
12341276{
1235   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1236   state->m_dmac_mode = data;
1277   m_dmac_mode = data;
12371278}
12381279
1239static READ8_HANDLER( pc8801_extram_mode_r )
1280READ8_MEMBER(pc8801_state::pc8801_extram_mode_r)
12401281{
1241   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1242   return (state->m_extram_mode ^ 0x11) | 0xee;
1282   return (m_extram_mode ^ 0x11) | 0xee;
12431283}
12441284
1245static WRITE8_HANDLER( pc8801_extram_mode_w )
1285WRITE8_MEMBER(pc8801_state::pc8801_extram_mode_w)
12461286{
1247   pc8801_state *state = space->machine().driver_data<pc8801_state>();
12481287   /*
12491288    ---x ---- Write EXT RAM access at 0x0000 - 0x7fff
12501289    ---- ---x Read EXT RAM access at 0x0000 - 0x7fff
12511290    */
12521291
1253   state->m_extram_mode = data & 0x11;
1292   m_extram_mode = data & 0x11;
12541293}
12551294
1256static READ8_HANDLER( pc8801_extram_bank_r )
1295READ8_MEMBER(pc8801_state::pc8801_extram_bank_r)
12571296{
1258   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1259   return state->m_extram_bank;
1297   return m_extram_bank;
12601298}
12611299
1262static WRITE8_HANDLER( pc8801_extram_bank_w )
1300WRITE8_MEMBER(pc8801_state::pc8801_extram_bank_w)
12631301{
1264   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1265   state->m_extram_bank = data;
1302   m_extram_bank = data;
12661303}
12671304
1268static WRITE8_HANDLER( pc8801_alu_ctrl1_w )
1305WRITE8_MEMBER(pc8801_state::pc8801_alu_ctrl1_w)
12691306{
1270   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1271   state->m_alu_ctrl1 = data;
1307   m_alu_ctrl1 = data;
12721308}
12731309
1274static WRITE8_HANDLER( pc8801_alu_ctrl2_w )
1310WRITE8_MEMBER(pc8801_state::pc8801_alu_ctrl2_w)
12751311{
1276   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1277   state->m_alu_ctrl2 = data;
1312   m_alu_ctrl2 = data;
12781313}
12791314
1280static WRITE8_HANDLER( pc8801_pcg8100_w )
1315WRITE8_MEMBER(pc8801_state::pc8801_pcg8100_w)
12811316{
12821317   if(data)
12831318   printf("Write to PCG-8100 %02x %02x\n",offset,data);
12841319}
12851320
12861321/* Balance of Power temp work-around */
1287static READ8_HANDLER( sio_status_r )
1322READ8_MEMBER(pc8801_state::sio_status_r)
12881323{
12891324   return 0;
12901325}
12911326
1292static WRITE8_HANDLER( pc8801_txt_cmt_ctrl_w )
1327WRITE8_MEMBER(pc8801_state::pc8801_txt_cmt_ctrl_w)
12931328{
1294   pc8801_state *state = space->machine().driver_data<pc8801_state>();
12951329   /* bits 2 to 5 are cmt related */
12961330
1297   state->m_txt_width = data & 1;
1298   state->m_txt_color = data & 2;
1331   m_txt_width = data & 1;
1332   m_txt_color = data & 2;
12991333}
13001334
13011335
1302static READ8_HANDLER( pc8801_kanji_r )
1336READ8_MEMBER(pc8801_state::pc8801_kanji_r)
13031337{
1304   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1305   UINT8 *knj_rom = space->machine().region("kanji")->base();
1338   UINT8 *knj_rom = machine().region("kanji")->base();
13061339   if((offset & 2) == 0)
1307      return knj_rom[state->m_knj_addr[0]*2+((offset & 1) ^ 1)];
1340      return knj_rom[m_knj_addr[0]*2+((offset & 1) ^ 1)];
13081341
13091342   return 0xff;
13101343}
13111344
1312static WRITE8_HANDLER( pc8801_kanji_w )
1345WRITE8_MEMBER(pc8801_state::pc8801_kanji_w)
13131346{
1314   pc8801_state *state = space->machine().driver_data<pc8801_state>();
13151347   if((offset & 2) == 0)
1316      state->m_knj_addr[0] = ((offset & 1) == 0) ? ((state->m_knj_addr[0]&0xff00)|(data&0xff)) : ((state->m_knj_addr[0]&0x00ff)|(data<<8));
1348      m_knj_addr[0] = ((offset & 1) == 0) ? ((m_knj_addr[0]&0xff00)|(data&0xff)) : ((m_knj_addr[0]&0x00ff)|(data<<8));
13171349}
13181350
1319static READ8_HANDLER( pc8801_kanji_lv2_r )
1351READ8_MEMBER(pc8801_state::pc8801_kanji_lv2_r)
13201352{
1321   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1322   UINT8 *knj_rom = space->machine().region("kanji")->base() + 0x20000;
1353   UINT8 *knj_rom = machine().region("kanji")->base() + 0x20000;
13231354   if((offset & 2) == 0)
1324      return knj_rom[state->m_knj_addr[1]*2+((offset & 1) ^ 1)];
1355      return knj_rom[m_knj_addr[1]*2+((offset & 1) ^ 1)];
13251356
13261357   return 0xff;
13271358}
13281359
1329static WRITE8_HANDLER( pc8801_kanji_lv2_w )
1360WRITE8_MEMBER(pc8801_state::pc8801_kanji_lv2_w)
13301361{
1331   pc8801_state *state = space->machine().driver_data<pc8801_state>();
13321362   if((offset & 2) == 0)
1333      state->m_knj_addr[1] = ((offset & 1) == 0) ? ((state->m_knj_addr[1]&0xff00)|(data&0xff)) : ((state->m_knj_addr[1]&0x00ff)|(data<<8));
1363      m_knj_addr[1] = ((offset & 1) == 0) ? ((m_knj_addr[1]&0xff00)|(data&0xff)) : ((m_knj_addr[1]&0x00ff)|(data<<8));
13341364}
13351365
1336static WRITE8_HANDLER( pc8801_dic_bank_w )
1366WRITE8_MEMBER(pc8801_state::pc8801_dic_bank_w)
13371367{
1338   pc8801_state *state = space->machine().driver_data<pc8801_state>();
13391368   printf("JISHO BANK = %02x\n",data);
1340   if(state->m_has_dictionary)
1341      state->m_dic_bank = data  & 0x1f;
1369   if(m_has_dictionary)
1370      m_dic_bank = data  & 0x1f;
13421371}
13431372
1344static WRITE8_HANDLER( pc8801_dic_ctrl_w )
1373WRITE8_MEMBER(pc8801_state::pc8801_dic_ctrl_w)
13451374{
1346   pc8801_state *state = space->machine().driver_data<pc8801_state>();
13471375   printf("JISHO CTRL = %02x\n",data);
1348   if(state->m_has_dictionary)
1349      state->m_dic_ctrl = (data ^ 1) & 1;
1376   if(m_has_dictionary)
1377      m_dic_ctrl = (data ^ 1) & 1;
13501378}
13511379
1352static READ8_HANDLER( pc8801_cdrom_r )
1380READ8_MEMBER(pc8801_state::pc8801_cdrom_r)
13531381{
1354   //pc8801_state *state = space->machine().driver_data<pc8801_state>();
13551382   //printf("CD-ROM read [%02x]\n",offset);
13561383
1357   //if(state->m_has_cdrom)
1358   //  return state->m_cdrom_reg[offset];
1384   //if(m_has_cdrom)
1385   //  return m_cdrom_reg[offset];
13591386
13601387   return 0xff;
13611388}
13621389
1363static WRITE8_HANDLER( pc8801_cdrom_w )
1390WRITE8_MEMBER(pc8801_state::pc8801_cdrom_w)
13641391{
1365   pc8801_state *state = space->machine().driver_data<pc8801_state>();
13661392   /*
13671393    [9] ---x ---- CD-ROM BIOS bank
13681394        ---- ---x CD-ROM E-ROM bank (?)
13691395    */
13701396   //printf("CD-ROM write %02x -> [%02x]\n",data,offset);
13711397
1372   if(state->m_has_cdrom)
1373      state->m_cdrom_reg[offset] = data;
1398   if(m_has_cdrom)
1399      m_cdrom_reg[offset] = data;
13741400}
13751401
1376static READ8_HANDLER( pc8801_cpuclock_r )
1402READ8_MEMBER(pc8801_state::pc8801_cpuclock_r)
13771403{
1378   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1379   if(state->m_has_clock_speed)
1380      return 0x10 | state->m_clock_setting;
1404   if(m_has_clock_speed)
1405      return 0x10 | m_clock_setting;
13811406
13821407   return 0xff;
13831408}
13841409
1385static READ8_HANDLER( pc8801_baudrate_r )
1410READ8_MEMBER(pc8801_state::pc8801_baudrate_r)
13861411{
1387   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1388   if(state->m_has_clock_speed)
1389      return 0xf0 | state->m_baudrate_val;
1412   if(m_has_clock_speed)
1413      return 0xf0 | m_baudrate_val;
13901414
13911415   return 0xff;
13921416}
13931417
1394static WRITE8_HANDLER( pc8801_baudrate_w )
1418WRITE8_MEMBER(pc8801_state::pc8801_baudrate_w)
13951419{
1396   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1397   if(state->m_has_clock_speed)
1398      state->m_baudrate_val = data & 0xf;
1420   if(m_has_clock_speed)
1421      m_baudrate_val = data & 0xf;
13991422}
14001423
1401static WRITE8_HANDLER( pc8801_rtc_w )
1424WRITE8_MEMBER(pc8801_state::pc8801_rtc_w)
14021425{
1403   pc8801_state *state = space->machine().driver_data<pc8801_state>();
14041426
1405   state->m_rtc->c0_w((data & 1) >> 0);
1406   state->m_rtc->c1_w((data & 2) >> 1);
1407   state->m_rtc->c2_w((data & 4) >> 2);
1408   state->m_rtc->data_in_w((data & 8) >> 3);
1427   m_rtc->c0_w((data & 1) >> 0);
1428   m_rtc->c1_w((data & 2) >> 1);
1429   m_rtc->c2_w((data & 4) >> 2);
1430   m_rtc->data_in_w((data & 8) >> 3);
14091431
14101432   /* TODO: remaining bits */
14111433}
r14844r14845
14291451   AM_RANGE(0x0d, 0x0d) AM_READ_PORT("KEY13")
14301452   AM_RANGE(0x0e, 0x0e) AM_READ_PORT("KEY14")
14311453   AM_RANGE(0x0f, 0x0f) AM_READ_PORT("KEY15")
1432   AM_RANGE(0x00, 0x02) AM_WRITE_LEGACY(pc8801_pcg8100_w)
1433   AM_RANGE(0x10, 0x10) AM_WRITE_LEGACY(pc8801_rtc_w)
1434   AM_RANGE(0x21, 0x21) AM_READ_LEGACY(sio_status_r)                                /* RS-232C and cassette */
1435   AM_RANGE(0x30, 0x30) AM_READ_PORT("DSW1") AM_WRITE_LEGACY(pc8801_txt_cmt_ctrl_w)
1436   AM_RANGE(0x31, 0x31) AM_READ_PORT("DSW2") AM_WRITE_LEGACY(pc8801_gfx_ctrl_w)
1437   AM_RANGE(0x32, 0x32) AM_READWRITE_LEGACY(pc8801_misc_ctrl_r, pc8801_misc_ctrl_w)
1454   AM_RANGE(0x00, 0x02) AM_WRITE(pc8801_pcg8100_w)
1455   AM_RANGE(0x10, 0x10) AM_WRITE(pc8801_rtc_w)
1456   AM_RANGE(0x21, 0x21) AM_READ(sio_status_r)                                /* RS-232C and cassette */
1457   AM_RANGE(0x30, 0x30) AM_READ_PORT("DSW1") AM_WRITE(pc8801_txt_cmt_ctrl_w)
1458   AM_RANGE(0x31, 0x31) AM_READ_PORT("DSW2") AM_WRITE(pc8801_gfx_ctrl_w)
1459   AM_RANGE(0x32, 0x32) AM_READWRITE(pc8801_misc_ctrl_r, pc8801_misc_ctrl_w)
14381460   //0x33, 0x33 sets something kanji related
1439   AM_RANGE(0x34, 0x34) AM_WRITE_LEGACY(pc8801_alu_ctrl1_w)
1440   AM_RANGE(0x35, 0x35) AM_WRITE_LEGACY(pc8801_alu_ctrl2_w)
1441   AM_RANGE(0x40, 0x40) AM_READWRITE_LEGACY(pc8801_ctrl_r, pc8801_ctrl_w)
1461   AM_RANGE(0x34, 0x34) AM_WRITE(pc8801_alu_ctrl1_w)
1462   AM_RANGE(0x35, 0x35) AM_WRITE(pc8801_alu_ctrl2_w)
1463   AM_RANGE(0x40, 0x40) AM_READWRITE(pc8801_ctrl_r, pc8801_ctrl_w)
14421464   AM_RANGE(0x44, 0x45) AM_DEVREADWRITE_LEGACY("opn", ym2203_r,ym2203_w)
14431465//  AM_RANGE(0x46, 0x47) AM_NOP                                     /* OPNA extra port */
1444   AM_RANGE(0x50, 0x50) AM_READWRITE_LEGACY(pc8801_crtc_param_r, pc88_crtc_param_w)
1445   AM_RANGE(0x51, 0x51) AM_READWRITE_LEGACY(pc8801_crtc_status_r, pc88_crtc_cmd_w)
1446   AM_RANGE(0x52, 0x52) AM_WRITE_LEGACY(pc8801_bgpal_w)
1447   AM_RANGE(0x53, 0x53) AM_WRITE_LEGACY(pc8801_layer_masking_w)
1448   AM_RANGE(0x54, 0x5b) AM_WRITE_LEGACY(pc8801_palram_w)
1449   AM_RANGE(0x5c, 0x5c) AM_READ_LEGACY(pc8801_vram_select_r)
1450   AM_RANGE(0x5c, 0x5f) AM_WRITE_LEGACY(pc8801_vram_select_w)
1451   AM_RANGE(0x60, 0x67) AM_WRITE_LEGACY(pc8801_dmac_w)
1452   AM_RANGE(0x68, 0x68) AM_WRITE_LEGACY(pc8801_dmac_mode_w)
1453   AM_RANGE(0x6e, 0x6e) AM_READ_LEGACY(pc8801_cpuclock_r)
1454   AM_RANGE(0x6f, 0x6f) AM_READWRITE_LEGACY(pc8801_baudrate_r,pc8801_baudrate_w)
1455   AM_RANGE(0x70, 0x70) AM_READWRITE_LEGACY(pc8801_window_bank_r, pc8801_window_bank_w)
1456   AM_RANGE(0x71, 0x71) AM_READWRITE_LEGACY(pc8801_ext_rom_bank_r, pc8801_ext_rom_bank_w)
1457   AM_RANGE(0x78, 0x78) AM_WRITE_LEGACY(pc8801_window_bank_inc_w)
1458   AM_RANGE(0x90, 0x9f) AM_READWRITE_LEGACY(pc8801_cdrom_r,pc8801_cdrom_w)
1466   AM_RANGE(0x50, 0x50) AM_READWRITE(pc8801_crtc_param_r, pc88_crtc_param_w)
1467   AM_RANGE(0x51, 0x51) AM_READWRITE(pc8801_crtc_status_r, pc88_crtc_cmd_w)
1468   AM_RANGE(0x52, 0x52) AM_WRITE(pc8801_bgpal_w)
1469   AM_RANGE(0x53, 0x53) AM_WRITE(pc8801_layer_masking_w)
1470   AM_RANGE(0x54, 0x5b) AM_WRITE(pc8801_palram_w)
1471   AM_RANGE(0x5c, 0x5c) AM_READ(pc8801_vram_select_r)
1472   AM_RANGE(0x5c, 0x5f) AM_WRITE(pc8801_vram_select_w)
1473   AM_RANGE(0x60, 0x67) AM_WRITE(pc8801_dmac_w)
1474   AM_RANGE(0x68, 0x68) AM_WRITE(pc8801_dmac_mode_w)
1475   AM_RANGE(0x6e, 0x6e) AM_READ(pc8801_cpuclock_r)
1476   AM_RANGE(0x6f, 0x6f) AM_READWRITE(pc8801_baudrate_r,pc8801_baudrate_w)
1477   AM_RANGE(0x70, 0x70) AM_READWRITE(pc8801_window_bank_r, pc8801_window_bank_w)
1478   AM_RANGE(0x71, 0x71) AM_READWRITE(pc8801_ext_rom_bank_r, pc8801_ext_rom_bank_w)
1479   AM_RANGE(0x78, 0x78) AM_WRITE(pc8801_window_bank_inc_w)
1480   AM_RANGE(0x90, 0x9f) AM_READWRITE(pc8801_cdrom_r,pc8801_cdrom_w)
14591481//  AM_RANGE(0xa0, 0xa3) AM_NOP                                     /* music & network */
14601482//  AM_RANGE(0xa8, 0xad) AM_NOP                                     /* second sound board */
14611483//  AM_RANGE(0xb4, 0xb5) AM_NOP                                     /* Video art board */
r14844r14845
14641486//  AM_RANGE(0xd0, 0xd7) AM_NOP                                     /* music & GP-IB */
14651487//  AM_RANGE(0xd8, 0xd8) AM_NOP                                     /* GP-IB */
14661488//  AM_RANGE(0xdc, 0xdf) AM_NOP                                     /* MODEM */
1467   AM_RANGE(0xe2, 0xe2) AM_READWRITE_LEGACY(pc8801_extram_mode_r,pc8801_extram_mode_w)         /* expand RAM mode */
1468   AM_RANGE(0xe3, 0xe3) AM_READWRITE_LEGACY(pc8801_extram_bank_r,pc8801_extram_bank_w)         /* expand RAM bank */
1489   AM_RANGE(0xe2, 0xe2) AM_READWRITE(pc8801_extram_mode_r,pc8801_extram_mode_w)         /* expand RAM mode */
1490   AM_RANGE(0xe3, 0xe3) AM_READWRITE(pc8801_extram_bank_r,pc8801_extram_bank_w)         /* expand RAM bank */
14691491#ifdef USE_PROPER_I8214
1470   AM_RANGE(0xe4, 0xe4) AM_WRITE_LEGACY(i8214_irq_level_w)
1471   AM_RANGE(0xe6, 0xe6) AM_WRITE_LEGACY(i8214_irq_mask_w)
1492   AM_RANGE(0xe4, 0xe4) AM_WRITE(i8214_irq_level_w)
1493   AM_RANGE(0xe6, 0xe6) AM_WRITE(i8214_irq_mask_w)
14721494#else
1473   AM_RANGE(0xe4, 0xe4) AM_WRITE_LEGACY(pc8801_irq_level_w)
1474   AM_RANGE(0xe6, 0xe6) AM_WRITE_LEGACY(pc8801_irq_mask_w)
1495   AM_RANGE(0xe4, 0xe4) AM_WRITE(pc8801_irq_level_w)
1496   AM_RANGE(0xe6, 0xe6) AM_WRITE(pc8801_irq_mask_w)
14751497#endif
14761498//  AM_RANGE(0xe7, 0xe7) AM_NOP                                     /* Arcus writes here, almost likely to be a mirror of above */
1477   AM_RANGE(0xe8, 0xeb) AM_READWRITE_LEGACY(pc8801_kanji_r, pc8801_kanji_w)
1478   AM_RANGE(0xec, 0xef) AM_READWRITE_LEGACY(pc8801_kanji_lv2_r, pc8801_kanji_lv2_w)
1479   AM_RANGE(0xf0, 0xf0) AM_WRITE_LEGACY(pc8801_dic_bank_w)
1480   AM_RANGE(0xf1, 0xf1) AM_WRITE_LEGACY(pc8801_dic_ctrl_w)
1499   AM_RANGE(0xe8, 0xeb) AM_READWRITE(pc8801_kanji_r, pc8801_kanji_w)
1500   AM_RANGE(0xec, 0xef) AM_READWRITE(pc8801_kanji_lv2_r, pc8801_kanji_lv2_w)
1501   AM_RANGE(0xf0, 0xf0) AM_WRITE(pc8801_dic_bank_w)
1502   AM_RANGE(0xf1, 0xf1) AM_WRITE(pc8801_dic_ctrl_w)
14811503//  AM_RANGE(0xf3, 0xf3) AM_NOP                                     /* DMA floppy (unknown) */
14821504//  AM_RANGE(0xf4, 0xf7) AM_NOP                                     /* DMA 5'floppy (may be not released) */
14831505//  AM_RANGE(0xf8, 0xfb) AM_NOP                                     /* DMA 8'floppy (unknown) */
r14844r14845
15481570   upd765_tc_w(machine.device("upd765"), 0);
15491571}
15501572
1551static WRITE8_HANDLER( upd765_mc_w )
1573WRITE8_MEMBER(pc8801_state::upd765_mc_w)
15521574{
1553   floppy_mon_w(floppy_get_device(space->machine(), 0), (data & 1) ? CLEAR_LINE : ASSERT_LINE);
1554   floppy_mon_w(floppy_get_device(space->machine(), 1), (data & 2) ? CLEAR_LINE : ASSERT_LINE);
1555   floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0), (data & 1), 0);
1556   floppy_drive_set_ready_state(floppy_get_device(space->machine(), 1), (data & 2), 0);
1575   floppy_mon_w(floppy_get_device(machine(), 0), (data & 1) ? CLEAR_LINE : ASSERT_LINE);
1576   floppy_mon_w(floppy_get_device(machine(), 1), (data & 2) ? CLEAR_LINE : ASSERT_LINE);
1577   floppy_drive_set_ready_state(floppy_get_device(machine(), 0), (data & 1), 0);
1578   floppy_drive_set_ready_state(floppy_get_device(machine(), 1), (data & 2), 0);
15571579}
15581580
1559static READ8_HANDLER( upd765_tc_r )
1581READ8_MEMBER(pc8801_state::upd765_tc_r)
15601582{
1561   //pc88va_state *state = space->machine().driver_data<pc88va_state>();
15621583
1563   upd765_tc_w(space->machine().device("upd765"), 1);
1584   upd765_tc_w(machine().device("upd765"), 1);
15641585    //TODO: I'm not convinced that this works correctly with current hook-up ... 1000 usec is needed by Aploon, a bigger value breaks Alpha.
1565   space->machine().scheduler().timer_set(attotime::from_usec(750), FUNC(pc8801fd_upd765_tc_to_zero));
1586   machine().scheduler().timer_set(attotime::from_usec(750), FUNC(pc8801fd_upd765_tc_to_zero));
15661587   return 0xff; // value is meaningless
15671588}
15681589
1569static WRITE8_HANDLER( fdc_irq_vector_w )
1590WRITE8_MEMBER(pc8801_state::fdc_irq_vector_w)
15701591{
1571   pc8801_state *state = space->machine().driver_data<pc8801_state>();
1572   state->m_fdc_irq_opcode = data;
1592   m_fdc_irq_opcode = data;
15731593}
15741594
1575static WRITE8_HANDLER( fdc_drive_mode_w )
1595WRITE8_MEMBER(pc8801_state::fdc_drive_mode_w)
15761596{
15771597   if(data & 5)
15781598      printf("drive 0 sets up %s floppy format\n",data & 1 ? "2hd" : "2dd");
r14844r14845
15821602
15831603static ADDRESS_MAP_START( pc8801fdc_io, AS_IO, 8, pc8801_state )
15841604   ADDRESS_MAP_GLOBAL_MASK(0xff)
1585   AM_RANGE(0xf0, 0xf0) AM_WRITE_LEGACY(fdc_irq_vector_w) // Interrupt Opcode Port
1586   AM_RANGE(0xf4, 0xf4) AM_WRITE_LEGACY(fdc_drive_mode_w) // Drive mode, 2d, 2dd, 2hd
1605   AM_RANGE(0xf0, 0xf0) AM_WRITE(fdc_irq_vector_w) // Interrupt Opcode Port
1606   AM_RANGE(0xf4, 0xf4) AM_WRITE(fdc_drive_mode_w) // Drive mode, 2d, 2dd, 2hd
15871607//  AM_RANGE(0xf7, 0xf7) AM_WRITENOP // printer port output
1588   AM_RANGE(0xf8, 0xf8) AM_READWRITE_LEGACY(upd765_tc_r,upd765_mc_w) // (R) Terminal Count Port (W) Motor Control Port
1608   AM_RANGE(0xf8, 0xf8) AM_READWRITE(upd765_tc_r,upd765_mc_w) // (R) Terminal Count Port (W) Motor Control Port
15891609   AM_RANGE(0xfa, 0xfa) AM_DEVREAD_LEGACY("upd765", upd765_status_r )
15901610   AM_RANGE(0xfb, 0xfb) AM_DEVREADWRITE_LEGACY("upd765", upd765_data_r, upd765_data_w )
15911611   AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE("d8255_slave", i8255_device, read, write)
src/mess/drivers/socrates.c
r14844r14845
101101   UINT8 m_speech_dummy_read; // have we done a dummy read yet?
102102   UINT8 m_speech_load_address_count; // number of times load address has happened
103103   UINT8 m_speech_load_settings_count; // number of times load settings has happened
104   DECLARE_READ8_MEMBER(socrates_rom_bank_r);
105   DECLARE_WRITE8_MEMBER(socrates_rom_bank_w);
106   DECLARE_READ8_MEMBER(socrates_ram_bank_r);
107   DECLARE_WRITE8_MEMBER(socrates_ram_bank_w);
108   DECLARE_READ8_MEMBER(read_f3);
109   DECLARE_WRITE8_MEMBER(unknownlatch_30);
110   DECLARE_READ8_MEMBER(status_and_speech);
111   DECLARE_WRITE8_MEMBER(speech_command);
112   DECLARE_READ8_MEMBER(socrates_keyboard_low_r);
113   DECLARE_READ8_MEMBER(socrates_keyboard_high_r);
114   DECLARE_WRITE8_MEMBER(socrates_keyboard_clear);
115   DECLARE_WRITE8_MEMBER(reset_speech);
116   DECLARE_WRITE8_MEMBER(socrates_scroll_w);
117   DECLARE_WRITE8_MEMBER(socrates_sound_w);
104118};
105119
106120
r14844r14845
215229    machine.device("maincpu")->set_clock_scale(0.45f); /* RAM access waitstates etc. aren't emulated - slow the CPU to compensate */
216230}
217231
218static READ8_HANDLER( socrates_rom_bank_r )
232READ8_MEMBER(socrates_state::socrates_rom_bank_r)
219233{
220   socrates_state *state = space->machine().driver_data<socrates_state>();
221234 UINT8 data = 0xFF;
222 data = state->m_rom_bank;
235 data = m_rom_bank;
223236 return data;
224237}
225238
226static WRITE8_HANDLER( socrates_rom_bank_w )
239WRITE8_MEMBER(socrates_state::socrates_rom_bank_w)
227240{
228   socrates_state *state = space->machine().driver_data<socrates_state>();
229 state->m_rom_bank = data;
230 socrates_set_rom_bank(space->machine());
241 m_rom_bank = data;
242 socrates_set_rom_bank(machine());
231243}
232244
233static READ8_HANDLER( socrates_ram_bank_r )
245READ8_MEMBER(socrates_state::socrates_ram_bank_r)
234246{
235   socrates_state *state = space->machine().driver_data<socrates_state>();
236247 UINT8 data = 0xFF;
237 data = state->m_ram_bank;
248 data = m_ram_bank;
238249 return data;
239250}
240251
241static WRITE8_HANDLER( socrates_ram_bank_w )
252WRITE8_MEMBER(socrates_state::socrates_ram_bank_w)
242253{
243   socrates_state *state = space->machine().driver_data<socrates_state>();
244 state->m_ram_bank = data&0xF;
245 socrates_set_ram_bank(space->machine());
254 m_ram_bank = data&0xF;
255 socrates_set_ram_bank(machine());
246256}
247257
248static READ8_HANDLER( read_f3 ) // used for read-only i/o ports as mame/mess doesn't have a way to set the unmapped area to read as 0xF3
258READ8_MEMBER(socrates_state::read_f3)// used for read-only i/o ports as mame/mess doesn't have a way to set the unmapped area to read as 0xF3
249259{
250260 return 0xF3;
251261}
252262
253static WRITE8_HANDLER( unknownlatch_30 ) // writes to i/o 0x3x do SOMETHING, possibly waitstate related (may halt cpu until vblank start?) or involve status reg bit 6
263WRITE8_MEMBER(socrates_state::unknownlatch_30)// writes to i/o 0x3x do SOMETHING, possibly waitstate related (may halt cpu until vblank start?) or involve status reg bit 6
254264{
255265//logerror("write to i/o 0x30, data %x\n", data); // too annoying to leave enabled
256266}
257267
258static READ8_HANDLER( status_and_speech ) // read 0x4x, some sort of status reg
268READ8_MEMBER(socrates_state::status_and_speech)// read 0x4x, some sort of status reg
259269{
260   socrates_state *state = space->machine().driver_data<socrates_state>();
261270// bit 7 - speech status: high when speech is playing, low when it is not (or when speech cart is not present)
262271// bit 6 - unknown, usually set, may involve the writes to 0x30, possibly some sort of fixed-length timer?
263272// bit 5 - vblank status, high when not in vblank
r14844r14845
266275// bit 2 - speech chip bit 2
267276// bit 1 - speech chip bit 1
268277// bit 0 - speech chip bit 0
269UINT8 *speechromint = space->machine().region("speechint")->base();
270UINT8 *speechromext = space->machine().region("speechext")->base();
278UINT8 *speechromint = machine().region("speechint")->base();
279UINT8 *speechromext = machine().region("speechext")->base();
271280   int temp = 0;
272   temp |= (state->m_speech_running)?0x80:0;
281   temp |= (m_speech_running)?0x80:0;
273282   temp |= 0x40; // unknown
274   temp |= (state->m_vblankstate)?0:0x20;
275   temp |= (state->m_hblankstate)?0:0x10;
276   switch(state->m_io40_latch&0xF0) // what was last opcode sent?
283   temp |= (m_vblankstate)?0:0x20;
284   temp |= (m_hblankstate)?0:0x10;
285   switch(m_io40_latch&0xF0) // what was last opcode sent?
277286   {
278287      case 0x60: case 0xE0:// speech status 'read' register
279         if(state->m_speech_settings&0x04) // external speech roms (outside of speech ic but still in cart) enabled
288         if(m_speech_settings&0x04) // external speech roms (outside of speech ic but still in cart) enabled
280289         {
281         logerror("reading external speech rom nybble from nybble address %x (byte address %x)\n",state->m_speech_address, state->m_speech_address>>1);
282         temp |= ((speechromext[((state->m_speech_address>>1)&0xffff)]>>((state->m_speech_address&1)*4))&0xF);
290         logerror("reading external speech rom nybble from nybble address %x (byte address %x)\n",m_speech_address, m_speech_address>>1);
291         temp |= ((speechromext[((m_speech_address>>1)&0xffff)]>>((m_speech_address&1)*4))&0xF);
283292         }
284293         else
285294         {
286         logerror("reading internal speech rom nybble from nybble address %x (byte address %x)\n",state->m_speech_address, state->m_speech_address>>1);
287         temp |= ((speechromint[((state->m_speech_address>>1)&0x1fff)]>>((state->m_speech_address&1)*4))&0xF);
295         logerror("reading internal speech rom nybble from nybble address %x (byte address %x)\n",m_speech_address, m_speech_address>>1);
296         temp |= ((speechromint[((m_speech_address>>1)&0x1fff)]>>((m_speech_address&1)*4))&0xF);
288297         }
289         if (state->m_speech_dummy_read == 0) // if we havent done the dummy read yet, do so now
298         if (m_speech_dummy_read == 0) // if we havent done the dummy read yet, do so now
290299         {
291            state->m_speech_dummy_read++;
300            m_speech_dummy_read++;
292301         }
293302         else
294303         {
295            state->m_speech_address++;
304            m_speech_address++;
296305         }
297306         break;
298307      default:
299         temp |= state->m_io40_latch&0xF; // read open bus
308         temp |= m_io40_latch&0xF; // read open bus
300309         break;
301310   }
302311   logerror("read from i/o 0x4x of %x\n", temp);
r14844r14845
310319   state->m_speech_load_settings_count = 0;
311320}
312321
313static WRITE8_HANDLER( speech_command ) // write 0x4x, some sort of bitfield; speech chip is probably hitachi hd38880 related but not exact, w/4 bit interface
322WRITE8_MEMBER(socrates_state::speech_command)// write 0x4x, some sort of bitfield; speech chip is probably hitachi hd38880 related but not exact, w/4 bit interface
314323{
315   socrates_state *state = space->machine().driver_data<socrates_state>();
316324   logerror("write to i/o 0x4x of %x\n", data);
317325/*
318326// the high 4 bits of the write control which 'register' is written to, the low 4 bits are data (this is based on a readback test)
r14844r14845
370378         if (data==0x80)
371379         {
372380            /* write me: start talking */
373            state->m_speech_running = 1;
374            space->machine().scheduler().timer_set(attotime::from_seconds(4), FUNC(clear_speech_cb)); // hack
381            m_speech_running = 1;
382            machine().scheduler().timer_set(attotime::from_seconds(4), FUNC(clear_speech_cb)); // hack
375383         }
376384         break;
377385      case 0x90: // unknown, one of these is probably read and branch
r14844r14845
381389      case 0xB0: // unknown
382390         break;
383391      case 0xC0: // load address to vsm
384         state->m_speech_address |= (((int)data&0xF)<<(state->m_speech_load_address_count*4))<<1;
385         state->m_speech_load_address_count++;
386         logerror("loaded address nybble %X, byte address is currently %5X with %d nybbles loaded\n", data&0xF, state->m_speech_address>>1, state->m_speech_load_address_count);
392         m_speech_address |= (((int)data&0xF)<<(m_speech_load_address_count*4))<<1;
393         m_speech_load_address_count++;
394         logerror("loaded address nybble %X, byte address is currently %5X with %d nybbles loaded\n", data&0xF, m_speech_address>>1, m_speech_load_address_count);
387395         break;
388396      case 0xD0: // load settings
389         state->m_speech_settings |= ((data&0xF)<<(state->m_speech_load_settings_count*4));
390         state->m_speech_load_settings_count++;
397         m_speech_settings |= ((data&0xF)<<(m_speech_load_settings_count*4));
398         m_speech_load_settings_count++;
391399         break;
392400      case 0xE0: // read byte, handled elsewhere
393401         break;
394402      case 0xF0: // command: sub 0 is speak, sub 8 is reset
395403         if ((data&0xF) == 0) // speak
396404         {
397            state->m_speech_running = 1;
398            space->machine().scheduler().timer_set(attotime::from_seconds(4), FUNC(clear_speech_cb)); // hack
405            m_speech_running = 1;
406            machine().scheduler().timer_set(attotime::from_seconds(4), FUNC(clear_speech_cb)); // hack
399407         }
400408         else if ((data&0xF) == 8) // reset
401409         {
402            state->m_speech_running = 0;
403            state->m_speech_address = 0;
404            state->m_speech_settings = 0;
405            state->m_speech_dummy_read = 0;
406            state->m_speech_load_address_count = 0;
407            state->m_speech_load_settings_count = 0;
408            state->m_io40_latch &= 0x0f; // set last command to 0 to prevent problems
410            m_speech_running = 0;
411            m_speech_address = 0;
412            m_speech_settings = 0;
413            m_speech_dummy_read = 0;
414            m_speech_load_address_count = 0;
415            m_speech_load_settings_count = 0;
416            m_io40_latch &= 0x0f; // set last command to 0 to prevent problems
409417         }
410418         else // other
411419         {
r14844r14845
415423      default: // 00 through 70 are packets without the write bit set, ignore them
416424         break;
417425   }
418   state->m_io40_latch = data;
426   m_io40_latch = data;
419427}
420428
421static READ8_HANDLER( socrates_keyboard_low_r ) // keyboard code low
429READ8_MEMBER(socrates_state::socrates_keyboard_low_r)// keyboard code low
422430{
423   socrates_state *state = space->machine().driver_data<socrates_state>();
424 socrates_update_kb(space->machine());
425 socrates_check_kb_latch(space->machine());
426 return state->m_kb_latch_low[0];
431 socrates_update_kb(machine());
432 socrates_check_kb_latch(machine());
433 return m_kb_latch_low[0];
427434}
428435
429static READ8_HANDLER( socrates_keyboard_high_r ) // keyboard code high
436READ8_MEMBER(socrates_state::socrates_keyboard_high_r)// keyboard code high
430437{
431   socrates_state *state = space->machine().driver_data<socrates_state>();
432 socrates_update_kb(space->machine());
433 socrates_check_kb_latch(space->machine());
434 return state->m_kb_latch_high[0];
438 socrates_update_kb(machine());
439 socrates_check_kb_latch(machine());
440 return m_kb_latch_high[0];
435441}
436442
437static WRITE8_HANDLER( socrates_keyboard_clear ) // keyboard latch shift/clear
443WRITE8_MEMBER(socrates_state::socrates_keyboard_clear)// keyboard latch shift/clear
438444{
439   socrates_state *state = space->machine().driver_data<socrates_state>();
440   state->m_kb_latch_low[0] = state->m_kb_latch_low[1];
441   state->m_kb_latch_high[0] = state->m_kb_latch_high[1];
442   state->m_kb_latch_low[1] = 0;
443   state->m_kb_latch_high[1] = 1;
445   m_kb_latch_low[0] = m_kb_latch_low[1];
446   m_kb_latch_high[0] = m_kb_latch_high[1];
447   m_kb_latch_low[1] = 0;
448   m_kb_latch_high[1] = 1;
444449}
445450
446static WRITE8_HANDLER( reset_speech ) // i/o 60: reset speech synth
451WRITE8_MEMBER(socrates_state::reset_speech)// i/o 60: reset speech synth
447452{
448   socrates_state *state = space->machine().driver_data<socrates_state>();
449 state->m_speech_running = 0;
450 state->m_speech_address = 0;
451 state->m_speech_settings = 0;
452 state->m_speech_dummy_read = 0;
453 state->m_speech_load_address_count = 0;
454 state->m_speech_load_settings_count = 0;
455 state->m_io40_latch &= 0x0f; // set last command to 0 to prevent problems
453 m_speech_running = 0;
454 m_speech_address = 0;
455 m_speech_settings = 0;
456 m_speech_dummy_read = 0;
457 m_speech_load_address_count = 0;
458 m_speech_load_settings_count = 0;
459 m_io40_latch &= 0x0f; // set last command to 0 to prevent problems
456460logerror("write to i/o 0x60 of %x\n",data);
457461}
458462
459463/* stuff below belongs in video/nc.c */
460464
461static WRITE8_HANDLER( socrates_scroll_w )
465WRITE8_MEMBER(socrates_state::socrates_scroll_w)
462466{
463   socrates_state *state = space->machine().driver_data<socrates_state>();
464467 if (offset == 0)
465 state->m_scroll_offset = (state->m_scroll_offset&0x100) | data;
468 m_scroll_offset = (m_scroll_offset&0x100) | data;
466469 else
467 state->m_scroll_offset = (state->m_scroll_offset&0xFF) | ((data&1)<<8);
470 m_scroll_offset = (m_scroll_offset&0xFF) | ((data&1)<<8);
468471}
469472
470473/* NTSC-based Palette stuff */
r14844r14845
628631
629632/* below belongs in sound/nc.c */
630633
631static WRITE8_HANDLER(socrates_sound_w)
634WRITE8_MEMBER(socrates_state::socrates_sound_w)
632635{
633   device_t *socr_snd = space->machine().device("soc_snd");
636   device_t *socr_snd = machine().device("soc_snd");
634637   switch(offset)
635638   {
636639      case 0:
r14844r14845
666669static ADDRESS_MAP_START(z80_io, AS_IO, 8, socrates_state )
667670   ADDRESS_MAP_UNMAP_HIGH
668671   ADDRESS_MAP_GLOBAL_MASK(0xff)
669   AM_RANGE(0x00, 0x00) AM_READWRITE_LEGACY(socrates_rom_bank_r, socrates_rom_bank_w) AM_MIRROR(0x7) /* rom bank select - RW - 8 bits */
670   AM_RANGE(0x08, 0x08) AM_READWRITE_LEGACY(socrates_ram_bank_r, socrates_ram_bank_w) AM_MIRROR(0x7) /* ram banks select - RW - 4 low bits; Format: 0b****HHLL where LL controls whether window 0 points at ram area: 0b00: 0x0000-0x3fff; 0b01: 0x4000-0x7fff; 0b10: 0x8000-0xbfff; 0b11: 0xc000-0xffff. HH controls the same thing for window 1 */
671   AM_RANGE(0x10, 0x17) AM_READWRITE_LEGACY(read_f3, socrates_sound_w) AM_MIRROR (0x8) /* sound section:
672   AM_RANGE(0x00, 0x00) AM_READWRITE(socrates_rom_bank_r, socrates_rom_bank_w) AM_MIRROR(0x7) /* rom bank select - RW - 8 bits */
673   AM_RANGE(0x08, 0x08) AM_READWRITE(socrates_ram_bank_r, socrates_ram_bank_w) AM_MIRROR(0x7) /* ram banks select - RW - 4 low bits; Format: 0b****HHLL where LL controls whether window 0 points at ram area: 0b00: 0x0000-0x3fff; 0b01: 0x4000-0x7fff; 0b10: 0x8000-0xbfff; 0b11: 0xc000-0xffff. HH controls the same thing for window 1 */
674   AM_RANGE(0x10, 0x17) AM_READWRITE(read_f3, socrates_sound_w) AM_MIRROR (0x8) /* sound section:
672675        0x10 - W - frequency control for channel 1 (louder channel) - 01=high pitch, ff=low; time between 1->0/0->1 transitions = (XTAL_21_4772MHz/(512+256) / (freq_reg+1)) (note that this is double the actual frequency since each full low and high squarewave pulse is two transitions)
673676    0x11 - W - frequency control for channel 2 (softer channel) - 01=high pitch, ff=low; same equation as above
674677    0x12 - W - 0b***EVVVV enable, volume control for channel 1
r14844r14845
680683    0xC0 produces a DMC wave read from an unknown address at around 342hz
681684    0x
682685    */
683   AM_RANGE(0x20, 0x21) AM_READWRITE_LEGACY(read_f3, socrates_scroll_w) AM_MIRROR (0xe) /* graphics section:
686   AM_RANGE(0x20, 0x21) AM_READWRITE(read_f3, socrates_scroll_w) AM_MIRROR (0xe) /* graphics section:
684687    0x20 - W - lsb offset of screen display
685688    0x21 - W - msb offset of screen display
686689    resulting screen line is one of 512 total offsets on 128-byte boundaries in the whole 64k ram
687690    */
688   AM_RANGE(0x30, 0x30) AM_READWRITE_LEGACY(read_f3, unknownlatch_30) AM_MIRROR (0xf) /* unknown, write only. may relate to waitstate timing? */
689   AM_RANGE(0x40, 0x40) AM_READWRITE_LEGACY(status_and_speech, speech_command ) AM_MIRROR(0xf) /* reads status register for vblank/hblank/speech, also reads and writes speech module */
690   AM_RANGE(0x50, 0x50) AM_READWRITE_LEGACY(socrates_keyboard_low_r, socrates_keyboard_clear) AM_MIRROR(0xE) /* Keyboard keycode low, latched on keypress, can be unlatched by writing anything here */
691   AM_RANGE(0x51, 0x51) AM_READWRITE_LEGACY(socrates_keyboard_high_r, socrates_keyboard_clear) AM_MIRROR(0xE) /* Keyboard keycode high, latched as above, unlatches same as above */
692   AM_RANGE(0x60, 0x60) AM_READWRITE_LEGACY(read_f3, reset_speech) AM_MIRROR(0xF) /* reset the speech module, or perhaps fire an NMI?  */
693   AM_RANGE(0x70, 0xFF) AM_READ_LEGACY(read_f3) // nothing mapped here afaik
691   AM_RANGE(0x30, 0x30) AM_READWRITE(read_f3, unknownlatch_30) AM_MIRROR (0xf) /* unknown, write only. may relate to waitstate timing? */
692   AM_RANGE(0x40, 0x40) AM_READWRITE(status_and_speech, speech_command ) AM_MIRROR(0xf) /* reads status register for vblank/hblank/speech, also reads and writes speech module */
693   AM_RANGE(0x50, 0x50) AM_READWRITE(socrates_keyboard_low_r, socrates_keyboard_clear) AM_MIRROR(0xE) /* Keyboard keycode low, latched on keypress, can be unlatched by writing anything here */
694   AM_RANGE(0x51, 0x51) AM_READWRITE(socrates_keyboard_high_r, socrates_keyboard_clear) AM_MIRROR(0xE) /* Keyboard keycode high, latched as above, unlatches same as above */
695   AM_RANGE(0x60, 0x60) AM_READWRITE(read_f3, reset_speech) AM_MIRROR(0xF) /* reset the speech module, or perhaps fire an NMI?  */
696   AM_RANGE(0x70, 0xFF) AM_READ(read_f3) // nothing mapped here afaik
694697ADDRESS_MAP_END
695698
696699
src/mess/drivers/jr200.c
r14844r14845
3333   UINT8 m_old_keydata;
3434   UINT8 m_freq_reg[2];
3535   emu_timer *m_timer_d;
36   DECLARE_READ8_MEMBER(jr200_pcg_1_r);
37   DECLARE_READ8_MEMBER(jr200_pcg_2_r);
38   DECLARE_WRITE8_MEMBER(jr200_pcg_1_w);
39   DECLARE_WRITE8_MEMBER(jr200_pcg_2_w);
40   DECLARE_READ8_MEMBER(jr200_bios_char_r);
41   DECLARE_WRITE8_MEMBER(jr200_bios_char_w);
42   DECLARE_READ8_MEMBER(mcu_keyb_r);
43   DECLARE_WRITE8_MEMBER(jr200_beep_w);
44   DECLARE_WRITE8_MEMBER(jr200_beep_freq_w);
45   DECLARE_WRITE8_MEMBER(jr200_border_col_w);
46   DECLARE_READ8_MEMBER(mn1271_io_r);
47   DECLARE_WRITE8_MEMBER(mn1271_io_w);
3648};
3749
3850
r14844r14845
153165   return 0;
154166}
155167
156static READ8_HANDLER( jr200_pcg_1_r )
168READ8_MEMBER(jr200_state::jr200_pcg_1_r)
157169{
158   UINT8 *pcg = space->machine().region("pcg")->base();
170   UINT8 *pcg = machine().region("pcg")->base();
159171
160172   return pcg[offset+0x000];
161173}
162174
163static READ8_HANDLER( jr200_pcg_2_r )
175READ8_MEMBER(jr200_state::jr200_pcg_2_r)
164176{
165   UINT8 *pcg = space->machine().region("pcg")->base();
177   UINT8 *pcg = machine().region("pcg")->base();
166178
167179   return pcg[offset+0x400];
168180}
169181
170static WRITE8_HANDLER( jr200_pcg_1_w )
182WRITE8_MEMBER(jr200_state::jr200_pcg_1_w)
171183{
172   UINT8 *pcg = space->machine().region("pcg")->base();
184   UINT8 *pcg = machine().region("pcg")->base();
173185
174186   pcg[offset+0x000] = data;
175   gfx_element_mark_dirty(space->machine().gfx[1], (offset+0x000) >> 3);
187   gfx_element_mark_dirty(machine().gfx[1], (offset+0x000) >> 3);
176188}
177189
178static WRITE8_HANDLER( jr200_pcg_2_w )
190WRITE8_MEMBER(jr200_state::jr200_pcg_2_w)
179191{
180   UINT8 *pcg = space->machine().region("pcg")->base();
192   UINT8 *pcg = machine().region("pcg")->base();
181193
182194   pcg[offset+0x400] = data;
183   gfx_element_mark_dirty(space->machine().gfx[1], (offset+0x400) >> 3);
195   gfx_element_mark_dirty(machine().gfx[1], (offset+0x400) >> 3);
184196}
185197
186static READ8_HANDLER( jr200_bios_char_r )
198READ8_MEMBER(jr200_state::jr200_bios_char_r)
187199{
188   UINT8 *gfx = space->machine().region("gfx_ram")->base();
200   UINT8 *gfx = machine().region("gfx_ram")->base();
189201
190202   return gfx[offset];
191203}
192204
193205
194static WRITE8_HANDLER( jr200_bios_char_w )
206WRITE8_MEMBER(jr200_state::jr200_bios_char_w)
195207{
196//  UINT8 *gfx = space->machine().region("gfx_ram")->base();
208//  UINT8 *gfx = machine().region("gfx_ram")->base();
197209
198210   /* TODO: writing is presumably controlled by an I/O bit */
199211//  gfx[offset] = data;
200//  gfx_element_mark_dirty(space->machine().gfx[0], offset >> 3);
212//  gfx_element_mark_dirty(machine().gfx[0], offset >> 3);
201213}
202214
203215/*
r14844r14845
206218
207219*/
208220
209static READ8_HANDLER( mcu_keyb_r )
221READ8_MEMBER(jr200_state::mcu_keyb_r)
210222{
211   jr200_state *state = space->machine().driver_data<jr200_state>();
212223   int row, col, table = 0;
213224   UINT8 keydata = 0;
214225   static const char *const keynames[] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7", "ROW8" };
215226
216   if (input_port_read(space->machine(), "ROW9") & 0x07)
227   if (input_port_read(machine(), "ROW9") & 0x07)
217228   {
218229      /* shift, upper case */
219230      table = 1;
r14844r14845
222233   /* scan keyboard */
223234   for (row = 0; row < 9; row++)
224235   {
225      UINT8 data = input_port_read(space->machine(), keynames[row]);
236      UINT8 data = input_port_read(machine(), keynames[row]);
226237
227238      for (col = 0; col < 8; col++)
228239      {
r14844r14845
234245      }
235246   }
236247
237   if(state->m_old_keydata == keydata)
248   if(m_old_keydata == keydata)
238249      return 0x00;
239250
240   state->m_old_keydata = keydata;
251   m_old_keydata = keydata;
241252
242253   return keydata;
243254}
244255
245static WRITE8_HANDLER( jr200_beep_w )
256WRITE8_MEMBER(jr200_state::jr200_beep_w)
246257{
247258   /* writing 0x0e enables the beeper, writing anything else disables it */
248   beep_set_state(space->machine().device(BEEPER_TAG),((data & 0xf) == 0x0e) ? 1 : 0);
259   beep_set_state(machine().device(BEEPER_TAG),((data & 0xf) == 0x0e) ? 1 : 0);
249260}
250261
251static WRITE8_HANDLER( jr200_beep_freq_w )
262WRITE8_MEMBER(jr200_state::jr200_beep_freq_w)
252263{
253   jr200_state *state = space->machine().driver_data<jr200_state>();
254264   UINT32 beep_freq;
255265
256   state->m_freq_reg[offset] = data;
266   m_freq_reg[offset] = data;
257267
258   beep_freq = ((state->m_freq_reg[0]<<8) | (state->m_freq_reg[1] & 0xff)) + 1;
268   beep_freq = ((m_freq_reg[0]<<8) | (m_freq_reg[1] & 0xff)) + 1;
259269
260   beep_set_frequency(space->machine().device(BEEPER_TAG),84000 / beep_freq);
270   beep_set_frequency(machine().device(BEEPER_TAG),84000 / beep_freq);
261271}
262272
263static WRITE8_HANDLER( jr200_border_col_w )
273WRITE8_MEMBER(jr200_state::jr200_border_col_w)
264274{
265   jr200_state *state = space->machine().driver_data<jr200_state>();
266   state->m_border_col = data;
275   m_border_col = data;
267276}
268277
269278
r14844r14845
272281   device_set_input_line(machine.firstcpu, 0, HOLD_LINE);
273282}
274283
275static READ8_HANDLER( mn1271_io_r )
284READ8_MEMBER(jr200_state::mn1271_io_r)
276285{
277   jr200_state *state = space->machine().driver_data<jr200_state>();
278   UINT8 retVal = state->m_mn1271_ram[offset];
286   UINT8 retVal = m_mn1271_ram[offset];
279287   if((offset+0xc800) > 0xca00)
280288      retVal= 0xff;
281289
282290   switch(offset+0xc800)
283291   {
284292      case 0xc801: retVal= mcu_keyb_r(space,0); break;
285      case 0xc803: retVal= (state->m_mn1271_ram[0x03] & 0xcf) | 0x30;  break;//---x ---- printer status ready (ACTIVE HIGH)
286      case 0xc807: retVal= (state->m_mn1271_ram[0x07] & 0x80) | 0x60; break;
287      case 0xc80a: retVal= (state->m_mn1271_ram[0x0a] & 0xfe); break;
288      case 0xc80c: retVal= (state->m_mn1271_ram[0x0c] & 0xdf) | 0x20; break;
293      case 0xc803: retVal= (m_mn1271_ram[0x03] & 0xcf) | 0x30;  break;//---x ---- printer status ready (ACTIVE HIGH)
294      case 0xc807: retVal= (m_mn1271_ram[0x07] & 0x80) | 0x60; break;
295      case 0xc80a: retVal= (m_mn1271_ram[0x0a] & 0xfe); break;
296      case 0xc80c: retVal= (m_mn1271_ram[0x0c] & 0xdf) | 0x20; break;
289297      case 0xc80e: retVal= 0; break;
290298      case 0xc810: retVal= 0; break;
291299      case 0xc816: retVal= 0x4e; break;
292      case 0xc81c: retVal= (state->m_mn1271_ram[0x1c] & 0xfe) | 1;  break;//bit 0 needs to be high otherwise system refuses to boot
293      case 0xc81d: retVal= (state->m_mn1271_ram[0x1d] & 0xed); break;
300      case 0xc81c: retVal= (m_mn1271_ram[0x1c] & 0xfe) | 1;  break;//bit 0 needs to be high otherwise system refuses to boot
301      case 0xc81d: retVal= (m_mn1271_ram[0x1d] & 0xed); break;
294302   }
295303   //logerror("mn1271_io_r [%04x] = %02x\n",offset+0xc800,retVal);
296304   return retVal;
297305}
298306
299static WRITE8_HANDLER( mn1271_io_w )
307WRITE8_MEMBER(jr200_state::mn1271_io_w)
300308{
301   jr200_state *state = space->machine().driver_data<jr200_state>();
302   state->m_mn1271_ram[offset] = data;
309   m_mn1271_ram[offset] = data;
303310   switch(offset+0xc800)
304311   {
305312      case 0xc805: break; //LPT printer port W
306313      case 0xc816: if (data!=0) {
307               state->m_timer_d->adjust(attotime::zero, 0, attotime::from_hz(XTAL_14_31818MHz) * (state->m_mn1271_ram[0x17]*0x100 + state->m_mn1271_ram[0x18]));
314               m_timer_d->adjust(attotime::zero, 0, attotime::from_hz(XTAL_14_31818MHz) * (m_mn1271_ram[0x17]*0x100 + m_mn1271_ram[0x18]));
308315            } else {
309               state->m_timer_d->adjust(attotime::zero, 0,  attotime::zero);
316               m_timer_d->adjust(attotime::zero, 0,  attotime::zero);
310317            }
311318            break;
312319      case 0xc819: jr200_beep_w(space,0,data); break;
r14844r14845
327334
328335   AM_RANGE(0xa000, 0xbfff) AM_ROM
329336
330   AM_RANGE(0xc000, 0xc0ff) AM_READWRITE_LEGACY(jr200_pcg_1_r,jr200_pcg_1_w) //PCG area (1)
337   AM_RANGE(0xc000, 0xc0ff) AM_READWRITE(jr200_pcg_1_r,jr200_pcg_1_w) //PCG area (1)
331338   AM_RANGE(0xc100, 0xc3ff) AM_RAM AM_BASE(m_vram)
332   AM_RANGE(0xc400, 0xc4ff) AM_READWRITE_LEGACY(jr200_pcg_2_r,jr200_pcg_2_w) //PCG area (2)
339   AM_RANGE(0xc400, 0xc4ff) AM_READWRITE(jr200_pcg_2_r,jr200_pcg_2_w) //PCG area (2)
333340   AM_RANGE(0xc500, 0xc7ff) AM_RAM AM_BASE(m_cram)
334341
335342//  0xc800 - 0xcfff I / O area
336   AM_RANGE(0xc800, 0xcfff) AM_READWRITE_LEGACY(mn1271_io_r,mn1271_io_w) AM_BASE(m_mn1271_ram)
343   AM_RANGE(0xc800, 0xcfff) AM_READWRITE(mn1271_io_r,mn1271_io_w) AM_BASE(m_mn1271_ram)
337344
338   AM_RANGE(0xd000, 0xd7ff) AM_READWRITE_LEGACY(jr200_bios_char_r,jr200_bios_char_w) //BIOS PCG RAM area
345   AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(jr200_bios_char_r,jr200_bios_char_w) //BIOS PCG RAM area
339346   AM_RANGE(0xd800, 0xdfff) AM_ROM // cart space (header 0x7e)
340347   AM_RANGE(0xe000, 0xffff) AM_ROM
341348ADDRESS_MAP_END
src/mess/drivers/pyl601.c
r14844r14845
2828   UINT8 m_video_mode;
2929   UINT8 m_tick50_mark;
3030   UINT8 m_floppy_ctrl;
31   DECLARE_READ8_MEMBER(rom_page_r);
32   DECLARE_WRITE8_MEMBER(rom_page_w);
33   DECLARE_WRITE8_MEMBER(vdisk_page_w);
34   DECLARE_WRITE8_MEMBER(vdisk_h_w);
35   DECLARE_WRITE8_MEMBER(vdisk_l_w);
36   DECLARE_WRITE8_MEMBER(vdisk_data_w);
37   DECLARE_READ8_MEMBER(vdisk_data_r);
38   DECLARE_READ8_MEMBER(keyboard_r);
39   DECLARE_READ8_MEMBER(keycheck_r);
40   DECLARE_WRITE8_MEMBER(video_mode_w);
41   DECLARE_READ8_MEMBER(video_mode_r);
42   DECLARE_READ8_MEMBER(timer_r);
43   DECLARE_WRITE8_MEMBER(speaker_w);
44   DECLARE_WRITE8_MEMBER(led_w);
45   DECLARE_WRITE8_MEMBER(floppy_w);
46   DECLARE_READ8_MEMBER(floppy_r);
3147};
3248
3349
3450
35static READ8_HANDLER (rom_page_r)
51READ8_MEMBER(pyl601_state::rom_page_r)
3652{
37   pyl601_state *state = space->machine().driver_data<pyl601_state>();
38   return state->m_rom_page;
53   return m_rom_page;
3954}
4055
41static WRITE8_HANDLER (rom_page_w)
56WRITE8_MEMBER(pyl601_state::rom_page_w)
4257{
43   pyl601_state *state = space->machine().driver_data<pyl601_state>();
44   state->m_rom_page =data;
58   m_rom_page =data;
4559   if (data & 8)
4660   {
4761      int chip = (data >> 4) % 5;
4862      int page = data & 7;
49      memory_set_bankptr(space->machine(), "bank2", space->machine().region("romdisk")->base() + chip*0x10000 + page * 0x2000);
63      memory_set_bankptr(machine(), "bank2", machine().region("romdisk")->base() + chip*0x10000 + page * 0x2000);
5064   }
5165   else
5266   {
53      memory_set_bankptr(space->machine(), "bank2", space->machine().device<ram_device>(RAM_TAG)->pointer() + 0xc000);
67      memory_set_bankptr(machine(), "bank2", machine().device<ram_device>(RAM_TAG)->pointer() + 0xc000);
5468   }
5569}
5670
5771
58static WRITE8_HANDLER (vdisk_page_w)
72WRITE8_MEMBER(pyl601_state::vdisk_page_w)
5973{
60   pyl601_state *state = space->machine().driver_data<pyl601_state>();
61   state->m_vdisk_addr = (state->m_vdisk_addr & 0x0ffff) | ((data & 0x0f)<<16);
74   m_vdisk_addr = (m_vdisk_addr & 0x0ffff) | ((data & 0x0f)<<16);
6275}
6376
64static WRITE8_HANDLER (vdisk_h_w)
77WRITE8_MEMBER(pyl601_state::vdisk_h_w)
6578{
66   pyl601_state *state = space->machine().driver_data<pyl601_state>();
67   state->m_vdisk_addr = (state->m_vdisk_addr & 0xf00ff) | (data<<8);
79   m_vdisk_addr = (m_vdisk_addr & 0xf00ff) | (data<<8);
6880}
6981
70static WRITE8_HANDLER (vdisk_l_w)
82WRITE8_MEMBER(pyl601_state::vdisk_l_w)
7183{
72   pyl601_state *state = space->machine().driver_data<pyl601_state>();
73   state->m_vdisk_addr = (state->m_vdisk_addr & 0xfff00) | data;
84   m_vdisk_addr = (m_vdisk_addr & 0xfff00) | data;
7485}
7586
76static WRITE8_HANDLER (vdisk_data_w)
87WRITE8_MEMBER(pyl601_state::vdisk_data_w)
7788{
78   pyl601_state *state = space->machine().driver_data<pyl601_state>();
79   space->machine().device<ram_device>(RAM_TAG)->pointer()[0x10000 + (state->m_vdisk_addr & 0x7ffff)] = data;
80   state->m_vdisk_addr++;
81   state->m_vdisk_addr&=0x7ffff;
89   machine().device<ram_device>(RAM_TAG)->pointer()[0x10000 + (m_vdisk_addr & 0x7ffff)] = data;
90   m_vdisk_addr++;
91   m_vdisk_addr&=0x7ffff;
8292}
8393
84static READ8_HANDLER (vdisk_data_r)
94READ8_MEMBER(pyl601_state::vdisk_data_r)
8595{
86   pyl601_state *state = space->machine().driver_data<pyl601_state>();
87   UINT8 retVal = space->machine().device<ram_device>(RAM_TAG)->pointer()[0x10000 + (state->m_vdisk_addr & 0x7ffff)];
88   state->m_vdisk_addr++;
89   state->m_vdisk_addr &= 0x7ffff;
96   UINT8 retVal = machine().device<ram_device>(RAM_TAG)->pointer()[0x10000 + (m_vdisk_addr & 0x7ffff)];
97   m_vdisk_addr++;
98   m_vdisk_addr &= 0x7ffff;
9099   return retVal;
91100}
92101
r14844r14845
103112   return 0;
104113}
105114
106static READ8_HANDLER ( keyboard_r )
115READ8_MEMBER(pyl601_state::keyboard_r)
107116{
108   pyl601_state *state = space->machine().driver_data<pyl601_state>();
109   return state->m_key_code;
117   return m_key_code;
110118}
111119
112static READ8_HANDLER ( keycheck_r )
120READ8_MEMBER(pyl601_state::keycheck_r)
113121{
114   pyl601_state *state = space->machine().driver_data<pyl601_state>();
115122   UINT8 retVal = 0x3f;
116   UINT8 *keyboard = space->machine().region("keyboard")->base();
117   UINT16 row1 = input_port_read(space->machine(), "ROW1");
118   UINT16 row2 = input_port_read(space->machine(), "ROW2");
119   UINT16 row3 = input_port_read(space->machine(), "ROW3");
120   UINT16 row4 = input_port_read(space->machine(), "ROW4");
121   UINT16 row5 = input_port_read(space->machine(), "ROW5");
123   UINT8 *keyboard = machine().region("keyboard")->base();
124   UINT16 row1 = input_port_read(machine(), "ROW1");
125   UINT16 row2 = input_port_read(machine(), "ROW2");
126   UINT16 row3 = input_port_read(machine(), "ROW3");
127   UINT16 row4 = input_port_read(machine(), "ROW4");
128   UINT16 row5 = input_port_read(machine(), "ROW5");
122129   UINT16 all = row1 | row2 | row3 | row4 | row5;
123   UINT16 addr = (input_port_read(space->machine(), "SHIFT") & 1) | (input_port_read(space->machine(), "CTRL") & 1) << 1;
130   UINT16 addr = (input_port_read(machine(), "SHIFT") & 1) | (input_port_read(machine(), "CTRL") & 1) << 1;
124131   if (all != 0xff)
125132   {
126133      addr |= selectedline(all) << 2;
r14844r14845
131138      addr |=  ((row2 == 0x00) ? 1 : 0) << 9;
132139      addr |=  ((row1 == 0x00) ? 1 : 0) << 10;
133140
134      state->m_key_code = keyboard[addr];
135      state->m_keyboard_clk = ~state->m_keyboard_clk;
141      m_key_code = keyboard[addr];
142      m_keyboard_clk = ~m_keyboard_clk;
136143
137      if (state->m_keyboard_clk)
144      if (m_keyboard_clk)
138145         retVal |= 0x80;
139146   }
140147   return retVal;
141148}
142149
143150
144static WRITE8_HANDLER (video_mode_w)
151WRITE8_MEMBER(pyl601_state::video_mode_w)
145152{
146   pyl601_state *state = space->machine().driver_data<pyl601_state>();
147   state->m_video_mode = data;
153   m_video_mode = data;
148154}
149static READ8_HANDLER (video_mode_r)
155READ8_MEMBER(pyl601_state::video_mode_r)
150156{
151   pyl601_state *state = space->machine().driver_data<pyl601_state>();
152   return state->m_video_mode;
157   return m_video_mode;
153158}
154159
155static READ8_HANDLER (timer_r)
160READ8_MEMBER(pyl601_state::timer_r)
156161{
157   pyl601_state *state = space->machine().driver_data<pyl601_state>();
158   UINT8 retVal= state->m_tick50_mark | 0x37;
159   state->m_tick50_mark = 0;
162   UINT8 retVal= m_tick50_mark | 0x37;
163   m_tick50_mark = 0;
160164   return retVal;
161165}
162166
163static WRITE8_HANDLER (speaker_w)
167WRITE8_MEMBER(pyl601_state::speaker_w)
164168{
165169}
166170
167static WRITE8_HANDLER (led_w)
171WRITE8_MEMBER(pyl601_state::led_w)
168172{
169173//  UINT8 caps_led = BIT(data,4);
170174}
r14844r14845
178182{
179183   return get_floppy_image(device->machine(), (floppy_index & 1)^1);
180184}
181static WRITE8_HANDLER( floppy_w )
185WRITE8_MEMBER(pyl601_state::floppy_w)
182186{
183   pyl601_state *state = space->machine().driver_data<pyl601_state>();
184187   // bit 0 is reset (if zero)
185188   // bit 1 is TC state
186189   // bit 2 is drive selected
187190   // bit 3 is motor state
188   device_t *floppy = space->machine().device("upd765");
191   device_t *floppy = machine().device("upd765");
189192   if (BIT(data,0)==0) {
190193      //reset
191194      upd765_reset(floppy,0);
192195   }
193   floppy_mon_w(get_floppy_image(space->machine(), BIT(data,2)), !BIT(data, 3));
196   floppy_mon_w(get_floppy_image(machine(), BIT(data,2)), !BIT(data, 3));
194197
195   floppy_drive_set_ready_state(get_floppy_image(space->machine(), 0), BIT(data,2), 0);
198   floppy_drive_set_ready_state(get_floppy_image(machine(), 0), BIT(data,2), 0);
196199
197200   upd765_tc_w(floppy, BIT(data,1));
198201
199   state->m_floppy_ctrl = data;
202   m_floppy_ctrl = data;
200203}
201static READ8_HANDLER (floppy_r)
204READ8_MEMBER(pyl601_state::floppy_r)
202205{
203   pyl601_state *state = space->machine().driver_data<pyl601_state>();
204   return state->m_floppy_ctrl;
206   return m_floppy_ctrl;
205207}
206208
207209static const struct upd765_interface pyldin_upd765_interface =
r14844r14845
222224   AM_RANGE( 0xe601, 0xe601 ) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
223225   AM_RANGE( 0xe604, 0xe604 ) AM_DEVWRITE("crtc", mc6845_device, address_w)
224226   AM_RANGE( 0xe605, 0xe605 ) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
225   AM_RANGE( 0xe628, 0xe628 ) AM_READ_LEGACY(keyboard_r)
226   AM_RANGE( 0xe629, 0xe629 ) AM_READWRITE_LEGACY(video_mode_r,video_mode_w)
227   AM_RANGE( 0xe62a, 0xe62a ) AM_READWRITE_LEGACY(keycheck_r,led_w)
228   AM_RANGE( 0xe62b, 0xe62b ) AM_READWRITE_LEGACY(timer_r,speaker_w)
229   AM_RANGE( 0xe62d, 0xe62d ) AM_READ_LEGACY(video_mode_r)
230   AM_RANGE( 0xe62e, 0xe62e ) AM_READWRITE_LEGACY(keycheck_r,led_w)
231   AM_RANGE( 0xe680, 0xe680 ) AM_WRITE_LEGACY(vdisk_page_w)
232   AM_RANGE( 0xe681, 0xe681 ) AM_WRITE_LEGACY(vdisk_h_w)
233   AM_RANGE( 0xe682, 0xe682 ) AM_WRITE_LEGACY(vdisk_l_w)
234   AM_RANGE( 0xe683, 0xe683 ) AM_READWRITE_LEGACY(vdisk_data_r,vdisk_data_w)
235   AM_RANGE( 0xe6c0, 0xe6c0 ) AM_READWRITE_LEGACY(floppy_r, floppy_w)
227   AM_RANGE( 0xe628, 0xe628 ) AM_READ(keyboard_r)
228   AM_RANGE( 0xe629, 0xe629 ) AM_READWRITE(video_mode_r,video_mode_w)
229   AM_RANGE( 0xe62a, 0xe62a ) AM_READWRITE(keycheck_r,led_w)
230   AM_RANGE( 0xe62b, 0xe62b ) AM_READWRITE(timer_r,speaker_w)
231   AM_RANGE( 0xe62d, 0xe62d ) AM_READ(video_mode_r)
232   AM_RANGE( 0xe62e, 0xe62e ) AM_READWRITE(keycheck_r,led_w)
233   AM_RANGE( 0xe680, 0xe680 ) AM_WRITE(vdisk_page_w)
234   AM_RANGE( 0xe681, 0xe681 ) AM_WRITE(vdisk_h_w)
235   AM_RANGE( 0xe682, 0xe682 ) AM_WRITE(vdisk_l_w)
236   AM_RANGE( 0xe683, 0xe683 ) AM_READWRITE(vdisk_data_r,vdisk_data_w)
237   AM_RANGE( 0xe6c0, 0xe6c0 ) AM_READWRITE(floppy_r, floppy_w)
236238   AM_RANGE( 0xe6d0, 0xe6d0 ) AM_DEVREAD_LEGACY("upd765", upd765_status_r)
237239   AM_RANGE( 0xe6d1, 0xe6d1 ) AM_DEVREADWRITE_LEGACY("upd765", upd765_data_r, upd765_data_w)
238   AM_RANGE( 0xe6f0, 0xe6f0 ) AM_READWRITE_LEGACY(rom_page_r, rom_page_w)
240   AM_RANGE( 0xe6f0, 0xe6f0 ) AM_READWRITE(rom_page_r, rom_page_w)
239241   AM_RANGE( 0xe700, 0xefff ) AM_RAMBANK("bank4")
240242   AM_RANGE( 0xf000, 0xffff ) AM_READ_BANK("bank5") AM_WRITE_BANK("bank6")
241243ADDRESS_MAP_END
src/mess/drivers/a310.c
r14844r14845
7171   a310_state(const machine_config &mconfig, device_type type, const char *tag)
7272      : driver_device(mconfig, type, tag) { }
7373
74   DECLARE_READ32_MEMBER(a310_psy_wram_r);
75   DECLARE_WRITE32_MEMBER(a310_psy_wram_w);
7476};
7577
7678
r14844r14845
9092      archimedes_clear_fiq(device->machine(), ARCHIMEDES_FIQ_FLOPPY_DRQ);
9193}
9294
93static READ32_HANDLER( a310_psy_wram_r )
95READ32_MEMBER(a310_state::a310_psy_wram_r)
9496{
9597   return archimedes_memc_physmem[offset];
9698}
9799
98static WRITE32_HANDLER( a310_psy_wram_w )
100WRITE32_MEMBER(a310_state::a310_psy_wram_w)
99101{
100102   COMBINE_DATA(&archimedes_memc_physmem[offset]);
101103}
r14844r14845
104106static DRIVER_INIT(a310)
105107{
106108   UINT32 ram_size = machine.device<ram_device>(RAM_TAG)->size();
107
109   a310_state *state = machine.driver_data<a310_state>();
108110   archimedes_memc_physmem = auto_alloc_array(machine, UINT32, 0x01000000);
109111
110   machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler( 0x02000000, 0x02000000+(ram_size-1), FUNC(a310_psy_wram_r), FUNC(a310_psy_wram_w) );
112   machine.device("maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler( 0x02000000, 0x02000000+(ram_size-1), read32_delegate(FUNC(a310_state::a310_psy_wram_r), state), write32_delegate(FUNC(a310_state::a310_psy_wram_w), state));
111113
112114   archimedes_driver_init(machine);
113115}
src/mess/drivers/juicebox.c
r14844r14845
5454   #if defined(JUICEBOX_ENTER_DEBUG_MENU) || defined(JUICEBOX_DISPLAY_ROM_ID)
5555   int port_g_read_count;
5656   #endif
57   DECLARE_READ32_MEMBER(juicebox_nand_r);
58   DECLARE_WRITE32_MEMBER(juicebox_nand_w);
5759};
5860
5961/***************************************************************************
r14844r14845
203205
204206// ...
205207
206static READ32_HANDLER( juicebox_nand_r )
208READ32_MEMBER(juicebox_state::juicebox_nand_r)
207209{
208   running_machine &machine = space->machine();
209210   UINT32 data = 0;
210   if (mem_mask & 0x000000FF) data = data | (smc_read( machine) <<  0);
211   if (mem_mask & 0x0000FF00) data = data | (smc_read( machine) <<  8);
212   if (mem_mask & 0x00FF0000) data = data | (smc_read( machine) << 16);
213   if (mem_mask & 0xFF000000) data = data | (smc_read( machine) << 24);
214   verboselog( machine, 5, "juicebox_nand_r %08X %08X %08X\n", offset, mem_mask, data);
211   if (mem_mask & 0x000000FF) data = data | (smc_read(machine()) <<  0);
212   if (mem_mask & 0x0000FF00) data = data | (smc_read(machine()) <<  8);
213   if (mem_mask & 0x00FF0000) data = data | (smc_read(machine()) << 16);
214   if (mem_mask & 0xFF000000) data = data | (smc_read(machine()) << 24);
215   verboselog( machine(), 5, "juicebox_nand_r %08X %08X %08X\n", offset, mem_mask, data);
215216   return data;
216217}
217218
218static WRITE32_HANDLER( juicebox_nand_w )
219WRITE32_MEMBER(juicebox_state::juicebox_nand_w)
219220{
220   running_machine &machine = space->machine();
221   verboselog( machine, 5, "juicebox_nand_w %08X %08X %08X\n", offset, mem_mask, data);
222   if (mem_mask & 0x000000FF) smc_write( machine, (data >>  0) & 0xFF);
223   if (mem_mask & 0x0000FF00) smc_write( machine, (data >>  8) & 0xFF);
224   if (mem_mask & 0x00FF0000) smc_write( machine, (data >> 16) & 0xFF);
225   if (mem_mask & 0xFF000000) smc_write( machine, (data >> 24) & 0xFF);
221   verboselog( machine(), 5, "juicebox_nand_w %08X %08X %08X\n", offset, mem_mask, data);
222   if (mem_mask & 0x000000FF) smc_write(machine(), (data >>  0) & 0xFF);
223   if (mem_mask & 0x0000FF00) smc_write(machine(), (data >>  8) & 0xFF);
224   if (mem_mask & 0x00FF0000) smc_write(machine(), (data >> 16) & 0xFF);
225   if (mem_mask & 0xFF000000) smc_write(machine(), (data >> 24) & 0xFF);
226226}
227227
228228// I2S
r14844r14845
264264
265265static ADDRESS_MAP_START( juicebox_map, AS_PROGRAM, 32, juicebox_state )
266266   AM_RANGE(0x00000000, 0x007fffff) AM_ROM
267   AM_RANGE(0x04000000, 0x04ffffff) AM_READWRITE_LEGACY(juicebox_nand_r, juicebox_nand_w )
267   AM_RANGE(0x04000000, 0x04ffffff) AM_READWRITE(juicebox_nand_r, juicebox_nand_w )
268268   AM_RANGE(0x0c000000, 0x0c1fffff) AM_RAM AM_MIRROR(0x00600000)
269269ADDRESS_MAP_END
270270
src/mess/drivers/ip20.c
r14844r14845
5252
5353   HPC_t m_HPC;
5454   RTC_t m_RTC;
55   DECLARE_READ32_MEMBER(hpc_r);
56   DECLARE_WRITE32_MEMBER(hpc_w);
57   DECLARE_READ32_MEMBER(int_r);
58   DECLARE_WRITE32_MEMBER(int_w);
5559};
5660
5761
r14844r14845
102106#define RTC_SECOND      state->m_RTC.nRAM[0x06]
103107#define RTC_HUNDREDTH   state->m_RTC.nRAM[0x05]
104108
105static READ32_HANDLER( hpc_r )
109READ32_MEMBER(ip20_state::hpc_r)
106110{
107   ip20_state *state = space->machine().driver_data<ip20_state>();
108111   scc8530_t *scc;
109   running_machine &machine = space->machine();
110
111112   offset <<= 2;
112113   if( offset >= 0x0e00 && offset <= 0x0e7c )
113114   {
114      verboselog(machine, 2, "RTC RAM[0x%02x] Read: %02x\n", ( offset - 0xe00 ) >> 2, state->m_RTC.nRAM[ ( offset - 0xe00 ) >> 2 ] );
115      return state->m_RTC.nRAM[ ( offset - 0xe00 ) >> 2 ];
115      verboselog(machine(), 2, "RTC RAM[0x%02x] Read: %02x\n", ( offset - 0xe00 ) >> 2, m_RTC.nRAM[ ( offset - 0xe00 ) >> 2 ] );
116      return m_RTC.nRAM[ ( offset - 0xe00 ) >> 2 ];
116117   }
117118   switch( offset )
118119   {
119120   case 0x05c:
120      verboselog(machine, 2, "HPC Unknown Read: %08x (%08x) (returning 0x000000a5 as kludge)\n", 0x1fb80000 + offset, mem_mask );
121      verboselog(machine(), 2, "HPC Unknown Read: %08x (%08x) (returning 0x000000a5 as kludge)\n", 0x1fb80000 + offset, mem_mask );
121122      return 0x0000a500;
122123   case 0x00ac:
123      verboselog(machine, 2, "HPC Parallel Buffer Pointer Read: %08x (%08x)\n", state->m_HPC.nParBufPtr, mem_mask );
124      return state->m_HPC.nParBufPtr;
124      verboselog(machine(), 2, "HPC Parallel Buffer Pointer Read: %08x (%08x)\n", m_HPC.nParBufPtr, mem_mask );
125      return m_HPC.nParBufPtr;
125126   case 0x00c0:
126      verboselog(machine, 2, "HPC Endianness Read: %08x (%08x)\n", 0x0000001f, mem_mask );
127      verboselog(machine(), 2, "HPC Endianness Read: %08x (%08x)\n", 0x0000001f, mem_mask );
127128      return 0x0000001f;
128129   case 0x0120:
129130      if (ACCESSING_BITS_8_15)
130131      {
131         return ( wd33c93_r( space, 0 ) << 8 );
132         return ( wd33c93_r( &space, 0 ) << 8 );
132133      }
133134      else
134135      {
r14844r14845
137138   case 0x0124:
138139      if (ACCESSING_BITS_8_15)
139140      {
140         return ( wd33c93_r( space, 1 ) << 8 );
141         return ( wd33c93_r( &space, 1 ) << 8 );
141142      }
142143      else
143144      {
144145         return 0;
145146      }
146147   case 0x01b0:
147      verboselog(machine, 2, "HPC Misc. Status Read: %08x (%08x)\n", state->m_HPC.nMiscStatus, mem_mask );
148      return state->m_HPC.nMiscStatus;
148      verboselog(machine(), 2, "HPC Misc. Status Read: %08x (%08x)\n", m_HPC.nMiscStatus, mem_mask );
149      return m_HPC.nMiscStatus;
149150   case 0x01bc:
150151//      verboselog(machine, 2, "HPC CPU Serial EEPROM Read\n" );
151      return ( (space->machine().device<eeprom_device>("eeprom")->read_bit() << 4 ) );
152      return ( (machine().device<eeprom_device>("eeprom")->read_bit() << 4 ) );
152153   case 0x01c4:
153      verboselog(machine, 2, "HPC Local IO Register 0 Mask Read: %08x (%08x)\n", state->m_HPC.nLocalIOReg0Mask, mem_mask );
154      return state->m_HPC.nLocalIOReg0Mask;
154      verboselog(machine(), 2, "HPC Local IO Register 0 Mask Read: %08x (%08x)\n", m_HPC.nLocalIOReg0Mask, mem_mask );
155      return m_HPC.nLocalIOReg0Mask;
155156   case 0x01cc:
156      verboselog(machine, 2, "HPC Local IO Register 1 Mask Read: %08x (%08x)\n", state->m_HPC.nLocalIOReg0Mask, mem_mask );
157      return state->m_HPC.nLocalIOReg1Mask;
157      verboselog(machine(), 2, "HPC Local IO Register 1 Mask Read: %08x (%08x)\n", m_HPC.nLocalIOReg0Mask, mem_mask );
158      return m_HPC.nLocalIOReg1Mask;
158159   case 0x01d4:
159      verboselog(machine, 2, "HPC VME Interrupt Mask 0 Read: %08x (%08x)\n", state->m_HPC.nLocalIOReg0Mask, mem_mask );
160      return state->m_HPC.nVMEIntMask0;
160      verboselog(machine(), 2, "HPC VME Interrupt Mask 0 Read: %08x (%08x)\n", m_HPC.nLocalIOReg0Mask, mem_mask );
161      return m_HPC.nVMEIntMask0;
161162   case 0x01d8:
162      verboselog(machine, 2, "HPC VME Interrupt Mask 1 Read: %08x (%08x)\n", state->m_HPC.nLocalIOReg0Mask, mem_mask );
163      return state->m_HPC.nVMEIntMask1;
163      verboselog(machine(), 2, "HPC VME Interrupt Mask 1 Read: %08x (%08x)\n", m_HPC.nLocalIOReg0Mask, mem_mask );
164      return m_HPC.nVMEIntMask1;
164165   case 0x0d00:
165      verboselog(machine, 2, "HPC DUART0 Channel B Control Read\n" );
166      verboselog(machine(), 2, "HPC DUART0 Channel B Control Read\n" );
166167//      return 0x00000004;
167      return 0x7c; //scc->reg_r(*space, 0);
168      return 0x7c; //scc->reg_r(*&space, 0);
168169   case 0x0d04:
169      verboselog(machine, 2, "HPC DUART0 Channel B Data Read\n" );
170      verboselog(machine(), 2, "HPC DUART0 Channel B Data Read\n" );
170171//      return 0;
171      scc = space->machine().device<scc8530_t>("scc");
172      return scc->reg_r(*space, 2);
172      scc = machine().device<scc8530_t>("scc");
173      return scc->reg_r(*&space, 2);
173174   case 0x0d08:
174      verboselog(machine, 2, "HPC DUART0 Channel A Control Read (%08x)\n", mem_mask    );
175      verboselog(machine(), 2, "HPC DUART0 Channel A Control Read (%08x)\n", mem_mask    );
175176//      return 0x40;
176      return 0x7c; //scc->reg_r(*space, 1);
177      return 0x7c; //scc->reg_r(*&space, 1);
177178   case 0x0d0c:
178      verboselog(machine, 2, "HPC DUART0 Channel A Data Read\n" );
179      verboselog(machine(), 2, "HPC DUART0 Channel A Data Read\n" );
179180//      return 0;
180      scc = space->machine().device<scc8530_t>("scc");
181      return scc->reg_r(*space, 3);
181      scc = machine().device<scc8530_t>("scc");
182      return scc->reg_r(*&space, 3);
182183   case 0x0d10:
183184//      verboselog(machine, 2, "HPC DUART1 Channel B Control Read\n" );
184185      return 0x00000004;
185186   case 0x0d14:
186      verboselog(machine, 2, "HPC DUART1 Channel B Data Read\n" );
187      verboselog(machine(), 2, "HPC DUART1 Channel B Data Read\n" );
187188      return 0;
188189   case 0x0d18:
189      verboselog(machine, 2, "HPC DUART1 Channel A Control Read\n" );
190      verboselog(machine(), 2, "HPC DUART1 Channel A Control Read\n" );
190191      return 0;
191192   case 0x0d1c:
192      verboselog(machine, 2, "HPC DUART1 Channel A Data Read\n" );
193      verboselog(machine(), 2, "HPC DUART1 Channel A Data Read\n" );
193194      return 0;
194195   case 0x0d20:
195      verboselog(machine, 2, "HPC DUART2 Channel B Control Read\n" );
196      verboselog(machine(), 2, "HPC DUART2 Channel B Control Read\n" );
196197      return 0x00000004;
197198   case 0x0d24:
198      verboselog(machine, 2, "HPC DUART2 Channel B Data Read\n" );
199      verboselog(machine(), 2, "HPC DUART2 Channel B Data Read\n" );
199200      return 0;
200201   case 0x0d28:
201      verboselog(machine, 2, "HPC DUART2 Channel A Control Read\n" );
202      verboselog(machine(), 2, "HPC DUART2 Channel A Control Read\n" );
202203      return 0;
203204   case 0x0d2c:
204      verboselog(machine, 2, "HPC DUART2 Channel A Data Read\n" );
205      verboselog(machine(), 2, "HPC DUART2 Channel A Data Read\n" );
205206      return 0;
206207   case 0x0d30:
207      verboselog(machine, 2, "HPC DUART3 Channel B Control Read\n" );
208      verboselog(machine(), 2, "HPC DUART3 Channel B Control Read\n" );
208209      return 0x00000004;
209210   case 0x0d34:
210      verboselog(machine, 2, "HPC DUART3 Channel B Data Read\n" );
211      verboselog(machine(), 2, "HPC DUART3 Channel B Data Read\n" );
211212      return 0;
212213   case 0x0d38:
213      verboselog(machine, 2, "HPC DUART3 Channel A Control Read\n" );
214      verboselog(machine(), 2, "HPC DUART3 Channel A Control Read\n" );
214215      return 0;
215216   case 0x0d3c:
216      verboselog(machine, 2, "HPC DUART3 Channel A Data Read\n" );
217      verboselog(machine(), 2, "HPC DUART3 Channel A Data Read\n" );
217218      return 0;
218219   }
219   verboselog(machine, 0, "Unmapped HPC read: 0x%08x (%08x)\n", 0x1fb80000 + offset, mem_mask );
220   verboselog(machine(), 0, "Unmapped HPC read: 0x%08x (%08x)\n", 0x1fb80000 + offset, mem_mask );
220221   return 0;
221222}
222223
223static WRITE32_HANDLER( hpc_w )
224WRITE32_MEMBER(ip20_state::hpc_w)
224225{
225   ip20_state *state = space->machine().driver_data<ip20_state>();
226226   scc8530_t *scc;
227227   eeprom_device *eeprom;
228   running_machine &machine = space->machine();
229
230   eeprom = space->machine().device<eeprom_device>("eeprom");
228   eeprom = machine().device<eeprom_device>("eeprom");
231229   offset <<= 2;
232230   if( offset >= 0x0e00 && offset <= 0x0e7c )
233231   {
234      verboselog(machine, 2, "RTC RAM[0x%02x] Write: %02x\n", ( offset - 0xe00 ) >> 2, data & 0x000000ff );
235      state->m_RTC.nRAM[ ( offset - 0xe00 ) >> 2 ] = data & 0x000000ff;
232      verboselog(machine(), 2, "RTC RAM[0x%02x] Write: %02x\n", ( offset - 0xe00 ) >> 2, data & 0x000000ff );
233      m_RTC.nRAM[ ( offset - 0xe00 ) >> 2 ] = data & 0x000000ff;
236234      switch( ( offset - 0xe00 ) >> 2 )
237235      {
238236      case 0:
239237         break;
240238      case 4:
241         if( !( state->m_RTC.nRAM[0x00] & 0x80 ) )
239         if( !( m_RTC.nRAM[0x00] & 0x80 ) )
242240         {
243241            if( data & 0x80 )
244242            {
245               state->m_RTC.nRAM[0x19] = RTC_SECOND;
246               state->m_RTC.nRAM[0x1a] = RTC_MINUTE;
247               state->m_RTC.nRAM[0x1b] = RTC_HOUR;
248               state->m_RTC.nRAM[0x1c] = RTC_DAY;
249               state->m_RTC.nRAM[0x1d] = RTC_MONTH;
243               m_RTC.nRAM[0x19] = m_RTC.nRAM[0x06]; //RTC_SECOND;
244               m_RTC.nRAM[0x1a] = m_RTC.nRAM[0x07]; //RTC_MINUTE;
245               m_RTC.nRAM[0x1b] = m_RTC.nRAM[0x08]; //RTC_HOUR;
246               m_RTC.nRAM[0x1c] = m_RTC.nRAM[0x09]; //RTC_DAY;
247               m_RTC.nRAM[0x1d] = m_RTC.nRAM[0x0a]; //RTC_MONTH;
250248            }
251249         }
252250         break;
r14844r14845
256254   switch( offset )
257255   {
258256   case 0x0090:   // SCSI0 next descriptor pointer
259      state->m_HPC.nSCSI0Descriptor = data;
257      m_HPC.nSCSI0Descriptor = data;
260258      break;
261259
262260   case 0x0094:   // SCSI0 control flags
263      state->m_HPC.nSCSI0DMACtrl = data;
261      m_HPC.nSCSI0DMACtrl = data;
264262      #if 0
265263      if (data & 0x80)
266264      {
r14844r14845
269267         mame_printf_info("DMA activated for SCSI0\n");
270268         mame_printf_info("Descriptor block:\n");
271269         mame_printf_info("CTL: %08x BUFPTR: %08x DESCPTR %08x\n",
272            program_read_dword(state->m_HPC.nSCSI0Descriptor), program_read_dword(state->m_HPC.nSCSI0Descriptor+4),
273            program_read_dword(state->m_HPC.nSCSI0Descriptor+8));
270            program_read_dword(m_HPC.nSCSI0Descriptor), program_read_dword(m_HPC.nSCSI0Descriptor+4),
271            program_read_dword(m_HPC.nSCSI0Descriptor+8));
274272
275         next = program_read_dword(state->m_HPC.nSCSI0Descriptor+8);
273         next = program_read_dword(m_HPC.nSCSI0Descriptor+8);
276274         mame_printf_info("CTL: %08x BUFPTR: %08x DESCPTR %08x\n",
277275            program_read_dword(next), program_read_dword(next+4),
278276            program_read_dword(next+8));
r14844r14845
281279      break;
282280
283281   case 0x00ac:
284      verboselog(machine, 2, "HPC Parallel Buffer Pointer Write: %08x (%08x)\n", data, mem_mask );
285      state->m_HPC.nParBufPtr = data;
282      verboselog(machine(), 2, "HPC Parallel Buffer Pointer Write: %08x (%08x)\n", data, mem_mask );
283      m_HPC.nParBufPtr = data;
286284      break;
287285   case 0x0120:
288286      if (ACCESSING_BITS_8_15)
289287      {
290         verboselog(machine, 2, "HPC SCSI Controller Register Write: %08x\n", ( data >> 8 ) & 0x000000ff );
291         wd33c93_w( space, 0, ( data >> 8 ) & 0x000000ff );
288         verboselog(machine(), 2, "HPC SCSI Controller Register Write: %08x\n", ( data >> 8 ) & 0x000000ff );
289         wd33c93_w( &space, 0, ( data >> 8 ) & 0x000000ff );
292290      }
293291      else
294292      {
r14844r14845
298296   case 0x0124:
299297      if (ACCESSING_BITS_8_15)
300298      {
301         verboselog(machine, 2, "HPC SCSI Controller Data Write: %08x\n", ( data >> 8 ) & 0x000000ff );
302         wd33c93_w( space, 1, ( data >> 8 ) & 0x000000ff );
299         verboselog(machine(), 2, "HPC SCSI Controller Data Write: %08x\n", ( data >> 8 ) & 0x000000ff );
300         wd33c93_w( &space, 1, ( data >> 8 ) & 0x000000ff );
303301      }
304302      else
305303      {
r14844r14845
307305      }
308306      break;
309307   case 0x01b0:
310      verboselog(machine, 2, "HPC Misc. Status Write: %08x (%08x)\n", data, mem_mask );
308      verboselog(machine(), 2, "HPC Misc. Status Write: %08x (%08x)\n", data, mem_mask );
311309      if( data & 0x00000001 )
312310      {
313         verboselog(machine, 2, "  Force DSP hard reset\n" );
311         verboselog(machine(), 2, "  Force DSP hard reset\n" );
314312      }
315313      if( data & 0x00000002 )
316314      {
317         verboselog(machine, 2, "  Force IRQA\n" );
315         verboselog(machine(), 2, "  Force IRQA\n" );
318316      }
319317      if( data & 0x00000004 )
320318      {
321         verboselog(machine, 2, "  Set IRQA polarity high\n" );
319         verboselog(machine(), 2, "  Set IRQA polarity high\n" );
322320      }
323321      else
324322      {
325         verboselog(machine, 2, "  Set IRQA polarity low\n" );
323         verboselog(machine(), 2, "  Set IRQA polarity low\n" );
326324      }
327325      if( data & 0x00000008 )
328326      {
329         verboselog(machine, 2, "  SRAM size: 32K\n" );
327         verboselog(machine(), 2, "  SRAM size: 32K\n" );
330328      }
331329      else
332330      {
333         verboselog(machine, 2, "  SRAM size:  8K\n" );
331         verboselog(machine(), 2, "  SRAM size:  8K\n" );
334332      }
335      state->m_HPC.nMiscStatus = data;
333      m_HPC.nMiscStatus = data;
336334      break;
337335   case 0x01bc:
338336//      verboselog(machine, 2, "HPC CPU Serial EEPROM Write: %08x (%08x)\n", data, mem_mask );
339337      if( data & 0x00000001 )
340338      {
341         verboselog(machine, 2, "    CPU board LED on\n" );
339         verboselog(machine(), 2, "    CPU board LED on\n" );
342340      }
343341      eeprom->write_bit((data & 0x00000008) ? 1 : 0 );
344342      eeprom->set_cs_line((data & 0x00000002) ? ASSERT_LINE : CLEAR_LINE );
345343      eeprom->set_clock_line((data & 0x00000004) ? CLEAR_LINE : ASSERT_LINE );
346344      break;
347345   case 0x01c4:
348      verboselog(machine, 2, "HPC Local IO Register 0 Mask Write: %08x (%08x)\n", data, mem_mask );
349      state->m_HPC.nLocalIOReg0Mask = data;
346      verboselog(machine(), 2, "HPC Local IO Register 0 Mask Write: %08x (%08x)\n", data, mem_mask );
347      m_HPC.nLocalIOReg0Mask = data;
350348      break;
351349   case 0x01cc:
352      verboselog(machine, 2, "HPC Local IO Register 1 Mask Write: %08x (%08x)\n", data, mem_mask );
353      state->m_HPC.nLocalIOReg1Mask = data;
350      verboselog(machine(), 2, "HPC Local IO Register 1 Mask Write: %08x (%08x)\n", data, mem_mask );
351      m_HPC.nLocalIOReg1Mask = data;
354352      break;
355353   case 0x01d4:
356      verboselog(machine, 2, "HPC VME Interrupt Mask 0 Write: %08x (%08x)\n", data, mem_mask );
357      state->m_HPC.nVMEIntMask0 = data;
354      verboselog(machine(), 2, "HPC VME Interrupt Mask 0 Write: %08x (%08x)\n", data, mem_mask );
355      m_HPC.nVMEIntMask0 = data;
358356      break;
359357   case 0x01d8:
360      verboselog(machine, 2, "HPC VME Interrupt Mask 1 Write: %08x (%08x)\n", data, mem_mask );
361      state->m_HPC.nVMEIntMask1 = data;
358      verboselog(machine(), 2, "HPC VME Interrupt Mask 1 Write: %08x (%08x)\n", data, mem_mask );
359      m_HPC.nVMEIntMask1 = data;
362360      break;
363361   case 0x0d00:
364      verboselog(machine, 2, "HPC DUART0 Channel B Control Write: %08x (%08x)\n", data, mem_mask );
365      scc = space->machine().device<scc8530_t>("scc");
366      scc->reg_w(*space, 0, data);
362      verboselog(machine(), 2, "HPC DUART0 Channel B Control Write: %08x (%08x)\n", data, mem_mask );
363      scc = machine().device<scc8530_t>("scc");
364      scc->reg_w(*&space, 0, data);
367365      break;
368366   case 0x0d04:
369      verboselog(machine, 2, "HPC DUART0 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
370      scc = space->machine().device<scc8530_t>("scc");
371      scc->reg_w(*space, 2, data);
367      verboselog(machine(), 2, "HPC DUART0 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
368      scc = machine().device<scc8530_t>("scc");
369      scc->reg_w(*&space, 2, data);
372370      break;
373371   case 0x0d08:
374      verboselog(machine, 2, "HPC DUART0 Channel A Control Write: %08x (%08x)\n", data, mem_mask );
375      scc = space->machine().device<scc8530_t>("scc");
376      scc->reg_w(*space, 1, data);
372      verboselog(machine(), 2, "HPC DUART0 Channel A Control Write: %08x (%08x)\n", data, mem_mask );
373      scc = machine().device<scc8530_t>("scc");
374      scc->reg_w(*&space, 1, data);
377375      break;
378376   case 0x0d0c:
379      verboselog(machine, 2, "HPC DUART0 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
380      scc = space->machine().device<scc8530_t>("scc");
381      scc->reg_w(*space, 3, data);
377      verboselog(machine(), 2, "HPC DUART0 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
378      scc = machine().device<scc8530_t>("scc");
379      scc->reg_w(*&space, 3, data);
382380      break;
383381   case 0x0d10:
384382      if( ( data & 0x000000ff ) >= 0x00000020 )
385383      {
386//          verboselog(machine, 2, "HPC DUART1 Channel B Control Write: %08x (%08x) %c\n", data, mem_mask, data & 0x000000ff );
384//          verboselog(machine(), 2, "HPC DUART1 Channel B Control Write: %08x (%08x) %c\n", data, mem_mask, data & 0x000000ff );
387385         //mame_printf_info( "%c", data & 0x000000ff );
388386      }
389387      else
390388      {
391//          verboselog(machine, 2, "HPC DUART1 Channel B Control Write: %08x (%08x)\n", data, mem_mask );
389//          verboselog(machine(), 2, "HPC DUART1 Channel B Control Write: %08x (%08x)\n", data, mem_mask );
392390      }
393391      break;
394392   case 0x0d14:
395393      if( ( data & 0x000000ff ) >= 0x00000020 || ( data & 0x000000ff ) == 0x0d || ( data & 0x000000ff ) == 0x0a )
396394      {
397         verboselog(machine, 2, "HPC DUART1 Channel B Data Write: %08x (%08x) %c\n", data, mem_mask, data & 0x000000ff );
395         verboselog(machine(), 2, "HPC DUART1 Channel B Data Write: %08x (%08x) %c\n", data, mem_mask, data & 0x000000ff );
398396         mame_printf_info( "%c", data & 0x000000ff );
399397      }
400398      else
401399      {
402         verboselog(machine, 2, "HPC DUART1 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
400         verboselog(machine(), 2, "HPC DUART1 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
403401      }
404402      break;
405403   case 0x0d18:
406404      mame_printf_info("HPC DUART1 Channel A Control Write: %08x (%08x)\n", data, mem_mask );
407405      break;
408406   case 0x0d1c:
409      verboselog(machine, 2, "HPC DUART1 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
407      verboselog(machine(), 2, "HPC DUART1 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
410408      break;
411409   case 0x0d20:
412410      mame_printf_info("HPC DUART2 Channel B Control Write: %08x (%08x)\n", data, mem_mask );
413411      break;
414412   case 0x0d24:
415      verboselog(machine, 2, "HPC DUART2 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
413      verboselog(machine(), 2, "HPC DUART2 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
416414      break;
417415   case 0x0d28:
418416      mame_printf_info("HPC DUART2 Channel A Control Write: %08x (%08x)\n", data, mem_mask );
419417      break;
420418   case 0x0d2c:
421      verboselog(machine, 2, "HPC DUART2 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
419      verboselog(machine(), 2, "HPC DUART2 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
422420      break;
423421   case 0x0d30:
424422      mame_printf_info("HPC DUART3 Channel B Control Write: %08x (%08x)\n", data, mem_mask );
425423      break;
426424   case 0x0d34:
427      verboselog(machine, 2, "HPC DUART3 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
425      verboselog(machine(), 2, "HPC DUART3 Channel B Data Write: %08x (%08x)\n", data, mem_mask );
428426      break;
429427   case 0x0d38:
430428      mame_printf_info("HPC DUART3 Channel A Control Write: %08x (%08x)\n", data, mem_mask );
431429      break;
432430   case 0x0d3c:
433      verboselog(machine, 2, "HPC DUART3 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
431      verboselog(machine(), 2, "HPC DUART3 Channel A Data Write: %08x (%08x)\n", data, mem_mask );
434432      break;
435433   default:
436434      mame_printf_info("Unmapped HPC write: 0x%08x (%08x): %08x\n", 0x1fb80000 + offset, mem_mask, data);
r14844r14845
439437}
440438
441439// INT/INT2/INT3 interrupt controllers
442static READ32_HANDLER( int_r )
440READ32_MEMBER(ip20_state::int_r)
443441{
444   mame_printf_info("INT: read @ ofs %x (mask %x) (PC=%x)\n", offset, mem_mask, cpu_get_pc(&space->device()));
442   mame_printf_info("INT: read @ ofs %x (mask %x) (PC=%x)\n", offset, mem_mask, cpu_get_pc(&space.device()));
445443   return 0;
446444}
447445
448static WRITE32_HANDLER( int_w )
446WRITE32_MEMBER(ip20_state::int_w)
449447{
450   mame_printf_info("INT: write %x to ofs %x (mask %x) (PC=%x)\n", data, offset, mem_mask, cpu_get_pc(&space->device()));
448   mame_printf_info("INT: write %x to ofs %x (mask %x) (PC=%x)\n", data, offset, mem_mask, cpu_get_pc(&space.device()));
451449}
452450
453451static ADDRESS_MAP_START( ip204415_map, AS_PROGRAM, 32, ip20_state )
r14844r14845
459457   AM_RANGE( 0x10000000, 0x107fffff ) AM_RAM AM_SHARE("share9")
460458   AM_RANGE( 0x18000000, 0x187fffff ) AM_RAM AM_SHARE("share1")
461459   AM_RANGE( 0x1fa00000, 0x1fa1ffff ) AM_READWRITE_LEGACY(sgi_mc_r, sgi_mc_w )
462   AM_RANGE( 0x1fb80000, 0x1fb8ffff ) AM_READWRITE_LEGACY(hpc_r, hpc_w )
463   AM_RANGE( 0x1fbd9000, 0x1fbd903f ) AM_READWRITE_LEGACY(int_r, int_w )
460   AM_RANGE( 0x1fb80000, 0x1fb8ffff ) AM_READWRITE(hpc_r, hpc_w )
461   AM_RANGE( 0x1fbd9000, 0x1fbd903f ) AM_READWRITE(int_r, int_w )
464462   AM_RANGE( 0x1fc00000, 0x1fc7ffff ) AM_ROM AM_SHARE("share2") AM_REGION( "user1", 0 )
465463   AM_RANGE( 0x80000000, 0x801fffff ) AM_RAM AM_SHARE("share10")
466464   AM_RANGE( 0x88000000, 0x88ffffff ) AM_RAM AM_SHARE("share5")
r14844r14845
472470   AM_RANGE( 0xb0000000, 0xb07fffff ) AM_RAM AM_SHARE("share9")
473471   AM_RANGE( 0xb8000000, 0xb87fffff ) AM_RAM AM_SHARE("share1")
474472   AM_RANGE( 0xbfa00000, 0xbfa1ffff ) AM_READWRITE_LEGACY(sgi_mc_r, sgi_mc_w )
475   AM_RANGE( 0xbfb80000, 0xbfb8ffff ) AM_READWRITE_LEGACY(hpc_r, hpc_w )
476   AM_RANGE( 0xbfbd9000, 0xbfbd903f ) AM_READWRITE_LEGACY(int_r, int_w )
473   AM_RANGE( 0xbfb80000, 0xbfb8ffff ) AM_READWRITE(hpc_r, hpc_w )
474   AM_RANGE( 0xbfbd9000, 0xbfbd903f ) AM_READWRITE(int_r, int_w )
477475   AM_RANGE( 0xbfc00000, 0xbfc7ffff ) AM_ROM AM_SHARE("share2") /* BIOS Mirror */
478476ADDRESS_MAP_END
479477

Previous 15994 Revisions Next


© 1998-2018 The MESS Team