Previous 15994 Revisions Next

r852 Monday 20th August, 2007 at 06:37:32 UTC by Curt Coder
[ATARIST] Fixed IKBD keyboard polling
[src/mess/drivers]atarist.c

src/mess/drivers/atarist.c
r851r852
237237/* IKBD */
238238
239239static UINT8 acia_ikbd_rx, acia_ikbd_tx;
240static UINT8 ikbd_keymask;
241static int ikbd_joyen;
240static UINT8 ikbd_keylatch;
242241static UINT8 ikbd_mouse_x0, ikbd_mouse_y0;
243242static UINT8 ikbd_mouse_x_phase, ikbd_mouse_y_phase, ikbd_mouse_phase_counter;
244243
r851r852
252251   IKBD_MOUSE_PHASE_NEGATIVE
253252};
254253
255static WRITE8_HANDLER( ikbd_port1_w )
254static READ8_HANDLER( ikbd_port1_r )
256255{
257   ikbd_keymask = data;
256   return ikbd_keylatch;
258257}
259258
260259static READ8_HANDLER( ikbd_port2_r )
r851r852
280279     
281280      bit      description
282281     
283      0      JOY 1-5 output
282      0      JOY 1-5
284283      1      JOY 0-6
285284      2      JOY 1-6
286285      3      SD FROM CPU
r851r852
288287
289288   */
290289
291   ikbd_joyen = data & 0x01;
292290   acia_ikbd_rx = (data & 0x10) >> 4;
293291}
294292
295static WRITE8_HANDLER( ikbd_port_3_w )
293static WRITE8_HANDLER( ikbd_port3_w )
296294{
297   set_led_status(1, data & 0x01);
298}
299
300static READ8_HANDLER( ikbd_port_3_r )
301{
302295   /*
303296     
304297      bit      description
305298     
306299      0      CAPS LOCK LED
307      1      Keyboard row input
308      2      Keyboard row input
309      3      Keyboard row input
310      4      Keyboard row input
311      5      Keyboard row input
312      6      Keyboard row input
313      7      Keyboard row input
300      1      Keyboard row select
301      2      Keyboard row select
302      3      Keyboard row select
303      4      Keyboard row select
304      5      Keyboard row select
305      6      Keyboard row select
306      7      Keyboard row select
314307
315308   */
316309
317   UINT8 data = 0xff;
310   set_led_status(1, data & 0x01);
318311
319   if ((readinputportbytag("P31") & ikbd_keymask) == ikbd_keymask) data -= 0x02;
320   if ((readinputportbytag("P32") & ikbd_keymask) == ikbd_keymask) data -= 0x04;
321   if ((readinputportbytag("P33") & ikbd_keymask) == ikbd_keymask) data -= 0x08;
322   if ((readinputportbytag("P34") & ikbd_keymask) == ikbd_keymask) data -= 0x10;
323   if ((readinputportbytag("P35") & ikbd_keymask) == ikbd_keymask) data -= 0x20;
324   if ((readinputportbytag("P36") & ikbd_keymask) == ikbd_keymask) data -= 0x40;
325   if ((readinputportbytag("P37") & ikbd_keymask) == ikbd_keymask) data -= 0x80;
312   if (~data & 0x02) ikbd_keylatch = readinputportbytag("P31");
313   if (~data & 0x04) ikbd_keylatch = readinputportbytag("P32");
314   if (~data & 0x08) ikbd_keylatch = readinputportbytag("P33");
315   if (~data & 0x10) ikbd_keylatch = readinputportbytag("P34");
316   if (~data & 0x20) ikbd_keylatch = readinputportbytag("P35");
317   if (~data & 0x40) ikbd_keylatch = readinputportbytag("P36");
318   if (~data & 0x80) ikbd_keylatch = readinputportbytag("P37");
319}
326320
327   return data;
321static READ8_HANDLER( ikbd_port4_r )
322{
323   if (readinputportbytag("config") & 0x01)
324   {
325      /*
326
327            Right   Left      Up      Down
328
329         XA   1100   0110   YA   1100   0110
330         XB   0110   1100   YB   0110   1100
331
332      */
333
334      UINT8 data = readinputportbytag("JOY0") & 0xf0;
335      UINT8 x = readinputportbytag("MOUSEX");
336      UINT8 y = readinputportbytag("MOUSEY");
337
338      if (x == ikbd_mouse_x0)
339      {
340         ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_STATIC;
341      }
342      else if (x > ikbd_mouse_x0)
343      {
344         ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_POSITIVE;
345      }
346      else if (x < ikbd_mouse_x0)
347      {
348         ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_NEGATIVE;
349      }
350     
351      if (y == ikbd_mouse_y0)
352      {
353         ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_STATIC;
354      }
355      else if (y > ikbd_mouse_y0)
356      {
357         ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_POSITIVE;
358      }
359      else if (y < ikbd_mouse_y0)
360      {
361         ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_NEGATIVE;
362      }
363
364      data |= IKBD_MOUSE_XYB[ikbd_mouse_x_phase][ikbd_mouse_phase_counter]; // XB
365      data |= IKBD_MOUSE_XYA[ikbd_mouse_x_phase][ikbd_mouse_phase_counter] << 1; // XA
366      data |= IKBD_MOUSE_XYA[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 2; // YA
367      data |= IKBD_MOUSE_XYB[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 3; // YB
368
369      ikbd_mouse_phase_counter++;
370
371      if (ikbd_mouse_phase_counter == 4)
372      {
373         ikbd_mouse_phase_counter = 0;
374      }
375
376      ikbd_mouse_x0 = x;
377      ikbd_mouse_y0 = y;
378
379      return data;
380   }
381   else
382   {
383      return readinputportbytag("JOY0");
384   }
328385}
329386
330static READ8_HANDLER( ikbd_port_4_r )
387static WRITE8_HANDLER( ikbd_port4_w )
331388{
332389   /*
333390     
r851r852
344401
345402   */
346403
347   if (ikbd_joyen)
348   {
349      UINT8 data = 0xff;
350
351      if ((readinputportbytag("P40") & ikbd_keymask) == ikbd_keymask) data -= 0x01;
352      if ((readinputportbytag("P41") & ikbd_keymask) == ikbd_keymask) data -= 0x02;
353      if ((readinputportbytag("P42") & ikbd_keymask) == ikbd_keymask) data -= 0x04;
354      if ((readinputportbytag("P43") & ikbd_keymask) == ikbd_keymask) data -= 0x08;
355      if ((readinputportbytag("P44") & ikbd_keymask) == ikbd_keymask) data -= 0x10;
356      if ((readinputportbytag("P45") & ikbd_keymask) == ikbd_keymask) data -= 0x20;
357      if ((readinputportbytag("P46") & ikbd_keymask) == ikbd_keymask) data -= 0x40;
358      if ((readinputportbytag("P47") & ikbd_keymask) == ikbd_keymask) data -= 0x80;
359
360      return data;
361   }
362   else
363   {
364      if (readinputportbytag("config") & 0x01)
365      {
366         /*
367
368               Right   Left      Up      Down
369
370            XA   1100   0110   YA   1100   0110
371            XB   0110   1100   YB   0110   1100
372
373         */
374
375         UINT8 data = readinputportbytag("JOY0") & 0xf0;
376         UINT8 x = readinputportbytag("MOUSEX");
377         UINT8 y = readinputportbytag("MOUSEY");
378
379         if (x == ikbd_mouse_x0)
380         {
381            ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_STATIC;
382         }
383         else if (x > ikbd_mouse_x0)
384         {
385            ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_POSITIVE;
386         }
387         else if (x < ikbd_mouse_x0)
388         {
389            ikbd_mouse_x_phase = IKBD_MOUSE_PHASE_NEGATIVE;
390         }
391         
392         if (y == ikbd_mouse_y0)
393         {
394            ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_STATIC;
395         }
396         else if (y > ikbd_mouse_y0)
397         {
398            ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_POSITIVE;
399         }
400         else if (y < ikbd_mouse_y0)
401         {
402            ikbd_mouse_y_phase = IKBD_MOUSE_PHASE_NEGATIVE;
403         }
404
405         data |= IKBD_MOUSE_XYB[ikbd_mouse_x_phase][ikbd_mouse_phase_counter]; // XB
406         data |= IKBD_MOUSE_XYA[ikbd_mouse_x_phase][ikbd_mouse_phase_counter] << 1; // XA
407         data |= IKBD_MOUSE_XYA[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 2; // YA
408         data |= IKBD_MOUSE_XYB[ikbd_mouse_y_phase][ikbd_mouse_phase_counter] << 3; // YB
409
410         ikbd_mouse_phase_counter++;
411
412         if (ikbd_mouse_phase_counter == 4)
413         {
414            ikbd_mouse_phase_counter = 0;
415         }
416
417         ikbd_mouse_x0 = x;
418         ikbd_mouse_y0 = y;
419
420         return data;
421      }
422      else
423      {
424         return readinputportbytag("JOY0");
425      }
426   }
404   if (~data & 0x01) ikbd_keylatch = readinputportbytag("P40");
405   if (~data & 0x02) ikbd_keylatch = readinputportbytag("P41");
406   if (~data & 0x04) ikbd_keylatch = readinputportbytag("P42");
407   if (~data & 0x08) ikbd_keylatch = readinputportbytag("P43");
408   if (~data & 0x10) ikbd_keylatch = readinputportbytag("P44");
409   if (~data & 0x20) ikbd_keylatch = readinputportbytag("P45");
410   if (~data & 0x40) ikbd_keylatch = readinputportbytag("P46");
411   if (~data & 0x80) ikbd_keylatch = readinputportbytag("P47");
427412}
428413
429414/* Memory Maps */
r851r852
435420ADDRESS_MAP_END
436421
437422static ADDRESS_MAP_START( ikbd_io_map, ADDRESS_SPACE_IO, 8 )
438   AM_RANGE(HD63701_PORT1, HD63701_PORT1) AM_WRITE(ikbd_port1_w)
423   AM_RANGE(HD63701_PORT1, HD63701_PORT1) AM_READ(ikbd_port1_r)
439424   AM_RANGE(HD63701_PORT2, HD63701_PORT2) AM_READWRITE(ikbd_port2_r, ikbd_port2_w)
440   AM_RANGE(HD63701_PORT3, HD63701_PORT3) AM_READ(ikbd_port_3_r)
441   AM_RANGE(HD63701_PORT4, HD63701_PORT4) AM_READ(ikbd_port_4_r)
425   AM_RANGE(HD63701_PORT3, HD63701_PORT3) AM_WRITE(ikbd_port3_w)
426   AM_RANGE(HD63701_PORT4, HD63701_PORT4) AM_READWRITE(ikbd_port4_r, ikbd_port4_w)
442427ADDRESS_MAP_END
443428
444429static ADDRESS_MAP_START( st_map, ADDRESS_SPACE_PROGRAM, 16 )
r851r852
837822
838823static struct acia6850_interface acia_ikbd_intf =
839824{
840   Y2/64,
841   Y2/64,
825   500000,
826   500000,
842827   &acia_ikbd_rx,
843828   &acia_ikbd_tx,
844829   acia_interrupt
r851r852
846831
847832static struct acia6850_interface acia_midi_intf =
848833{
849   Y2/64,
850   Y2/64,
834   500000,
835   500000,
851836   &acia_midi_rx,
852837   &acia_midi_tx,
853838   acia_interrupt
r851r852
989974   MDRV_CPU_ADD_TAG("main", M68000, Y2/4)
990975   MDRV_CPU_PROGRAM_MAP(st_map, 0)
991976
992   MDRV_CPU_ADD(HD63701, 1000000) // HD6301
977   MDRV_CPU_ADD(HD63701, 1000000) // HD6301, really clocked at 4MHz but CPU core doesn't divide it properly
993978   MDRV_CPU_PROGRAM_MAP(ikbd_map, 0)
994979   MDRV_CPU_IO_MAP(ikbd_io_map, 0)
995980
r851r852
10521037   ROMX_LOAD( "tos102.img", 0xfc0000, 0x030000, BAD_DUMP CRC(3b5cd0c5) SHA1(87900a40a890fdf03bd08be6c60cc645855cbce5), ROM_BIOS(2) )
10531038   ROM_SYSTEM_BIOS( 2, "tos104", "TOS 1.04 (Rainbow TOS)" )
10541039   ROMX_LOAD( "tos104.img", 0xfc0000, 0x030000, BAD_DUMP CRC(a50d1d43) SHA1(9526ef63b9cb1d2a7109e278547ae78a5c1db6c6), ROM_BIOS(3) )
1040   ROM_SYSTEM_BIOS( 3, "tos099", "TOS 0.99 (Disk TOS)" )
1041   ROMX_LOAD( "tos099.img", 0xfc0000, 0x008000, NO_DUMP, ROM_BIOS(4) )
10551042   ROM_COPY( REGION_CPU1, 0xfc0000, 0x000000, 0x000008 )
10561043
10571044   ROM_REGION( 0x10000, REGION_CPU2, 0 )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team