Previous 199869 Revisions Next

r18613 Friday 19th October, 2012 at 21:57:33 UTC by Mariusz Wojcieszek
Cops: added some inputs and outputs (nw)
[src/mame/drivers]cops.c

trunk/src/mame/drivers/cops.c
r18612r18613
1515
1616#include "cops.lh"
1717
18#define LOG_CDROM   1
19#define LOG_DACIA   0
20
1821#define MAIN_CLOCK XTAL_4MHz
1922
2023class cops_state : public driver_device
r18612r18613
4750   DECLARE_WRITE8_MEMBER(via1_irq);
4851   DECLARE_WRITE8_MEMBER(via2_irq);
4952   void dacia_receive(UINT8 data);
50   void laserdisc_w(UINT8 data);
5153   DECLARE_WRITE8_MEMBER(dacia_w);
5254   DECLARE_READ8_MEMBER(dacia_r);
5355   DECLARE_WRITE8_MEMBER(cdrom_data_w);
r18612r18613
6466
6567   UINT8 m_cdrom_ctrl;
6668   UINT8 m_cdrom_data;
69
70   // LDP-1450
71   UINT8 m_ld_command_to_send[5];
72   UINT8 m_ld_command_total_bytes;
73   UINT8 m_ld_command_current_byte;
74   UINT8 m_ld_frame[5];
75   UINT8 m_ld_frame_index;
76   emu_timer *m_ld_timer;
77   TIMER_CALLBACK_MEMBER(ld_timer_callback);
78   enum LD_INPUT_STATE
79   {
80      LD_INPUT_GET_COMMAND = 0,
81      LD_INPUT_TEXT_COMMAND,
82      LD_INPUT_TEXT_GET_X,
83      LD_INPUT_TEXT_GET_Y,
84      LD_INPUT_TEXT_GET_MODE,
85      LD_INPUT_TEXT_GET_STRING,
86      LD_INPUT_TEXT_GET_SET_WINDOW
87   } m_ld_input_state;
88
89   void laserdisc_w(UINT8 data);
90   void laserdisc_response_w(UINT8 data);
6791};
6892
6993void cops_state::video_start()
r18612r18613
7397
7498UINT32 cops_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
7599{
100   char ledtext[16 + 1];
101   for ( int i = 0; i < 16; i++ )
102   {
103      ledtext[i] = m_maincpu->space(AS_PROGRAM).read_byte(0x64 + i);
104   }
105   ledtext[16] = 0;
106   popmessage(ledtext);
76107   return 0;
77108}
78109
r18612r18613
87118   const char *regs[4] = { "CMD", "PARAM", "WRITE", "CTRL" };
88119   m_cdrom_data = BITSWAP8(data,0,1,2,3,4,5,6,7);
89120   UINT8 reg = ((m_cdrom_ctrl & 4) >> 1) | ((m_cdrom_ctrl & 8) >> 3);
90   logerror("%s:cdrom_data_w(reg = %s, data = %02x)\n", machine().describe_context(), regs[reg & 0x03], m_cdrom_data);
121   if (LOG_CDROM) logerror("%s:cdrom_data_w(reg = %s, data = %02x)\n", machine().describe_context(), regs[reg & 0x03], m_cdrom_data);
91122}
92123
93124WRITE8_MEMBER(cops_state::cdrom_ctrl_w)
94125{
95   logerror("%s:cdrom_ctrl_w(%02x)\n", machine().describe_context(), data);
126   if (LOG_CDROM) logerror("%s:cdrom_ctrl_w(%02x)\n", machine().describe_context(), data);
96127   m_cdrom_ctrl = data;
97128}
98129
99130READ8_MEMBER(cops_state::cdrom_data_r)
100131{
101   logerror("%s:cdrom_data_r\n", machine().describe_context());
132   const char *regs[4] = { "STATUS", "RESULT", "READ", "FIFOST" };
133   UINT8 reg = ((m_cdrom_ctrl & 4) >> 1) | ((m_cdrom_ctrl & 8) >> 3);
134   if (LOG_CDROM) logerror("%s:cdrom_data_r(reg = %s)\n", machine().describe_context(), regs[reg & 0x03]);
102135   return machine().rand()&0xff;
103136}
104137/*************************************
105138 *
106 * 6552 DACIA & LDP-1450 Laserdisc
139 * LDP-1450 Laserdisc
107140 *
108141 *************************************/
109142
143TIMER_CALLBACK_MEMBER(cops_state::ld_timer_callback)
144{
145   if ( m_ld_command_current_byte < m_ld_command_total_bytes )
146   {
147      dacia_receive(m_ld_command_to_send[m_ld_command_current_byte]);
148      m_ld_command_current_byte++;
149      if ( m_ld_command_current_byte == m_ld_command_total_bytes )
150      {
151         m_ld_command_current_byte = m_ld_command_total_bytes = 0;
152      }
153   }
154}
155
156void cops_state::laserdisc_response_w(UINT8 data)
157{
158   if ( m_ld_command_total_bytes >= 5 )
159   {
160      logerror( "LD Overflow!\n" );
161   }
162   m_ld_command_to_send[m_ld_command_total_bytes++] = data;
163}
164
110165void cops_state::laserdisc_w(UINT8 data)
111166{
112   switch( data )
167   switch( m_ld_input_state )
113168   {
114      case 0x26: /* Video off */
115         dacia_receive(0x0a);
169      case LD_INPUT_TEXT_GET_X:
170         m_ld_input_state = LD_INPUT_TEXT_GET_Y;
116171         break;
117      case 0x27: /* Video on */
118         dacia_receive(0x0a);
172      case LD_INPUT_TEXT_GET_Y:
173         m_ld_input_state = LD_INPUT_TEXT_GET_MODE;
119174         break;
120      case 0x30: /* Digit */
121      case 0x31:
122      case 0x32:
123      case 0x33:
124      case 0x34:
125      case 0x35:
126      case 0x36:
127      case 0x37:
128      case 0x38:
129      case 0x39:
130         dacia_receive(0x0a);
175      case LD_INPUT_TEXT_GET_MODE:
176         m_ld_input_state = LD_INPUT_GET_COMMAND;
131177         break;
132      case 0x3f: /* Stop */
133         dacia_receive(0x0a);
178      case LD_INPUT_TEXT_GET_SET_WINDOW:
179         m_ld_input_state = LD_INPUT_GET_COMMAND;
134180         break;
135      case 0x40: /* Enter */
136         dacia_receive(0x0a);
181      case LD_INPUT_TEXT_GET_STRING:
182         if ( data == 0x1a )
183         {
184            m_ld_input_state = LD_INPUT_GET_COMMAND;
185         }
137186         break;
138      case 0x43: /* Search */
139         dacia_receive(0x0a);
187      case LD_INPUT_TEXT_COMMAND:
188      case LD_INPUT_GET_COMMAND:
189         {
190            switch( data )
191            {
192               case 0x00: /* text handling (start gotoxy) */
193                  if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
194                  {
195                     m_ld_input_state = LD_INPUT_TEXT_GET_X;
196                  }
197                  break;
198               case 0x01: /* text handling (end of text)*/
199                  if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
200                  {
201                     m_ld_input_state = LD_INPUT_TEXT_GET_STRING;
202                  }
203                  break;
204               case 0x02: /* text 'set window' command */
205                  if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
206                  {
207                     m_ld_input_state = LD_INPUT_TEXT_GET_SET_WINDOW;
208                  }
209                  break;
210               case 0x1a: /* text sent */
211                  break;
212               case 0x24: /* Audio On */
213                  laserdisc_response_w(0x0a);
214                  break;
215               case 0x26: /* Video off */
216                  laserdisc_response_w(0x0a);
217                  break;
218               case 0x27: /* Video on */
219                  laserdisc_response_w(0x0a);
220                  break;
221               case 0x30: /* Digit */
222               case 0x31:
223               case 0x32:
224               case 0x33:
225               case 0x34:
226               case 0x35:
227               case 0x36:
228               case 0x37:
229               case 0x38:
230               case 0x39:
231                  if ( m_ld_frame_index >= 5 )
232                  {
233                     m_ld_frame_index = 0;
234                  }
235                  m_ld_frame[m_ld_frame_index++] = data;
236                  laserdisc_response_w(0x0a);
237                  break;
238               case 0x3a: /* Play (answer should have delay) */
239                  laserdisc_response_w(0x0a);
240                  break;
241               case 0x3f: /* Stop */
242                  laserdisc_response_w(0x0a);
243                  break;
244               case 0x40: /* Enter */
245                  laserdisc_response_w(0x0a);
246                  break;
247               case 0x43: /* Search */
248                  laserdisc_response_w(0x0a);
249                  break;
250               case 0x46: /* Channel 1 on */
251                  laserdisc_response_w(0x0a);
252                  break;
253               case 0x47: /* Channel 1 off */
254                  laserdisc_response_w(0x0a);
255                  break;
256               case 0x48: /* Channel 2 on */
257                  laserdisc_response_w(0x0a);
258                  break;
259               case 0x49: /* Channel 2 off */
260                  laserdisc_response_w(0x0a);
261                  break;
262               case 0x4f: /* Still */
263                  laserdisc_response_w(0x0a);
264                  break;
265               case 0x55: /* 'frame mode' (unknown function) */
266                  break;
267               case 0x56: /* C. L. (Reset) */
268                  m_ld_input_state = LD_INPUT_GET_COMMAND;
269                  laserdisc_response_w(0x0a);
270                  break;
271               case 0x60: /* Addr Inq (get current frame number) */
272                  for ( int i = 0; i < 5; i++ )
273                  {
274                     laserdisc_response_w(m_ld_frame[i]);
275                  }
276                  break;
277               case 0x80: /* text start */
278                  m_ld_input_state = LD_INPUT_TEXT_COMMAND;
279                  break;
280               case 0x81: /* Turn on text */
281                  break;
282               case 0x82: /* Turn off text */
283                  break;
284               default:
285                  logerror("Laserdisc command %02x\n", data);
286                  break;
287            }
288         }
140289         break;
141      case 0x56: /* C. L. (Reset) */
142         dacia_receive(0x0a);
143         break;
144      default:
145         logerror("Laserdisc command %02x\n", data);
146         break;
147290   }
148291}
149292
293/*************************************
294 *
295 * 6552 DACIA
296 *
297 *************************************/
298
150299void cops_state::dacia_receive(UINT8 data)
151300{
152301   m_dacia_receiver_data = data;
r18612r18613
165314         m_dacia_receiver_full = 0;
166315         return m_dacia_receiver_data;
167316      default:
168         logerror("%s:dacia_r(%02x)\n", machine().describe_context(), offset);
317         if (LOG_DACIA) logerror("%s:dacia_r(%02x)\n", machine().describe_context(), offset);
169318         return 0;
170319   }
171320}
r18612r18613
179328         laserdisc_w(data);
180329         break;
181330      default:
182         logerror("%s:dacia_w(%02x,%02x)\n", machine().describe_context(), offset, data);
331         if (LOG_DACIA) logerror("%s:dacia_w(%02x,%02x)\n", machine().describe_context(), offset, data);
183332         break;
184333   }
185334}
r18612r18613
249398         m_lcd_data_h = data;
250399         break;
251400      case 0x04: /* WOP4 */
401         output_set_value("Offroad Right 4 Lamp", data & 0x80);
402         output_set_value("Offroad Right 3 Lamp", data & 0x40);
403         output_set_value("Offroad Right 2 Lamp", data & 0x20);
404         output_set_value("Offroad Right 1 Lamp", data & 0x10);
405         output_set_value("Offroad Left 4 Lamp", data & 0x08);
406         output_set_value("Offroad Left 3 Lamp", data & 0x04);
407         output_set_value("Offroad Left 2 Lamp", data & 0x02);
408         output_set_value("Offroad Left 1 Lamp", data & 0x01);
252409         break;
253410      case 0x05: /* WOP5 */
411         output_set_value("Damage Lamp", data & 0x80);
412         output_set_value("Stop Lamp", data & 0x40);
413         output_set_value("Gun Active Right Lamp", data & 0x20);
414         output_set_value("Vest Hit 2 Lamp", data & 0x10);
415         output_set_value("Vest Hit 3 Lamp", data & 0x04);
416         output_set_value("Gun Active Left Lamp", data & 0x02);
417         output_set_value("Vest Hit 1 Lamp", data & 0x01);
254418         break;
255419      case 0x06: /* WOP6 */
420         logerror("WOP6: data = %02x\n", data);
256421         break;
257422      case 0x07: /* WOP? */
423         logerror("WOP7: data = %02x\n", data);
258424         break;
259425      case 0x08: /* WOP0 */
426         logerror("WOP8: data = %02x\n", data);
260427         break;
261428      default:
262429         logerror("Unknown io1_w, offset = %03x, data = %02x\n", offset, data);
r18612r18613
266433
267434READ8_MEMBER(cops_state::io2_r)
268435{
269   return 0;
436   switch( offset & 0x0f )
437   {
438      case 0x03:
439         return ioport("STEER")->read();
440      default:
441         logerror("Unknown io2_r, offset = %02x\n", offset);
442         return 0;
443   }
270444}
271445
272446WRITE8_MEMBER(cops_state::io2_w)
273447{
448   switch( offset & 0x0f )
449   {
450      case 0x02:
451         output_set_value("Flash Red Lamp", data & 0x01);
452         output_set_value("Flash Blue Lamp", data & 0x80);
453         if ( data & ~0x91 ) logerror("Unknown io2_w, offset = %02x, data = %02x\n", offset, data);
454         break;
455      case 0x04:
456         output_set_value("Bullet Lamp 6", data & 0x20);
457         output_set_value("Bullet Lamp 5", data & 0x10);
458         output_set_value("Bullet Lamp 4", data & 0x08);
459         output_set_value("Bullet Lamp 3", data & 0x04);
460         output_set_value("Bullet Lamp 2", data & 0x02);
461         output_set_value("Bullet Lamp 1", data & 0x01);
462         if ( data & ~0x3f ) logerror("Unknown io2_w, offset = %02x, data = %02x\n", offset, data);
463         break;
464      default:
465         logerror("Unknown io2_w, offset = %02x, data = %02x\n", offset, data);
466         break;
467   }
274468}
275469
276470/*************************************
r18612r18613
381575
382576static INPUT_PORTS_START( cops )
383577   PORT_START("SW0")
384   PORT_DIPNAME( 0x01, 0x00, "SW0" )
385   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
386   PORT_DIPSETTING(    0x01, DEF_STR( On ) )
387   PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
388   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
389   PORT_DIPSETTING(    0x02, DEF_STR( On ) )
390   PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
391   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
392   PORT_DIPSETTING(    0x04, DEF_STR( On ) )
393   PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
394   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
395   PORT_DIPSETTING(    0x08, DEF_STR( On ) )
396   PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
397   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
398   PORT_DIPSETTING(    0x10, DEF_STR( On ) )
399   PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
400   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
401   PORT_DIPSETTING(    0x20, DEF_STR( On ) )
402   PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
403   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
404   PORT_DIPSETTING(    0x40, DEF_STR( On ) )
405   PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
406   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
407   PORT_DIPSETTING(    0x80, DEF_STR( On ) )
578   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Switch A") PORT_CODE(KEYCODE_A) PORT_IMPULSE(1)
579   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Switch C") PORT_CODE(KEYCODE_C) PORT_IMPULSE(1)
580   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("PROGRAM") PORT_CODE(KEYCODE_P)
581   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 )
582   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_IMPULSE(1)
583   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
584   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START )
585   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Switch B") PORT_CODE(KEYCODE_B) PORT_IMPULSE(1)
408586
409587   PORT_START("SW1")
410   PORT_DIPNAME( 0x01, 0x00, "SW1" )
411   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
412   PORT_DIPSETTING(    0x01, DEF_STR( On ) )
413   PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
414   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
415   PORT_DIPSETTING(    0x02, DEF_STR( On ) )
416   PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
417   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
418   PORT_DIPSETTING(    0x04, DEF_STR( On ) )
419   PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
420   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
421   PORT_DIPSETTING(    0x08, DEF_STR( On ) )
422   PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
423   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
424   PORT_DIPSETTING(    0x10, DEF_STR( On ) )
425   PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
426   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
427   PORT_DIPSETTING(    0x20, DEF_STR( On ) )
428   PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
429   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
430   PORT_DIPSETTING(    0x40, DEF_STR( On ) )
431   PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
432   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
433   PORT_DIPSETTING(    0x80, DEF_STR( On ) )
588   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // N.C.
589   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) // Gas pedal
590   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("20P LEVEL") PORT_CODE(KEYCODE_Q)
591   PORT_BIT( 0x38, IP_ACTIVE_LOW, IPT_UNUSED )
592   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE )
593   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("100P LEVEL") PORT_CODE(KEYCODE_W)
434594
435595   PORT_START("SW2")
436   PORT_DIPNAME( 0x01, 0x00, "SW2" )
437   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
438   PORT_DIPSETTING(    0x01, DEF_STR( On ) )
439   PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
440   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
441   PORT_DIPSETTING(    0x02, DEF_STR( On ) )
442   PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
443   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
444   PORT_DIPSETTING(    0x04, DEF_STR( On ) )
445   PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
446   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
447   PORT_DIPSETTING(    0x08, DEF_STR( On ) )
448   PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
449   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
450   PORT_DIPSETTING(    0x10, DEF_STR( On ) )
451   PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) )
452   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
453   PORT_DIPSETTING(    0x20, DEF_STR( On ) )
454   PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
455   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
456   PORT_DIPSETTING(    0x40, DEF_STR( On ) )
457   PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
458   PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
459   PORT_DIPSETTING(    0x80, DEF_STR( On ) )
596   PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
597
598   PORT_START("STEER")
599   PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10)
460600INPUT_PORTS_END
461601
462602void cops_state::machine_start()
463603{
604   m_ld_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cops_state::ld_timer_callback),this));
605   m_ld_timer->adjust(attotime::from_hz(167*5), 0, attotime::from_hz(167*5));
464606}
465607
466608void cops_state::machine_reset()
r18612r18613
470612   m_lcd_data_l = m_lcd_data_h = 0;
471613
472614   m_dacia_receiver_full = 0;
615   m_ld_input_state = LD_INPUT_GET_COMMAND;
616   m_ld_command_current_byte = m_ld_command_total_bytes = 0;
617   m_ld_frame_index = 0;
473618}
474619
475620

Previous 199869 Revisions Next


© 1997-2024 The MAME Team