Previous 199869 Revisions Next

r32472 Tuesday 30th September, 2014 at 14:57:36 UTC by Osso
namcos2 and namcos21: moved most remaining functions into classes (nw).
[src/mame/drivers]namcos21.c
[src/mame/includes]namcos2.h namcos21.h
[src/mame/machine]namcos2.c
[src/mame/video]namcos2.c namcos21.c

trunk/src/mame/machine/namcos2.c
r32471r32472
1616#include "machine/nvram.h"
1717
1818
19static void InitC148(void);
20
21static emu_timer *namcos2_posirq_timer;
22
2319void (*namcos2_kickstart)(running_machine &machine, int internal);
2420
25static unsigned mFinalLapProtCount;
26static int namcos2_mcu_analog_ctrl;
27static int namcos2_mcu_analog_data;
28static int namcos2_mcu_analog_complete;
29static UINT8 *namcos2_eeprom;
30static int sendval;
3121
32
3322READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
3423{
3524   static const UINT16 table0[8] = { 0x0000,0x0040,0x0440,0x2440,0x2480,0xa080,0x8081,0x8041 };
r32471r32472
4736      break;
4837
4938   case 2:
50      data = table1[mFinalLapProtCount&7];
39      data = table1[m_finallap_prot_count&7];
5140      data = (data&0xff00)>>8;
5241      break;
5342
5443   case 3:
55      data = table1[mFinalLapProtCount&7];
56      mFinalLapProtCount++;
44      data = table1[m_finallap_prot_count&7];
45      m_finallap_prot_count++;
5746      data = data&0x00ff;
5847      break;
5948
6049   case 0x3fffc/2:
61      data = table0[mFinalLapProtCount&7];
50      data = table0[m_finallap_prot_count&7];
6251      data = data&0xff00;
6352      break;
6453
6554   case 0x3fffe/2:
66      data = table0[mFinalLapProtCount&7];
67      mFinalLapProtCount++;
55      data = table0[m_finallap_prot_count&7];
56      m_finallap_prot_count++;
6857      data = (data&0x00ff)<<8;
6958      break;
7059
r32471r32472
7867/* Perform basic machine initialisation                      */
7968/*************************************************************/
8069
81#define namcos2_eeprom_size 0x2000
70#define m_eeprom_size 0x2000
8271
83static void
84ResetAllSubCPUs( running_machine &machine, int state )
72void namcos2_shared_state::reset_all_subcpus(int state)
8573{
86   namcos2_shared_state *s2state = machine.driver_data<namcos2_shared_state>();
87
88   s2state->m_slave->set_input_line(INPUT_LINE_RESET, state);
89   if (s2state->m_c68)
74   m_slave->set_input_line(INPUT_LINE_RESET, state);
75   if (m_c68)
9076   {
91      s2state->m_c68->set_input_line(INPUT_LINE_RESET, state);
77      m_c68->set_input_line(INPUT_LINE_RESET, state);
9278   }
9379   else
9480   {
95      s2state->m_mcu->set_input_line(INPUT_LINE_RESET, state);
81      m_mcu->set_input_line(INPUT_LINE_RESET, state);
9682   }
97   switch( machine.driver_data<namcos2_shared_state>()->m_gametype )
83   switch( m_gametype )
9884   {
9985   case NAMCOS21_SOLVALOU:
10086   case NAMCOS21_STARBLADE:
10187   case NAMCOS21_AIRCOMBAT:
10288   case NAMCOS21_CYBERSLED:
103      s2state->m_dspmaster->set_input_line(INPUT_LINE_RESET, state);
104      s2state->m_dspslave->set_input_line(INPUT_LINE_RESET, state);
89      m_dspmaster->set_input_line(INPUT_LINE_RESET, state);
90      m_dspslave->set_input_line(INPUT_LINE_RESET, state);
10591      break;
10692
10793//  case NAMCOS21_WINRUN91:
r32471r32472
114100MACHINE_START_MEMBER(namcos2_shared_state,namcos2)
115101{
116102   namcos2_kickstart = NULL;
117   namcos2_eeprom = auto_alloc_array(machine(), UINT8, namcos2_eeprom_size);
118   machine().device<nvram_device>("nvram")->set_base(namcos2_eeprom, namcos2_eeprom_size);
119   namcos2_posirq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos2_shared_state::namcos2_posirq_tick),this));
103   m_eeprom = auto_alloc_array(machine(), UINT8, m_eeprom_size);
104   machine().device<nvram_device>("nvram")->set_base(m_eeprom, m_eeprom_size);
105   m_posirq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos2_shared_state::namcos2_posirq_tick),this));
120106}
121107
122MACHINE_RESET_MEMBER(namcos2_shared_state,namcos2)
108MACHINE_RESET_MEMBER(namcos2_shared_state, namcos2)
123109{
124110//  address_space &space = m_maincpu->space(AS_PROGRAM);
125111   address_space &audio_space = m_audiocpu->space(AS_PROGRAM);
126112
127   mFinalLapProtCount = 0;
128   namcos2_mcu_analog_ctrl = 0;
129   namcos2_mcu_analog_data = 0xaa;
130   namcos2_mcu_analog_complete = 0;
131   sendval = 0;
113   m_mcu_analog_ctrl = 0;
114   m_mcu_analog_data = 0xaa;
115   m_mcu_analog_complete = 0;
132116
133117   /* Initialise the bank select in the sound CPU */
134118   namcos2_sound_bankselect_w(audio_space, 0, 0); /* Page in bank 0 */
r32471r32472
136120   m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE );
137121
138122   /* Place CPU2 & CPU3 into the reset condition */
139   ResetAllSubCPUs( machine(), ASSERT_LINE );
123   reset_all_subcpus(ASSERT_LINE);
140124
141125   /* Initialise interrupt handlers */
142   InitC148();
126   init_c148();
143127
144128   /* reset POSIRQ timer */
145   namcos2_posirq_timer->adjust(attotime::never);
129   m_posirq_timer->adjust(attotime::never);
146130
147131   m_player_mux = 0;
148132}
r32471r32472
153137
154138WRITE8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_w )
155139{
156   namcos2_eeprom[offset] = data;
140   m_eeprom[offset] = data;
157141}
158142
159143READ8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_r )
160144{
161   return namcos2_eeprom[offset];
145   return m_eeprom[offset];
162146}
163147
164148
r32471r32472
301285      case 1: return 0x110;
302286      case 4: return 0xBE;
303287      case 6: return 0x1001;
304      case 7: return (sendval==1)?0xBE:1;
288      case 7: return (m_sendval==1)?0xBE:1;
305289      }
306290      break;
307291
r32471r32472
316300      switch(offset)
317301      {
318302      case 4:
319         if( sendval == 1 ){
320            sendval = 0;
303         if( m_sendval == 1 ){
304            m_sendval = 0;
321305            return 0x13F;
322306         }
323307         break;
324308      case 7:
325         if( sendval == 1 ){
326            sendval = 0;
309         if( m_sendval == 1 ){
310            m_sendval = 0;
327311            return 0x13F;
328312         }
329313         break;
r32471r32472
408392   int gametype = m_gametype;
409393   if( gametype == NAMCOS2_MARVEL_LAND && offset == 5 )
410394   {
411      if (data == 0x615E) sendval = 1;
395      if (data == 0x615E) m_sendval = 1;
412396   }
413397   if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 4 )
414398   {
415      if (data == 0x13EC) sendval = 1;
399      if (data == 0x13EC) m_sendval = 1;
416400   }
417401   if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 7 )
418402   {
419      if (data == 0x13EC) sendval = 1;
403      if (data == 0x13EC) m_sendval = 1;
420404   }
421405   if( gametype == NAMCOS2_MARVEL_LAND && offset == 6 )
422406   {
423      if (data == 0x1001) sendval = 0;
407      if (data == 0x1001) m_sendval = 0;
424408   }
425409}
426410
r32471r32472
432416#define FRAME_TIME      (1.0/60.0)
433417#define LINE_LENGTH     (FRAME_TIME/NO_OF_LINES)
434418
435static UINT16  namcos2_68k_master_C148[0x20];
436static UINT16  namcos2_68k_slave_C148[0x20];
437static UINT16  namcos2_68k_gpu_C148[0x20];
438419
439
440420bool namcos2_shared_state::is_system21()
441421{
442422   switch (m_gametype)
r32471r32472
453433   }
454434}
455435
456static void InitC148(void)
436void namcos2_shared_state::init_c148()
457437{
458   int loop;
459
460   for(loop = 0; loop < 0x20; loop++)
438   for(int loop = 0; loop < 0x20; loop++)
461439   {
462      namcos2_68k_master_C148[loop] = 0;
463      namcos2_68k_slave_C148[loop] = 0;
464      namcos2_68k_gpu_C148[loop] = 0;
440      m_68k_master_C148[loop] = 0;
441      m_68k_slave_C148[loop] = 0;
442      m_68k_gpu_C148[loop] = 0;
465443   }
466444}
467445
468static UINT16
469ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite )
446UINT16 namcos2_shared_state::readwrite_c148( address_space &space, offs_t offset, UINT16 data, int bWrite )
470447{
471448   offs_t addr = ((offset * 2) + 0x1c0000) & 0x1fe000;
472449   device_t *altcpu = NULL;
r32471r32472
476453
477454   if (&space.device() == space.machine().device("maincpu"))
478455   {
479      pC148Reg = namcos2_68k_master_C148;
456      pC148Reg = m_68k_master_C148;
480457      altcpu = space.machine().device("slave");
481      pC148RegAlt = namcos2_68k_slave_C148;
458      pC148RegAlt = m_68k_slave_C148;
482459   }
483460   else if (&space.device() == space.machine().device("slave"))
484461   {
485      pC148Reg = namcos2_68k_slave_C148;
462      pC148Reg = m_68k_slave_C148;
486463      altcpu = space.machine().device("maincpu");
487      pC148RegAlt = namcos2_68k_master_C148;
464      pC148RegAlt = m_68k_master_C148;
488465   }
489466   else if (&space.device() == space.machine().device("gpu"))
490467   {
491      pC148Reg = namcos2_68k_gpu_C148;
468      pC148Reg = m_68k_gpu_C148;
492469      altcpu = space.machine().device("maincpu");
493      pC148RegAlt = namcos2_68k_master_C148;
470      pC148RegAlt = m_68k_master_C148;
494471   }
495472
496473   if( bWrite )
r32471r32472
600577      {
601578         if (data & 0x01)
602579         { /* Resume execution */
603            ResetAllSubCPUs(space.machine(), CLEAR_LINE);
580            reset_all_subcpus(CLEAR_LINE);
604581            /* Give the new CPU an immediate slice of the action */
605582            space.device().execute().yield();
606583         }
607584         else
608585         { /* Suspend execution */
609            ResetAllSubCPUs(space.machine(), ASSERT_LINE);
586            reset_all_subcpus(ASSERT_LINE);
610587         }
611588      }
612589      break;
r32471r32472
623600
624601WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_w )
625602{
626   (void)ReadWriteC148(space, offset, data, 1);
603   (void)readwrite_c148(space, offset, data, 1);
627604}
628605
629606READ16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_r )
630607{
631   return ReadWriteC148(space, offset, 0, 0);
608   return readwrite_c148(space, offset, 0, 0);
632609}
633610
634611WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_w )
635612{
636   (void)ReadWriteC148(space, offset, data, 1);
613   (void)readwrite_c148(space, offset, data, 1);
637614}
638615
639616READ16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_r )
640617{
641   return ReadWriteC148(space, offset, 0, 0);
618   return readwrite_c148(space, offset, 0, 0);
642619}
643620
644621WRITE16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_w )
645622{
646   (void)ReadWriteC148(space, offset, data, 1);
623   (void)readwrite_c148(space, offset, data, 1);
647624}
648625
649626READ16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_r )
650627{
651   return ReadWriteC148(space, offset, 0, 0);
628   return readwrite_c148(space, offset, 0, 0);
652629}
653630
654631
655static int GetPosIRQScanline( running_machine &machine )
632int namcos2_shared_state::get_posirq_scanline()
656633{
657   namcos2_shared_state *state = machine.driver_data<namcos2_shared_state>();
658   if (state->is_system21()) return 0;
659   return downcast<namcos2_state *>(state)->get_pos_irq_scanline();
634   namcos2_state *s2state = machine().driver_data<namcos2_state>();
635   if (is_system21()) return 0;
636   return s2state->get_pos_irq_scanline();
660637}
661638
662639TIMER_CALLBACK_MEMBER(namcos2_shared_state::namcos2_posirq_tick)
663640{
664641   if (is_system21()) {
665      if (namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
642      if (m_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
666643         m_screen->update_partial(param);
667         machine().device("gpu")->execute().set_input_line(namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
644         machine().device("gpu")->execute().set_input_line(m_68k_gpu_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
668645      }
669646      return;
670647   }
671648
672   if (namcos2_68k_master_C148[NAMCOS2_C148_POSIRQ]|namcos2_68k_slave_C148[NAMCOS2_C148_POSIRQ]) {
649   if (m_68k_master_C148[NAMCOS2_C148_POSIRQ]|m_68k_slave_C148[NAMCOS2_C148_POSIRQ]) {
673650      m_screen->update_partial(param);
674      if (namcos2_68k_master_C148[NAMCOS2_C148_POSIRQ]) m_maincpu->set_input_line(namcos2_68k_master_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
675      if (namcos2_68k_slave_C148[NAMCOS2_C148_POSIRQ]) m_slave->set_input_line(namcos2_68k_slave_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
651      if (m_68k_master_C148[NAMCOS2_C148_POSIRQ]) m_maincpu->set_input_line(m_68k_master_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
652      if (m_68k_slave_C148[NAMCOS2_C148_POSIRQ]) m_slave->set_input_line(m_68k_slave_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
676653   }
677654}
678655
679656void namcos2_shared_state::adjust_posirq_timer( int scanline )
680657{
681   namcos2_posirq_timer->adjust(m_screen->time_until_pos(scanline, 80), scanline);
658   m_posirq_timer->adjust(m_screen->time_until_pos(scanline, 80), scanline);
682659}
683660
684661INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_master_vblank)
685662{
686   if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine()));
687   device.execute().set_input_line(namcos2_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
663   if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
664   device.execute().set_input_line(m_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
688665}
689666
690667INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_slave_vblank)
691668{
692   if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine()));
693   device.execute().set_input_line(namcos2_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
669   if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
670   device.execute().set_input_line(m_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
694671}
695672
696673INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_gpu_vblank)
697674{
698675   /* only used by namcos21 */
699   int scanline = GetPosIRQScanline(machine());
676   int scanline = get_posirq_scanline();
700677   scanline = 0x50+0x89; /* HACK for Winning Run */
701678
702   //printf( "namcos2_68k_gpu_vblank(%d)\n",namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ] );
679   //printf( "namcos2_68k_gpu_vblank(%d)\n",m_68k_gpu_C148[NAMCOS2_C148_POSIRQ] );
703680   adjust_posirq_timer(scanline);
704   device.execute().set_input_line(namcos2_68k_gpu_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
681   device.execute().set_input_line(m_68k_gpu_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
705682}
706683
707684/**************************************************************/
r32471r32472
724701
725702WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_ctrl_w )
726703{
727   namcos2_mcu_analog_ctrl = data & 0xff;
704   m_mcu_analog_ctrl = data & 0xff;
728705
729706   /* Check if this is a start of conversion */
730707   /* Input ports 2 through 9 are the analog channels */
r32471r32472
732709   if(data & 0x40)
733710   {
734711   /* Set the conversion complete flag */
735      namcos2_mcu_analog_complete = 2;
712      m_mcu_analog_complete = 2;
736713      /* We convert instantly, good eh! */
737714      switch((data>>2) & 0x07)
738715      {
739716      case 0:
740         namcos2_mcu_analog_data=ioport("AN0")->read();
717         m_mcu_analog_data=ioport("AN0")->read();
741718         break;
742719      case 1:
743         namcos2_mcu_analog_data=ioport("AN1")->read();
720         m_mcu_analog_data=ioport("AN1")->read();
744721         break;
745722      case 2:
746         namcos2_mcu_analog_data=ioport("AN2")->read();
723         m_mcu_analog_data=ioport("AN2")->read();
747724         break;
748725      case 3:
749         namcos2_mcu_analog_data=ioport("AN3")->read();
726         m_mcu_analog_data=ioport("AN3")->read();
750727         break;
751728      case 4:
752         namcos2_mcu_analog_data=ioport("AN4")->read();
729         m_mcu_analog_data=ioport("AN4")->read();
753730         break;
754731      case 5:
755         namcos2_mcu_analog_data=ioport("AN5")->read();
732         m_mcu_analog_data=ioport("AN5")->read();
756733         break;
757734      case 6:
758         namcos2_mcu_analog_data=ioport("AN6")->read();
735         m_mcu_analog_data=ioport("AN6")->read();
759736         break;
760737      case 7:
761         namcos2_mcu_analog_data=ioport("AN7")->read();
738         m_mcu_analog_data=ioport("AN7")->read();
762739         break;
763740      default:
764741         output_set_value("anunk",data);
r32471r32472
769746      if( m_gametype == NAMCOS2_DIRT_FOX ||
770747         m_gametype == NAMCOS2_DIRT_FOX_JP )
771748      {
772         namcos2_mcu_analog_data ^= 0x80;
749         m_mcu_analog_data ^= 0x80;
773750      }
774751#endif
775752      /* If the interrupt enable bit is set trigger an A/D IRQ */
r32471r32472
785762   int data=0;
786763
787764   /* ADEF flag is only cleared AFTER a read from control THEN a read from DATA */
788   if(namcos2_mcu_analog_complete==2) namcos2_mcu_analog_complete=1;
789   if(namcos2_mcu_analog_complete) data|=0x80;
765   if(m_mcu_analog_complete==2) m_mcu_analog_complete=1;
766   if(m_mcu_analog_complete) data|=0x80;
790767
791768   /* Mask on the lower 6 register bits, Irq EN/Channel/Clock */
792   data|=namcos2_mcu_analog_ctrl&0x3f;
769   data|=m_mcu_analog_ctrl&0x3f;
793770   /* Return the value */
794771   return data;
795772}
r32471r32472
800777
801778READ8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_port_r )
802779{
803   if(namcos2_mcu_analog_complete==1) namcos2_mcu_analog_complete=0;
804   return namcos2_mcu_analog_data;
780   if(m_mcu_analog_complete==1) m_mcu_analog_complete=0;
781   return m_mcu_analog_data;
805782}
806783
807784WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_port_d_w )
trunk/src/mame/includes/namcos21.h
r32471r32472
2525   int slaveActive;
2626};
2727
28struct vertex
29{
30   double x,y;
31   double z;
32};
33
34struct edge
35{
36   double x;
37   double z;
38};
39
40
2841class namcos21_state : public namcos2_shared_state
2942{
3043public:
r32471r32472
157170   DECLARE_MACHINE_START(namcos21);
158171   DECLARE_VIDEO_START(namcos21);
159172   UINT32 screen_update_namcos21(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
173   void allocate_poly_framebuffer();
174   void clear_poly_framebuffer();
175   void copy_visible_poly_framebuffer(bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi);
176   void renderscanline_flat(const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable);
177   void rendertri(const vertex *v0, const vertex *v1, const vertex *v2, unsigned color, int depthcueenable);
178   void draw_quad(int sx[4], int sy[4], int zcode[4], int color);
179   INT32 read_pointrom_data(unsigned offset);
180   void transmit_word_to_slave(UINT16 data);
181   void transfer_dsp_data();
182   UINT16 read_word_from_slave_input();
183   size_t get_input_bytes_advertised_for_slave();
184   int init_dsp();
185   void render_slave_output(UINT16 data);
186   void winrun_flush_poly();
187   void init(int game_type);
160188};
161
162/*----------- defined in video/namcos21.c -----------*/
163extern void namcos21_ClearPolyFrameBuffer( running_machine &machine );
164extern void namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4], int color );
trunk/src/mame/includes/namcos2.h
r32471r32472
120120   // game type helpers
121121   bool is_system21();
122122   int m_gametype;
123   
124   emu_timer *m_posirq_timer;
125   int m_mcu_analog_ctrl;
126   int m_mcu_analog_data;
127   int m_mcu_analog_complete;
128   UINT8 *m_eeprom;
129   UINT16  m_68k_master_C148[0x20];
130   UINT16  m_68k_slave_C148[0x20];
131   UINT16  m_68k_gpu_C148[0x20];
123132
124133   // C123 Tilemap Emulation
125134   // TODO: merge with namcos1.c implementation and convert to device
r32471r32472
210219   INTERRUPT_GEN_MEMBER(namcos2_68k_gpu_vblank);
211220   TIMER_CALLBACK_MEMBER(namcos2_posirq_tick);
212221   void adjust_posirq_timer( int scanline );
222   void init_c148();
223   void reset_all_subcpus(int state);
224   UINT16 readwrite_c148( address_space &space, offs_t offset, UINT16 data, int bWrite );
225   int get_posirq_scanline();
213226
214227   DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w );
215228   DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r );
r32471r32472
338351   tilemap_t *m_tilemap_roz;
339352   UINT16 m_gfx_ctrl;
340353   UINT16 m_serial_comms_ctrl[0x8];
354   unsigned m_finallap_prot_count;
355   int m_sendval;
341356
342357   optional_device<namco_c45_road_device> m_c45_road;
343358
trunk/src/mame/video/namcos21.c
r32471r32472
4545         videoram[(offset+i)&0x7ffff] = color;
4646      }
4747   }
48} /* winrun_gpu_videoram_w */
48}
4949
5050READ16_MEMBER(namcos21_state::winrun_gpu_videoram_r)
5151{
5252   UINT8 *videoram = m_videoram;
5353   return videoram[offset]<<8;
54} /* winrun_gpu_videoram_r */
54}
5555
56static void
57AllocatePolyFrameBuffer( running_machine &machine )
56void namcos21_state::allocate_poly_framebuffer()
5857{
59   namcos21_state *state = machine.driver_data<namcos21_state>();
60   state->m_mpPolyFrameBufferZ     = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
61   state->m_mpPolyFrameBufferPens  = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
58   m_mpPolyFrameBufferZ     = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
59   m_mpPolyFrameBufferPens  = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
6260
63   state->m_mpPolyFrameBufferZ2    = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
64   state->m_mpPolyFrameBufferPens2 = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
61   m_mpPolyFrameBufferZ2    = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
62   m_mpPolyFrameBufferPens2 = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
6563
66   namcos21_ClearPolyFrameBuffer(machine);
67   namcos21_ClearPolyFrameBuffer(machine);
68} /* AllocatePolyFrameBuffer */
64   clear_poly_framebuffer();
65   clear_poly_framebuffer();
66}
6967
70void
71namcos21_ClearPolyFrameBuffer( running_machine &machine )
68void namcos21_state::clear_poly_framebuffer()
7269{
73   namcos21_state *state = machine.driver_data<namcos21_state>();
74   int i;
7570   UINT16 *temp2;
7671
7772   /* swap work and visible framebuffers */
78   temp2 = state->m_mpPolyFrameBufferZ;
79   state->m_mpPolyFrameBufferZ = state->m_mpPolyFrameBufferZ2;
80   state->m_mpPolyFrameBufferZ2 = temp2;
73   temp2 = m_mpPolyFrameBufferZ;
74   m_mpPolyFrameBufferZ = m_mpPolyFrameBufferZ2;
75   m_mpPolyFrameBufferZ2 = temp2;
8176
82   temp2 = state->m_mpPolyFrameBufferPens;
83   state->m_mpPolyFrameBufferPens = state->m_mpPolyFrameBufferPens2;
84   state->m_mpPolyFrameBufferPens2 = temp2;
77   temp2 = m_mpPolyFrameBufferPens;
78   m_mpPolyFrameBufferPens = m_mpPolyFrameBufferPens2;
79   m_mpPolyFrameBufferPens2 = temp2;
8580
8681   /* wipe work zbuffer */
87   for( i=0; i<NAMCOS21_POLY_FRAME_WIDTH*NAMCOS21_POLY_FRAME_HEIGHT; i++ )
82   for( int i = 0; i < NAMCOS21_POLY_FRAME_WIDTH*NAMCOS21_POLY_FRAME_HEIGHT; i++ )
8883   {
89      state->m_mpPolyFrameBufferZ[i] = 0x7fff;
84      m_mpPolyFrameBufferZ[i] = 0x7fff;
9085   }
91} /* namcos21_ClearPolyFrameBuffer */
86}
9287
93static void
94CopyVisiblePolyFrameBuffer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi )
88void namcos21_state::copy_visible_poly_framebuffer(bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi)
9589{
96   namcos21_state *state = machine.driver_data<namcos21_state>(); /* blit the visible framebuffer */
90   /* blit the visible framebuffer */
9791   int sy;
9892   for( sy=clip.min_y; sy<=clip.max_y; sy++ )
9993   {
10094      UINT16 *dest = &bitmap.pix16(sy);
101      const UINT16 *pPen = state->m_mpPolyFrameBufferPens2+NAMCOS21_POLY_FRAME_WIDTH*sy;
102      const UINT16 *pZ = state->m_mpPolyFrameBufferZ2+NAMCOS21_POLY_FRAME_WIDTH*sy;
95      const UINT16 *pPen = m_mpPolyFrameBufferPens2+NAMCOS21_POLY_FRAME_WIDTH*sy;
96      const UINT16 *pZ = m_mpPolyFrameBufferZ2+NAMCOS21_POLY_FRAME_WIDTH*sy;
10397      int sx;
10498      for( sx=clip.min_x; sx<=clip.max_x; sx++ )
10599      {
r32471r32472
111105         }
112106      }
113107   }
114} /* CopyVisiblePolyFrameBuffer */
108}
115109
116110VIDEO_START_MEMBER(namcos21_state,namcos21)
117111{
r32471r32472
119113   {
120114      m_videoram = auto_alloc_array(machine(), UINT8, 0x80000);
121115   }
122   AllocatePolyFrameBuffer(machine());
116   allocate_poly_framebuffer();
123117   c355_obj_init(
124118      0,      /* gfx bank */
125119      0xf,    /* reverse palette mapping */
r32471r32472
158152      c355_obj_draw(screen, bitmap, cliprect, 14 );   //driver's eyes
159153   }
160154
161   CopyVisiblePolyFrameBuffer( machine(), bitmap, cliprect, 0x7fc0, 0x7ffe );
155   copy_visible_poly_framebuffer(bitmap, cliprect, 0x7fc0, 0x7ffe);
162156
163157   if( m_gametype != NAMCOS21_WINRUN91 )
164158   { /* draw low priority 2d sprites */
r32471r32472
166160      c355_obj_draw(screen, bitmap, cliprect, 1 );
167161   }
168162
169   CopyVisiblePolyFrameBuffer( machine(), bitmap, cliprect, 0, 0x7fbf );
163   copy_visible_poly_framebuffer(bitmap, cliprect, 0, 0x7fbf);
170164
171165
172166   if( m_gametype != NAMCOS21_WINRUN91 )
r32471r32472
211205
212206/*********************************************************************************************/
213207
214struct vertex
215{
216   double x,y;
217   double z;
218};
219
220struct edge
221{
222   double x;
223   double z;
224};
225
226208#define SWAP(T,A,B) { const T *temp = A; A = B; B = temp; }
227209
228static void
229renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable )
210void namcos21_state::renderscanline_flat(const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable)
230211{
231212   if( e1->x > e2->x )
232213   {
r32471r32472
234215   }
235216
236217   {
237      UINT16 *pDest = state->m_mpPolyFrameBufferPens + sy*NAMCOS21_POLY_FRAME_WIDTH;
238      UINT16 *pZBuf = state->m_mpPolyFrameBufferZ    + sy*NAMCOS21_POLY_FRAME_WIDTH;
218      UINT16 *pDest = m_mpPolyFrameBufferPens + sy*NAMCOS21_POLY_FRAME_WIDTH;
219      UINT16 *pZBuf = m_mpPolyFrameBufferZ    + sy*NAMCOS21_POLY_FRAME_WIDTH;
239220      int x0 = (int)e1->x;
240221      int x1 = (int)e2->x;
241222      int w = x1-x0;
r32471r32472
264245               if( depthcueenable && zz>0 )
265246               {
266247                  int depth = 0;
267                  if( state->m_gametype == NAMCOS21_WINRUN91 )
248                  if( m_gametype == NAMCOS21_WINRUN91 )
268249                  {
269250                     depth = (zz>>10)*0x100;
270251                     pen += depth;
271252                  }
272                  else if( state->m_gametype == NAMCOS21_DRIVERS_EYES )
253                  else if( m_gametype == NAMCOS21_DRIVERS_EYES )
273254                  {
274255                     depth = (zz>>10)*0x100;
275256                     pen -= depth;
r32471r32472
287268         }
288269      }
289270   }
290} /* renderscanline_flat */
271}
291272
292static void
293rendertri(
294      namcos21_state *state,
295      const vertex *v0,
296      const vertex *v1,
297      const vertex *v2,
298      unsigned color,
299      int depthcueenable )
273void namcos21_state::rendertri(const vertex *v0, const vertex *v1, const vertex *v2, unsigned color, int depthcueenable)
300274{
301275   int dy,ystart,yend,crop;
302276
r32471r32472
363337
364338         for( y=ystart; y<yend; y++ )
365339         {
366            renderscanline_flat( state, &e1, &e2, y, color, depthcueenable );
340            renderscanline_flat(&e1, &e2, y, color, depthcueenable);
367341
368342            e2.x += dx2dy;
369343            e2.z += dz2dy;
r32471r32472
397371         }
398372         for( y=ystart; y<yend; y++ )
399373         {
400            renderscanline_flat( state, &e1, &e2, y, color, depthcueenable );
374            renderscanline_flat(&e1, &e2, y, color, depthcueenable);
401375
402376            e2.x += dx2dy;
403377            e2.z += dz2dy;
r32471r32472
407381         }
408382      }
409383   }
410} /* rendertri */
384}
411385
412void
413namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4], int color )
386void namcos21_state::draw_quad(int sx[4], int sy[4], int zcode[4], int color)
414387{
415   namcos21_state *state = machine.driver_data<namcos21_state>();
416388   vertex a,b,c,d;
417389   int depthcueenable = 1;
418390   /*
r32471r32472
421393       0x4000..0x5fff  polygon palette bank1 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
422394       0x6000..0x7fff  polygon palette bank2 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
423395   */
424   if( state->m_gametype == NAMCOS21_WINRUN91 )
396   if( m_gametype == NAMCOS21_WINRUN91 )
425397   {
426398      color = 0x4000|(color&0xff);
427399   }
428   else if ( state->m_gametype == NAMCOS21_DRIVERS_EYES )
400   else if ( m_gametype == NAMCOS21_DRIVERS_EYES )
429401   {
430402      color = 0x3f00|(color&0xff);
431403   }
r32471r32472
465437   d.y = sy[3];
466438   d.z = zcode[3];
467439
468   rendertri( state, &a, &b, &c, color, depthcueenable );
469   rendertri( state, &c, &d, &a, color, depthcueenable );
470} /* namcos21_DrawQuad */
440   rendertri(&a, &b, &c, color, depthcueenable);
441   rendertri(&c, &d, &a, color, depthcueenable);
442}
trunk/src/mame/video/namcos2.c
r32471r32472
77
88static void
99TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
10//void namcos2_shared_state::tilemap_cb(UINT16 code, int *tile, int *mask)
1011{
1112   *mask = code;
1213
r32471r32472
2324      *tile = (code&0x07ff)|((code&0xc000)>>3)|((code&0x3800)<<2);
2425      break;
2526   }
26} /* TilemapCB */
27}
2728
2829/**
2930 * m_gfx_ctrl selects a bank of 128 sprites within spriteram
r32471r32472
3940READ16_MEMBER( namcos2_state::gfx_ctrl_r )
4041{
4142   return m_gfx_ctrl;
42} /* namcos2_gfx_ctrl_r */
43}
4344
4445WRITE16_MEMBER( namcos2_state::gfx_ctrl_w )
4546{
4647   COMBINE_DATA(&m_gfx_ctrl);
47} /* namcos2_gfx_ctrl_w */
48}
4849
4950TILE_GET_INFO_MEMBER( namcos2_state::roz_tile_info )
5051{
5152   int tile = m_rozram[tile_index];
5253   SET_TILE_INFO_MEMBER(3,tile,0/*color*/,0);
53} /* roz_tile_info */
54}
5455
55struct RozParam
56struct roz_param
5657{
5758   UINT32 size;
5859   UINT32 startx,starty;
r32471r32472
6263};
6364
6465INLINE void
65DrawRozHelperBlock(const struct RozParam *rozInfo, int destx, int desty,
66draw_roz_helper_block(const struct roz_param *rozInfo, int destx, int desty,
6667   int srcx, int srcy, int width, int height,
6768   bitmap_ind16 &destbitmap, bitmap_ind8 &flagsbitmap,
6869   bitmap_ind16 &srcbitmap, UINT32 size_mask)
r32471r32472
109110      dest += dest_rowinc;
110111      desty++;
111112   }
112} /* DrawRozHelperBlock */
113}
113114
114115static void
115DrawRozHelper(
116draw_roz_helper(
116117   screen_device &screen,
117118   bitmap_ind16 &bitmap,
118119   tilemap_t *tmap,
119120   const rectangle &clip,
120   const struct RozParam *rozInfo )
121   const struct roz_param *rozInfo )
121122{
122123   tmap->set_palette_offset(rozInfo->color );
123124
r32471r32472
186187         // Do the block columns
187188         for (j = 0; j < column_block_count; j++)
188189         {
189            DrawRozHelperBlock(rozInfo, dx, desty, sx, sy, ROZ_BLOCK_SIZE,
190            draw_roz_helper_block(rozInfo, dx, desty, sx, sy, ROZ_BLOCK_SIZE,
190191               ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask);
191192            // Increment to the next block column
192193            sx += row_block_size_incxx;
r32471r32472
196197         // Do the extra columns
197198         if (column_extra_count)
198199         {
199            DrawRozHelperBlock(rozInfo, dx, desty, sx, sy, column_extra_count,
200            draw_roz_helper_block(rozInfo, dx, desty, sx, sy, column_extra_count,
200201               ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask);
201202         }
202203         // Increment to the next row block
r32471r32472
210211         // Do the block columns
211212         for (i = 0; i < column_block_count; i++)
212213         {
213            DrawRozHelperBlock(rozInfo, destx, desty, srcx, srcy, ROZ_BLOCK_SIZE,
214            draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, ROZ_BLOCK_SIZE,
214215               row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask);
215216            srcx += row_block_size_incxx;
216217            srcy += row_block_size_incxy;
r32471r32472
219220         // Do the extra columns
220221         if (column_extra_count)
221222         {
222            DrawRozHelperBlock(rozInfo, destx, desty, srcx, srcy, column_extra_count,
223            draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, column_extra_count,
223224               row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask);
224225         }
225226      }
r32471r32472
233234         rozInfo->incyx, rozInfo->incyy,
234235         rozInfo->wrap,0,0); // wrap, flags, pri
235236   }
236} /* DrawRozHelper */
237}
237238
238239void namcos2_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
239240{
240241   const int xoffset = 38,yoffset = 0;
241   struct RozParam rozParam;
242   struct roz_param rozParam;
242243
243244   rozParam.color = (m_gfx_ctrl & 0x0f00);
244245   rozParam.incxx  = (INT16)m_roz_ctrl[0];
r32471r32472
282283   rozParam.incyx<<=8;
283284   rozParam.incyy<<=8;
284285
285   DrawRozHelper( screen, bitmap, m_tilemap_roz, cliprect, &rozParam );
286   draw_roz_helper( screen, bitmap, m_tilemap_roz, cliprect, &rozParam );
286287}
287288
288289WRITE16_MEMBER( namcos2_state::rozram_word_w )
r32471r32472
314315      if (offset > 0x180b) return 0xff;
315316   }
316317   return m_paletteram[offset];
317} /* namcos2_68k_video_palette_r */
318}
318319
319320WRITE16_MEMBER( namcos2_state::paletteram_word_w )
320321{
r32471r32472
361362   {
362363      COMBINE_DATA(&m_paletteram[offset]);
363364   }
364} /* namcos2_68k_video_palette_w */
365}
365366
366367
367368inline void
r32471r32472
382383         offset++;
383384      }
384385   }
385} /* update_palette */
386}
386387
387388/**************************************************************************/
388389
r32471r32472
413414   clip.max_y = get_palette_register(3) - 0x21 - 1;
414415   /* intersect with master clip rectangle */
415416   clip &= cliprect;
416} /* apply_clip */
417}
417418
418419UINT32 namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
419420{
r32471r32472
482483   {
483484      c169_roz_init(1, "gfx5");
484485   }
485} /* luckywld */
486}
486487
487488UINT32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
488489{
trunk/src/mame/drivers/namcos21.c
r32471r32472
309309#define ENABLE_LOGGING      0
310310
311311
312static INT32
313ReadPointROMData( running_machine &machine, unsigned offset )
312INT32 namcos21_state::read_pointrom_data(unsigned offset)
314313{
315   const INT32 *pPointData = (INT32 *)machine.root_device().memregion( "user2" )->base();
314   const INT32 *pPointData = (INT32 *)memregion( "user2" )->base();
316315   INT32 result = pPointData[offset];
317316   return result;
318317}
r32471r32472
378377   return result;
379378}
380379
381static void
382TransmitWordToSlave( namcos21_state *state, UINT16 data )
380void namcos21_state::transmit_word_to_slave(UINT16 data)
383381{
384   unsigned offs = state->m_mpDspState->slaveInputStart+state->m_mpDspState->slaveBytesAvailable++;
385   state->m_mpDspState->slaveInputBuffer[offs%DSP_BUF_MAX] = data;
386   if (ENABLE_LOGGING) logerror( "+%04x(#%04x)\n", data, state->m_mpDspState->slaveBytesAvailable );
387   state->m_mpDspState->slaveActive = 1;
388   if( state->m_mpDspState->slaveBytesAvailable >= DSP_BUF_MAX )
382   unsigned offs = m_mpDspState->slaveInputStart+m_mpDspState->slaveBytesAvailable++;
383   m_mpDspState->slaveInputBuffer[offs%DSP_BUF_MAX] = data;
384   if (ENABLE_LOGGING) logerror( "+%04x(#%04x)\n", data, m_mpDspState->slaveBytesAvailable );
385   m_mpDspState->slaveActive = 1;
386   if( m_mpDspState->slaveBytesAvailable >= DSP_BUF_MAX )
389387   {
390388      logerror( "IDC overflow\n" );
391389      exit(1);
392390   }
393} /* TransmitWordToSlave */
391}
394392
395static void
396TransferDspData( running_machine &machine )
393void namcos21_state::transfer_dsp_data()
397394{
398   namcos21_state *state = machine.driver_data<namcos21_state>();
399   UINT16 addr = state->m_mpDspState->masterSourceAddr;
395   UINT16 addr = m_mpDspState->masterSourceAddr;
400396   int mode = addr&0x8000;
401397   addr&=0x7fff;
402398   if( addr )
r32471r32472
405401      {
406402         int i;
407403         UINT16 old = addr;
408         UINT16 code = state->m_dspram16[addr++];
404         UINT16 code = m_dspram16[addr++];
409405         if( code == 0xffff )
410406         {
411407            if( mode )
412408            {
413               addr = state->m_dspram16[addr];
414               state->m_mpDspState->masterSourceAddr = addr;
409               addr = m_dspram16[addr];
410               m_mpDspState->masterSourceAddr = addr;
415411               if (ENABLE_LOGGING) logerror( "LOOP:0x%04x\n", addr );
416412               addr&=0x7fff;
417413               if( old==addr )
r32471r32472
421417            }
422418            else
423419            {
424               state->m_mpDspState->masterSourceAddr = 0;
420               m_mpDspState->masterSourceAddr = 0;
425421               return;
426422            }
427423         }
428424         else if( mode==0 )
429425         { /* direct data transfer */
430426            if (ENABLE_LOGGING) logerror( "DATA TFR(0x%x)\n", code );
431            TransmitWordToSlave( state, code );
427            transmit_word_to_slave(code);
432428            for( i=0; i<code; i++ )
433429            {
434               UINT16 data = state->m_dspram16[addr++];
435               TransmitWordToSlave( state, data );
430               UINT16 data = m_dspram16[addr++];
431               transmit_word_to_slave(data);
436432            }
437433         }
438434         else if( code==0x18 || code==0x1a )
439435         {
440436            if (ENABLE_LOGGING) logerror( "HEADER TFR(0x%x)\n", code );
441            TransmitWordToSlave( state, code+1 );
437            transmit_word_to_slave(code+1);
442438            for( i=0; i<code; i++ )
443439            {
444               UINT16 data = state->m_dspram16[addr++];
445               TransmitWordToSlave( state, data );
440               UINT16 data = m_dspram16[addr++];
441               transmit_word_to_slave(data);
446442            }
447443         }
448444         else
449445         {
450            INT32 masterAddr = ReadPointROMData(machine, code);
446            INT32 masterAddr = read_pointrom_data(code);
451447            if (ENABLE_LOGGING) logerror( "OBJ TFR(0x%x)\n", code );
452448            {
453               UINT16 len = state->m_dspram16[addr++];
449               UINT16 len = m_dspram16[addr++];
454450               for(;;)
455451               {
456                  int subAddr = ReadPointROMData(machine, masterAddr++);
452                  int subAddr = read_pointrom_data(masterAddr++);
457453                  if( subAddr==0xffffff )
458454                  {
459455                     break;
460456                  }
461457                  else
462458                  {
463                     int primWords = (UINT16)ReadPointROMData(machine, subAddr++);
459                     int primWords = (UINT16)read_pointrom_data(subAddr++);
464460                     if( primWords>2 )
465461                     {
466                        TransmitWordToSlave( state, 0 ); /* pad1 */
467                        TransmitWordToSlave( state, len+1 );
462                        transmit_word_to_slave(0); /* pad1 */
463                        transmit_word_to_slave(len+1);
468464                        for( i=0; i<len; i++ )
469465                        { /* transform */
470                           TransmitWordToSlave( state, state->m_dspram16[addr+i] );
466                           transmit_word_to_slave(m_dspram16[addr+i]);
471467                        }
472                        TransmitWordToSlave( state, 0 ); /* pad2 */
473                        TransmitWordToSlave( state, primWords+1 );
468                        transmit_word_to_slave(0); /* pad2 */
469                        transmit_word_to_slave(primWords+1);
474470                        for( i=0; i<primWords; i++ )
475471                        {
476                           TransmitWordToSlave( state, (UINT16)ReadPointROMData(machine, subAddr+i) );
472                           transmit_word_to_slave((UINT16)read_pointrom_data(subAddr+i));
477473                        }
478474                     }
479475                     else
r32471r32472
487483         }
488484      } /* for(;;) */
489485   }
490} /* TransferDspData */
486}
491487
492488
493489
494void
495namcos21_kickstart( running_machine &machine, int internal )
490void namcos21_kickstart(running_machine &machine, int internal)
496491{
497492   namcos21_state *state = machine.driver_data<namcos21_state>();
493   
498494   /* patch dsp watchdog */
499495   switch( state->m_gametype )
500496   {
501   case NAMCOS21_AIRCOMBAT:
502      state->m_master_dsp_code[0x008e] = 0x808f;
503      break;
504   case NAMCOS21_SOLVALOU:
505      state->m_master_dsp_code[0x008b] = 0x808c;
506      break;
507   default:
508      break;
497      case NAMCOS21_AIRCOMBAT:
498         state->m_master_dsp_code[0x008e] = 0x808f;
499         break;
500      case NAMCOS21_SOLVALOU:
501         state->m_master_dsp_code[0x008b] = 0x808c;
502         break;
503      default:
504         break;
509505   }
510506   if( internal )
511507   {
512508      if( state->m_mbNeedsKickstart==0 ) return;
513      state->m_mbNeedsKickstart--;
509         state->m_mbNeedsKickstart--;
514510      if( state->m_mbNeedsKickstart ) return;
515511   }
516512
517   namcos21_ClearPolyFrameBuffer(machine);
513   state->clear_poly_framebuffer();
518514   state->m_mpDspState->masterSourceAddr = 0;
519515   state->m_mpDspState->slaveOutputSize = 0;
520516   state->m_mpDspState->masterFinished = 0;
r32471r32472
523519   state->m_dspslave->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
524520}
525521
526static UINT16
527ReadWordFromSlaveInput( address_space &space )
522UINT16 namcos21_state::read_word_from_slave_input()
528523{
529   namcos21_state *state = space.machine().driver_data<namcos21_state>();
530524   UINT16 data = 0;
531   if( state->m_mpDspState->slaveBytesAvailable>0 )
525   if( m_mpDspState->slaveBytesAvailable>0 )
532526   {
533      data = state->m_mpDspState->slaveInputBuffer[state->m_mpDspState->slaveInputStart++];
534      state->m_mpDspState->slaveInputStart %= DSP_BUF_MAX;
535      state->m_mpDspState->slaveBytesAvailable--;
536      if( state->m_mpDspState->slaveBytesAdvertised>0 )
527      data = m_mpDspState->slaveInputBuffer[m_mpDspState->slaveInputStart++];
528      m_mpDspState->slaveInputStart %= DSP_BUF_MAX;
529      m_mpDspState->slaveBytesAvailable--;
530      if( m_mpDspState->slaveBytesAdvertised>0 )
537531      {
538         state->m_mpDspState->slaveBytesAdvertised--;
532         m_mpDspState->slaveBytesAdvertised--;
539533      }
540      if (ENABLE_LOGGING) logerror( "%s:-%04x(0x%04x)\n", space.machine().describe_context(), data, state->m_mpDspState->slaveBytesAvailable );
534      if (ENABLE_LOGGING) logerror( "%s:-%04x(0x%04x)\n", machine().describe_context(), data, m_mpDspState->slaveBytesAvailable );
541535   }
542536   return data;
543} /* ReadWordFromSlaveInput */
537}
544538
545static size_t
546GetInputBytesAdvertisedForSlave( running_machine &machine )
539size_t namcos21_state::get_input_bytes_advertised_for_slave()
547540{
548   namcos21_state *state = machine.driver_data<namcos21_state>();
549   if( state->m_mpDspState->slaveBytesAdvertised < state->m_mpDspState->slaveBytesAvailable )
541   if( m_mpDspState->slaveBytesAdvertised < m_mpDspState->slaveBytesAvailable )
550542   {
551      state->m_mpDspState->slaveBytesAdvertised++;
543      m_mpDspState->slaveBytesAdvertised++;
552544   }
553   else if( state->m_mpDspState->slaveActive && state->m_mpDspState->masterFinished && state->m_mpDspState->masterSourceAddr )
545   else if( m_mpDspState->slaveActive && m_mpDspState->masterFinished && m_mpDspState->masterSourceAddr )
554546   {
555      namcos21_kickstart(machine, 0);
547      namcos21_kickstart(machine(), 0);
556548   }
557   return state->m_mpDspState->slaveBytesAdvertised;
558} /* GetInputBytesAdvertisedForSlave */
549   return m_mpDspState->slaveBytesAdvertised;
550}
559551
560552READ16_MEMBER(namcos21_state::dspram16_r)
561553{
562554   return m_dspram16[offset];
563} /* dspram16_r */
555}
564556
565557WRITE16_MEMBER(namcos21_state::dspram16_w)
566558{
r32471r32472
572564         offset == 1+(m_mpDspState->masterSourceAddr&0x7fff) )
573565      {
574566         if (ENABLE_LOGGING) logerror( "IDC-CONTINUE\n" );
575         TransferDspData(machine());
567         transfer_dsp_data();
576568      }
577569      else if (m_gametype == NAMCOS21_SOLVALOU &&
578570               offset == 0x103 &&
r32471r32472
581573         space.device().execute().yield();
582574      }
583575   }
584} /* dspram16_w */
576}
585577
586578/************************************************************************************/
587579
588static int
589InitDSP( running_machine &machine )
580int namcos21_state::init_dsp()
590581{
591   namcos21_state *state = machine.driver_data<namcos21_state>();
592   UINT16 *pMem = (UINT16 *)state->memregion("dspmaster")->base();
582   UINT16 *pMem = (UINT16 *)memregion("dspmaster")->base();
593583   /**
594584    * DSP BIOS tests "CPU ID" on startup
595585    * "JAPAN (C)1990 NAMCO LTD. by H.F "
r32471r32472
598588   pMem[0x8000] = 0xFF80;
599589   pMem[0x8001] = 0x0000;
600590
601   state->m_mpDspState = auto_alloc_clear(machine, dsp_state);
591   m_mpDspState = auto_alloc_clear(machine(), dsp_state);
602592
603593   return 0;
604594}
r32471r32472
609599
610600READ16_MEMBER(namcos21_state::dsp_port0_r)
611601{
612   INT32 data = ReadPointROMData(machine(), m_pointrom_idx++);
602   INT32 data = read_pointrom_data(m_pointrom_idx++);
613603   m_mPointRomMSB = (UINT8)(data>>16);
614604   m_mbPointRomDataAvailable = 1;
615605   return (UINT16)data;
616} /* dsp_port0_r */
606}
617607
618608WRITE16_MEMBER(namcos21_state::dsp_port0_w)
619609{ /* unused? */
620610   if (ENABLE_LOGGING) logerror( "PTRAM_LO(0x%04x)\n", data );
621} /* dsp_port0_w */
611}
622612
623613READ16_MEMBER(namcos21_state::dsp_port1_r)
624614{
r32471r32472
628618      return m_mPointRomMSB;
629619   }
630620   return 0x8000; /* IDC ack? */
631} /* dsp_port1_r */
621}
632622
633623WRITE16_MEMBER(namcos21_state::dsp_port1_w)
634624{ /* unused? */
635625   if (ENABLE_LOGGING) logerror( "PTRAM_HI(0x%04x)\n", data );
636} /* dsp_port1_w */
626}
637627
638628READ16_MEMBER(namcos21_state::dsp_port2_r)
639629{ /* IDC TRANSMIT ENABLE? */
640630   return 0;
641} /* dsp_port2_r */
631}
642632
643633WRITE16_MEMBER(namcos21_state::dsp_port2_w)
644634{
645635   if (ENABLE_LOGGING) logerror( "IDC ADDR INIT(0x%04x)\n", data );
646636   m_mpDspState->masterSourceAddr = data;
647   TransferDspData(machine());
648} /* dsp_port2_w */
637   transfer_dsp_data();
638}
649639
650640READ16_MEMBER(namcos21_state::dsp_port3_idc_rcv_enable_r)
651641{ /* IDC RECEIVE ENABLE? */
652642   return 0;
653} /* dsp_port3_idc_rcv_enable_r */
643}
654644
655645WRITE16_MEMBER(namcos21_state::dsp_port3_w)
656646{
657647   m_pointrom_idx<<=16;
658648   m_pointrom_idx|=data;
659} /* dsp_port3_w */
649}
660650
661651WRITE16_MEMBER(namcos21_state::dsp_port4_w)
662652{ /* receives $0B<<4 prior to IDC setup */
663} /* dsp_port4_w */
653}
664654
665655READ16_MEMBER(namcos21_state::dsp_port8_r)
666656{ /* SMU status */
667657   return 1;
668} /* dsp_port8_r */
658}
669659
670660
671661WRITE16_MEMBER(namcos21_state::dsp_port8_w)
r32471r32472
676666      m_mpDspState->masterFinished = 1;
677667   }
678668   m_irq_enable = data;
679} /* dsp_port8_w */
669}
680670
681671READ16_MEMBER(namcos21_state::dsp_port9_r)
682672{ /* render-device-busy; used for direct-draw */
683673   return 0;
684} /* dsp_port9_r */
674}
685675
686676READ16_MEMBER(namcos21_state::dsp_porta_r)
687677{ /* config */
688678   return 0;
689} /* dsp_porta_r */
679}
690680
691681WRITE16_MEMBER(namcos21_state::dsp_porta_w)
692682{
r32471r32472
696686   /* direct-draw begin: 0 */
697687   /* INT1 begin: 1 */
698688//  if (ENABLE_LOGGING) logerror( "dsp_porta_w(0x%04x)\n", data );
699} /* dsp_porta_w */
689}
700690
701691READ16_MEMBER(namcos21_state::dsp_portb_r)
702692{ /* config */
703693   return 1;
704} /* dsp_portb_r */
694}
705695
706696WRITE16_MEMBER(namcos21_state::dsp_portb_w)
707697{
r32471r32472
722712      }
723713      if( color&0x8000 )
724714      {
725         namcos21_DrawQuad( machine(), sx, sy, zcode, color );
715         draw_quad(sx, sy, zcode, color);
726716      }
727717      else
728718      {
r32471r32472
734724      logerror( "unexpected masterDirectDrawSize=%d!\n",m_mpDspState->masterDirectDrawSize );
735725   }
736726   m_mpDspState->masterDirectDrawSize = 0;
737} /* dsp_portb_w */
727}
738728
739729WRITE16_MEMBER(namcos21_state::dsp_portc_w)
740730{
r32471r32472
746736   {
747737      logerror( "portc overflow\n" );
748738   }
749} /* dsp_portc_w */
739}
750740
751741READ16_MEMBER(namcos21_state::dsp_portf_r)
752742{ /* informs BIOS that this is Master DSP */
753743   return 0;
754} /* dsp_portf_r */
744}
755745
756746WRITE16_MEMBER(namcos21_state::dsp_xf_w)
757747{
r32471r32472
787777
788778/************************************************************************************/
789779
790static void
791RenderSlaveOutput( running_machine &machine, UINT16 data )
780void namcos21_state::render_slave_output(UINT16 data)
792781{
793   namcos21_state *state = machine.driver_data<namcos21_state>();
794   if( state->m_mpDspState->slaveOutputSize >= 4096 )
782   if( m_mpDspState->slaveOutputSize >= 4096 )
795783   {
796      fatalerror( "FATAL ERROR: SLAVE OVERFLOW (0x%x)\n",state->m_mpDspState->slaveOutputBuffer[0]  );
784      fatalerror( "FATAL ERROR: SLAVE OVERFLOW (0x%x)\n",m_mpDspState->slaveOutputBuffer[0]  );
797785   }
798786
799787   /* append word to slave output buffer */
800   state->m_mpDspState->slaveOutputBuffer[state->m_mpDspState->slaveOutputSize++] = data;
788   m_mpDspState->slaveOutputBuffer[m_mpDspState->slaveOutputSize++] = data;
801789
802790   {
803      UINT16 *pSource = state->m_mpDspState->slaveOutputBuffer;
791      UINT16 *pSource = m_mpDspState->slaveOutputBuffer;
804792      UINT16 count = *pSource++;
805      if( count && state->m_mpDspState->slaveOutputSize > count )
793      if( count && m_mpDspState->slaveOutputSize > count )
806794      {
807795         UINT16 color = *pSource++;
808796         int sx[4], sy[4],zcode[4];
r32471r32472
816804               sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[3*j+1];
817805               zcode[j] = pSource[3*j+2];
818806            }
819            namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
807            draw_quad(sx, sy, zcode, color&0x7fff);
820808         }
821809         else
822810         {
823811            int quad_idx = color*6;
824812            for(;;)
825813            {
826               UINT8 code = state->m_pointram[quad_idx++];
827               color = state->m_pointram[quad_idx++]|(code<<8);
814               UINT8 code = m_pointram[quad_idx++];
815               color = m_pointram[quad_idx++]|(code<<8);
828816               for( j=0; j<4; j++ )
829817               {
830                  UINT8 vi = state->m_pointram[quad_idx++];
818                  UINT8 vi = m_pointram[quad_idx++];
831819                  sx[j] = NAMCOS21_POLY_FRAME_WIDTH/2  + (INT16)pSource[vi*3+0];
832820                  sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
833821                  zcode[j] = pSource[vi*3+2];
834822               }
835               namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
823               draw_quad(sx, sy, zcode, color&0x7fff);
836824               if( code&0x80 )
837825               { /* end-of-quadlist marker */
838826                  break;
839827               }
840828            }
841829         }
842         state->m_mpDspState->slaveOutputSize = 0;
830         m_mpDspState->slaveOutputSize = 0;
843831      }
844832      else if( count==0 )
845833      {
r32471r32472
847835         exit(1);
848836      }
849837   }
850} /* RenderSlaveOutput */
838}
851839
852840READ16_MEMBER(namcos21_state::slave_port0_r)
853841{
854   return ReadWordFromSlaveInput(space);
855} /* slave_port0_r */
842   return read_word_from_slave_input();
843}
856844
857845WRITE16_MEMBER(namcos21_state::slave_port0_w)
858846{
859   RenderSlaveOutput( machine(), data );
847   render_slave_output(data);
860848}
861849
862850READ16_MEMBER(namcos21_state::slave_port2_r)
863851{
864   return GetInputBytesAdvertisedForSlave(machine());
865} /* slave_port2_r */
852   return get_input_bytes_advertised_for_slave();
853}
866854
867855READ16_MEMBER(namcos21_state::slave_port3_r)
868856{ /* render-device queue size */
r32471r32472
874862
875863WRITE16_MEMBER(namcos21_state::slave_port3_w)
876864{ /* 0=busy, 1=ready? */
877} /* slave_port3_w */
865}
878866
879867WRITE16_MEMBER(namcos21_state::slave_XF_output_w)
880868{
881869   if (ENABLE_LOGGING) logerror( "0x%x:slaveXF(%d)\n", space.device().safe_pc(), data );
882} /* slave_XF_output_w */
870}
883871
884872READ16_MEMBER(namcos21_state::slave_portf_r)
885873{ /* informs BIOS that this is Slave DSP */
r32471r32472
957945   logerror( "\n" );
958946#endif
959947   m_pointram_idx = 0; /* HACK */
960} /* pointram_control_w */
948}
961949
962950READ16_MEMBER(namcos21_state::pointram_data_r)
963951{
964952   return m_pointram[m_pointram_idx];
965} /* pointram_data_r */
953}
966954
967955WRITE16_MEMBER(namcos21_state::pointram_data_w)
968956{
r32471r32472
973961      m_pointram[m_pointram_idx++] = data;
974962      m_pointram_idx &= (PTRAM_SIZE-1);
975963   }
976} /* pointram_data_w */
964}
977965
978966
979967READ16_MEMBER(namcos21_state::namcos21_depthcue_r)
r32471r32472
11231111      break;
11241112   }
11251113   return 0;
1126} /* winrun_cuskey_r */
1114}
11271115
11281116WRITE16_MEMBER(namcos21_state::winrun_cuskey_w)
11291117{
1130} /* winrun_cuskey_w */
1118}
11311119
1132static void
1133winrun_flushpoly( running_machine &machine )
1120void namcos21_state::winrun_flush_poly()
11341121{
1135   namcos21_state *state = machine.driver_data<namcos21_state>();
1136   if( state->m_winrun_poly_index>0 )
1122   if( m_winrun_poly_index>0 )
11371123   {
1138      const UINT16 *pSource = state->m_winrun_poly_buf;
1124      const UINT16 *pSource = m_winrun_poly_buf;
11391125      UINT16 color;
11401126      int sx[4], sy[4], zcode[4];
11411127      int j;
r32471r32472
11481134            sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)*pSource++;
11491135            zcode[j] = *pSource++;
11501136         }
1151         namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
1137         draw_quad(sx, sy, zcode, color&0x7fff);
11521138      }
11531139      else
11541140      {
11551141         int quad_idx = color*6;
11561142         for(;;)
11571143         {
1158            UINT8 code = state->m_pointram[quad_idx++];
1159            color = state->m_pointram[quad_idx++];
1144            UINT8 code = m_pointram[quad_idx++];
1145            color = m_pointram[quad_idx++];
11601146            for( j=0; j<4; j++ )
11611147            {
1162               UINT8 vi = state->m_pointram[quad_idx++];
1148               UINT8 vi = m_pointram[quad_idx++];
11631149               sx[j] = NAMCOS21_POLY_FRAME_WIDTH/2  + (INT16)pSource[vi*3+0];
11641150               sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
11651151               zcode[j] = pSource[vi*3+2];
11661152            }
1167            namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
1153            draw_quad(sx, sy, zcode, color&0x7fff);
11681154            if( code&0x80 )
11691155            { /* end-of-quadlist marker */
11701156               break;
11711157            }
11721158         }
11731159      }
1174      state->m_winrun_poly_index = 0;
1160      m_winrun_poly_index = 0;
11751161   }
11761162} /* winrun_flushpoly */
11771163
11781164READ16_MEMBER(namcos21_state::winrun_poly_reset_r)
11791165{
1180   winrun_flushpoly(machine());
1166   winrun_flush_poly();
11811167   return 0;
11821168}
11831169
r32471r32472
11911177   {
11921178      logerror( "WINRUN_POLY_OVERFLOW\n" );
11931179   }
1194} /* winrun_dsp_render_w */
1180}
11951181
11961182WRITE16_MEMBER(namcos21_state::winrun_dsp_pointrom_addr_w)
11971183{
r32471r32472
12091195{
12101196   UINT16 *ptrom = (UINT16 *)memregion("user2")->base();
12111197   return ptrom[m_winrun_pointrom_addr++];
1212} /* winrun_dsp_pointrom_data_r */
1198}
12131199
12141200WRITE16_MEMBER(namcos21_state::winrun_dsp_complete_w)
12151201{
12161202   if( data )
12171203   {
1218      winrun_flushpoly(machine());
1204      winrun_flush_poly();
12191205      m_dsp->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
1220      namcos21_ClearPolyFrameBuffer(machine());
1206      clear_poly_framebuffer();
12211207   }
12221208}
12231209
r32471r32472
12711257      memcpy( mem, m_winrun_dspbios, 0x2000 );
12721258      m_winrun_dsp_alive = 1;
12731259   }
1274} /* winrun_dspbios_w */
1260}
12751261
12761262//380000 : read : dsp status? 1 = busy
12771263//380000 : write(0x01) - done before dsp comram init
r32471r32472
22542240   ROM_LOAD("r911-avo3.11e", 0x180000, 0x80000,CRC(76e22f92) SHA1(0e1b8d35a5b9c20cc3192d935f0c9da1e69679d2) )
22552241ROM_END
22562242
2257static void namcos21_init( running_machine &machine, int game_type )
2243void namcos21_state::init(int game_type)
22582244{
2259   namcos21_state *state = machine.driver_data<namcos21_state>();
2260   state->m_gametype = game_type;
2261   state->m_pointram = auto_alloc_array(machine, UINT8, PTRAM_SIZE);
2262   state->m_mpDataROM = (UINT16 *)state->memregion( "user1" )->base();
2263   InitDSP(machine);
2264   state->m_mbNeedsKickstart = 20;
2245   m_gametype = game_type;
2246   m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE);
2247   m_mpDataROM = (UINT16 *)memregion( "user1" )->base();
2248   init_dsp();
2249   m_mbNeedsKickstart = 20;
22652250   if( game_type==NAMCOS21_CYBERSLED )
22662251   {
2267      state->m_mbNeedsKickstart = 200;
2252      m_mbNeedsKickstart = 200;
22682253   }
2269} /* namcos21_init */
2254}
22702255
22712256DRIVER_INIT_MEMBER(namcos21_state,winrun)
22722257{
r32471r32472
22862271
22872272DRIVER_INIT_MEMBER(namcos21_state,aircomb)
22882273{
2289   namcos21_init( machine(), NAMCOS21_AIRCOMBAT );
2274   init(NAMCOS21_AIRCOMBAT);
22902275}
22912276
22922277DRIVER_INIT_MEMBER(namcos21_state,starblad)
22932278{
2294   namcos21_init( machine(), NAMCOS21_STARBLADE );
2279   init(NAMCOS21_STARBLADE);
22952280}
22962281
22972282
22982283DRIVER_INIT_MEMBER(namcos21_state,cybsled)
22992284{
2300   namcos21_init( machine(), NAMCOS21_CYBERSLED );
2285   init(NAMCOS21_CYBERSLED);
23012286}
23022287
23032288DRIVER_INIT_MEMBER(namcos21_state,solvalou)
r32471r32472
23082293   mem[0x20cf4/2+1] = 0x4e71;
23092294   mem[0x20cf4/2+2] = 0x4e71;
23102295
2311   namcos21_init( machine(), NAMCOS21_SOLVALOU );
2296   init(NAMCOS21_SOLVALOU );
23122297}
23132298
23142299DRIVER_INIT_MEMBER(namcos21_state,driveyes)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team