Previous 199869 Revisions Next

r18261 Wednesday 3rd October, 2012 at 13:45:23 UTC by Miodrag Milanović
modernization and cleanup of x68k (no whatsnew)
[src/mess/drivers]x68k.c
[src/mess/includes]x68k.h
[src/mess/video]x68k.c

trunk/src/mess/drivers/x68k.c
r18260r18261
168168}
169169#endif
170170
171static void mfp_init(running_machine &machine)
171void x68k_state::mfp_init()
172172{
173   x68k_state *state = machine.driver_data<x68k_state>();
174   state->m_mfp.tadr = state->m_mfp.tbdr = state->m_mfp.tcdr = state->m_mfp.tddr = 0xff;
173   m_mfp.tadr = m_mfp.tbdr = m_mfp.tcdr = m_mfp.tddr = 0xff;
175174
176   state->m_mfp.irqline = 6;  // MFP is connected to 68000 IRQ line 6
177   state->m_mfp.current_irq = -1;  // No current interrupt
175   m_mfp.irqline = 6;  // MFP is connected to 68000 IRQ line 6
176   m_mfp.current_irq = -1;  // No current interrupt
178177
179178#if 0
180179    mfp_timer[0] = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(x68k_state::mfp_timer_a_callback),this));
r18260r18261
338337}
339338
340339// 4 channel DMA controller (Hitachi HD63450)
341static WRITE16_HANDLER( x68k_dmac_w )
340WRITE16_HANDLER(x68k_state::x68k_dmac_w)
342341{
343   device_t* device = space.machine().device("hd63450");
342   device_t* device = machine().device("hd63450");
344343   hd63450_w(device, space, offset, data, mem_mask);
345344}
346345
347static READ16_HANDLER( x68k_dmac_r )
346READ16_HANDLER(x68k_state::x68k_dmac_r)
348347{
349   device_t* device = space.machine().device("hd63450");
348   device_t* device = machine().device("hd63450");
350349   return hd63450_r(device, space, offset, mem_mask);
351350}
352351
353static void x68k_keyboard_ctrl_w(x68k_state *state, int data)
352void x68k_state::x68k_keyboard_ctrl_w(int data)
354353{
355354   /* Keyboard control commands:
356355       00xxxxxx - TV Control
r18260r18261
403402
404403   if((data & 0xf8) == 0x48)  // Keyboard enable
405404   {
406      state->m_keyboard.enabled = data & 0x01;
407      logerror("KB: Keyboard enable bit = %i\n",state->m_keyboard.enabled);
405      m_keyboard.enabled = data & 0x01;
406      logerror("KB: Keyboard enable bit = %i\n",m_keyboard.enabled);
408407   }
409408
410409   if((data & 0xf0) == 0x60)  // Key delay time
411410   {
412      state->m_keyboard.delay = data & 0x0f;
411      m_keyboard.delay = data & 0x0f;
413412      logerror("KB: Keypress delay time is now %ims\n",(data & 0x0f)*100+200);
414413   }
415414
416415   if((data & 0xf0) == 0x70)  // Key repeat rate
417416   {
418      state->m_keyboard.repeat = data & 0x0f;
417      m_keyboard.repeat = data & 0x0f;
419418      logerror("KB: Keypress repeat rate is now %ims\n",((data & 0x0f)^2)*5+30);
420419   }
421420
422421}
423422
424static int x68k_keyboard_pop_scancode(x68k_state *state)
423int x68k_state::x68k_keyboard_pop_scancode()
425424{
426425   int ret;
427   if(state->m_keyboard.keynum == 0)  // no scancodes in USART buffer
426   if(m_keyboard.keynum == 0)  // no scancodes in USART buffer
428427      return 0x00;
429428
430   state->m_keyboard.keynum--;
431   ret = state->m_keyboard.buffer[state->m_keyboard.tailpos++];
432   if(state->m_keyboard.tailpos > 15)
433      state->m_keyboard.tailpos = 0;
429   m_keyboard.keynum--;
430   ret = m_keyboard.buffer[m_keyboard.tailpos++];
431   if(m_keyboard.tailpos > 15)
432      m_keyboard.tailpos = 0;
434433
435434   logerror("MFP: Keyboard buffer pop 0x%02x\n",ret);
436435   return ret;
437436}
438437
439static void x68k_keyboard_push_scancode(running_machine &machine,unsigned char code)
440{
441   x68k_state *state = machine.driver_data<x68k_state>();
442   state->m_keyboard.keynum++;
443   if(state->m_keyboard.keynum >= 1)
438void x68k_state::x68k_keyboard_push_scancode(unsigned char code)
439{   
440   m_keyboard.keynum++;
441   if(m_keyboard.keynum >= 1)
444442   { // keyboard buffer full
445      if(state->m_keyboard.enabled != 0)
443      if(m_keyboard.enabled != 0)
446444      {
447         state->m_mfp.rsr |= 0x80;  // Buffer full
445         m_mfp.rsr |= 0x80;  // Buffer full
448446//          mfp_trigger_irq(MFP_IRQ_RX_FULL);
449         if(machine.root_device().ioport("options")->read() & 0x01)
447         if(machine().root_device().ioport("options")->read() & 0x01)
450448         {
451            state->m_current_vector[6] = 0x4c;
452            machine.device("maincpu")->execute().set_input_line_and_vector(6,ASSERT_LINE,0x4c);
449            m_current_vector[6] = 0x4c;
450            machine().device("maincpu")->execute().set_input_line_and_vector(6,ASSERT_LINE,0x4c);
453451            logerror("MFP: Receive buffer full IRQ sent\n");
454452         }
455453      }
456454   }
457   state->m_keyboard.buffer[state->m_keyboard.headpos++] = code;
458   if(state->m_keyboard.headpos > 15)
455   m_keyboard.buffer[m_keyboard.headpos++] = code;
456   if(m_keyboard.headpos > 15)
459457   {
460      state->m_keyboard.headpos = 0;
458      m_keyboard.headpos = 0;
461459//      mfp_trigger_irq(MFP_IRQ_RX_ERROR);
462      state->m_current_vector[6] = 0x4b;
460      m_current_vector[6] = 0x4b;
463461//      machine.device("maincpu")->execute().set_input_line_and_vector(6,ASSERT_LINE,0x4b);
464462   }
465463}
r18260r18261
480478      {
481479         if(m_keyboard.keyon[x] != 0)
482480         {
483            x68k_keyboard_push_scancode(machine(),0x80 + x);
481            x68k_keyboard_push_scancode(0x80 + x);
484482            m_keyboard.keytime[x] = 0;
485483            m_keyboard.keyon[x] = 0;
486484            m_keyboard.last_pressed = 0;
r18260r18261
492490      {
493491         if(machine().root_device().ioport(keynames[m_keyboard.last_pressed / 32])->read() & (1 << (m_keyboard.last_pressed % 32)))
494492         {
495            x68k_keyboard_push_scancode(machine(),m_keyboard.last_pressed);
493            x68k_keyboard_push_scancode(m_keyboard.last_pressed);
496494            m_keyboard.keytime[m_keyboard.last_pressed] = (m_keyboard.repeat^2)*5+30;
497495            logerror("KB: Holding key 0x%02x\n",m_keyboard.last_pressed);
498496         }
r18260r18261
501499      {
502500         if(m_keyboard.keyon[x] == 0)
503501         {
504            x68k_keyboard_push_scancode(machine(),x);
502            x68k_keyboard_push_scancode(x);
505503            m_keyboard.keytime[x] = m_keyboard.delay * 100 + 200;
506504            m_keyboard.keyon[x] = 1;
507505            m_keyboard.last_pressed = x;
r18260r18261
528526// mouse input
529527// port B of the Z8530 SCC
530528// typically read from the SCC data port on receive buffer full interrupt per byte
531static int x68k_read_mouse(running_machine &machine)
529int x68k_state::x68k_read_mouse()
532530{
533   x68k_state *state = machine.driver_data<x68k_state>();
534   scc8530_t *scc = machine.device<scc8530_t>("scc");
531   scc8530_t *scc = machine().device<scc8530_t>("scc");
535532   char val = 0;
536533   char ipt = 0;
537534
538535   if(!(scc->get_reg_b(5) & 0x02))
539536      return 0xff;
540537
541   switch(state->m_mouse.inputtype)
538   switch(m_mouse.inputtype)
542539   {
543540   case 0:
544      ipt = machine.root_device().ioport("mouse1")->read();
541      ipt = machine().root_device().ioport("mouse1")->read();
545542      break;
546543   case 1:
547      val = machine.root_device().ioport("mouse2")->read();
548      ipt = val - state->m_mouse.last_mouse_x;
549      state->m_mouse.last_mouse_x = val;
544      val = machine().root_device().ioport("mouse2")->read();
545      ipt = val - m_mouse.last_mouse_x;
546      m_mouse.last_mouse_x = val;
550547      break;
551548   case 2:
552      val = machine.root_device().ioport("mouse3")->read();
553      ipt = val - state->m_mouse.last_mouse_y;
554      state->m_mouse.last_mouse_y = val;
549      val = machine().root_device().ioport("mouse3")->read();
550      ipt = val - m_mouse.last_mouse_y;
551      m_mouse.last_mouse_y = val;
555552      break;
556553   }
557   state->m_mouse.inputtype++;
558   if(state->m_mouse.inputtype > 2)
554   m_mouse.inputtype++;
555   if(m_mouse.inputtype > 2)
559556   {
560557      int i_val = scc->get_reg_b(0);
561      state->m_mouse.inputtype = 0;
562      state->m_mouse.bufferempty = 1;
558      m_mouse.inputtype = 0;
559      m_mouse.bufferempty = 1;
563560      i_val &= ~0x01;
564561      scc->set_reg_b(0, i_val);
565562      logerror("SCC: mouse buffer empty\n");
r18260r18261
574571    0xe98005 - Z8530 command port A
575572    0xe98007 - Z8530 data port A  (RS232)
576573*/
577static READ16_HANDLER( x68k_scc_r )
574READ16_MEMBER(x68k_state::x68k_scc_r )
578575{
579   scc8530_t *scc = space.machine().device<scc8530_t>("scc");
576   scc8530_t *scc = machine().device<scc8530_t>("scc");
580577   offset %= 4;
581578   switch(offset)
582579   {
583580   case 0:
584581      return scc->reg_r(space, 0);
585582   case 1:
586      return x68k_read_mouse(space.machine());
583      return x68k_read_mouse();
587584   case 2:
588585      return scc->reg_r(space, 1);
589586   case 3:
r18260r18261
593590   }
594591}
595592
596static WRITE16_HANDLER( x68k_scc_w )
593WRITE16_MEMBER(x68k_state::x68k_scc_w )
597594{
598   x68k_state *state = space.machine().driver_data<x68k_state>();
599   scc8530_t *scc = space.machine().device<scc8530_t>("scc");
595   scc8530_t *scc = machine().device<scc8530_t>("scc");
600596   offset %= 4;
601597
602598   switch(offset)
603599   {
604600   case 0:
605601      scc->reg_w(space, 0,(UINT8)data);
606      if((scc->get_reg_b(5) & 0x02) != state->m_scc_prev)
602      if((scc->get_reg_b(5) & 0x02) != m_scc_prev)
607603      {
608604         if(scc->get_reg_b(5) & 0x02)  // Request to Send
609605         {
610606            int val = scc->get_reg_b(0);
611            state->m_mouse.bufferempty = 0;
607            m_mouse.bufferempty = 0;
612608            val |= 0x01;
613609            scc->set_reg_b(0,val);
614610         }
r18260r18261
624620      scc->reg_w(space, 3,(UINT8)data);
625621      break;
626622   }
627   state->m_scc_prev = scc->get_reg_b(5) & 0x02;
623   m_scc_prev = scc->get_reg_b(5) & 0x02;
628624}
629625
630626TIMER_CALLBACK_MEMBER(x68k_state::x68k_scc_ack)
r18260r18261
652648   }
653649}
654650
655static void x68k_set_adpcm(running_machine &machine)
651void x68k_state::x68k_set_adpcm()
656652{
657   x68k_state *state = machine.driver_data<x68k_state>();
658   device_t *dev = machine.device("hd63450");
653   device_t *dev = machine().device("hd63450");
659654   UINT32 rate = 0;
660655
661   switch(state->m_adpcm.rate & 0x0c)
656   switch(m_adpcm.rate & 0x0c)
662657   {
663658      case 0x00:
664659         rate = 7812/2;
r18260r18261
673668         logerror("PPI: Invalid ADPCM sample rate set.\n");
674669         rate = 15625/2;
675670   }
676   if(state->m_adpcm.clock != 0)
671   if(m_adpcm.clock != 0)
677672      rate = rate/2;
678673   hd63450_set_timer(dev,3,attotime::from_hz(rate));
679674}
r18260r18261
684679// Button inputs (Start, A, B and C) are read in bits 5 and 6 (rather than 4
685680// and 5 like on a Megadrive)
686681
687static UINT8 md_3button_r(device_t* device, int port)
682UINT8 x68k_state::md_3button_r(int port)
688683{
689   x68k_state *state = device->machine().driver_data<x68k_state>();
690684   if(port == 1)
691685   {
692      UINT8 porta = device->machine().root_device().ioport("md3b")->read() & 0xff;
693      UINT8 portb = (state->ioport("md3b")->read() >> 8) & 0xff;
694      if(state->m_mdctrl.mux1 & 0x10)
686      UINT8 porta = machine().root_device().ioport("md3b")->read() & 0xff;
687      UINT8 portb = (ioport("md3b")->read() >> 8) & 0xff;
688      if(m_mdctrl.mux1 & 0x10)
695689      {
696690         return porta | 0x90;
697691      }
r18260r18261
702696   }
703697   if(port == 2)
704698   {
705      UINT8 porta = (device->machine().root_device().ioport("md3b")->read() >> 16) & 0xff;
706      UINT8 portb = (device->machine().root_device().ioport("md3b")->read() >> 24) & 0xff;
707      if(state->m_mdctrl.mux2 & 0x20)
699      UINT8 porta = (machine().root_device().ioport("md3b")->read() >> 16) & 0xff;
700      UINT8 portb = (machine().root_device().ioport("md3b")->read() >> 24) & 0xff;
701      if(m_mdctrl.mux2 & 0x20)
708702      {
709703         return porta | 0x90;
710704      }
r18260r18261
727721   m_mdctrl.seq2 = 0;
728722}
729723
730static void md_6button_init(running_machine &machine)
724void x68k_state::md_6button_init()
731725{
732   x68k_state *state = machine.driver_data<x68k_state>();
733   state->m_mdctrl.io_timeout1 = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(x68k_state::md_6button_port1_timeout),state));
734   state->m_mdctrl.io_timeout2 = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(x68k_state::md_6button_port2_timeout),state));
726   m_mdctrl.io_timeout1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(x68k_state::md_6button_port1_timeout),this));
727   m_mdctrl.io_timeout2 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(x68k_state::md_6button_port2_timeout),this));
735728}
736729
737static UINT8 md_6button_r(device_t* device, int port)
730UINT8 x68k_state::md_6button_r(int port)
738731{
739   x68k_state *state = device->machine().driver_data<x68k_state>();
740732   if(port == 1)
741733   {
742      UINT8 porta = device->machine().root_device().ioport("md6b")->read() & 0xff;
743      UINT8 portb = (device->machine().root_device().ioport("md6b")->read() >> 8) & 0xff;
744      UINT8 extra = state->ioport("md6b_extra")->read() & 0x0f;
734      UINT8 porta = machine().root_device().ioport("md6b")->read() & 0xff;
735      UINT8 portb = (machine().root_device().ioport("md6b")->read() >> 8) & 0xff;
736      UINT8 extra = ioport("md6b_extra")->read() & 0x0f;
745737
746      switch(state->m_mdctrl.seq1)
738      switch(m_mdctrl.seq1)
747739      {
748740         case 1:
749741         default:
750            if(state->m_mdctrl.mux1 & 0x10)
742            if(m_mdctrl.mux1 & 0x10)
751743            {
752744               return porta | 0x90;
753745            }
r18260r18261
756748               return (portb & 0x60) | (porta & 0x03) | 0x90;
757749            }
758750         case 2:
759            if(state->m_mdctrl.mux1 & 0x10)
751            if(m_mdctrl.mux1 & 0x10)
760752            {
761753               return porta | 0x90;
762754            }
r18260r18261
765757               return (portb & 0x60) | 0x90;
766758            }
767759         case 3:
768            if(state->m_mdctrl.mux1 & 0x10)
760            if(m_mdctrl.mux1 & 0x10)
769761            {
770762               return (porta & 0x60) | (extra & 0x0f) | 0x90;
771763            }
r18260r18261
777769   }
778770   if(port == 2)
779771   {
780      UINT8 porta = (device->machine().root_device().ioport("md6b")->read() >> 16) & 0xff;
781      UINT8 portb = (device->machine().root_device().ioport("md6b")->read() >> 24) & 0xff;
782      UINT8 extra = (device->machine().root_device().ioport("md6b_extra")->read() >> 4) & 0x0f;
772      UINT8 porta = (machine().root_device().ioport("md6b")->read() >> 16) & 0xff;
773      UINT8 portb = (machine().root_device().ioport("md6b")->read() >> 24) & 0xff;
774      UINT8 extra = (machine().root_device().ioport("md6b_extra")->read() >> 4) & 0x0f;
783775
784      switch(state->m_mdctrl.seq2)
776      switch(m_mdctrl.seq2)
785777      {
786778         case 1:
787779         default:
788            if(state->m_mdctrl.mux2 & 0x20)
780            if(m_mdctrl.mux2 & 0x20)
789781            {
790782               return porta | 0x90;
791783            }
r18260r18261
794786               return (portb & 0x60) | (porta & 0x03) | 0x90;
795787            }
796788         case 2:
797            if(state->m_mdctrl.mux2 & 0x20)
789            if(m_mdctrl.mux2 & 0x20)
798790            {
799791               return porta | 0x90;
800792            }
r18260r18261
803795               return (portb & 0x60) | 0x90;
804796            }
805797         case 3:
806            if(state->m_mdctrl.mux2 & 0x20)
798            if(m_mdctrl.mux2 & 0x20)
807799            {
808800               return (porta & 0x60) | (extra & 0x0f) | 0x90;
809801            }
r18260r18261
823815// Output is the same as for standard controllers, but when ctl is high,
824816// the directions refer to the right D-pad, and when low, the left D-pad
825817// The buttons are read the same as normal, regardless of ctl.
826static UINT8 xpd1lr_r(device_t* device, int port)
818UINT8 x68k_state::xpd1lr_r(int port)
827819{
828   x68k_state *state = device->machine().driver_data<x68k_state>();
829820   if(port == 1)
830821   {
831      UINT8 porta = device->machine().root_device().ioport("xpd1lr")->read() & 0xff;
832      UINT8 portb = (state->ioport("xpd1lr")->read() >> 8) & 0xff;
833      if(state->m_mdctrl.mux1 & 0x10)
822      UINT8 porta = machine().root_device().ioport("xpd1lr")->read() & 0xff;
823      UINT8 portb = (ioport("xpd1lr")->read() >> 8) & 0xff;
824      if(m_mdctrl.mux1 & 0x10)
834825      {
835826         return porta;
836827      }
r18260r18261
841832   }
842833   if(port == 2)
843834   {
844      UINT8 porta = (device->machine().root_device().ioport("xpd1lr")->read() >> 16) & 0xff;
845      UINT8 portb = (device->machine().root_device().ioport("xpd1lr")->read() >> 24) & 0xff;
846      if(state->m_mdctrl.mux2 & 0x20)
835      UINT8 porta = (machine().root_device().ioport("xpd1lr")->read() >> 16) & 0xff;
836      UINT8 portb = (machine().root_device().ioport("xpd1lr")->read() >> 24) & 0xff;
837      if(m_mdctrl.mux2 & 0x20)
847838      {
848839         return porta;
849840      }
r18260r18261
868859         else
869860            return 0xff;
870861      case 0x01:  // 3-button Megadrive gamepad
871         return md_3button_r(machine().device("ppi8255"),1);
862         return md_3button_r(1);
872863      case 0x02:  // 6-button Megadrive gamepad
873         return md_6button_r(machine().device("ppi8255"),1);
864         return md_6button_r(1);
874865      case 0x03:  // XPD-1LR
875         return xpd1lr_r(machine().device("ppi8255"),1);
866         return xpd1lr_r(1);
876867   }
877868
878869   return 0xff;
r18260r18261
890881         else
891882            return 0xff;
892883      case 0x10:  // 3-button Megadrive gamepad
893         return md_3button_r(machine().device("ppi8255"),2);
884         return md_3button_r(2);
894885      case 0x20:  // 6-button Megadrive gamepad
895         return md_6button_r(machine().device("ppi8255"),2);
886         return md_6button_r(2);
896887      case 0x30:  // XPD-1LR
897         return xpd1lr_r(machine().device("ppi8255"),2);
888         return xpd1lr_r(2);
898889   }
899890
900891   return 0xff;
r18260r18261
923914   {
924915      m_adpcm.pan = data & 0x03;
925916      m_adpcm.rate = data & 0x0c;
926      x68k_set_adpcm(machine());
917      x68k_set_adpcm();
927918      okim6258_set_divider(oki, (data >> 2) & 3);
928919   }
929920
r18260r18261
951942
952943
953944// NEC uPD72065 at 0xe94000
954static WRITE16_HANDLER( x68k_fdc_w )
945WRITE16_MEMBER(x68k_state::x68k_fdc_w)
955946{
956   x68k_state *state = space.machine().driver_data<x68k_state>();
957   device_t *fdc = space.machine().device("upd72065");
947   device_t *fdc = machine().device("upd72065");
958948   unsigned int drive, x;
959949   switch(offset)
960950   {
r18260r18261
966956      x = data & 0x0f;
967957      for(drive=0;drive<4;drive++)
968958      {
969         if(state->m_fdc.selected_drive & (1 << drive))
959         if(m_fdc.selected_drive & (1 << drive))
970960         {
971961            if(!(x & (1 << drive)))  // functions take place on 1->0 transitions of drive bits only
972962            {
973               state->m_fdc.led_ctrl[drive] = data & 0x80;  // blinking drive LED if no disk inserted
974               state->m_fdc.led_eject[drive] = data & 0x40;  // eject button LED (on when set to 0)
963               m_fdc.led_ctrl[drive] = data & 0x80;  // blinking drive LED if no disk inserted
964               m_fdc.led_eject[drive] = data & 0x40;  // eject button LED (on when set to 0)
975965               output_set_indexed_value("eject_drv",drive,(data & 0x40) ? 1 : 0);
976966               if(data & 0x20)  // ejects disk
977967               {
978                  (dynamic_cast<device_image_interface *>(floppy_get_device(space.machine(), drive)))->unload();
979                  floppy_mon_w(floppy_get_device(space.machine(), drive), ASSERT_LINE);
968                  (dynamic_cast<device_image_interface *>(floppy_get_device(machine(), drive)))->unload();
969                  floppy_mon_w(floppy_get_device(machine(), drive), ASSERT_LINE);
980970               }
981971            }
982972         }
983973      }
984      state->m_fdc.selected_drive = data & 0x0f;
974      m_fdc.selected_drive = data & 0x0f;
985975      logerror("FDC: signal control set to %02x\n",data);
986976      break;
987977   case 0x03:
988      state->m_fdc.media_density[data & 0x03] = data & 0x10;
989      state->m_fdc.motor[data & 0x03] = data & 0x80;
990      floppy_mon_w(floppy_get_device(space.machine(), data & 0x03), !BIT(data, 7));
978      m_fdc.media_density[data & 0x03] = data & 0x10;
979      m_fdc.motor[data & 0x03] = data & 0x80;
980      floppy_mon_w(floppy_get_device(machine(), data & 0x03), !BIT(data, 7));
991981      if(data & 0x80)
992982      {
993983         for(drive=0;drive<4;drive++) // enable motor for this drive
994984         {
995985            if(drive == (data & 0x03))
996986            {
997               floppy_mon_w(floppy_get_device(space.machine(), drive), CLEAR_LINE);
987               floppy_mon_w(floppy_get_device(machine(), drive), CLEAR_LINE);
998988               output_set_indexed_value("access_drv",drive,0);
999989            }
1000990            else
r18260r18261
1005995      {
1006996         for(drive=0;drive<4;drive++)
1007997         {
1008            floppy_mon_w(floppy_get_device(space.machine(), drive), ASSERT_LINE);
998            floppy_mon_w(floppy_get_device(machine(), drive), ASSERT_LINE);
1009999            output_set_indexed_value("access_drv",drive,1);
10101000         }
10111001      }
1012      floppy_drive_set_ready_state(floppy_get_device(space.machine(), 0),1,1);
1013      floppy_drive_set_ready_state(floppy_get_device(space.machine(), 1),1,1);
1014      floppy_drive_set_ready_state(floppy_get_device(space.machine(), 2),1,1);
1015      floppy_drive_set_ready_state(floppy_get_device(space.machine(), 3),1,1);
1002      floppy_drive_set_ready_state(floppy_get_device(machine(), 0),1,1);
1003      floppy_drive_set_ready_state(floppy_get_device(machine(), 1),1,1);
1004      floppy_drive_set_ready_state(floppy_get_device(machine(), 2),1,1);
1005      floppy_drive_set_ready_state(floppy_get_device(machine(), 3),1,1);
10161006#if 0
10171007      for(drive=0;drive<4;drive++)
10181008      {
r18260r18261
10301020   }
10311021}
10321022
1033static READ16_HANDLER( x68k_fdc_r )
1023READ16_MEMBER(x68k_state::x68k_fdc_r)
10341024{
1035   x68k_state *state = space.machine().driver_data<x68k_state>();
10361025   unsigned int ret;
10371026   int x;
1038   device_t *fdc = space.machine().device("upd72065");
1027   device_t *fdc = machine().device("upd72065");
10391028
10401029   switch(offset)
10411030   {
r18260r18261
10471036      ret = 0x00;
10481037      for(x=0;x<4;x++)
10491038      {
1050         if(state->m_fdc.selected_drive & (1 << x))
1039         if(m_fdc.selected_drive & (1 << x))
10511040         {
10521041            ret = 0x00;
1053            if(state->m_fdc.disk_inserted[x] != 0)
1042            if(m_fdc.disk_inserted[x] != 0)
10541043            {
10551044               ret |= 0x80;
10561045            }
r18260r18261
11041093   m_fdc.drq_state = state;
11051094}
11061095
1107static WRITE16_HANDLER( x68k_fm_w )
1096WRITE16_MEMBER(x68k_state::x68k_fm_w)
11081097{
11091098   switch(offset)
11101099   {
11111100   case 0x00:
11121101   case 0x01:
1113      ym2151_w(space.machine().device("ym2151"), space, offset, data);
1102      ym2151_w(machine().device("ym2151"), space, offset, data);
11141103      break;
11151104   }
11161105}
11171106
1118static READ16_HANDLER( x68k_fm_r )
1107READ16_MEMBER(x68k_state::x68k_fm_r)
11191108{
11201109   if(offset == 0x01)
1121      return ym2151_r(space.machine().device("ym2151"), space, 1);
1110      return ym2151_r(machine().device("ym2151"), space, 1);
11221111
11231112   return 0xffff;
11241113}
r18260r18261
11331122   // CT2 - 1 = Set ready state of FDC
11341123   upd765_ready_w(fdc,data & 0x01);
11351124   m_adpcm.clock = data & 0x02;
1136   x68k_set_adpcm(machine());
1125   x68k_set_adpcm();
11371126   okim6258_set_clock(okim, data & 0x02 ? 4000000 : 8000000);
11381127}
11391128
r18260r18261
11531142                - bits 7-2 = vector
11541143                - bits 1,0 = device (00 = FDC, 01 = FDD, 10 = HDD, 11 = Printer)
11551144*/
1156static WRITE16_HANDLER( x68k_ioc_w )
1145WRITE16_MEMBER(x68k_state::x68k_ioc_w)
11571146{
1158   x68k_state *state = space.machine().driver_data<x68k_state>();
11591147   switch(offset)
11601148   {
11611149   case 0x00:
1162      state->m_ioc.irqstatus = data & 0x0f;
1150      m_ioc.irqstatus = data & 0x0f;
11631151      logerror("I/O: Status register write %02x\n",data);
11641152      break;
11651153   case 0x01:
11661154      switch(data & 0x03)
11671155      {
11681156      case 0x00:
1169         state->m_ioc.fdcvector = data & 0xfc;
1157         m_ioc.fdcvector = data & 0xfc;
11701158         logerror("IOC: FDC IRQ vector = 0x%02x\n",data & 0xfc);
11711159         break;
11721160      case 0x01:
1173         state->m_ioc.fddvector = data & 0xfc;
1161         m_ioc.fddvector = data & 0xfc;
11741162         logerror("IOC: FDD IRQ vector = 0x%02x\n",data & 0xfc);
11751163         break;
11761164      case 0x02:
1177         state->m_ioc.hdcvector = data & 0xfc;
1165         m_ioc.hdcvector = data & 0xfc;
11781166         logerror("IOC: HDD IRQ vector = 0x%02x\n",data & 0xfc);
11791167         break;
11801168      case 0x03:
1181         state->m_ioc.prnvector = data & 0xfc;
1169         m_ioc.prnvector = data & 0xfc;
11821170         logerror("IOC: Printer IRQ vector = 0x%02x\n",data & 0xfc);
11831171         break;
11841172      }
r18260r18261
11861174   }
11871175}
11881176
1189static READ16_HANDLER( x68k_ioc_r )
1177READ16_MEMBER(x68k_state::x68k_ioc_r)
11901178{
1191   x68k_state *state = space.machine().driver_data<x68k_state>();
11921179   switch(offset)
11931180   {
11941181   case 0x00:
11951182      logerror("I/O: Status register read\n");
1196      return (state->m_ioc.irqstatus & 0xdf) | 0x20;
1183      return (m_ioc.irqstatus & 0xdf) | 0x20;
11971184   default:
11981185      return 0x00;
11991186   }
r18260r18261
12191206                                         Any other value, then SRAM is read only.
12201207 Port 8 (0xe8e00f) - Power off control - write 0x00, 0x0f, 0x0f sequentially to switch power off.
12211208*/
1222static WRITE16_HANDLER( x68k_sysport_w )
1209WRITE16_MEMBER(x68k_state::x68k_sysport_w)
12231210{
1224   x68k_state *state = space.machine().driver_data<x68k_state>();
12251211   switch(offset)
12261212   {
12271213   case 0x00:
1228      state->m_sysport.contrast = data & 0x0f;  // often used for screen fades / blanking
1214      m_sysport.contrast = data & 0x0f;  // often used for screen fades / blanking
12291215      // TODO: implement a decent, not slow, brightness control
12301216      break;
12311217   case 0x01:
1232      state->m_sysport.monitor = data & 0x08;
1218      m_sysport.monitor = data & 0x08;
12331219      break;
12341220   case 0x03:
1235      state->m_sysport.keyctrl = data & 0x08;  // bit 3 = enable keyboard data transmission
1221      m_sysport.keyctrl = data & 0x08;  // bit 3 = enable keyboard data transmission
12361222      break;
12371223   case 0x06:
1238      state->m_sysport.sram_writeprotect = data;
1224      m_sysport.sram_writeprotect = data;
12391225      break;
12401226   default:
12411227//      logerror("SYS: [%08x] Wrote %04x to invalid or unimplemented system port %04x\n",space.device().safe_pc(),data,offset);
r18260r18261
12431229   }
12441230}
12451231
1246static READ16_HANDLER( x68k_sysport_r )
1232READ16_MEMBER(x68k_state::x68k_sysport_r)
12471233{
1248   x68k_state *state = space.machine().driver_data<x68k_state>();
12491234   int ret = 0;
12501235   switch(offset)
12511236   {
12521237   case 0x00:  // monitor contrast setting (bits3-0)
1253      return state->m_sysport.contrast;
1238      return m_sysport.contrast;
12541239   case 0x01:  // monitor control (bit3) / 3D Scope (bits1,0)
1255      ret |= state->m_sysport.monitor;
1240      ret |= m_sysport.monitor;
12561241      return ret;
12571242   case 0x03:  // bit 3 = key control (is 1 if keyboard is connected)
12581243      return 0x08;
12591244   case 0x05:  // CPU type and speed
1260      return state->m_sysport.cputype;
1245      return m_sysport.cputype;
12611246   default:
12621247      logerror("Read from invalid or unimplemented system port %04x\n",offset);
12631248      return 0xff;
r18260r18261
12651250}
12661251
12671252#ifdef UNUSED_FUNCTION
1268static READ16_HANDLER( x68k_mfp_r )
1253READ16_MEMBER(x68k_state::x68k_mfp_r)
12691254{
1270   device_t *x68k_mfp = space.machine().device(MC68901_TAG);
1255   device_t *x68k_mfp = machine().device(MC68901_TAG);
12711256
12721257   return mc68901_register_r(x68k_mfp, offset);
12731258}
12741259#endif
12751260
1276static READ16_HANDLER( x68k_mfp_r )
1261READ16_MEMBER(x68k_state::x68k_mfp_r)
12771262{
1278   x68k_state *state = space.machine().driver_data<x68k_state>();
12791263
12801264   // Initial settings indicate that IRQs are generated for FM (YM2151), Receive buffer error or full,
12811265    // MFP Timer C, and the power switch
r18260r18261
12851269#if 0
12861270    case 0x00:  // GPIP - General purpose I/O register (read-only)
12871271        ret = 0x23;
1288        if(machine.primary_screen->vpos() == state->m_crtc.reg[9])
1272        if(machine.primary_screen->vpos() == m_crtc.reg[9])
12891273            ret |= 0x40;
1290        if(state->m_crtc.vblank == 0)
1274        if(m_crtc.vblank == 0)
12911275            ret |= 0x10;  // Vsync signal (low if in vertical retrace)
1292//      if(state->m_mfp.isrb & 0x08)
1276//      if(m_mfp.isrb & 0x08)
12931277//          ret |= 0x08;  // FM IRQ signal
1294        if(machine.primary_screen->hpos() > state->m_crtc.width - 32)
1278        if(machine.primary_screen->hpos() > m_crtc.width - 32)
12951279            ret |= 0x80;  // Hsync signal
12961280//      logerror("MFP: [%08x] Reading offset %i (ret=%02x)\n",space.device().safe_pc(),offset,ret);
12971281        return ret;  // bit 5 is always 1
12981282    case 3:
1299        return state->m_mfp.iera;
1283        return m_mfp.iera;
13001284    case 4:
1301        return state->m_mfp.ierb;
1285        return m_mfp.ierb;
13021286    case 5:
1303        return state->m_mfp.ipra;
1287        return m_mfp.ipra;
13041288    case 6:
1305        return state->m_mfp.iprb;
1289        return m_mfp.iprb;
13061290    case 7:
1307        if(state->m_mfp.eoi_mode == 0)  // forced low in auto EOI mode
1291        if(m_mfp.eoi_mode == 0)  // forced low in auto EOI mode
13081292            return 0;
13091293        else
1310            return state->m_mfp.isra;
1294            return m_mfp.isra;
13111295    case 8:
1312        if(state->m_mfp.eoi_mode == 0)  // forced low in auto EOI mode
1296        if(m_mfp.eoi_mode == 0)  // forced low in auto EOI mode
13131297            return 0;
13141298        else
1315            return state->m_mfp.isrb;
1299            return m_mfp.isrb;
13161300    case 9:
1317        return state->m_mfp.imra;
1301        return m_mfp.imra;
13181302    case 10:
1319        return state->m_mfp.imrb;
1303        return m_mfp.imrb;
13201304    case 15:  // TADR
1321        return state->m_mfp.timer[0].counter;  // Timer data registers return their main counter values
1305        return m_mfp.timer[0].counter;  // Timer data registers return their main counter values
13221306    case 16:  // TBDR
1323        return state->m_mfp.timer[1].counter;
1307        return m_mfp.timer[1].counter;
13241308    case 17:  // TCDR
1325        return state->m_mfp.timer[2].counter;
1309        return m_mfp.timer[2].counter;
13261310    case 18:  // TDDR
1327        return state->m_mfp.timer[3].counter;
1311        return m_mfp.timer[3].counter;
13281312#endif
13291313    case 21:  // RSR
1330        return state->m_mfp.rsr;
1314        return m_mfp.rsr;
13311315    case 22:  // TSR
1332        return state->m_mfp.tsr | 0x80;  // buffer is typically empty?
1316        return m_mfp.tsr | 0x80;  // buffer is typically empty?
13331317    case 23:
1334        return x68k_keyboard_pop_scancode(state);
1318        return x68k_keyboard_pop_scancode();
13351319    default:
1336      if (ACCESSING_BITS_0_7) return state->m_mfpdev->read(space, offset);
1320      if (ACCESSING_BITS_0_7) return m_mfpdev->read(space, offset);
13371321    }
13381322    return 0xffff;
13391323}
13401324
1341static WRITE16_HANDLER( x68k_mfp_w )
1325WRITE16_MEMBER(x68k_state::x68k_mfp_w)
13421326{
1343   x68k_state *state = space.machine().driver_data<x68k_state>();
13441327
13451328   /* For the Interrupt registers, the bits are set out as such:
13461329       Reg A - bit 7: GPIP7 (HSync)
r18260r18261
13671350        // All bits are inputs generally, so no action taken.
13681351        break;
13691352    case 1:  // AER
1370        state->m_mfp.aer = data;
1353        m_mfp.aer = data;
13711354        break;
13721355    case 2:  // DDR
1373        state->m_mfp.ddr = data;  // usually all bits are 0 (input)
1356        m_mfp.ddr = data;  // usually all bits are 0 (input)
13741357        break;
13751358    case 3:  // IERA
1376        state->m_mfp.iera = data;
1359        m_mfp.iera = data;
13771360        break;
13781361    case 4:  // IERB
1379        state->m_mfp.ierb = data;
1362        m_mfp.ierb = data;
13801363        break;
13811364    case 5:  // IPRA
1382        state->m_mfp.ipra = data;
1365        m_mfp.ipra = data;
13831366        break;
13841367    case 6:  // IPRB
1385        state->m_mfp.iprb = data;
1368        m_mfp.iprb = data;
13861369        break;
13871370    case 7:
1388        state->m_mfp.isra = data;
1371        m_mfp.isra = data;
13891372        break;
13901373    case 8:
1391        state->m_mfp.isrb = data;
1374        m_mfp.isrb = data;
13921375        break;
13931376    case 9:
1394        state->m_mfp.imra = data;
1377        m_mfp.imra = data;
13951378//      mfp_update_irq(0);
13961379//      logerror("MFP: IRQ Mask A write: %02x\n",data);
13971380        break;
13981381    case 10:
1399        state->m_mfp.imrb = data;
1382        m_mfp.imrb = data;
14001383//      mfp_update_irq(0);
14011384//      logerror("MFP: IRQ Mask B write: %02x\n",data);
14021385        break;
14031386    case 11:  // VR
1404        state->m_mfp.vr = 0x40;//data;  // High 4 bits = high 4 bits of IRQ vector
1405        state->m_mfp.eoi_mode = data & 0x08;  // 0 = Auto, 1 = Software End-of-interrupt
1406        if(state->m_mfp.eoi_mode == 0)  // In-service registers are cleared if this bit is cleared.
1387        m_mfp.vr = 0x40;//data;  // High 4 bits = high 4 bits of IRQ vector
1388        m_mfp.eoi_mode = data & 0x08;  // 0 = Auto, 1 = Software End-of-interrupt
1389        if(m_mfp.eoi_mode == 0)  // In-service registers are cleared if this bit is cleared.
14071390        {
1408            state->m_mfp.isra = 0;
1409            state->m_mfp.isrb = 0;
1391            m_mfp.isra = 0;
1392            m_mfp.isrb = 0;
14101393        }
14111394        break;
14121395    case 12:  // TACR
1413        state->m_mfp.tacr = data;
1396        m_mfp.tacr = data;
14141397        mfp_set_timer(0,data & 0x0f);
14151398        break;
14161399    case 13:  // TBCR
1417        state->m_mfp.tbcr = data;
1400        m_mfp.tbcr = data;
14181401        mfp_set_timer(1,data & 0x0f);
14191402        break;
14201403    case 14:  // TCDCR
1421        state->m_mfp.tcdcr = data;
1404        m_mfp.tcdcr = data;
14221405        mfp_set_timer(2,(data & 0x70)>>4);
14231406        mfp_set_timer(3,data & 0x07);
14241407        break;
14251408    case 15:  // TADR
1426        state->m_mfp.tadr = data;
1427        state->m_mfp.timer[0].counter = data;
1409        m_mfp.tadr = data;
1410        m_mfp.timer[0].counter = data;
14281411        break;
14291412    case 16:  // TBDR
1430        state->m_mfp.tbdr = data;
1431        state->m_mfp.timer[1].counter = data;
1413        m_mfp.tbdr = data;
1414        m_mfp.timer[1].counter = data;
14321415        break;
14331416    case 17:  // TCDR
1434        state->m_mfp.tcdr = data;
1435        state->m_mfp.timer[2].counter = data;
1417        m_mfp.tcdr = data;
1418        m_mfp.timer[2].counter = data;
14361419        break;
14371420    case 18:  // TDDR
1438        state->m_mfp.tddr = data;
1439        state->m_mfp.timer[3].counter = data;
1421        m_mfp.tddr = data;
1422        m_mfp.timer[3].counter = data;
14401423        break;
14411424    case 20:
1442        state->m_mfp.ucr = data;
1425        m_mfp.ucr = data;
14431426        break;
14441427#endif
14451428   case 21:
14461429      if(data & 0x01)
1447         state->m_mfp.usart.recv_enable = 1;
1430         m_mfp.usart.recv_enable = 1;
14481431      else
1449         state->m_mfp.usart.recv_enable = 0;
1432         m_mfp.usart.recv_enable = 0;
14501433      break;
14511434   case 22:
14521435      if(data & 0x01)
1453         state->m_mfp.usart.send_enable = 1;
1436         m_mfp.usart.send_enable = 1;
14541437      else
1455         state->m_mfp.usart.send_enable = 0;
1438         m_mfp.usart.send_enable = 0;
14561439      break;
14571440   case 23:
1458      if(state->m_mfp.usart.send_enable != 0)
1441      if(m_mfp.usart.send_enable != 0)
14591442      {
14601443         // Keyboard control command.
1461         state->m_mfp.usart.send_buffer = data;
1462         x68k_keyboard_ctrl_w(state, data);
1444         m_mfp.usart.send_buffer = data;
1445         x68k_keyboard_ctrl_w(data);
14631446//          logerror("MFP: [%08x] USART Sent data %04x\n",space.device().safe_pc(),data);
14641447      }
14651448      break;
14661449   default:
1467      if (ACCESSING_BITS_0_7) state->m_mfpdev->write(space, offset, data & 0xff);
1450      if (ACCESSING_BITS_0_7) m_mfpdev->write(space, offset, data & 0xff);
14681451      return;
14691452   }
14701453}
14711454
14721455
1473static WRITE16_HANDLER( x68k_ppi_w )
1456WRITE16_MEMBER(x68k_state::x68k_ppi_w)
14741457{
1475   i8255_device *ppi = space.machine().device<i8255_device>("ppi8255");
1458   i8255_device *ppi = machine().device<i8255_device>("ppi8255");
14761459   ppi->write(space,offset & 0x03,data);
14771460}
14781461
1479static READ16_HANDLER( x68k_ppi_r )
1462READ16_MEMBER(x68k_state::x68k_ppi_r)
14801463{
1481   i8255_device *ppi = space.machine().device<i8255_device>("ppi8255");
1464   i8255_device *ppi = machine().device<i8255_device>("ppi8255");
14821465   return ppi->read(space,offset & 0x03);
14831466}
14841467
1485static READ16_HANDLER( x68k_rtc_r )
1468READ16_MEMBER(x68k_state::x68k_rtc_r)
14861469{
1487   x68k_state *state = space.machine().driver_data<x68k_state>();
1488
1489   return state->m_rtc->read(space, offset);
1470   return m_rtc->read(space, offset);
14901471}
14911472
1492static WRITE16_HANDLER( x68k_rtc_w )
1473WRITE16_MEMBER(x68k_state::x68k_rtc_w)
14931474{
1494   x68k_state *state = space.machine().driver_data<x68k_state>();
1495
1496   state->m_rtc->write(space, offset, data);
1475   m_rtc->write(space, offset, data);
14971476}
14981477
14991478WRITE_LINE_MEMBER(x68k_state::x68k_rtc_alarm_irq)
r18260r18261
15191498}
15201499
15211500
1522static WRITE16_HANDLER( x68k_sram_w )
1501WRITE16_MEMBER(x68k_state::x68k_sram_w)
15231502{
1524   x68k_state *state = space.machine().driver_data<x68k_state>();
1525
1526   if(state->m_sysport.sram_writeprotect == 0x31)
1503   if(m_sysport.sram_writeprotect == 0x31)
15271504   {
1528      COMBINE_DATA(state->m_nvram16 + offset);
1505      COMBINE_DATA(m_nvram16 + offset);
15291506   }
15301507}
15311508
1532static READ16_HANDLER( x68k_sram_r )
1509READ16_MEMBER(x68k_state::x68k_sram_r)
15331510{
1534   x68k_state *state = space.machine().driver_data<x68k_state>();
15351511   // HACKS!
15361512//  if(offset == 0x5a/2)  // 0x5a should be 0 if no SASI HDs are present.
15371513//      return 0x0000;
15381514   if(offset == 0x08/2)
1539      return space.machine().device<ram_device>(RAM_TAG)->size() >> 16;  // RAM size
1515      return machine().device<ram_device>(RAM_TAG)->size() >> 16;  // RAM size
15401516#if 0
15411517   if(offset == 0x46/2)
15421518      return 0x0024;
r18260r18261
15451521   if(offset == 0x70/2)
15461522      return 0x0700;
15471523#endif
1548   return state->m_nvram16[offset];
1524   return m_nvram16[offset];
15491525}
15501526
1551static READ32_HANDLER( x68k_sram32_r )
1527READ32_MEMBER(x68k_state::x68k_sram32_r)
15521528{
1553   x68k_state *state = space.machine().driver_data<x68k_state>();
15541529   if(offset == 0x08/4)
1555      return (space.machine().device<ram_device>(RAM_TAG)->size() & 0xffff0000);  // RAM size
1530      return (machine().device<ram_device>(RAM_TAG)->size() & 0xffff0000);  // RAM size
15561531#if 0
15571532   if(offset == 0x46/2)
15581533      return 0x0024;
r18260r18261
15611536   if(offset == 0x70/2)
15621537      return 0x0700;
15631538#endif
1564   return state->m_nvram32[offset];
1539   return m_nvram32[offset];
15651540}
15661541
1567static WRITE32_HANDLER( x68k_sram32_w )
1542WRITE32_MEMBER(x68k_state::x68k_sram32_w)
15681543{
1569   x68k_state *state = space.machine().driver_data<x68k_state>();
1570   if(state->m_sysport.sram_writeprotect == 0x31)
1544   if(m_sysport.sram_writeprotect == 0x31)
15711545   {
1572      COMBINE_DATA(state->m_nvram32 + offset);
1546      COMBINE_DATA(m_nvram32 + offset);
15731547   }
15741548}
15751549
1576static WRITE16_HANDLER( x68k_vid_w )
1550WRITE16_MEMBER(x68k_state::x68k_vid_w)
15771551{
1578   x68k_state *state = space.machine().driver_data<x68k_state>();
15791552   int val;
15801553   if(offset < 0x100)  // Graphic layer palette
15811554   {
1582      COMBINE_DATA(state->m_video.gfx_pal+offset);
1583      val = state->m_video.gfx_pal[offset];
1584      palette_set_color_rgb(space.machine(),offset,(val & 0x07c0) >> 3,(val & 0xf800) >> 8,(val & 0x003e) << 2);
1555      COMBINE_DATA(m_video.gfx_pal+offset);
1556      val = m_video.gfx_pal[offset];
1557      palette_set_color_rgb(machine(),offset,(val & 0x07c0) >> 3,(val & 0xf800) >> 8,(val & 0x003e) << 2);
15851558      return;
15861559   }
15871560
15881561   if(offset >= 0x100 && offset < 0x200)  // Text / Sprites / Tilemap palette
15891562   {
1590      COMBINE_DATA(state->m_video.text_pal+(offset-0x100));
1591      val = state->m_video.text_pal[offset-0x100];
1592      palette_set_color_rgb(space.machine(),offset,(val & 0x07c0) >> 3,(val & 0xf800) >> 8,(val & 0x003e) << 2);
1563      COMBINE_DATA(m_video.text_pal+(offset-0x100));
1564      val = m_video.text_pal[offset-0x100];
1565      palette_set_color_rgb(machine(),offset,(val & 0x07c0) >> 3,(val & 0xf800) >> 8,(val & 0x003e) << 2);
15931566      return;
15941567   }
15951568
15961569   switch(offset)
15971570   {
15981571   case 0x200:
1599      COMBINE_DATA(state->m_video.reg);
1572      COMBINE_DATA(m_video.reg);
16001573      break;
16011574   case 0x280:  // priority levels
1602      COMBINE_DATA(state->m_video.reg+1);
1575      COMBINE_DATA(m_video.reg+1);
16031576      if(ACCESSING_BITS_0_7)
16041577      {
1605         state->m_video.gfxlayer_pri[0] = data & 0x0003;
1606         state->m_video.gfxlayer_pri[1] = (data & 0x000c) >> 2;
1607         state->m_video.gfxlayer_pri[2] = (data & 0x0030) >> 4;
1608         state->m_video.gfxlayer_pri[3] = (data & 0x00c0) >> 6;
1578         m_video.gfxlayer_pri[0] = data & 0x0003;
1579         m_video.gfxlayer_pri[1] = (data & 0x000c) >> 2;
1580         m_video.gfxlayer_pri[2] = (data & 0x0030) >> 4;
1581         m_video.gfxlayer_pri[3] = (data & 0x00c0) >> 6;
16091582      }
16101583      if(ACCESSING_BITS_8_15)
16111584      {
1612         state->m_video.gfx_pri = (data & 0x0300) >> 8;
1613         state->m_video.text_pri = (data & 0x0c00) >> 10;
1614         state->m_video.sprite_pri = (data & 0x3000) >> 12;
1615         if(state->m_video.gfx_pri == 3)
1616            state->m_video.gfx_pri--;
1617         if(state->m_video.text_pri == 3)
1618            state->m_video.text_pri--;
1619         if(state->m_video.sprite_pri == 3)
1620            state->m_video.sprite_pri--;
1585         m_video.gfx_pri = (data & 0x0300) >> 8;
1586         m_video.text_pri = (data & 0x0c00) >> 10;
1587         m_video.sprite_pri = (data & 0x3000) >> 12;
1588         if(m_video.gfx_pri == 3)
1589            m_video.gfx_pri--;
1590         if(m_video.text_pri == 3)
1591            m_video.text_pri--;
1592         if(m_video.sprite_pri == 3)
1593            m_video.sprite_pri--;
16211594      }
16221595      break;
16231596   case 0x300:
1624      COMBINE_DATA(state->m_video.reg+2);
1597      COMBINE_DATA(m_video.reg+2);
16251598      break;
16261599   default:
16271600      logerror("VC: Invalid video controller write (offset = 0x%04x, data = %04x)\n",offset,data);
16281601   }
16291602}
16301603
1631static READ16_HANDLER( x68k_vid_r )
1604READ16_MEMBER(x68k_state::x68k_vid_r)
16321605{
1633   x68k_state *state = space.machine().driver_data<x68k_state>();
16341606   if(offset < 0x100)
1635      return state->m_video.gfx_pal[offset];
1607      return m_video.gfx_pal[offset];
16361608
16371609   if(offset >= 0x100 && offset < 0x200)
1638      return state->m_video.text_pal[offset-0x100];
1610      return m_video.text_pal[offset-0x100];
16391611
16401612   switch(offset)
16411613   {
16421614   case 0x200:
1643      return state->m_video.reg[0];
1615      return m_video.reg[0];
16441616   case 0x280:
1645      return state->m_video.reg[1];
1617      return m_video.reg[1];
16461618   case 0x300:
1647      return state->m_video.reg[2];
1619      return m_video.reg[2];
16481620   default:
16491621      logerror("VC: Invalid video controller read (offset = 0x%04x)\n",offset);
16501622   }
r18260r18261
16521624   return 0xff;
16531625}
16541626
1655static READ16_HANDLER( x68k_areaset_r )
1627READ16_MEMBER(x68k_state::x68k_areaset_r)
16561628{
16571629   // register is write-only
16581630   return 0xffff;
16591631}
16601632
1661static WRITE16_HANDLER( x68k_areaset_w )
1633WRITE16_MEMBER(x68k_state::x68k_areaset_w)
16621634{
16631635   // TODO
16641636   logerror("SYS: Supervisor area set: 0x%02x\n",data & 0xff);
16651637}
16661638
1667static WRITE16_HANDLER( x68k_enh_areaset_w )
1639WRITE16_MEMBER(x68k_state::x68k_enh_areaset_w )
16681640{
16691641   // TODO
16701642   logerror("SYS: Enhanced Supervisor area set (from %iMB): 0x%02x\n",(offset + 1) * 2,data & 0xff);
r18260r18261
16881660   }
16891661}
16901662
1691static READ16_HANDLER( x68k_rom0_r )
1663READ16_MEMBER(x68k_state::x68k_rom0_r)
16921664{
1693   x68k_state *state = space.machine().driver_data<x68k_state>();
16941665   /* this location contains the address of some expansion device ROM, if no ROM exists,
16951666       then access causes a bus error */
1696   state->m_current_vector[2] = 0x02;  // bus error
1697   state->m_current_irq_line = 2;
1698//  space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]);
1699   if(state->ioport("options")->read() & 0x02)
1667   m_current_vector[2] = 0x02;  // bus error
1668   m_current_irq_line = 2;
1669//  machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,m_current_vector[2]);
1670   if(ioport("options")->read() & 0x02)
17001671   {
17011672      offset *= 2;
17021673      if(ACCESSING_BITS_0_7)
17031674         offset++;
1704      space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),state), 0xbffffc+offset);
1675      machine().scheduler().timer_set(machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),this), 0xbffffc+offset);
17051676   }
17061677   return 0xff;
17071678}
17081679
1709static WRITE16_HANDLER( x68k_rom0_w )
1680WRITE16_MEMBER(x68k_state::x68k_rom0_w)
17101681{
1711   x68k_state *state = space.machine().driver_data<x68k_state>();
17121682   /* this location contains the address of some expansion device ROM, if no ROM exists,
17131683       then access causes a bus error */
1714   state->m_current_vector[2] = 0x02;  // bus error
1715   state->m_current_irq_line = 2;
1716//  space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]);
1717   if(state->ioport("options")->read() & 0x02)
1684   m_current_vector[2] = 0x02;  // bus error
1685   m_current_irq_line = 2;
1686//  machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,m_current_vector[2]);
1687   if(ioport("options")->read() & 0x02)
17181688   {
17191689      offset *= 2;
17201690      if(ACCESSING_BITS_0_7)
17211691         offset++;
1722      space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),state), 0xbffffc+offset);
1692      machine().scheduler().timer_set(machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),this), 0xbffffc+offset);
17231693   }
17241694}
17251695
1726static READ16_HANDLER( x68k_emptyram_r )
1696READ16_MEMBER(x68k_state::x68k_emptyram_r)
17271697{
1728   x68k_state *state = space.machine().driver_data<x68k_state>();
17291698   /* this location is unused RAM, access here causes a bus error
17301699       Often a method for detecting amount of installed RAM, is to read or write at 1MB intervals, until a bus error occurs */
1731   state->m_current_vector[2] = 0x02;  // bus error
1732   state->m_current_irq_line = 2;
1733//  space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]);
1734   if(state->ioport("options")->read() & 0x02)
1700   m_current_vector[2] = 0x02;  // bus error
1701   m_current_irq_line = 2;
1702//  machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,m_current_vector[2]);
1703   if(ioport("options")->read() & 0x02)
17351704   {
17361705      offset *= 2;
17371706      if(ACCESSING_BITS_0_7)
17381707         offset++;
1739      space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),state), offset);
1708      machine().scheduler().timer_set(machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),this), offset);
17401709   }
17411710   return 0xff;
17421711}
17431712
1744static WRITE16_HANDLER( x68k_emptyram_w )
1713WRITE16_MEMBER(x68k_state::x68k_emptyram_w)
17451714{
1746   x68k_state *state = space.machine().driver_data<x68k_state>();
17471715   /* this location is unused RAM, access here causes a bus error
17481716       Often a method for detecting amount of installed RAM, is to read or write at 1MB intervals, until a bus error occurs */
1749   state->m_current_vector[2] = 0x02;  // bus error
1750   state->m_current_irq_line = 2;
1751//  space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]);
1752   if(state->ioport("options")->read() & 0x02)
1717   m_current_vector[2] = 0x02;  // bus error
1718   m_current_irq_line = 2;
1719//  machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,m_current_vector[2]);
1720   if(ioport("options")->read() & 0x02)
17531721   {
17541722      offset *= 2;
17551723      if(ACCESSING_BITS_0_7)
17561724         offset++;
1757      space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),state), offset);
1725      machine().scheduler().timer_set(machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),this), offset);
17581726   }
17591727}
17601728
1761static READ16_HANDLER( x68k_exp_r )
1729READ16_MEMBER(x68k_state::x68k_exp_r)
17621730{
1763   x68k_state *state = space.machine().driver_data<x68k_state>();
17641731   /* These are expansion devices, if not present, they cause a bus error */
1765   if(state->ioport("options")->read() & 0x02)
1732   if(ioport("options")->read() & 0x02)
17661733   {
1767      state->m_current_vector[2] = 0x02;  // bus error
1768      state->m_current_irq_line = 2;
1734      m_current_vector[2] = 0x02;  // bus error
1735      m_current_irq_line = 2;
17691736      offset *= 2;
17701737      if(ACCESSING_BITS_0_7)
17711738         offset++;
1772      space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(16), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),state), 0xeafa00+offset);
1739      machine().scheduler().timer_set(machine().device<cpu_device>("maincpu")->cycles_to_attotime(16), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),this), 0xeafa00+offset);
17731740//      machine.device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]);
17741741   }
17751742   return 0xffff;
17761743}
17771744
1778static WRITE16_HANDLER( x68k_exp_w )
1745WRITE16_MEMBER(x68k_state::x68k_exp_w)
17791746{
1780   x68k_state *state = space.machine().driver_data<x68k_state>();
17811747   /* These are expansion devices, if not present, they cause a bus error */
1782   if(state->ioport("options")->read() & 0x02)
1748   if(ioport("options")->read() & 0x02)
17831749   {
1784      state->m_current_vector[2] = 0x02;  // bus error
1785      state->m_current_irq_line = 2;
1750      m_current_vector[2] = 0x02;  // bus error
1751      m_current_irq_line = 2;
17861752      offset *= 2;
17871753      if(ACCESSING_BITS_0_7)
17881754         offset++;
1789      space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(16), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),state), 0xeafa00+offset);
1755      machine().scheduler().timer_set(machine().device<cpu_device>("maincpu")->cycles_to_attotime(16), timer_expired_delegate(FUNC(x68k_state::x68k_bus_error),this), 0xeafa00+offset);
17901756//      machine.device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]);
17911757   }
17921758}
r18260r18261
18211787   }
18221788}
18231789
1824static void x68k_fm_irq(device_t *device, int irq)
1790WRITE_LINE_MEMBER(x68k_state::x68k_fm_irq)
18251791{
1826   x68k_state *state = device->machine().driver_data<x68k_state>();
1827   if(irq == CLEAR_LINE)
1792   if(state == CLEAR_LINE)
18281793   {
1829      state->m_mfp.gpio |= 0x08;
1830      state->m_mfpdev->i3_w(1);
1794      m_mfp.gpio |= 0x08;
1795      m_mfpdev->i3_w(1);
18311796   }
18321797   else
18331798   {
1834      state->m_mfp.gpio &= ~0x08;
1835      state->m_mfpdev->i3_w(0);
1799      m_mfp.gpio &= ~0x08;
1800      m_mfpdev->i3_w(0);
18361801   }
18371802}
18381803
r18260r18261
19421907
19431908static ADDRESS_MAP_START(x68k_map, AS_PROGRAM, 16, x68k_state )
19441909//  AM_RANGE(0x000000, 0xbfffff) AM_RAMBANK(1)
1945   AM_RANGE(0xbffffc, 0xbfffff) AM_READWRITE_LEGACY(x68k_rom0_r, x68k_rom0_w)
1946//  AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE_LEGACY(x68k_gvram_r, x68k_gvram_w) AM_SHARE("gvram")
1947//  AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE_LEGACY(x68k_tvram_r, x68k_tvram_w) AM_SHARE("tvram")
1910   AM_RANGE(0xbffffc, 0xbfffff) AM_READWRITE(x68k_rom0_r, x68k_rom0_w)
1911//  AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(x68k_gvram_r, x68k_gvram_w) AM_SHARE("gvram")
1912//  AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE(x68k_tvram_r, x68k_tvram_w) AM_SHARE("tvram")
19481913   AM_RANGE(0xc00000, 0xdfffff) AM_RAMBANK("bank2") AM_SHARE("gvram16")
19491914   AM_RANGE(0xe00000, 0xe7ffff) AM_RAMBANK("bank3") AM_SHARE("tvram16")
1950   AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE_LEGACY(x68k_crtc_r, x68k_crtc_w)
1951   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE_LEGACY(x68k_vid_r, x68k_vid_w)
1952   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE_LEGACY(x68k_dmac_r, x68k_dmac_w)
1953   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE_LEGACY(x68k_areaset_r, x68k_areaset_w)
1954   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE_LEGACY(x68k_mfp_r, x68k_mfp_w)
1955   AM_RANGE(0xe8a000, 0xe8bfff) AM_READWRITE_LEGACY(x68k_rtc_r, x68k_rtc_w)
1956//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE_LEGACY(x68k_printer_r, x68k_printer_w)
1957   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE_LEGACY(x68k_sysport_r, x68k_sysport_w)
1958   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE_LEGACY(x68k_fm_r, x68k_fm_w)
1915   AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE(x68k_crtc_r, x68k_crtc_w)
1916   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w)
1917   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE(x68k_dmac_r, x68k_dmac_w)
1918   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE(x68k_areaset_r, x68k_areaset_w)
1919   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE(x68k_mfp_r, x68k_mfp_w)
1920   AM_RANGE(0xe8a000, 0xe8bfff) AM_READWRITE(x68k_rtc_r, x68k_rtc_w)
1921//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w)
1922   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE(x68k_sysport_r, x68k_sysport_w)
1923   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE(x68k_fm_r, x68k_fm_w)
19591924   AM_RANGE(0xe92000, 0xe92001) AM_DEVREADWRITE8_LEGACY("okim6258", okim6258_status_r, okim6258_ctrl_w, 0x00ff)
19601925   AM_RANGE(0xe92002, 0xe92003) AM_DEVREADWRITE8_LEGACY("okim6258", okim6258_status_r, okim6258_data_w, 0x00ff)
1961   AM_RANGE(0xe94000, 0xe95fff) AM_READWRITE_LEGACY(x68k_fdc_r, x68k_fdc_w)
1926   AM_RANGE(0xe94000, 0xe95fff) AM_READWRITE(x68k_fdc_r, x68k_fdc_w)
19621927   AM_RANGE(0xe96000, 0xe9601f) AM_DEVREADWRITE("x68k_hdc", x68k_hdc_image_device, hdc_r, hdc_w)
1963   AM_RANGE(0xe98000, 0xe99fff) AM_READWRITE_LEGACY(x68k_scc_r, x68k_scc_w)
1964   AM_RANGE(0xe9a000, 0xe9bfff) AM_READWRITE_LEGACY(x68k_ppi_r, x68k_ppi_w)
1965   AM_RANGE(0xe9c000, 0xe9dfff) AM_READWRITE_LEGACY(x68k_ioc_r, x68k_ioc_w)
1966   AM_RANGE(0xea0000, 0xea1fff) AM_READWRITE_LEGACY(x68k_exp_r, x68k_exp_w)  // external SCSI ROM and controller
1967   AM_RANGE(0xeafa00, 0xeafa1f) AM_READWRITE_LEGACY(x68k_exp_r, x68k_exp_w)
1968   AM_RANGE(0xeafa80, 0xeafa89) AM_READWRITE_LEGACY(x68k_areaset_r, x68k_enh_areaset_w)
1969   AM_RANGE(0xeb0000, 0xeb7fff) AM_READWRITE_LEGACY(x68k_spritereg_r, x68k_spritereg_w)
1970   AM_RANGE(0xeb8000, 0xebffff) AM_READWRITE_LEGACY(x68k_spriteram_r, x68k_spriteram_w)
1971   AM_RANGE(0xece000, 0xece3ff) AM_READWRITE_LEGACY(x68k_exp_r, x68k_exp_w)  // User I/O
1972//  AM_RANGE(0xed0000, 0xed3fff) AM_READWRITE_LEGACY(sram_r, sram_w)
1928   AM_RANGE(0xe98000, 0xe99fff) AM_READWRITE(x68k_scc_r, x68k_scc_w)
1929   AM_RANGE(0xe9a000, 0xe9bfff) AM_READWRITE(x68k_ppi_r, x68k_ppi_w)
1930   AM_RANGE(0xe9c000, 0xe9dfff) AM_READWRITE(x68k_ioc_r, x68k_ioc_w)
1931   AM_RANGE(0xea0000, 0xea1fff) AM_READWRITE(x68k_exp_r, x68k_exp_w)  // external SCSI ROM and controller
1932   AM_RANGE(0xeafa00, 0xeafa1f) AM_READWRITE(x68k_exp_r, x68k_exp_w)
1933   AM_RANGE(0xeafa80, 0xeafa89) AM_READWRITE(x68k_areaset_r, x68k_enh_areaset_w)
1934   AM_RANGE(0xeb0000, 0xeb7fff) AM_READWRITE(x68k_spritereg_r, x68k_spritereg_w)
1935   AM_RANGE(0xeb8000, 0xebffff) AM_READWRITE(x68k_spriteram_r, x68k_spriteram_w)
1936   AM_RANGE(0xece000, 0xece3ff) AM_READWRITE(x68k_exp_r, x68k_exp_w)  // User I/O
1937//  AM_RANGE(0xed0000, 0xed3fff) AM_READWRITE(sram_r, sram_w)
19731938   AM_RANGE(0xed0000, 0xed3fff) AM_RAMBANK("bank4") AM_SHARE("nvram16")
19741939   AM_RANGE(0xed4000, 0xefffff) AM_NOP
19751940   AM_RANGE(0xf00000, 0xfbffff) AM_ROM
1976   AM_RANGE(0xfc0000, 0xfdffff) AM_READWRITE_LEGACY(x68k_exp_r, x68k_exp_w)  // internal SCSI ROM
1941   AM_RANGE(0xfc0000, 0xfdffff) AM_READWRITE(x68k_exp_r, x68k_exp_w)  // internal SCSI ROM
19771942   AM_RANGE(0xfe0000, 0xffffff) AM_ROM
19781943ADDRESS_MAP_END
19791944
19801945static ADDRESS_MAP_START(x68kxvi_map, AS_PROGRAM, 16, x68k_state )
19811946//  AM_RANGE(0x000000, 0xbfffff) AM_RAMBANK(1)
1982   AM_RANGE(0xbffffc, 0xbfffff) AM_READWRITE_LEGACY(x68k_rom0_r, x68k_rom0_w)
1983//  AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE_LEGACY(x68k_gvram_r, x68k_gvram_w) AM_SHARE("gvram")
1984//  AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE_LEGACY(x68k_tvram_r, x68k_tvram_w) AM_SHARE("tvram")
1947   AM_RANGE(0xbffffc, 0xbfffff) AM_READWRITE(x68k_rom0_r, x68k_rom0_w)
1948//  AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(x68k_gvram_r, x68k_gvram_w) AM_SHARE("gvram")
1949//  AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE(x68k_tvram_r, x68k_tvram_w) AM_SHARE("tvram")
19851950   AM_RANGE(0xc00000, 0xdfffff) AM_RAMBANK("bank2") AM_SHARE("gvram16")
19861951   AM_RANGE(0xe00000, 0xe7ffff) AM_RAMBANK("bank3") AM_SHARE("tvram16")
1987   AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE_LEGACY(x68k_crtc_r, x68k_crtc_w)
1988   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE_LEGACY(x68k_vid_r, x68k_vid_w)
1989   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE_LEGACY(x68k_dmac_r, x68k_dmac_w)
1990   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE_LEGACY(x68k_areaset_r, x68k_areaset_w)
1991   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE_LEGACY(x68k_mfp_r, x68k_mfp_w)
1992   AM_RANGE(0xe8a000, 0xe8bfff) AM_READWRITE_LEGACY(x68k_rtc_r, x68k_rtc_w)
1993//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE_LEGACY(x68k_printer_r, x68k_printer_w)
1994   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE_LEGACY(x68k_sysport_r, x68k_sysport_w)
1995   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE_LEGACY(x68k_fm_r, x68k_fm_w)
1952   AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE(x68k_crtc_r, x68k_crtc_w)
1953   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE(x68k_vid_r, x68k_vid_w)
1954   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE(x68k_dmac_r, x68k_dmac_w)
1955   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE(x68k_areaset_r, x68k_areaset_w)
1956   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE(x68k_mfp_r, x68k_mfp_w)
1957   AM_RANGE(0xe8a000, 0xe8bfff) AM_READWRITE(x68k_rtc_r, x68k_rtc_w)
1958//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w)
1959   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE(x68k_sysport_r, x68k_sysport_w)
1960   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE(x68k_fm_r, x68k_fm_w)
19961961   AM_RANGE(0xe92000, 0xe92001) AM_DEVREADWRITE8_LEGACY("okim6258", okim6258_status_r, okim6258_ctrl_w, 0x00ff)
19971962   AM_RANGE(0xe92002, 0xe92003) AM_DEVREADWRITE8_LEGACY("okim6258", okim6258_status_r, okim6258_data_w, 0x00ff)
1998   AM_RANGE(0xe94000, 0xe95fff) AM_READWRITE_LEGACY(x68k_fdc_r, x68k_fdc_w)
1963   AM_RANGE(0xe94000, 0xe95fff) AM_READWRITE(x68k_fdc_r, x68k_fdc_w)
19991964//  AM_RANGE(0xe96000, 0xe9601f) AM_DEVREADWRITE_LEGACY("x68k_hdc",x68k_hdc_r, x68k_hdc_w)
20001965   AM_RANGE(0xe96020, 0xe9603f) AM_DEVREADWRITE8("scsi:mb89352",mb89352_device,mb89352_r,mb89352_w,0x00ff)
2001   AM_RANGE(0xe98000, 0xe99fff) AM_READWRITE_LEGACY(x68k_scc_r, x68k_scc_w)
2002   AM_RANGE(0xe9a000, 0xe9bfff) AM_READWRITE_LEGACY(x68k_ppi_r, x68k_ppi_w)
2003   AM_RANGE(0xe9c000, 0xe9dfff) AM_READWRITE_LEGACY(x68k_ioc_r, x68k_ioc_w)
2004   AM_RANGE(0xea0000, 0xea1fff) AM_READWRITE_LEGACY(x68k_exp_r, x68k_exp_w)  // external SCSI ROM and controller
2005   AM_RANGE(0xeafa00, 0xeafa1f) AM_READWRITE_LEGACY(x68k_exp_r, x68k_exp_w)
2006   AM_RANGE(0xeafa80, 0xeafa89) AM_READWRITE_LEGACY(x68k_areaset_r, x68k_enh_areaset_w)
2007   AM_RANGE(0xeb0000, 0xeb7fff) AM_READWRITE_LEGACY(x68k_spritereg_r, x68k_spritereg_w)
2008   AM_RANGE(0xeb8000, 0xebffff) AM_READWRITE_LEGACY(x68k_spriteram_r, x68k_spriteram_w)
2009   AM_RANGE(0xece000, 0xece3ff) AM_READWRITE_LEGACY(x68k_exp_r, x68k_exp_w)  // User I/O
2010//  AM_RANGE(0xed0000, 0xed3fff) AM_READWRITE_LEGACY(sram_r, sram_w)
1966   AM_RANGE(0xe98000, 0xe99fff) AM_READWRITE(x68k_scc_r, x68k_scc_w)
1967   AM_RANGE(0xe9a000, 0xe9bfff) AM_READWRITE(x68k_ppi_r, x68k_ppi_w)
1968   AM_RANGE(0xe9c000, 0xe9dfff) AM_READWRITE(x68k_ioc_r, x68k_ioc_w)
1969   AM_RANGE(0xea0000, 0xea1fff) AM_READWRITE(x68k_exp_r, x68k_exp_w)  // external SCSI ROM and controller
1970   AM_RANGE(0xeafa00, 0xeafa1f) AM_READWRITE(x68k_exp_r, x68k_exp_w)
1971   AM_RANGE(0xeafa80, 0xeafa89) AM_READWRITE(x68k_areaset_r, x68k_enh_areaset_w)
1972   AM_RANGE(0xeb0000, 0xeb7fff) AM_READWRITE(x68k_spritereg_r, x68k_spritereg_w)
1973   AM_RANGE(0xeb8000, 0xebffff) AM_READWRITE(x68k_spriteram_r, x68k_spriteram_w)
1974   AM_RANGE(0xece000, 0xece3ff) AM_READWRITE(x68k_exp_r, x68k_exp_w)  // User I/O
1975//  AM_RANGE(0xed0000, 0xed3fff) AM_READWRITE(sram_r, sram_w)
20111976   AM_RANGE(0xed0000, 0xed3fff) AM_RAMBANK("bank4") AM_SHARE("nvram16")
20121977   AM_RANGE(0xed4000, 0xefffff) AM_NOP
20131978   AM_RANGE(0xf00000, 0xfbffff) AM_ROM
r18260r18261
20181983static ADDRESS_MAP_START(x68030_map, AS_PROGRAM, 32, x68k_state )
20191984   ADDRESS_MAP_GLOBAL_MASK(0x00ffffff)  // Still only has 24-bit address space
20201985//  AM_RANGE(0x000000, 0xbfffff) AM_RAMBANK(1)
2021   AM_RANGE(0xbffffc, 0xbfffff) AM_READWRITE16_LEGACY(x68k_rom0_r, x68k_rom0_w,0xffffffff)
2022//  AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE_LEGACY(x68k_gvram_r, x68k_gvram_w) AM_SHARE("gvram")
2023//  AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE_LEGACY(x68k_tvram_r, x68k_tvram_w) AM_SHARE("tvram")
1986   AM_RANGE(0xbffffc, 0xbfffff) AM_READWRITE16(x68k_rom0_r, x68k_rom0_w,0xffffffff)
1987//  AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(x68k_gvram_r, x68k_gvram_w) AM_SHARE("gvram")
1988//  AM_RANGE(0xe00000, 0xe7ffff) AM_READWRITE(x68k_tvram_r, x68k_tvram_w) AM_SHARE("tvram")
20241989   AM_RANGE(0xc00000, 0xdfffff) AM_RAMBANK("bank2") AM_SHARE("gvram32")
20251990   AM_RANGE(0xe00000, 0xe7ffff) AM_RAMBANK("bank3") AM_SHARE("tvram32")
2026   AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE16_LEGACY(x68k_crtc_r, x68k_crtc_w,0xffffffff)
2027   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE16_LEGACY(x68k_vid_r, x68k_vid_w,0xffffffff)
2028   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE16_LEGACY(x68k_dmac_r, x68k_dmac_w,0xffffffff)
2029   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE16_LEGACY(x68k_areaset_r, x68k_areaset_w,0xffffffff)
2030   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE16_LEGACY(x68k_mfp_r, x68k_mfp_w,0xffffffff)
2031   AM_RANGE(0xe8a000, 0xe8bfff) AM_READWRITE16_LEGACY(x68k_rtc_r, x68k_rtc_w,0xffffffff)
2032//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE_LEGACY(x68k_printer_r, x68k_printer_w)
2033   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE16_LEGACY(x68k_sysport_r, x68k_sysport_w,0xffffffff)
2034   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE16_LEGACY(x68k_fm_r, x68k_fm_w,0xffffffff)
1991   AM_RANGE(0xe80000, 0xe81fff) AM_READWRITE16(x68k_crtc_r, x68k_crtc_w,0xffffffff)
1992   AM_RANGE(0xe82000, 0xe83fff) AM_READWRITE16(x68k_vid_r, x68k_vid_w,0xffffffff)
1993   AM_RANGE(0xe84000, 0xe85fff) AM_READWRITE16(x68k_dmac_r, x68k_dmac_w,0xffffffff)
1994   AM_RANGE(0xe86000, 0xe87fff) AM_READWRITE16(x68k_areaset_r, x68k_areaset_w,0xffffffff)
1995   AM_RANGE(0xe88000, 0xe89fff) AM_READWRITE16(x68k_mfp_r, x68k_mfp_w,0xffffffff)
1996   AM_RANGE(0xe8a000, 0xe8bfff) AM_READWRITE16(x68k_rtc_r, x68k_rtc_w,0xffffffff)
1997//  AM_RANGE(0xe8c000, 0xe8dfff) AM_READWRITE(x68k_printer_r, x68k_printer_w)
1998   AM_RANGE(0xe8e000, 0xe8ffff) AM_READWRITE16(x68k_sysport_r, x68k_sysport_w,0xffffffff)
1999   AM_RANGE(0xe90000, 0xe91fff) AM_READWRITE16(x68k_fm_r, x68k_fm_w,0xffffffff)
20352000   AM_RANGE(0xe92000, 0xe92003) AM_DEVREAD8_LEGACY("okim6258", okim6258_status_r, 0x00ff00ff) AM_WRITE8(x68030_adpcm_w, 0x00ff00ff)
2036   AM_RANGE(0xe94000, 0xe95fff) AM_READWRITE16_LEGACY(x68k_fdc_r, x68k_fdc_w,0xffffffff)
2001   AM_RANGE(0xe94000, 0xe95fff) AM_READWRITE16(x68k_fdc_r, x68k_fdc_w,0xffffffff)
20372002//  AM_RANGE(0xe96000, 0xe9601f) AM_DEVREADWRITE16_LEGACY("x68k_hdc",x68k_hdc_r, x68k_hdc_w,0xffffffff)
20382003   AM_RANGE(0xe96020, 0xe9603f) AM_DEVREADWRITE8("scsi:mb89352",mb89352_device,mb89352_r,mb89352_w,0x00ff00ff)
2039   AM_RANGE(0xe98000, 0xe99fff) AM_READWRITE16_LEGACY(x68k_scc_r, x68k_scc_w,0xffffffff)
2040   AM_RANGE(0xe9a000, 0xe9bfff) AM_READWRITE16_LEGACY(x68k_ppi_r, x68k_ppi_w,0xffffffff)
2041   AM_RANGE(0xe9c000, 0xe9dfff) AM_READWRITE16_LEGACY(x68k_ioc_r, x68k_ioc_w,0xffffffff)
2004   AM_RANGE(0xe98000, 0xe99fff) AM_READWRITE16(x68k_scc_r, x68k_scc_w,0xffffffff)
2005   AM_RANGE(0xe9a000, 0xe9bfff) AM_READWRITE16(x68k_ppi_r, x68k_ppi_w,0xffffffff)
2006   AM_RANGE(0xe9c000, 0xe9dfff) AM_READWRITE16(x68k_ioc_r, x68k_ioc_w,0xffffffff)
20422007   AM_RANGE(0xea0000, 0xea1fff) AM_NOP//AM_READWRITE16_LEGACY(x68k_exp_r, x68k_exp_w,0xffffffff)  // external SCSI ROM and controller
2043   AM_RANGE(0xeafa00, 0xeafa1f) AM_READWRITE16_LEGACY(x68k_exp_r, x68k_exp_w,0xffffffff)
2044   AM_RANGE(0xeafa80, 0xeafa8b) AM_READWRITE16_LEGACY(x68k_areaset_r, x68k_enh_areaset_w,0xffffffff)
2045   AM_RANGE(0xeb0000, 0xeb7fff) AM_READWRITE16_LEGACY(x68k_spritereg_r, x68k_spritereg_w,0xffffffff)
2046   AM_RANGE(0xeb8000, 0xebffff) AM_READWRITE16_LEGACY(x68k_spriteram_r, x68k_spriteram_w,0xffffffff)
2047   AM_RANGE(0xece000, 0xece3ff) AM_READWRITE16_LEGACY(x68k_exp_r, x68k_exp_w,0xffffffff)  // User I/O
2048//  AM_RANGE(0xed0000, 0xed3fff) AM_READWRITE_LEGACY(sram_r, sram_w)
2008   AM_RANGE(0xeafa00, 0xeafa1f) AM_READWRITE16(x68k_exp_r, x68k_exp_w,0xffffffff)
2009   AM_RANGE(0xeafa80, 0xeafa8b) AM_READWRITE16(x68k_areaset_r, x68k_enh_areaset_w,0xffffffff)
2010   AM_RANGE(0xeb0000, 0xeb7fff) AM_READWRITE16(x68k_spritereg_r, x68k_spritereg_w,0xffffffff)
2011   AM_RANGE(0xeb8000, 0xebffff) AM_READWRITE16(x68k_spriteram_r, x68k_spriteram_w,0xffffffff)
2012   AM_RANGE(0xece000, 0xece3ff) AM_READWRITE16(x68k_exp_r, x68k_exp_w,0xffffffff)  // User I/O
2013//  AM_RANGE(0xed0000, 0xed3fff) AM_READWRITE(sram_r, sram_w)
20492014   AM_RANGE(0xed0000, 0xed3fff) AM_RAMBANK("bank4") AM_SHARE("nvram32")
20502015   AM_RANGE(0xed4000, 0xefffff) AM_NOP
20512016   AM_RANGE(0xf00000, 0xfbffff) AM_ROM
r18260r18261
21112076
21122077static const ym2151_interface x68k_ym2151_interface =
21132078{
2114   DEVCB_LINE(x68k_fm_irq),
2079   DEVCB_DRIVER_LINE_MEMBER(x68k_state,x68k_fm_irq),
21152080   DEVCB_DRIVER_MEMBER(x68k_state,x68k_ct_w)  // CT1, CT2 from YM2151 port 0x1b
21162081};
21172082
r18260r18261
24702435   machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,m_current_vector[2]);
24712436}
24722437
2473static void x68k_irq2_line(device_t* device,int state)
2438WRITE_LINE_MEMBER(x68k_state::x68k_irq2_line)
24742439{
2475   x68k_state *tstate = device->machine().driver_data<x68k_state>();
24762440   if(state==ASSERT_LINE)
24772441   {
2478      tstate->m_net_timer->adjust(attotime::from_usec(16));
2442      m_net_timer->adjust(attotime::from_usec(16));
24792443   }
24802444   else
2481      device->machine().device("maincpu")->execute().set_input_line_and_vector(2,CLEAR_LINE,tstate->m_current_vector[2]);
2445      machine().device("maincpu")->execute().set_input_line_and_vector(2,CLEAR_LINE,m_current_vector[2]);
24822446   logerror("EXP: IRQ2 set to %i\n",state);
24832447
24842448}
r18260r18261
25152479
25162480static X68K_EXPANSION_INTERFACE(x68k_exp_intf)
25172481{
2518   DEVCB_LINE(x68k_irq2_line),
2482   DEVCB_DRIVER_LINE_MEMBER(x68k_state,x68k_irq2_line),
25192483   DEVCB_CPU_INPUT_LINE("maincpu", M68K_IRQ_4),
25202484   DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_NMI),
25212485   DEVCB_NULL  // RESET
r18260r18261
25642528   m_crtc.reg[7] = 552;  // Vertical end
25652529   m_crtc.reg[8] = 27;   // Horizontal adjust
25662530
2567   mfp_init(machine());
2531   mfp_init();
25682532
25692533   m_scanline = machine().primary_screen->vpos();// = m_crtc.reg[6];  // Vertical start
25702534
r18260r18261
26042568   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
26052569   /*  Install RAM handlers  */
26062570   m_spriteram = (UINT16*)(*memregion("user1"));
2607   space.install_legacy_read_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_emptyram_r));
2608   space.install_legacy_write_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_emptyram_w));
2571   space.install_read_handler(0x000000,0xbffffb,0xffffffff,0,read16_delegate(FUNC(x68k_state::x68k_emptyram_r),this));
2572   space.install_write_handler(0x000000,0xbffffb,0xffffffff,0,write16_delegate(FUNC(x68k_state::x68k_emptyram_w),this));
26092573   space.install_readwrite_bank(0x000000,machine().device<ram_device>(RAM_TAG)->size()-1,0xffffffff,0,"bank1");
26102574   membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer());
2611   space.install_legacy_read_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram_r));
2612   space.install_legacy_write_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram_w));
2575   space.install_read_handler(0xc00000,0xdfffff,0xffffffff,0,read16_delegate(FUNC(x68k_state::x68k_gvram_r),this));
2576   space.install_write_handler(0xc00000,0xdfffff,0xffffffff,0,write16_delegate(FUNC(x68k_state::x68k_gvram_w),this));
26132577   membank("bank2")->set_base(m_gvram16);  // so that code in VRAM is executable - needed for Terra Cresta
2614   space.install_legacy_read_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram_r));
2615   space.install_legacy_write_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram_w));
2578   space.install_read_handler(0xe00000,0xe7ffff,0xffffffff,0,read16_delegate(FUNC(x68k_state::x68k_tvram_r),this));
2579   space.install_write_handler(0xe00000,0xe7ffff,0xffffffff,0,write16_delegate(FUNC(x68k_state::x68k_tvram_w),this));
26162580   membank("bank3")->set_base(m_tvram16);  // so that code in VRAM is executable - needed for Terra Cresta
2617   space.install_legacy_read_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram_r));
2618   space.install_legacy_write_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram_w));
2581   space.install_read_handler(0xed0000,0xed3fff,0xffffffff,0,read16_delegate(FUNC(x68k_state::x68k_sram_r),this));
2582   space.install_write_handler(0xed0000,0xed3fff,0xffffffff,0,write16_delegate(FUNC(x68k_state::x68k_sram_w),this));
26192583   membank("bank4")->set_base(m_nvram16);  // so that code in SRAM is executable, there is an option for booting from SRAM
26202584
26212585   // start keyboard timer
r18260r18261
26342598   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
26352599   /*  Install RAM handlers  */
26362600   m_spriteram = (UINT16*)(*memregion("user1"));
2637   space.install_legacy_read_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_rom0_r),0xffffffff);
2638   space.install_legacy_write_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_rom0_w),0xffffffff);
2601   space.install_read_handler(0x000000,0xbffffb,0xffffffff,0,read16_delegate(FUNC(x68k_state::x68k_rom0_r),this),0xffffffff);
2602   space.install_write_handler(0x000000,0xbffffb,0xffffffff,0,write16_delegate(FUNC(x68k_state::x68k_rom0_w),this),0xffffffff);
26392603   space.install_readwrite_bank(0x000000,machine().device<ram_device>(RAM_TAG)->size()-1,0xffffffff,0,"bank1");
26402604   membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer());
2641   space.install_legacy_read_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram32_r));
2642   space.install_legacy_write_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram32_w));
2605   space.install_read_handler(0xc00000,0xdfffff,0xffffffff,0,read32_delegate(FUNC(x68k_state::x68k_gvram32_r),this));
2606   space.install_write_handler(0xc00000,0xdfffff,0xffffffff,0,write32_delegate(FUNC(x68k_state::x68k_gvram32_w),this));
26432607   membank("bank2")->set_base(m_gvram32);  // so that code in VRAM is executable - needed for Terra Cresta
2644   space.install_legacy_read_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram32_r));
2645   space.install_legacy_write_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram32_w));
2608   space.install_read_handler(0xe00000,0xe7ffff,0xffffffff,0,read32_delegate(FUNC(x68k_state::x68k_tvram32_r),this));
2609   space.install_write_handler(0xe00000,0xe7ffff,0xffffffff,0,write32_delegate(FUNC(x68k_state::x68k_tvram32_w),this));
26462610   membank("bank3")->set_base(m_tvram32);  // so that code in VRAM is executable - needed for Terra Cresta
2647   space.install_legacy_read_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram32_r));
2648   space.install_legacy_write_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram32_w));
2611   space.install_read_handler(0xed0000,0xed3fff,0xffffffff,0,read32_delegate(FUNC(x68k_state::x68k_sram32_r),this));
2612   space.install_write_handler(0xed0000,0xed3fff,0xffffffff,0,write32_delegate(FUNC(x68k_state::x68k_sram32_w),this));
26492613   membank("bank4")->set_base(m_nvram32);  // so that code in SRAM is executable, there is an option for booting from SRAM
26502614
26512615   // start keyboard timer
r18260r18261
26802644   // copy last half of BIOS to a user region, to use for inital startup
26812645   memcpy(user2,(rom+0xff0000),0x10000);
26822646
2683   mfp_init(machine());
2647   mfp_init();
26842648
26852649   machine().device("maincpu")->execute().set_irq_acknowledge_callback(x68k_int_ack);
26862650
r18260r18261
26962660   m_net_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(x68k_state::x68k_net_irq),this));
26972661
26982662   // Initialise timers for 6-button MD controllers
2699   md_6button_init(machine());
2663   md_6button_init();
27002664
27012665   m_sysport.cputype = 0xff;  // 68000, 10MHz
27022666   m_is_32bit = false;
trunk/src/mess/includes/x68k.h
r18260r18261
297297   DECLARE_WRITE_LINE_MEMBER(mfp_irq_callback);
298298   DECLARE_WRITE_LINE_MEMBER(x68k_scsi_irq);
299299   DECLARE_WRITE_LINE_MEMBER(x68k_scsi_drq);
300   
301   void mfp_init();
302   void x68k_keyboard_ctrl_w(int data);
303   int x68k_keyboard_pop_scancode();
304   void x68k_keyboard_push_scancode(unsigned char code);
305   int x68k_read_mouse();
306   void x68k_set_adpcm();
307   UINT8 md_3button_r(int port);
308   void md_6button_init();
309   UINT8 md_6button_r(int port);
310   UINT8 xpd1lr_r(int port);
311   
312   DECLARE_WRITE_LINE_MEMBER(x68k_fm_irq);
313   DECLARE_WRITE_LINE_MEMBER(x68k_irq2_line);
314
315   DECLARE_WRITE16_MEMBER(x68k_dmac_w);
316   DECLARE_READ16_MEMBER(x68k_dmac_r);
317   DECLARE_WRITE16_MEMBER(x68k_scc_w);
318   DECLARE_WRITE16_MEMBER(x68k_fdc_w);
319   DECLARE_READ16_MEMBER(x68k_fdc_r);
320   DECLARE_WRITE16_MEMBER(x68k_fm_w);
321   DECLARE_READ16_MEMBER(x68k_fm_r);
322   DECLARE_WRITE16_MEMBER(x68k_ioc_w);
323   DECLARE_READ16_MEMBER(x68k_ioc_r);
324   DECLARE_WRITE16_MEMBER(x68k_sysport_w);
325   DECLARE_READ16_MEMBER(x68k_sysport_r);
326   DECLARE_READ16_MEMBER(x68k_mfp_r);
327   DECLARE_WRITE16_MEMBER(x68k_mfp_w);
328   DECLARE_WRITE16_MEMBER(x68k_ppi_w);
329   DECLARE_READ16_MEMBER(x68k_ppi_r);
330   DECLARE_READ16_MEMBER(x68k_rtc_r);
331   DECLARE_WRITE16_MEMBER(x68k_rtc_w);
332   DECLARE_WRITE16_MEMBER(x68k_sram_w);
333   DECLARE_READ16_MEMBER(x68k_sram_r);
334   DECLARE_READ32_MEMBER(x68k_sram32_r);
335   DECLARE_WRITE32_MEMBER(x68k_sram32_w);
336   DECLARE_WRITE16_MEMBER(x68k_vid_w);
337   DECLARE_READ16_MEMBER(x68k_vid_r);
338   DECLARE_READ16_MEMBER(x68k_areaset_r);
339   DECLARE_WRITE16_MEMBER(x68k_areaset_w);
340   DECLARE_WRITE16_MEMBER(x68k_enh_areaset_w);
341   DECLARE_READ16_MEMBER(x68k_rom0_r);
342   DECLARE_WRITE16_MEMBER(x68k_rom0_w);
343   DECLARE_READ16_MEMBER(x68k_emptyram_r);
344   DECLARE_WRITE16_MEMBER(x68k_emptyram_w);
345   DECLARE_READ16_MEMBER(x68k_exp_r);
346   DECLARE_WRITE16_MEMBER(x68k_exp_w);
347   DECLARE_READ16_MEMBER(x68k_scc_r);
348   
349   DECLARE_READ16_MEMBER(x68k_spritereg_r);
350   DECLARE_WRITE16_MEMBER(x68k_spritereg_w);
351   DECLARE_READ16_MEMBER(x68k_spriteram_r);
352   DECLARE_WRITE16_MEMBER(x68k_spriteram_w);
353   DECLARE_WRITE16_MEMBER(x68k_crtc_w);
354   DECLARE_READ16_MEMBER(x68k_crtc_r);
355   DECLARE_WRITE16_MEMBER(x68k_gvram_w);
356   DECLARE_READ16_MEMBER(x68k_gvram_r);
357   DECLARE_WRITE16_MEMBER(x68k_tvram_w);
358   DECLARE_READ16_MEMBER(x68k_tvram_r);
359   DECLARE_WRITE32_MEMBER(x68k_gvram32_w);
360   DECLARE_READ32_MEMBER(x68k_gvram32_r);
361   DECLARE_WRITE32_MEMBER(x68k_tvram32_w);
362   DECLARE_READ32_MEMBER(x68k_tvram32_r);
363private:
364   inline void x68k_plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color);
365   void x68k_crtc_text_copy(int src, int dest);
366   void x68k_crtc_refresh_mode();
367   void x68k_draw_text(bitmap_ind16 &bitmap, int xscr, int yscr, rectangle rect);
368   void x68k_draw_gfx_scanline(bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority);
369   void x68k_draw_gfx(bitmap_ind16 &bitmap,rectangle cliprect);
370   void x68k_draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle cliprect);   
300371};
301372
302373
303/*----------- defined in drivers/x68k.c -----------*/
304374
305#ifdef UNUSED_FUNCTION
306void mfp_trigger_irq(int);
307TIMER_CALLBACK(mfp_timer_a_callback);
308TIMER_CALLBACK(mfp_timer_b_callback);
309TIMER_CALLBACK(mfp_timer_c_callback);
310TIMER_CALLBACK(mfp_timer_d_callback);
311#endif
312
313/*----------- defined in video/x68k.c -----------*/
314DECLARE_READ16_HANDLER( x68k_spritereg_r );
315DECLARE_WRITE16_HANDLER( x68k_spritereg_w );
316DECLARE_READ16_HANDLER( x68k_spriteram_r );
317DECLARE_WRITE16_HANDLER( x68k_spriteram_w );
318DECLARE_WRITE16_HANDLER( x68k_crtc_w );
319DECLARE_READ16_HANDLER( x68k_crtc_r );
320DECLARE_WRITE16_HANDLER( x68k_gvram_w );
321DECLARE_READ16_HANDLER( x68k_gvram_r );
322DECLARE_WRITE16_HANDLER( x68k_tvram_w );
323DECLARE_READ16_HANDLER( x68k_tvram_r );
324DECLARE_WRITE32_HANDLER( x68k_gvram32_w );
325DECLARE_READ32_HANDLER( x68k_gvram32_r );
326DECLARE_WRITE32_HANDLER( x68k_tvram32_w );
327DECLARE_READ32_HANDLER( x68k_tvram32_r );
328
329
330375#endif /* X68K_H_ */
trunk/src/mess/video/x68k.c
r18260r18261
3333
3434
3535
36static void x68k_crtc_refresh_mode(running_machine &machine);
37
38INLINE void x68k_plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color)
36inline void x68k_state::x68k_plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color)
3937{
4038   bitmap.pix16(y, x) = (UINT16)color;
4139}
r18260r18261
7876    return NULL;  // should never reach here either.
7977}
8078*/
81static void x68k_crtc_text_copy(x68k_state *state, int src, int dest)
79void x68k_state::x68k_crtc_text_copy(int src, int dest)
8280{
8381   // copys one raster in T-VRAM to another raster
8482   UINT16* tvram;
r18260r18261
8684   int dest_ram = dest * 256;
8785   int line;
8886
89   if(state->m_is_32bit)
90      tvram = (UINT16*)state->m_tvram32.target();
87   if(m_is_32bit)
88      tvram = (UINT16*)m_tvram32.target();
9189   else
92      tvram = (UINT16*)state->m_tvram16.target();
90      tvram = (UINT16*)m_tvram16.target();
9391
9492   if(dest > 250)
9593      return;  // for some reason, Salamander causes a SIGSEGV in a debug build in this function.
r18260r18261
114112   m_crtc.operation &= ~bit;
115113}
116114
117static void x68k_crtc_refresh_mode(running_machine &machine)
115void x68k_state::x68k_crtc_refresh_mode()
118116{
119   x68k_state *state = machine.driver_data<x68k_state>();
120117//  rectangle rect;
121118//  double scantime;
122119   rectangle scr,visiblescr;
123120   int length;
124121
125122   // Calculate data from register values
126   state->m_crtc.vmultiple = 1;
127   if((state->m_crtc.reg[20] & 0x10) != 0 && (state->m_crtc.reg[20] & 0x0c) == 0)
128      state->m_crtc.vmultiple = 2;  // 31.5kHz + 256 lines = doublescan
129   if(state->m_crtc.interlace != 0)
130      state->m_crtc.vmultiple = 0.5f;  // 31.5kHz + 1024 lines or 15kHz + 512 lines = interlaced
131   state->m_crtc.htotal = (state->m_crtc.reg[0] + 1) * 8;
132   state->m_crtc.vtotal = (state->m_crtc.reg[4] + 1) / state->m_crtc.vmultiple; // default is 567 (568 scanlines)
133   state->m_crtc.hbegin = (state->m_crtc.reg[2] * 8) + 1;
134   state->m_crtc.hend = (state->m_crtc.reg[3] * 8);
135   state->m_crtc.vbegin = (state->m_crtc.reg[6]) / state->m_crtc.vmultiple;
136   state->m_crtc.vend = (state->m_crtc.reg[7] - 1) / state->m_crtc.vmultiple;
137   state->m_crtc.hsync_end = (state->m_crtc.reg[1]) * 8;
138   state->m_crtc.vsync_end = (state->m_crtc.reg[5]) / state->m_crtc.vmultiple;
139   state->m_crtc.hsyncadjust = state->m_crtc.reg[8];
140   scr.set(0, state->m_crtc.htotal - 8, 0, state->m_crtc.vtotal);
141   if(scr.max_y <= state->m_crtc.vend)
142      scr.max_y = state->m_crtc.vend + 2;
143   if(scr.max_x <= state->m_crtc.hend)
144      scr.max_x = state->m_crtc.hend + 2;
145   visiblescr.set(state->m_crtc.hbegin, state->m_crtc.hend, state->m_crtc.vbegin, state->m_crtc.vend);
123   m_crtc.vmultiple = 1;
124   if((m_crtc.reg[20] & 0x10) != 0 && (m_crtc.reg[20] & 0x0c) == 0)
125      m_crtc.vmultiple = 2;  // 31.5kHz + 256 lines = doublescan
126   if(m_crtc.interlace != 0)
127      m_crtc.vmultiple = 0.5f;  // 31.5kHz + 1024 lines or 15kHz + 512 lines = interlaced
128   m_crtc.htotal = (m_crtc.reg[0] + 1) * 8;
129   m_crtc.vtotal = (m_crtc.reg[4] + 1) / m_crtc.vmultiple; // default is 567 (568 scanlines)
130   m_crtc.hbegin = (m_crtc.reg[2] * 8) + 1;
131   m_crtc.hend = (m_crtc.reg[3] * 8);
132   m_crtc.vbegin = (m_crtc.reg[6]) / m_crtc.vmultiple;
133   m_crtc.vend = (m_crtc.reg[7] - 1) / m_crtc.vmultiple;
134   m_crtc.hsync_end = (m_crtc.reg[1]) * 8;
135   m_crtc.vsync_end = (m_crtc.reg[5]) / m_crtc.vmultiple;
136   m_crtc.hsyncadjust = m_crtc.reg[8];
137   scr.set(0, m_crtc.htotal - 8, 0, m_crtc.vtotal);
138   if(scr.max_y <= m_crtc.vend)
139      scr.max_y = m_crtc.vend + 2;
140   if(scr.max_x <= m_crtc.hend)
141      scr.max_x = m_crtc.hend + 2;
142   visiblescr.set(m_crtc.hbegin, m_crtc.hend, m_crtc.vbegin, m_crtc.vend);
146143
147144   // expand visible area to the size indicated by CRTC reg 20
148   length = state->m_crtc.hend - state->m_crtc.hbegin;
149   if (length < state->m_crtc.width)
145   length = m_crtc.hend - m_crtc.hbegin;
146   if (length < m_crtc.width)
150147   {
151      visiblescr.min_x = state->m_crtc.hbegin - ((state->m_crtc.width - length)/2);
152      visiblescr.max_x = state->m_crtc.hend + ((state->m_crtc.width - length)/2);
148      visiblescr.min_x = m_crtc.hbegin - ((m_crtc.width - length)/2);
149      visiblescr.max_x = m_crtc.hend + ((m_crtc.width - length)/2);
153150   }
154   length = state->m_crtc.vend - state->m_crtc.vbegin;
155   if (length < state->m_crtc.height)
151   length = m_crtc.vend - m_crtc.vbegin;
152   if (length < m_crtc.height)
156153   {
157      visiblescr.min_y = state->m_crtc.vbegin - ((state->m_crtc.height - length)/2);
158      visiblescr.max_y = state->m_crtc.vend + ((state->m_crtc.height - length)/2);
154      visiblescr.min_y = m_crtc.vbegin - ((m_crtc.height - length)/2);
155      visiblescr.max_y = m_crtc.vend + ((m_crtc.height - length)/2);
159156   }
160157   // bounds check
161158   if(visiblescr.min_x < 0)
r18260r18261
167164   if(visiblescr.max_y >= scr.max_y - 1)
168165      visiblescr.max_y = scr.max_y - 2;
169166
170//  logerror("CRTC regs - %i %i %i %i  - %i %i %i %i - %i - %i\n",state->m_crtc.reg[0],state->m_crtc.reg[1],state->m_crtc.reg[2],state->m_crtc.reg[3],
171//      state->m_crtc.reg[4],state->m_crtc.reg[5],state->m_crtc.reg[6],state->m_crtc.reg[7],state->m_crtc.reg[8],state->m_crtc.reg[9]);
167//  logerror("CRTC regs - %i %i %i %i  - %i %i %i %i - %i - %i\n",m_crtc.reg[0],m_crtc.reg[1],m_crtc.reg[2],m_crtc.reg[3],
168//      m_crtc.reg[4],m_crtc.reg[5],m_crtc.reg[6],m_crtc.reg[7],m_crtc.reg[8],m_crtc.reg[9]);
172169   logerror("video_screen_configure(machine.primary_screen,%i,%i,[%i,%i,%i,%i],55.45)\n",scr.max_x,scr.max_y,visiblescr.min_x,visiblescr.min_y,visiblescr.max_x,visiblescr.max_y);
173   machine.primary_screen->configure(scr.max_x,scr.max_y,visiblescr,HZ_TO_ATTOSECONDS(55.45));
170   machine().primary_screen->configure(scr.max_x,scr.max_y,visiblescr,HZ_TO_ATTOSECONDS(55.45));
174171}
175172
176173TIMER_CALLBACK_MEMBER(x68k_state::x68k_hsync)
r18260r18261
370367 *    Operation Port bits are cleared automatically when the requested
371368 *    operation is completed.
372369 */
373WRITE16_HANDLER( x68k_crtc_w )
370WRITE16_MEMBER(x68k_state::x68k_crtc_w )
374371{
375   x68k_state *state = space.machine().driver_data<x68k_state>();
376   COMBINE_DATA(state->m_crtc.reg+offset);
372   COMBINE_DATA(m_crtc.reg+offset);
377373   switch(offset)
378374   {
379375   case 0:
r18260r18261
385381   case 6:
386382   case 7:
387383   case 8:
388      x68k_crtc_refresh_mode(space.machine());
384      x68k_crtc_refresh_mode();
389385      break;
390386   case 9:  // CRTC raster IRQ (GPIP6)
391387      {
392388         attotime irq_time;
393         irq_time = space.machine().primary_screen->time_until_pos((data) / state->m_crtc.vmultiple,2);
389         irq_time = machine().primary_screen->time_until_pos((data) / m_crtc.vmultiple,2);
394390
395391         if(irq_time.as_double() > 0)
396            state->m_raster_irq->adjust(irq_time, (data) / state->m_crtc.vmultiple);
392            m_raster_irq->adjust(irq_time, (data) / m_crtc.vmultiple);
397393      }
398394      logerror("CRTC: Write to raster IRQ register - %i\n",data);
399395      break;
400396   case 20:
401397      if(ACCESSING_BITS_0_7)
402398      {
403         state->m_crtc.interlace = 0;
399         m_crtc.interlace = 0;
404400         switch(data & 0x0c)
405401         {
406402         case 0x00:
407            state->m_crtc.height = 256;
403            m_crtc.height = 256;
408404            break;
409405         case 0x08:
410406         case 0x0c:  // TODO: 1024 vertical, if horizontal freq = 31kHz
411            state->m_crtc.height = 512;
412            state->m_crtc.interlace = 1;  // if 31kHz, 1024 lines = interlaced
407            m_crtc.height = 512;
408            m_crtc.interlace = 1;  // if 31kHz, 1024 lines = interlaced
413409            break;
414410         case 0x04:
415            state->m_crtc.height = 512;
416            if(!(state->m_crtc.reg[20] & 0x0010))  // if 15kHz, 512 lines = interlaced
417               state->m_crtc.interlace = 1;
411            m_crtc.height = 512;
412            if(!(m_crtc.reg[20] & 0x0010))  // if 15kHz, 512 lines = interlaced
413               m_crtc.interlace = 1;
418414            break;
419415         }
420416         switch(data & 0x03)
421417         {
422418         case 0x00:
423            state->m_crtc.width = 256;
419            m_crtc.width = 256;
424420            break;
425421         case 0x01:
426            state->m_crtc.width = 512;
422            m_crtc.width = 512;
427423            break;
428424         case 0x02:
429425         case 0x03:  // 0x03 = 50MHz clock mode (XVI only)
430            state->m_crtc.width = 768;
426            m_crtc.width = 768;
431427            break;
432428         }
433429      }
434430/*      if(ACCESSING_BITS_8_15)
435431        {
436            state->m_crtc.interlace = 0;
432            m_crtc.interlace = 0;
437433            if(data & 0x0400)
438                state->m_crtc.interlace = 1;
434                m_crtc.interlace = 1;
439435        }*/
440      x68k_crtc_refresh_mode(space.machine());
436      x68k_crtc_refresh_mode();
441437      break;
442438   case 576:  // operation register
443      state->m_crtc.operation = data;
439      m_crtc.operation = data;
444440      if(data & 0x08)  // text screen raster copy
445441      {
446         x68k_crtc_text_copy(state, (state->m_crtc.reg[22] & 0xff00) >> 8,(state->m_crtc.reg[22] & 0x00ff));
447         space.machine().scheduler().timer_set(attotime::from_msec(1), timer_expired_delegate(FUNC(x68k_state::x68k_crtc_operation_end),state), 0x02);  // time taken to do operation is a complete guess.
442         x68k_crtc_text_copy((m_crtc.reg[22] & 0xff00) >> 8,(m_crtc.reg[22] & 0x00ff));
443         machine().scheduler().timer_set(attotime::from_msec(1), timer_expired_delegate(FUNC(x68k_state::x68k_crtc_operation_end),this), 0x02);  // time taken to do operation is a complete guess.
448444      }
449445      if(data & 0x02)  // high-speed graphic screen clear
450446      {
451         if(state->m_is_32bit)
452            memset(state->m_gvram32,0,0x40000);
447         if(m_is_32bit)
448            memset(m_gvram32,0,0x40000);
453449         else
454            memset(state->m_gvram16,0,0x40000);
455         space.machine().scheduler().timer_set(attotime::from_msec(10), timer_expired_delegate(FUNC(x68k_state::x68k_crtc_operation_end),state), 0x02);  // time taken to do operation is a complete guess.
450            memset(m_gvram16,0,0x40000);
451         machine().scheduler().timer_set(attotime::from_msec(10), timer_expired_delegate(FUNC(x68k_state::x68k_crtc_operation_end),this), 0x02);  // time taken to do operation is a complete guess.
456452      }
457453      break;
458454   }
459//  logerror("CRTC: [%08x] Wrote %04x to CRTC register %i\n",space.machine().device("maincpu")->safe_pc(),data,offset);
455//  logerror("CRTC: [%08x] Wrote %04x to CRTC register %i\n",machine().device("maincpu")->safe_pc(),data,offset);
460456}
461457
462READ16_HANDLER( x68k_crtc_r )
458READ16_MEMBER(x68k_state::x68k_crtc_r )
463459{
464   x68k_state *state = space.machine().driver_data<x68k_state>();
465460#if 0
466461   switch(offset)
467462   {
r18260r18261
473468
474469   if(offset < 24)
475470   {
476//      logerror("CRTC: [%08x] Read %04x from CRTC register %i\n",space.machine().device("maincpu")->safe_pc(),state->m_crtc.reg[offset],offset);
471//      logerror("CRTC: [%08x] Read %04x from CRTC register %i\n",machine().device("maincpu")->safe_pc(),m_crtc.reg[offset],offset);
477472      switch(offset)
478473      {
479474      case 9:
r18260r18261
482477      case 11:
483478      case 12:  // Graphic layer 0 scroll
484479      case 13:
485         return state->m_crtc.reg[offset] & 0x3ff;
480         return m_crtc.reg[offset] & 0x3ff;
486481      case 14:  // Graphic layer 1 scroll
487482      case 15:
488483      case 16:  // Graphic layer 2 scroll
489484      case 17:
490485      case 18:  // Graphic layer 3 scroll
491486      case 19:
492         return state->m_crtc.reg[offset] & 0x1ff;
487         return m_crtc.reg[offset] & 0x1ff;
493488      default:
494         return state->m_crtc.reg[offset];
489         return m_crtc.reg[offset];
495490      }
496491   }
497492   if(offset == 576) // operation port, operation bits are set to 0 when operation is complete
498      return state->m_crtc.operation;
493      return m_crtc.operation;
499494//  logerror("CRTC: [%08x] Read from unknown CRTC register %i\n",activecpu_get_pc(),offset);
500495   return 0xffff;
501496}
502497
503WRITE16_HANDLER( x68k_gvram_w )
498WRITE16_MEMBER(x68k_state::x68k_gvram_w )
504499{
505   x68k_state *state = space.machine().driver_data<x68k_state>();
506500   UINT16* gvram;
507501//  int xloc,yloc,pageoffset;
508502   /*
r18260r18261
520514       Page 3 - 0xd00000-0xd7ffff    Page 4 - 0xd80000-0xdfffff
521515    */
522516
523   if(state->m_is_32bit)
524      gvram = (UINT16*)state->m_gvram32.target();
517   if(m_is_32bit)
518      gvram = (UINT16*)m_gvram32.target();
525519   else
526      gvram = (UINT16*)state->m_gvram16.target();
520      gvram = (UINT16*)m_gvram16.target();
527521
528522   // handle different G-VRAM page setups
529   if(state->m_crtc.reg[20] & 0x08)  // G-VRAM set to buffer
523   if(m_crtc.reg[20] & 0x08)  // G-VRAM set to buffer
530524   {
531525      if(offset < 0x40000)
532526         COMBINE_DATA(gvram+offset);
533527   }
534528   else
535529   {
536      switch(state->m_crtc.reg[20] & 0x0300)
530      switch(m_crtc.reg[20] & 0x0300)
537531      {
538532         case 0x0300:
539533            if(offset < 0x40000)
r18260r18261
573567   }
574568}
575569
576WRITE16_HANDLER( x68k_tvram_w )
570WRITE16_MEMBER(x68k_state::x68k_tvram_w )
577571{
578   x68k_state *state = space.machine().driver_data<x68k_state>();
579572   UINT16* tvram;
580573   UINT16 text_mask;
581574
582   if(state->m_is_32bit)
583      tvram = (UINT16*)state->m_tvram32.target();
575   if(m_is_32bit)
576      tvram = (UINT16*)m_tvram32.target();
584577   else
585      tvram = (UINT16*)state->m_tvram16.target();
578      tvram = (UINT16*)m_tvram16.target();
586579
587   text_mask = ~(state->m_crtc.reg[23]) & mem_mask;
580   text_mask = ~(m_crtc.reg[23]) & mem_mask;
588581
589   if(!(state->m_crtc.reg[21] & 0x0200)) // text access mask enable
582   if(!(m_crtc.reg[21] & 0x0200)) // text access mask enable
590583      text_mask = 0xffff & mem_mask;
591584
592585   mem_mask = text_mask;
593586
594   if(state->m_crtc.reg[21] & 0x0100)
587   if(m_crtc.reg[21] & 0x0100)
595588   {  // simultaneous T-VRAM plane access (I think ;))
596589      int plane,wr;
597590      offset = offset & 0x00ffff;
598      wr = (state->m_crtc.reg[21] & 0x00f0) >> 4;
591      wr = (m_crtc.reg[21] & 0x00f0) >> 4;
599592      for(plane=0;plane<4;plane++)
600593      {
601594         if(wr & (1 << plane))
r18260r18261
610603   }
611604}
612605
613READ16_HANDLER( x68k_gvram_r )
606READ16_MEMBER(x68k_state::x68k_gvram_r )
614607{
615   x68k_state *state = space.machine().driver_data<x68k_state>();
616608   const UINT16* gvram;
617609   UINT16 ret = 0;
618610
619   if(state->m_is_32bit)
620      gvram = (const UINT16*)state->m_gvram32.target();
611   if(m_is_32bit)
612      gvram = (const UINT16*)m_gvram32.target();
621613   else
622      gvram = (const UINT16*)state->m_gvram16.target();
614      gvram = (const UINT16*)m_gvram16.target();
623615
624   if(state->m_crtc.reg[20] & 0x08)  // G-VRAM set to buffer
616   if(m_crtc.reg[20] & 0x08)  // G-VRAM set to buffer
625617      return gvram[offset];
626618
627   switch(state->m_crtc.reg[20] & 0x0300)  // colour setup determines G-VRAM use
619   switch(m_crtc.reg[20] & 0x0300)  // colour setup determines G-VRAM use
628620   {
629621      case 0x0300: // 65,536 colour (RGB) - 16-bits per word
630622         if(offset < 0x40000)
r18260r18261
658650   return ret;
659651}
660652
661READ16_HANDLER( x68k_tvram_r )
653READ16_MEMBER(x68k_state::x68k_tvram_r )
662654{
663   x68k_state *state = space.machine().driver_data<x68k_state>();
664655   const UINT16* tvram;
665656
666   if(state->m_is_32bit)
667      tvram = (const UINT16*)state->m_tvram32.target();
657   if(m_is_32bit)
658      tvram = (const UINT16*)m_tvram32.target();
668659   else
669      tvram = (const UINT16*)state->m_tvram16.target();
660      tvram = (const UINT16*)m_tvram16.target();
670661
671662   return tvram[offset];
672663}
673664
674READ32_HANDLER( x68k_tvram32_r )
665READ32_MEMBER(x68k_state::x68k_tvram32_r )
675666{
676667   UINT32 ret = 0;
677668
r18260r18261
683674   return ret;
684675}
685676
686READ32_HANDLER( x68k_gvram32_r )
677READ32_MEMBER(x68k_state::x68k_gvram32_r )
687678{
688679   UINT32 ret = 0;
689680
r18260r18261
695686   return ret;
696687}
697688
698WRITE32_HANDLER( x68k_tvram32_w )
689WRITE32_MEMBER(x68k_state::x68k_tvram32_w )
699690{
700691   if(ACCESSING_BITS_0_7)
701692      x68k_tvram_w(space,(offset*2)+1,data,0x00ff);
r18260r18261
707698      x68k_tvram_w(space,offset*2,data >> 16,0xff00);
708699}
709700
710WRITE32_HANDLER( x68k_gvram32_w )
701WRITE32_MEMBER(x68k_state::x68k_gvram32_w )
711702{
712703   if(ACCESSING_BITS_0_7)
713704      x68k_gvram_w(space,(offset*2)+1,data,0x00ff);
r18260r18261
719710      x68k_gvram_w(space,offset*2,data >> 16,0xff00);
720711}
721712
722WRITE16_HANDLER( x68k_spritereg_w )
713WRITE16_MEMBER(x68k_state::x68k_spritereg_w )
723714{
724   x68k_state *state = space.machine().driver_data<x68k_state>();
725   COMBINE_DATA(state->m_spritereg+offset);
715   COMBINE_DATA(m_spritereg+offset);
726716   switch(offset)
727717   {
728718   case 0x400:
729      state->m_bg0_8->set_scrollx(0,(data - state->m_crtc.hbegin - state->m_crtc.bg_hshift) & 0x3ff);
730      state->m_bg0_16->set_scrollx(0,(data - state->m_crtc.hbegin - state->m_crtc.bg_hshift) & 0x3ff);
719      m_bg0_8->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
720      m_bg0_16->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
731721      break;
732722   case 0x401:
733      state->m_bg0_8->set_scrolly(0,(data - state->m_crtc.vbegin) & 0x3ff);
734      state->m_bg0_16->set_scrolly(0,(data - state->m_crtc.vbegin) & 0x3ff);
723      m_bg0_8->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
724      m_bg0_16->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
735725      break;
736726   case 0x402:
737      state->m_bg1_8->set_scrollx(0,(data - state->m_crtc.hbegin - state->m_crtc.bg_hshift) & 0x3ff);
738      state->m_bg1_16->set_scrollx(0,(data - state->m_crtc.hbegin - state->m_crtc.bg_hshift) & 0x3ff);
727      m_bg1_8->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
728      m_bg1_16->set_scrollx(0,(data - m_crtc.hbegin - m_crtc.bg_hshift) & 0x3ff);
739729      break;
740730   case 0x403:
741      state->m_bg1_8->set_scrolly(0,(data - state->m_crtc.vbegin) & 0x3ff);
742      state->m_bg1_16->set_scrolly(0,(data - state->m_crtc.vbegin) & 0x3ff);
731      m_bg1_8->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
732      m_bg1_16->set_scrolly(0,(data - m_crtc.vbegin) & 0x3ff);
743733      break;
744734   case 0x406:  // BG H-DISP (normally equals CRTC reg 2 value + 4)
745735      if(data != 0x00ff)
746736      {
747         state->m_crtc.bg_visible_width = (state->m_crtc.reg[3] - ((data & 0x003f) - 4)) * 8;
748         state->m_crtc.bg_hshift = ((data - (state->m_crtc.reg[2]+4)) * 8);
749         if(state->m_crtc.bg_hshift > 0)
750            state->m_crtc.bg_hshift = 0;
737         m_crtc.bg_visible_width = (m_crtc.reg[3] - ((data & 0x003f) - 4)) * 8;
738         m_crtc.bg_hshift = ((data - (m_crtc.reg[2]+4)) * 8);
739         if(m_crtc.bg_hshift > 0)
740            m_crtc.bg_hshift = 0;
751741      }
752742      break;
753743   case 0x407:  // BG V-DISP (like CRTC reg 6)
754      state->m_crtc.bg_vshift = state->m_crtc.vshift;
744      m_crtc.bg_vshift = m_crtc.vshift;
755745      break;
756746   case 0x408:  // BG H/V-Res
757      state->m_crtc.bg_hvres = data & 0x1f;
747      m_crtc.bg_hvres = data & 0x1f;
758748      if(data != 0xff)
759749      {  // Handle when the PCG is using 256 and the CRTC is using 512
760         if((state->m_crtc.bg_hvres & 0x0c) == 0x00 && (state->m_crtc.reg[20] & 0x0c) == 0x04)
761            state->m_crtc.bg_double = 2;
750         if((m_crtc.bg_hvres & 0x0c) == 0x00 && (m_crtc.reg[20] & 0x0c) == 0x04)
751            m_crtc.bg_double = 2;
762752         else
763            state->m_crtc.bg_double = 1;
753            m_crtc.bg_double = 1;
764754      }
765755      else
766         state->m_crtc.bg_double = 1;
756         m_crtc.bg_double = 1;
767757      break;
768758   }
769759}
770760
771READ16_HANDLER( x68k_spritereg_r )
761READ16_MEMBER(x68k_state::x68k_spritereg_r )
772762{
773   x68k_state *state = space.machine().driver_data<x68k_state>();
774763   if(offset >= 0x400 && offset < 0x404)
775      return state->m_spritereg[offset] & 0x3ff;
776   return state->m_spritereg[offset];
764      return m_spritereg[offset] & 0x3ff;
765   return m_spritereg[offset];
777766}
778767
779WRITE16_HANDLER( x68k_spriteram_w )
768WRITE16_MEMBER(x68k_state::x68k_spriteram_w )
780769{
781   x68k_state *state = space.machine().driver_data<x68k_state>();
782   COMBINE_DATA(state->m_spriteram+offset);
783   state->m_video.tile8_dirty[offset / 16] = 1;
784   state->m_video.tile16_dirty[offset / 64] = 1;
770   COMBINE_DATA(m_spriteram+offset);
771   m_video.tile8_dirty[offset / 16] = 1;
772   m_video.tile16_dirty[offset / 64] = 1;
785773   if(offset < 0x2000)
786774   {
787        state->m_bg1_8->mark_all_dirty();
788        state->m_bg1_16->mark_all_dirty();
789        state->m_bg0_8->mark_all_dirty();
790        state->m_bg0_16->mark_all_dirty();
775        m_bg1_8->mark_all_dirty();
776        m_bg1_16->mark_all_dirty();
777        m_bg0_8->mark_all_dirty();
778        m_bg0_16->mark_all_dirty();
791779    }
792780    if(offset >= 0x2000 && offset < 0x3000)
793781    {
794        state->m_bg1_8->mark_tile_dirty(offset & 0x0fff);
795        state->m_bg1_16->mark_tile_dirty(offset & 0x0fff);
782        m_bg1_8->mark_tile_dirty(offset & 0x0fff);
783        m_bg1_16->mark_tile_dirty(offset & 0x0fff);
796784    }
797785    if(offset >= 0x3000)
798786    {
799        state->m_bg0_8->mark_tile_dirty(offset & 0x0fff);
800        state->m_bg0_16->mark_tile_dirty(offset & 0x0fff);
787        m_bg0_8->mark_tile_dirty(offset & 0x0fff);
788        m_bg0_16->mark_tile_dirty(offset & 0x0fff);
801789    }
802790}
803791
804READ16_HANDLER( x68k_spriteram_r )
792READ16_MEMBER(x68k_state::x68k_spriteram_r )
805793{
806   x68k_state *state = space.machine().driver_data<x68k_state>();
807   return state->m_spriteram[offset];
794   return m_spriteram[offset];
808795}
809796
810static void x68k_draw_text(running_machine &machine,bitmap_ind16 &bitmap, int xscr, int yscr, rectangle rect)
797void x68k_state::x68k_draw_text(bitmap_ind16 &bitmap, int xscr, int yscr, rectangle rect)
811798{
812   x68k_state *state = machine.driver_data<x68k_state>();
813799   const UINT16* tvram;
814800   unsigned int line,pixel; // location on screen
815801   UINT32 loc;  // location in TVRAM
816802   UINT32 colour;
817803   int bit;
818804
819   if(state->m_is_32bit)
820      tvram = (const UINT16*)state->m_tvram32.target();
805   if(m_is_32bit)
806      tvram = (const UINT16*)m_tvram32.target();
821807   else
822      tvram = (const UINT16*)state->m_tvram16.target();
808      tvram = (const UINT16*)m_tvram16.target();
823809
824810   for(line=rect.min_y;line<=rect.max_y;line++)  // per scanline
825811   {
826812      // adjust for scroll registers
827      loc = (((line - state->m_crtc.vbegin) + yscr) & 0x3ff) * 64;
813      loc = (((line - m_crtc.vbegin) + yscr) & 0x3ff) * 64;
828814      loc += (xscr / 16) & 0x7f;
829815      loc &= 0xffff;
830816      bit = 15 - (xscr & 0x0f);
r18260r18261
834820            + (((tvram[loc+0x10000] >> bit) & 0x01) ? 2 : 0)
835821            + (((tvram[loc+0x20000] >> bit) & 0x01) ? 4 : 0)
836822            + (((tvram[loc+0x30000] >> bit) & 0x01) ? 8 : 0);
837         if(state->m_video.text_pal[colour] != 0x0000)  // any colour but black
823         if(m_video.text_pal[colour] != 0x0000)  // any colour but black
838824         {
839825            // Colour 0 is displayable if the text layer is at the priority level 2
840            if(colour == 0 && (state->m_video.reg[1] & 0x0c00) == 0x0800)
841               bitmap.pix16(line, pixel) = 512 + (state->m_video.text_pal[colour] >> 1);
826            if(colour == 0 && (m_video.reg[1] & 0x0c00) == 0x0800)
827               bitmap.pix16(line, pixel) = 512 + (m_video.text_pal[colour] >> 1);
842828            else
843829               if(colour != 0)
844                  bitmap.pix16(line, pixel) = 512 + (state->m_video.text_pal[colour] >> 1);
830                  bitmap.pix16(line, pixel) = 512 + (m_video.text_pal[colour] >> 1);
845831         }
846832         bit--;
847833         if(bit < 0)
r18260r18261
854840   }
855841}
856842
857static void x68k_draw_gfx_scanline(running_machine &machine, bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority)
843void x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority)
858844{
859   x68k_state *state = machine.driver_data<x68k_state>();
860845   const UINT16* gvram;
861846   int pixel;
862847   int page;
r18260r18261
867852   int shift;
868853   int scanline;
869854
870   if(state->m_is_32bit)
871      gvram = (const UINT16*)state->m_gvram32.target();
855   if(m_is_32bit)
856      gvram = (const UINT16*)m_gvram32.target();
872857   else
873      gvram = (const UINT16*)state->m_gvram16.target();
858      gvram = (const UINT16*)m_gvram16.target();
874859
875860   for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++)  // per scanline
876861   {
877      if(state->m_crtc.reg[20] & 0x0400)  // 1024x1024 "real" screen size - use 1024x1024 16-colour gfx layer
862      if(m_crtc.reg[20] & 0x0400)  // 1024x1024 "real" screen size - use 1024x1024 16-colour gfx layer
878863      {
879864         // adjust for scroll registers
880         if(state->m_video.reg[2] & 0x0010 && priority == state->m_video.gfxlayer_pri[0])
865         if(m_video.reg[2] & 0x0010 && priority == m_video.gfxlayer_pri[0])
881866         {
882            xscr = (state->m_crtc.reg[12] & 0x3ff);
883            yscr = (state->m_crtc.reg[13] & 0x3ff);
884            lineoffset = (((scanline - state->m_crtc.vbegin) + yscr) & 0x3ff) * 1024;
867            xscr = (m_crtc.reg[12] & 0x3ff);
868            yscr = (m_crtc.reg[13] & 0x3ff);
869            lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x3ff) * 1024;
885870            loc = xscr & 0x3ff;
886            for(pixel=state->m_crtc.hbegin;pixel<=state->m_crtc.hend;pixel++)
871            for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
887872            {
888873               switch(lineoffset & 0xc0000)
889874               {
r18260r18261
901886                  break;
902887               }
903888               if(colour != 0)
904                  bitmap.pix16(scanline, pixel) = 512 + (state->m_video.gfx_pal[colour] >> 1);
889                  bitmap.pix16(scanline, pixel) = 512 + (m_video.gfx_pal[colour] >> 1);
905890               loc++;
906891               loc &= 0x3ff;
907892            }
r18260r18261
909894      }
910895      else  // else 512x512 "real" screen size
911896      {
912         if(state->m_video.reg[2] & (1 << priority))
897         if(m_video.reg[2] & (1 << priority))
913898         {
914            page = state->m_video.gfxlayer_pri[priority];
899            page = m_video.gfxlayer_pri[priority];
915900            // adjust for scroll registers
916            switch(state->m_video.reg[0] & 0x03)
901            switch(m_video.reg[0] & 0x03)
917902            {
918903            case 0x00: // 16 colours
919               xscr = ((state->m_crtc.reg[12+(page*2)])) & 0x1ff;
920               yscr = ((state->m_crtc.reg[13+(page*2)])) & 0x1ff;
921               lineoffset = (((scanline - state->m_crtc.vbegin) + yscr) & 0x1ff) * 512;
904               xscr = ((m_crtc.reg[12+(page*2)])) & 0x1ff;
905               yscr = ((m_crtc.reg[13+(page*2)])) & 0x1ff;
906               lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
922907               loc = xscr & 0x1ff;
923908               shift = 4;
924               for(pixel=state->m_crtc.hbegin;pixel<=state->m_crtc.hend;pixel++)
909               for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
925910               {
926911                  colour = ((gvram[lineoffset + loc] >> page*shift) & 0x000f);
927912                  if(colour != 0)
928                     bitmap.pix16(scanline, pixel) = 512 + (state->m_video.gfx_pal[colour & 0x0f] >> 1);
913                     bitmap.pix16(scanline, pixel) = 512 + (m_video.gfx_pal[colour & 0x0f] >> 1);
929914                  loc++;
930915                  loc &= 0x1ff;
931916               }
r18260r18261
933918            case 0x01: // 256 colours
934919               if(page == 0 || page == 2)
935920               {
936                  xscr = ((state->m_crtc.reg[12+(page*2)])) & 0x1ff;
937                  yscr = ((state->m_crtc.reg[13+(page*2)])) & 0x1ff;
938                  lineoffset = (((scanline - state->m_crtc.vbegin) + yscr) & 0x1ff) * 512;
921                  xscr = ((m_crtc.reg[12+(page*2)])) & 0x1ff;
922                  yscr = ((m_crtc.reg[13+(page*2)])) & 0x1ff;
923                  lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
939924                  loc = xscr & 0x1ff;
940925                  shift = 4;
941                  for(pixel=state->m_crtc.hbegin;pixel<=state->m_crtc.hend;pixel++)
926                  for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
942927                  {
943928                     colour = ((gvram[lineoffset + loc] >> page*shift) & 0x00ff);
944929                     if(colour != 0)
945                        bitmap.pix16(scanline, pixel) = 512 + (state->m_video.gfx_pal[colour & 0xff] >> 1);
930                        bitmap.pix16(scanline, pixel) = 512 + (m_video.gfx_pal[colour & 0xff] >> 1);
946931                     loc++;
947932                     loc &= 0x1ff;
948933                  }
949934               }
950935               break;
951936            case 0x03: // 65536 colours
952               xscr = ((state->m_crtc.reg[12])) & 0x1ff;
953               yscr = ((state->m_crtc.reg[13])) & 0x1ff;
954               lineoffset = (((scanline - state->m_crtc.vbegin) + yscr) & 0x1ff) * 512;
937               xscr = ((m_crtc.reg[12])) & 0x1ff;
938               yscr = ((m_crtc.reg[13])) & 0x1ff;
939               lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
955940               loc = xscr & 0x1ff;
956               for(pixel=state->m_crtc.hbegin;pixel<=state->m_crtc.hend;pixel++)
941               for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
957942               {
958943                  colour = gvram[lineoffset + loc];
959944                  if(colour != 0)
r18260r18261
968953   }
969954}
970955
971static void x68k_draw_gfx(running_machine &machine, bitmap_ind16 &bitmap,rectangle cliprect)
956void x68k_state::x68k_draw_gfx(bitmap_ind16 &bitmap,rectangle cliprect)
972957{
973   x68k_state *state = machine.driver_data<x68k_state>();
974958   int priority;
975959   //rectangle rect;
976960   //int xscr,yscr;
977961   //int gpage;
978962
979   if(state->m_crtc.reg[20] & 0x0800)  // if graphic layers are set to buffer, then they aren't visible
963   if(m_crtc.reg[20] & 0x0800)  // if graphic layers are set to buffer, then they aren't visible
980964      return;
981965
982966   for(priority=3;priority>=0;priority--)
983967   {
984      x68k_draw_gfx_scanline(machine, bitmap,cliprect,priority);
968      x68k_draw_gfx_scanline(bitmap,cliprect,priority);
985969   }
986970}
987971
988972// Sprite controller "Cynthia" at 0xeb0000
989static void x68k_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, int priority, rectangle cliprect)
973void x68k_state::x68k_draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle cliprect)
990974{
991   x68k_state *state = machine.driver_data<x68k_state>();
992975   /*
993976       0xeb0000 - 0xeb07ff - Sprite registers (up to 128)
994977           + 00 : b9-0,  Sprite X position
r18260r18261
10221005
10231006   for(ptr=508;ptr>=0;ptr-=4)  // stepping through sprites
10241007   {
1025      pri = state->m_spritereg[ptr+3] & 0x03;
1008      pri = m_spritereg[ptr+3] & 0x03;
10261009#ifdef MAME_DEBUG
1027      if(!(machine.input().code_pressed(KEYCODE_I)))
1010      if(!(machine().input().code_pressed(KEYCODE_I)))
10281011#endif
10291012      if(pri == priority)
10301013      {  // if at the right priority level, draw the sprite
10311014         rectangle rect;
1032         int code = state->m_spritereg[ptr+2] & 0x00ff;
1033         int colour = (state->m_spritereg[ptr+2] & 0x0f00) >> 8;
1034         int xflip = state->m_spritereg[ptr+2] & 0x4000;
1035         int yflip = state->m_spritereg[ptr+2] & 0x8000;
1036         int sx = (state->m_spritereg[ptr+0] & 0x3ff) - 16;
1037         int sy = (state->m_spritereg[ptr+1] & 0x3ff) - 16;
1015         int code = m_spritereg[ptr+2] & 0x00ff;
1016         int colour = (m_spritereg[ptr+2] & 0x0f00) >> 8;
1017         int xflip = m_spritereg[ptr+2] & 0x4000;
1018         int yflip = m_spritereg[ptr+2] & 0x8000;
1019         int sx = (m_spritereg[ptr+0] & 0x3ff) - 16;
1020         int sy = (m_spritereg[ptr+1] & 0x3ff) - 16;
10381021
1039         rect.min_x=state->m_crtc.hshift;
1040         rect.min_y=state->m_crtc.vshift;
1041         rect.max_x=rect.min_x + state->m_crtc.visible_width-1;
1042         rect.max_y=rect.min_y + state->m_crtc.visible_height-1;
1022         rect.min_x=m_crtc.hshift;
1023         rect.min_y=m_crtc.vshift;
1024         rect.max_x=rect.min_x + m_crtc.visible_width-1;
1025         rect.max_y=rect.min_y + m_crtc.visible_height-1;
10431026
1044         sx += state->m_crtc.bg_hshift;
1045         sx += state->m_sprite_shift;
1027         sx += m_crtc.bg_hshift;
1028         sx += m_sprite_shift;
10461029
1047         drawgfxzoom_transpen(bitmap,cliprect,machine.gfx[1],code,colour+0x10,xflip,yflip,state->m_crtc.hbegin+sx,state->m_crtc.vbegin+(sy*state->m_crtc.bg_double),0x10000,0x10000*state->m_crtc.bg_double,0x00);
1030         drawgfxzoom_transpen(bitmap,cliprect,machine().gfx[1],code,colour+0x10,xflip,yflip,m_crtc.hbegin+sx,m_crtc.vbegin+(sy*m_crtc.bg_double),0x10000,0x10000*m_crtc.bg_double,0x00);
10481031      }
10491032   }
10501033}
r18260r18261
12141197   {
12151198      // Graphics screen(s)
12161199      if(priority == m_video.gfx_pri)
1217         x68k_draw_gfx(machine(),bitmap,rect);
1200         x68k_draw_gfx(bitmap,rect);
12181201
12191202      // Sprite / BG Tiles
12201203      if(priority == m_video.sprite_pri /*&& (m_spritereg[0x404] & 0x0200)*/ && (m_video.reg[2] & 0x0040))
12211204      {
1222         x68k_draw_sprites(machine(), bitmap,1,rect);
1205         x68k_draw_sprites(bitmap,1,rect);
12231206         if((m_spritereg[0x404] & 0x0008))
12241207         {
12251208            if((m_spritereg[0x404] & 0x0030) == 0x10)  // BG1 TXSEL
r18260r18261
12351218               x68k_bg1->draw(bitmap,rect,0,0);
12361219            }
12371220         }
1238         x68k_draw_sprites(machine(),bitmap,2,rect);
1221         x68k_draw_sprites(bitmap,2,rect);
12391222         if((m_spritereg[0x404] & 0x0001))
12401223         {
12411224            if((m_spritereg[0x404] & 0x0006) == 0x02)  // BG0 TXSEL
r18260r18261
12511234               x68k_bg1->draw(bitmap,rect,0,0);
12521235            }
12531236         }
1254         x68k_draw_sprites(machine(),bitmap,3,rect);
1237         x68k_draw_sprites(bitmap,3,rect);
12551238      }
12561239
12571240      // Text screen
r18260r18261
12601243         xscr = (m_crtc.reg[10] & 0x3ff);
12611244         yscr = (m_crtc.reg[11] & 0x3ff);
12621245         if(!(m_crtc.reg[20] & 0x1000))  // if text layer is set to buffer, then it's not visible
1263            x68k_draw_text(machine(),bitmap,xscr,yscr,rect);
1246            x68k_draw_text(bitmap,xscr,yscr,rect);
12641247      }
12651248   }
12661249

Previous 199869 Revisions Next


© 1997-2024 The MAME Team