Previous 199869 Revisions Next

r31964 Sunday 7th September, 2014 at 08:38:40 UTC by Fabio Priuli
gtia.c: converted to be a device. [Fabio Priuli]

also, fixed a regression in maxaflex.c and cleaned up a little bit the driver,
[src/mame/drivers]bartop52.c maxaflex.c
[src/mame/includes]atari.h
[src/mame/video]atari.c gtia.c gtia.h
[src/mess/drivers]atari400.c

trunk/src/mame/drivers/bartop52.c
r31963r31964
3939static ADDRESS_MAP_START(a5200_mem, AS_PROGRAM, 8, bartop52_state )
4040   AM_RANGE(0x0000, 0x3fff) AM_RAM
4141   AM_RANGE(0x4000, 0xbfff) AM_ROM
42   AM_RANGE(0xc000, 0xc0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
42   AM_RANGE(0xc000, 0xc0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
4343   AM_RANGE(0xd400, 0xd5ff) AM_READWRITE(atari_antic_r, atari_antic_w)
4444   AM_RANGE(0xe800, 0xe8ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
4545   AM_RANGE(0xf800, 0xffff) AM_ROM
r31963r31964
104104
105105void bartop52_state::machine_start()
106106{
107   /* GTIA */
108   gtia_interface gtia_intf;
109   memset(&gtia_intf, 0, sizeof(gtia_intf));
110   gtia_init(machine(), &gtia_intf);   
111   
112107   /* ANTIC */
113108   antic_start(machine());
114109}
r31963r31964
127122   MCFG_CPU_PROGRAM_MAP(a5200_mem)
128123   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", atari_common_state, a5200_interrupt, "screen", 0, 1)
129124
125   MCFG_DEVICE_ADD("gtia", ATARI_GTIA, 0)
126
130127   /* video hardware */
131128   MCFG_SCREEN_ADD("screen", RASTER)
132129   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1))
trunk/src/mame/drivers/maxaflex.c
r31963r31964
5959   DECLARE_READ8_MEMBER(mcu_tcr_r);
6060   DECLARE_WRITE8_MEMBER(mcu_tcr_w);
6161   DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
62   DECLARE_READ8_MEMBER(maxaflex_atari_pia_pa_r);
63   DECLARE_READ8_MEMBER(maxaflex_atari_pia_pb_r);
64   WRITE8_MEMBER(a600xl_pia_pb_w) { mmu(data); }
65   WRITE_LINE_MEMBER(atari_pia_cb2_w) { }  // This is used by Floppy drive on Atari 8bits Home Computers
66   DECLARE_DRIVER_INIT(a600xl);
67   DECLARE_MACHINE_RESET(supervisor_board);
62   DECLARE_READ8_MEMBER(pia_pa_r);
63   DECLARE_READ8_MEMBER(pia_pb_r);
64   WRITE8_MEMBER(pia_pb_w) { mmu(data); }
65   WRITE_LINE_MEMBER(pia_cb2_w) { }  // This is used by Floppy drive on Atari 8bits Home Computers
6866   TIMER_DEVICE_CALLBACK_MEMBER(mcu_timer_proc);
6967   int atari_input_disabled();
7068   virtual void machine_start();
r31963r31964
7876void maxaflex_state::mmu(UINT8 new_mmu)
7977{
8078   /* check if self-test ROM changed */
81   if ( new_mmu & 0x80 )
79   if (new_mmu & 0x80)
8280   {
8381      logerror("%s MMU SELFTEST RAM\n", machine().system().name);
8482      machine().device("maincpu")->memory().space(AS_PROGRAM).nop_readwrite(0x5000, 0x57ff);
r31963r31964
8886      logerror("%s MMU SELFTEST ROM\n", machine().system().name);
8987      machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_bank(0x5000, 0x57ff, "bank2");
9088      machine().device("maincpu")->memory().space(AS_PROGRAM).unmap_write(0x5000, 0x57ff);
91      machine().root_device().membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base() + 0x5000);
89      machine().root_device().membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base() + 0xd000);
9290   }
9391}
9492
r31963r31964
269267   }
270268}
271269
272MACHINE_RESET_MEMBER(maxaflex_state,supervisor_board)
273{
274   m_portA_in = m_portA_out = m_ddrA   = 0;
275   m_portB_in = m_portB_out = m_ddrB   = 0;
276   m_portC_in = m_portC_out = m_ddrC   = 0;
277   m_tdr = m_tcr = 0;
278   m_mcu_timer = machine().device<timer_device>("mcu_timer");
279
280   output_set_lamp_value(0, 0);
281   output_set_lamp_value(1, 0);
282   output_set_lamp_value(2, 0);
283   output_set_lamp_value(3, 0);
284   output_set_digit_value(0, 0x00);
285   output_set_digit_value(1, 0x00);
286   output_set_digit_value(2, 0x00);
287}
288
289270INPUT_CHANGED_MEMBER(maxaflex_state::coin_inserted)
290271{
291272   if (!newval)
r31963r31964
301282
302283static ADDRESS_MAP_START(a600xl_mem, AS_PROGRAM, 8, maxaflex_state )
303284   AM_RANGE(0x0000, 0x3fff) AM_RAM
304   AM_RANGE(0x5000, 0x57ff) AM_ROM AM_REGION("maincpu", 0x5000)    /* self test */
285   AM_RANGE(0x5000, 0x57ff) AM_ROM AM_REGION("maincpu", 0xd000)    /* self test */
305286   AM_RANGE(0x8000, 0xbfff) AM_ROM /* game cartridge */
306287   AM_RANGE(0xc000, 0xcfff) AM_ROM /* OS */
307   AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
288   AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
308289   AM_RANGE(0xd100, 0xd1ff) AM_NOP
309290   AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
310291   AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
r31963r31964
315296
316297static ADDRESS_MAP_START( mcu_mem, AS_PROGRAM, 8, maxaflex_state )
317298   ADDRESS_MAP_GLOBAL_MASK(0x7ff)
318   AM_RANGE(0x0000, 0x0000) AM_READ(mcu_portA_r ) AM_WRITE(mcu_portA_w )
319   AM_RANGE(0x0001, 0x0001) AM_READ(mcu_portB_r ) AM_WRITE(mcu_portB_w )
320   AM_RANGE(0x0002, 0x0002) AM_READ(mcu_portC_r ) AM_WRITE(mcu_portC_w )
321   AM_RANGE(0x0004, 0x0004) AM_READ(mcu_ddr_r ) AM_WRITE(mcu_portA_ddr_w )
322   AM_RANGE(0x0005, 0x0005) AM_READ(mcu_ddr_r ) AM_WRITE(mcu_portB_ddr_w )
323   AM_RANGE(0x0006, 0x0006) AM_READ(mcu_ddr_r ) AM_WRITE(mcu_portC_ddr_w )
324   AM_RANGE(0x0008, 0x0008) AM_READ(mcu_tdr_r ) AM_WRITE(mcu_tdr_w )
325   AM_RANGE(0x0009, 0x0009) AM_READ(mcu_tcr_r ) AM_WRITE(mcu_tcr_w )
299   AM_RANGE(0x0000, 0x0000) AM_READ(mcu_portA_r) AM_WRITE(mcu_portA_w)
300   AM_RANGE(0x0001, 0x0001) AM_READ(mcu_portB_r) AM_WRITE(mcu_portB_w)
301   AM_RANGE(0x0002, 0x0002) AM_READ(mcu_portC_r) AM_WRITE(mcu_portC_w)
302   AM_RANGE(0x0004, 0x0004) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portA_ddr_w)
303   AM_RANGE(0x0005, 0x0005) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portB_ddr_w)
304   AM_RANGE(0x0006, 0x0006) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portC_ddr_w)
305   AM_RANGE(0x0008, 0x0008) AM_READ(mcu_tdr_r) AM_WRITE(mcu_tdr_w)
306   AM_RANGE(0x0009, 0x0009) AM_READ(mcu_tcr_r) AM_WRITE(mcu_tcr_w)
326307   AM_RANGE(0x0010, 0x007f) AM_RAM
327308   AM_RANGE(0x0080, 0x07ff) AM_ROM
328309ADDRESS_MAP_END
r31963r31964
330311
331312static INPUT_PORTS_START( a600xl )
332313
333   PORT_START("console")  /* IN0 console keys & switch settings */
314   PORT_START("console")
334315   PORT_BIT(0x04, 0x04, IPT_KEYPAD) PORT_NAME("Option") PORT_CODE(KEYCODE_F2)
335316   PORT_BIT(0x02, 0x02, IPT_KEYPAD) PORT_NAME("Select") PORT_CODE(KEYCODE_F1)
336317   PORT_BIT(0x01, 0x01, IPT_START1 )
337318
338   PORT_START("djoy_0_1")  /* IN1 digital joystick #1 + #2 (PIA port A) */
319   PORT_START("djoy_0_1")
339320   PORT_BIT(0x01, 0x01, IPT_JOYSTICK_UP) PORT_PLAYER(1)
340321   PORT_BIT(0x02, 0x02, IPT_JOYSTICK_DOWN) PORT_PLAYER(1)
341322   PORT_BIT(0x04, 0x04, IPT_JOYSTICK_LEFT) PORT_PLAYER(1)
r31963r31964
346327   PORT_BIT(0x40, 0x40, IPT_JOYSTICK_LEFT) PORT_PLAYER(2)
347328   PORT_BIT(0x80, 0x80, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
348329
349   PORT_START("djoy_2_3")  /* IN2 digital joystick #3 + #4 (PIA port B) */
330   PORT_START("djoy_2_3")
350331   /* not connected */
351332   PORT_BIT(0x01, 0x01, IPT_JOYSTICK_UP) PORT_PLAYER(3)
352333   PORT_BIT(0x02, 0x02, IPT_JOYSTICK_DOWN) PORT_PLAYER(3)
r31963r31964
357338   PORT_BIT(0x40, 0x40, IPT_JOYSTICK_LEFT) PORT_PLAYER(4)
358339   PORT_BIT(0x80, 0x80, IPT_JOYSTICK_RIGHT) PORT_PLAYER(4)
359340
360   PORT_START("djoy_b")    /* IN3 digital joystick buttons (GTIA button bits) */
341   PORT_START("djoy_b")
361342   PORT_BIT(0x01, 0x01, IPT_BUTTON1) PORT_PLAYER(1)
362343   PORT_BIT(0x02, 0x02, IPT_BUTTON1) PORT_PLAYER(2)
363344   PORT_BIT(0x04, 0x04, IPT_BUTTON1) PORT_PLAYER(3)
r31963r31964
368349   PORT_BIT(0x80, 0x80, IPT_BUTTON2) PORT_PLAYER(4)
369350
370351   /* Max-A-Flex specific ports */
371   PORT_START("coin")  /* IN4 coin */
352   PORT_START("coin")
372353   PORT_BIT(0x1, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, maxaflex_state,coin_inserted, 0)
373354
374   PORT_START("dsw")   /* IN5 DSW */
355   PORT_START("dsw")
375356   PORT_DIPNAME(0xf, 0x9, "Coin/Time" )
376357   PORT_DIPSETTING( 0x0, "30 sec" )
377358   PORT_DIPSETTING( 0x1, "60 sec" )
r31963r31964
393374INPUT_PORTS_END
394375
395376
396READ8_MEMBER(maxaflex_state::maxaflex_atari_pia_pa_r)
377READ8_MEMBER(maxaflex_state::pia_pa_r)
397378{
398   return atari_input_disabled() ? 0xFF : ioport("djoy_0_1")->read_safe(0);
379   return atari_input_disabled() ? 0xff : ioport("djoy_0_1")->read_safe(0);
399380}
400381
401READ8_MEMBER(maxaflex_state::maxaflex_atari_pia_pb_r)
382READ8_MEMBER(maxaflex_state::pia_pb_r)
402383{
403   return atari_input_disabled() ? 0xFF : ioport("djoy_2_3")->read_safe(0);
384   return atari_input_disabled() ? 0xff : ioport("djoy_2_3")->read_safe(0);
404385}
405386
406387
407388void maxaflex_state::machine_start()
408389{
409   /* GTIA */
410   gtia_interface gtia_intf;
411   memset(&gtia_intf, 0, sizeof(gtia_intf));
412   gtia_init(machine(), &gtia_intf);   
413   
414390   /* ANTIC */
415391   antic_start(machine());
416392}
r31963r31964
420396   pokey_device *pokey = machine().device<pokey_device>("pokey");
421397   pokey->write(15,0);
422398   antic_reset();
399
400   // Supervisor board reset
401   m_portA_in = m_portA_out = m_ddrA = 0;
402   m_portB_in = m_portB_out = m_ddrB = 0;
403   m_portC_in = m_portC_out = m_ddrC = 0;
404   m_tdr = m_tcr = 0;
405   m_mcu_timer = machine().device<timer_device>("mcu_timer");
406   
407   output_set_lamp_value(0, 0);
408   output_set_lamp_value(1, 0);
409   output_set_lamp_value(2, 0);
410   output_set_lamp_value(3, 0);
411   output_set_digit_value(0, 0x00);
412   output_set_digit_value(1, 0x00);
413   output_set_digit_value(2, 0x00);
423414}
424415
425416
426static MACHINE_CONFIG_START( a600xl, maxaflex_state )
417static MACHINE_CONFIG_START( maxaflex, maxaflex_state )
427418   /* basic machine hardware */
428419   MCFG_CPU_ADD("maincpu", M6502, FREQ_17_EXACT)
429420   MCFG_CPU_PROGRAM_MAP(a600xl_mem)
r31963r31964
432423   MCFG_CPU_ADD("mcu", M68705, 3579545)
433424   MCFG_CPU_PROGRAM_MAP(mcu_mem)
434425
426   MCFG_DEVICE_ADD("gtia", ATARI_GTIA, 0)
427   MCFG_GTIA_READ_CB(IOPORT("console"))
428
435429   MCFG_DEVICE_ADD("pia", PIA6821, 0)
436   MCFG_PIA_READPA_HANDLER(READ8(maxaflex_state, maxaflex_atari_pia_pa_r))
437   MCFG_PIA_READPB_HANDLER(READ8(maxaflex_state, maxaflex_atari_pia_pb_r))
438   MCFG_PIA_WRITEPB_HANDLER(WRITE8(maxaflex_state, a600xl_pia_pb_w))
439   MCFG_PIA_CB2_HANDLER(WRITELINE(maxaflex_state, atari_pia_cb2_w))
430   MCFG_PIA_READPA_HANDLER(READ8(maxaflex_state, pia_pa_r))
431   MCFG_PIA_READPB_HANDLER(READ8(maxaflex_state, pia_pb_r))
432   MCFG_PIA_WRITEPB_HANDLER(WRITE8(maxaflex_state, pia_pb_w))
433   MCFG_PIA_CB2_HANDLER(WRITELINE(maxaflex_state, pia_cb2_w))
440434
441435   MCFG_TIMER_DRIVER_ADD("mcu_timer", maxaflex_state, mcu_timer_proc)
442436
r31963r31964
466460   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
467461MACHINE_CONFIG_END
468462
469static MACHINE_CONFIG_DERIVED( maxaflex, a600xl )
470   MCFG_MACHINE_RESET_OVERRIDE(maxaflex_state, supervisor_board )
471MACHINE_CONFIG_END
472463
473464ROM_START(maxaflex)
474465   ROM_REGION(0x10000,"maincpu",0) /* 64K for the CPU */
r31963r31964
530521   ROM_LOAD("maxprom.prm", 0x0000, 0x0200, CRC(edf5c950) SHA1(9ad046ea41a61585dd8d2f2d4167a3cc39d2928f))   /* for simulating keystrokes ?*/
531522ROM_END
532523
533DRIVER_INIT_MEMBER(maxaflex_state,a600xl)
534{
535   UINT8 *rom = memregion("maincpu")->base();
536   memcpy( rom + 0x5000, rom + 0xd000, 0x800 );
537}
538524
539GAME( 1984, maxaflex, 0,        maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy", "Max-A-Flex", GAME_IS_BIOS_ROOT )
540GAME( 1982, mf_achas, maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Astro Chase (Max-A-Flex)", 0 )
541GAME( 1983, mf_brist, maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Bristles (Max-A-Flex)", 0 )
542GAME( 1983, mf_flip,  maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Flip & Flop (Max-A-Flex)", 0 )
543GAME( 1984, mf_bdash, maxaflex, maxaflex, a600xl, maxaflex_state, a600xl, ROT0, "Exidy / First Star Software", "Boulder Dash (Max-A-Flex)", 0 )
525GAME( 1984, maxaflex, 0,        maxaflex, a600xl, driver_device,    0, ROT0, "Exidy", "Max-A-Flex", GAME_IS_BIOS_ROOT )
526GAME( 1982, mf_achas, maxaflex, maxaflex, a600xl, driver_device,    0, ROT0, "Exidy / First Star Software", "Astro Chase (Max-A-Flex)", 0 )
527GAME( 1983, mf_brist, maxaflex, maxaflex, a600xl, driver_device,    0, ROT0, "Exidy / First Star Software", "Bristles (Max-A-Flex)", 0 )
528GAME( 1983, mf_flip,  maxaflex, maxaflex, a600xl, driver_device,    0, ROT0, "Exidy / First Star Software", "Flip & Flop (Max-A-Flex)", 0 )
529GAME( 1984, mf_bdash, maxaflex, maxaflex, a600xl, driver_device,    0, ROT0, "Exidy / First Star Software", "Boulder Dash (Max-A-Flex)", 0 )
trunk/src/mame/includes/atari.h
r31963r31964
1414
1515#include "machine/6821pia.h"
1616#include "sound/pokey.h"
17#include "video/gtia.h"
1718
1819
1920class atari_common_state : public driver_device
r31963r31964
2122public:
2223   atari_common_state(const machine_config &mconfig, device_type type, const char *tag)
2324      : driver_device(mconfig, type, tag),
25      m_gtia(*this, "gtia"),
2426      tv_artifacts(0) { }
2527
2628   virtual void video_start();
r31963r31964
3335
3436   DECLARE_PALETTE_INIT(atari);
3537
36   DECLARE_READ8_MEMBER( atari_gtia_r );
37   DECLARE_WRITE8_MEMBER( atari_gtia_w );
38
3938   DECLARE_READ8_MEMBER ( atari_antic_r );
4039   DECLARE_WRITE8_MEMBER ( atari_antic_w );
4140
r31963r31964
4443   POKEY_KEYBOARD_CB_MEMBER(a800_keyboard);
4544
4645private:
47   UINT32 tv_artifacts ;
46   required_device<gtia_device> m_gtia;
47   UINT32 tv_artifacts;
4848   void prio_init();
4949   void cclk_init();
5050   void artifacts_gfx(UINT8 *src, UINT8 *dst, int width);
trunk/src/mame/video/atari.c
r31963r31964
703703void atari_common_state::video_start()
704704{
705705   palette_device *m_palette = machine().first_screen()->palette();
706   int i;
707706
708707   LOG(("atari antic_vh_start\n"));
709708   memset(&antic, 0, sizeof(antic));
r31963r31964
737736   antic.uc_g2       = &antic.used_colors[19 * 256];
738737   antic.uc_g3       = &antic.used_colors[20 * 256];
739738
740   /* reset the ANTIC color tables */
741   for( i = 0; i < 256; i ++ )
742      gtia.color_lookup[i] = (m_palette->pen(0) << 8) + m_palette->pen(0);
739   for (int i = 0; i < 256; i++)
740      m_gtia->set_color_lookup(i, (m_palette->pen(0) << 8) + m_palette->pen(0));
743741
744742   LOG(("atari cclk_init\n"));
745743   cclk_init();
746744
747   for( i = 0; i < 64; i++ )
748   {
745   for (int i = 0; i < 64; i++)
749746      antic.prio_table[i] = auto_alloc_array(machine(), UINT8, 8*256);
750   }
751747
752748   LOG(("atari prio_init\n"));
753749   prio_init();
754750
755   for( i = 0; i < machine().first_screen()->height(); i++ )
756   {
751   for (int i = 0; i < machine().first_screen()->height(); i++)
757752      antic.video[i] = auto_alloc_clear(machine(), VIDEO);
758   }
759753}
760754
761755/************************************************************************
r31963r31964
780774
781775void atari_common_state::artifacts_gfx(UINT8 *src, UINT8 *dst, int width)
782776{
783   int x;
784777   UINT8 n, bits = 0;
785   UINT8 b = gtia.w.colbk & 0xf0;
786   UINT8 c = gtia.w.colpf1 & 0x0f;
787   UINT8 atari_A = ((b+0x30)&0xf0)+c;
788   UINT8 atari_B = ((b+0x70)&0xf0)+c;
789   UINT8 atari_C = b+c;
790   UINT8 atari_D = gtia.w.colbk;
791   UINT16 *color_lookup = gtia.color_lookup;
778   UINT8 b = m_gtia->get_w_colbk() & 0xf0;
779   UINT8 c = m_gtia->get_w_colpf1() & 0x0f;
780   UINT8 atari_A = ((b + 0x30) & 0xf0) + c;
781   UINT8 atari_B = ((b + 0x70) & 0xf0) + c;
782   UINT8 atari_C = b + c;
783   UINT8 atari_D = m_gtia->get_w_colbk();
784   UINT16 *color_lookup = m_gtia->get_color_lookup();
792785
793   for( x = 0; x < width * 4; x++ )
786   for (int x = 0; x < width * 4; x++)
794787   {
795788      n = *src++;
796789      bits <<= 2;
r31963r31964
812805         *dst++ = color_lookup[n];
813806         continue;
814807      }
815      switch( (bits >> 1) & 7 )
808      switch ((bits >> 1) & 7)
816809      {
817810      case 0: /* 0 0 0 */
818811      case 1: /* 0 0 1 */
r31963r31964
831824         *dst++ = atari_A;
832825         break;
833826      }
834      switch( bits & 7 )
827      switch (bits & 7)
835828      {
836829      case 0: /* 0 0 0 */
837830      case 1: /* 0 0 1 */
r31963r31964
855848
856849void atari_common_state::artifacts_txt(UINT8 * src, UINT8 * dst, int width)
857850{
858   int x;
859851   UINT8 n, bits = 0;
860   UINT8 b = gtia.w.colpf2 & 0xf0;
861   UINT8 c = gtia.w.colpf1 & 0x0f;
852   UINT8 b = m_gtia->get_w_colpf2() & 0xf0;
853   UINT8 c = m_gtia->get_w_colpf1() & 0x0f;
862854   UINT8 atari_A = ((b+0x30)&0xf0)+c;
863855   UINT8 atari_B = ((b+0x70)&0xf0)+c;
864856   UINT8 atari_C = b+c;
865   UINT8 atari_D = gtia.w.colpf2;
866   UINT16 *color_lookup = gtia.color_lookup;
857   UINT8 atari_D = m_gtia->get_w_colpf2();
858   UINT16 *color_lookup = m_gtia->get_color_lookup();
867859
868   for( x = 0; x < width * 4; x++ )
860   for (int x = 0; x < width * 4; x++)
869861   {
870862      n = *src++;
871863      bits <<= 2;
r31963r31964
935927   UINT8 *src;
936928   UINT32 *dst;
937929   UINT32 scanline[4 + (HCHARS * 2) + 4];
938   UINT16 *color_lookup = gtia.color_lookup;
930   UINT16 *color_lookup = m_gtia->get_color_lookup();
939931
940932   /* increment the scanline */
941933   if( ++antic.scanline == machine().first_screen()->height() )
r31963r31964
944936      antic.scanline = 0;
945937      antic.modelines = 0;
946938      /* count frames gone since last write to hitclr */
947      gtia.h.hitclr_frames++;
939      m_gtia->count_hitclr_frames();
948940   }
949941
950942   if( antic.scanline < MIN_Y || antic.scanline > MAX_Y )
r31963r31964
11831175         if( antic.w.dmactl & DMA_MISSILE )
11841176         {
11851177            antic.steal_cycles += 1;
1186            atari_gtia_w(space, 0x11, RDPMGFXD(space, 3*256));
1178            m_gtia->write(space, 0x11, RDPMGFXD(space, 3*256));
11871179         }
11881180         /* transport player data to GTIA ? */
11891181         if( antic.w.dmactl & DMA_PLAYER )
11901182         {
11911183            antic.steal_cycles += 4;
1192            atari_gtia_w(space, 0x0d, RDPMGFXD(space, 4*256));
1193            atari_gtia_w(space, 0x0e, RDPMGFXD(space, 5*256));
1194            atari_gtia_w(space, 0x0f, RDPMGFXD(space, 6*256));
1195            atari_gtia_w(space, 0x10, RDPMGFXD(space, 7*256));
1184            m_gtia->write(space, 0x0d, RDPMGFXD(space, 4*256));
1185            m_gtia->write(space, 0x0e, RDPMGFXD(space, 5*256));
1186            m_gtia->write(space, 0x0f, RDPMGFXD(space, 6*256));
1187            m_gtia->write(space, 0x10, RDPMGFXD(space, 7*256));
11961188         }
11971189      }
11981190      else
r31963r31964
12021194         {
12031195            if( (antic.scanline & 1) == 0 )      /* even line ? */
12041196               antic.steal_cycles += 1;
1205            atari_gtia_w(space, 0x11, RDPMGFXS(space, 3*128));
1197            m_gtia->write(space, 0x11, RDPMGFXS(space, 3*128));
12061198         }
12071199         /* transport player data to GTIA ? */
12081200         if( antic.w.dmactl & DMA_PLAYER )
12091201         {
12101202            if( (antic.scanline & 1) == 0 )      /* even line ? */
12111203               antic.steal_cycles += 4;
1212            atari_gtia_w(space, 0x0d, RDPMGFXS(space, 4*128));
1213            atari_gtia_w(space, 0x0e, RDPMGFXS(space, 5*128));
1214            atari_gtia_w(space, 0x0f, RDPMGFXS(space, 6*128));
1215            atari_gtia_w(space, 0x10, RDPMGFXS(space, 7*128));
1204            m_gtia->write(space, 0x0d, RDPMGFXS(space, 4*128));
1205            m_gtia->write(space, 0x0e, RDPMGFXS(space, 5*128));
1206            m_gtia->write(space, 0x0f, RDPMGFXS(space, 6*128));
1207            m_gtia->write(space, 0x10, RDPMGFXS(space, 7*128));
12161208         }
12171209      }
12181210   }
12191211
12201212   if (antic.scanline >= VBL_END && antic.scanline < 256)
1221      gtia_render((UINT8 *)antic.pmbits + PMOFFSET, (UINT8 *)antic.cclock + PMOFFSET - antic.hscrol_old, (UINT8 *)antic.prio_table[gtia.w.prior & 0x3f], (UINT8 *)&antic.pmbits);
1213      m_gtia->render((UINT8 *)antic.pmbits + PMOFFSET, (UINT8 *)antic.cclock + PMOFFSET - antic.hscrol_old, (UINT8 *)antic.prio_table[m_gtia->get_w_prior() & 0x3f], (UINT8 *)&antic.pmbits);
12221214
12231215   antic.steal_cycles += CYCLES_REFRESH;
12241216   LOG(("           run CPU for %d cycles\n", CYCLES_HSYNC - CYCLES_HSTART - antic.steal_cycles));
r31963r31964
14361428               LMS(new_cmd);
14371429               /* bits 6+7 of the priority select register determine */
14381430               /* if newer GTIA or plain graphics modes are used */
1439               switch (gtia.w.prior >> 6)
1431               switch (m_gtia->get_w_prior() >> 6)
14401432               {
14411433                  case 0: break;
14421434                  case 1: antic.renderer = renderer[h][16][w];  break;
r31963r31964
14821474
14831475void atari_common_state::generic_atari_interrupt(int button_count)
14841476{
1485   int button_port, i;
1486
14871477   LOG(("ANTIC #%3d @cycle #%d scanline interrupt\n", antic.scanline, cycle()));
14881478
14891479   if( antic.scanline < VBL_START )
r31963r31964
14941484
14951485   if( antic.scanline == VBL_START )
14961486   {
1497      button_port = machine().root_device().ioport("djoy_b")->read_safe(0);
1498
14991487      /* specify buttons relevant to this Atari variant */
1500      for (i = 0; i < button_count; i++)
1501      {
1502         if ((gtia.w.gractl & GTIA_TRIGGER) == 0)
1503            gtia.r.but[i] = 1;
1504         gtia.r.but[i] &= (button_port >> i) & 1;
1505      }
1488      m_gtia->button_interrupt(button_count, machine().root_device().ioport("djoy_b")->read_safe(0));
15061489
1507      /* button registers for xl/xe */
1508      if (button_count == 2)
1509      {
1510         gtia.r.but[2] = 1; /* not used on xl/xe */
1511         gtia.r.but[3] = 0; /* 1 if external cartridge is inserted */
1512      }
1513
15141490      /* do nothing new for the rest of the frame */
15151491      antic.modelines = machine().first_screen()->height() - VBL_START;
15161492      antic.renderer = antic_mode_0_xx;
trunk/src/mame/video/gtia.c
r31963r31964
99***************************************************************************/
1010
1111#include "emu.h"
12#include "cpu/m6502/m6502.h"
13#include "includes/atari.h"
1412#include "video/gtia.h"
1513
16gtia_struct gtia;
14#define GTIA_P0 0x01
15#define GTIA_P1 0x02
16#define GTIA_P2 0x04
17#define GTIA_P3 0x08
18#define GTIA_M0 0x10
19#define GTIA_M1 0x20
20#define GTIA_M2 0x40
21#define GTIA_M3 0x80
1722
18#define P0 0x01
19#define P1 0x02
20#define P2 0x04
21#define P3 0x08
22#define M0 0x10
23#define M1 0x20
24#define M2 0x40
25#define M3 0x80
23#define GTIA_HWIDTH    48      /* total characters per line */
24#define GTIA_TRIGGER    0x04
2625
2726#define CHECK_GRACTL    0
2827#define VERBOSE         0
2928
30static void gtia_reset(running_machine &machine);
31static void gtia_state(running_machine &machine);
32static void gtia_state_postload(running_machine &machine);
29#define PFD     0x00    /* 00000000b playfield default color */
3330
31#define PBK     0x00    /* 00000000b playfield background */
32#define PF0     0x01    /* 00000001b playfield color #0   */
33#define PF1     0x02    /* 00000010b playfield color #1   */
34#define PF2     0x04    /* 00000100b playfield color #2   */
35#define PF3     0x08    /* 00001000b playfield color #3   */
36#define PL0     0x11    /* 00010001b player #0            */
37#define PL1     0x12    /* 00010010b player #1            */
38#define PL2     0x14    /* 00010100b player #2            */
39#define PL3     0x18    /* 00011000b player #3            */
40#define MI0     0x21    /* 00100001b missile #0           */
41#define MI1     0x22    /* 00100010b missile #1           */
42#define MI2     0x24    /* 00100100b missile #2           */
43#define MI3     0x28    /* 00101000b missile #3           */
44#define T00     0x40    /* 01000000b text mode pixels 00  */
45#define P000    0x48    /* 01001000b player #0 pixels 00  */
46#define P100    0x4a    /* 01001010b player #1 pixels 00  */
47#define P200    0x4c    /* 01001100b player #2 pixels 00  */
48#define P300    0x4e    /* 01001110b player #3 pixels 00  */
49#define P400    0x4f    /* 01001111b missiles  pixels 00  */
50#define T01     0x50    /* 01010000b text mode pixels 01  */
51#define P001    0x58    /* 01011000b player #0 pixels 01  */
52#define P101    0x5a    /* 01011010b player #1 pixels 01  */
53#define P201    0x5c    /* 01011100b player #2 pixels 01  */
54#define P301    0x5e    /* 01011110b player #3 pixels 01  */
55#define P401    0x5f    /* 01011111b missiles  pixels 01  */
56#define T10     0x60    /* 01100000b text mode pixels 10  */
57#define P010    0x68    /* 01101000b player #0 pixels 10  */
58#define P110    0x6a    /* 01101010b player #1 pixels 10  */
59#define P210    0x6c    /* 01101100b player #2 pixels 10  */
60#define P310    0x6e    /* 01101110b player #3 pixels 10  */
61#define P410    0x6f    /* 01101111b missiles  pixels 10  */
62#define T11     0x70    /* 01110000b text mode pixels 11  */
63#define P011    0x78    /* 01111000b player #0 pixels 11  */
64#define P111    0x7a    /* 01111010b player #1 pixels 11  */
65#define P211    0x7c    /* 01111100b player #2 pixels 11  */
66#define P311    0x7e    /* 01111110b player #3 pixels 11  */
67#define P411    0x7f    /* 01111111b missiles  pixels 11  */
68#define G00     0x80    /* 10000000b hires gfx pixels 00  */
69#define G01     0x90    /* 10010000b hires gfx pixels 01  */
70#define G10     0xa0    /* 10100000b hires gfx pixels 10  */
71#define G11     0xb0    /* 10110000b hires gfx pixels 11  */
72#define GT1     0xc0    /* 11000000b gtia mode 1          */
73#define GT2     0xd0    /* 11010000b gtia mode 2          */
74#define GT3     0xe0    /* 11100000b gtia mode 3          */
75#define ILL     0xfe    /* 11111110b illegal priority     */
76#define EOR     0xff    /* 11111111b EOR mode color       */
77
78#define LUM     0x0f    /* 00001111b luminance bits       */
79#define HUE     0xf0    /* 11110000b hue bits             */
80
81
3482/**********************************************
3583 * split a color into hue and luminance values
3684 **********************************************/
37#define SPLIT_HUE(data,hue) \
85#define SPLIT_HUE(data, hue) \
3886   hue = (data & HUE)
3987
40#define SPLIT_LUM(data,lum) \
88#define SPLIT_LUM(data, lum) \
4189   lum = (data & LUM)
4290
4391/**********************************************
4492 * set both color clocks equal for one color
4593 **********************************************/
46#define SETCOL_B(o,d) \
47   gtia.color_lookup[o] = ((d) << 8) | (d)
94#define SETCOL_B(o, d) \
95   m_color_lookup[o] = ((d) << 8) | (d)
4896
4997/**********************************************
5098 * set left color clock for one color
5199 **********************************************/
52#define SETCOL_L(o,d) \
53   *((UINT8*)&gtia.color_lookup[o] + 0) = d
100#define SETCOL_L(o, d) \
101   *((UINT8*)&m_color_lookup[o] + 0) = d
54102
55103/**********************************************
56104 * set right color clock for one color
57105 **********************************************/
58#define SETCOL_R(o,d) \
59   *((UINT8*)&gtia.color_lookup[o] + 1) = d
106#define SETCOL_R(o, d) \
107   *((UINT8*)&m_color_lookup[o] + 1) = d
60108
61109
62110
63/*************************************
64 *
65 *  Initialization/Reset
66 *
67 *************************************/
111// devices
112const device_type ATARI_GTIA = &device_creator<gtia_device>;
68113
69void gtia_init(running_machine &machine, const gtia_interface *intf)
114//-------------------------------------------------
115//  upd7220_device - constructor
116//-------------------------------------------------
117
118gtia_device::gtia_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
119            device_t(mconfig, ATARI_GTIA, "Atari GTIA", tag, owner, clock, "gtia", __FILE__),
120            m_read_cb(*this),
121            m_write_cb(*this)
70122{
71   memset(&gtia, 0, sizeof(gtia));
72   gtia.intf = *intf;
73
74   machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(gtia_reset), &machine));
75
76   /* state saves */
77   gtia_state(machine);
78123}
79124
80125
126//-------------------------------------------------
127//  device_start - device-specific startup
128//-------------------------------------------------
81129
82static void gtia_state(running_machine &machine)
130void gtia_device::device_start()
83131{
84   machine.save().save_item(NAME(gtia.r.m0pf));
85   machine.save().save_item(NAME(gtia.r.m1pf));
86   machine.save().save_item(NAME(gtia.r.m2pf));
87   machine.save().save_item(NAME(gtia.r.m3pf));
88   machine.save().save_item(NAME(gtia.r.p0pf));
89   machine.save().save_item(NAME(gtia.r.p1pf));
90   machine.save().save_item(NAME(gtia.r.p2pf));
91   machine.save().save_item(NAME(gtia.r.p3pf));
92   machine.save().save_item(NAME(gtia.r.m0pl));
93   machine.save().save_item(NAME(gtia.r.m1pl));
94   machine.save().save_item(NAME(gtia.r.m2pl));
95   machine.save().save_item(NAME(gtia.r.m3pl));
96   machine.save().save_item(NAME(gtia.r.p0pl));
97   machine.save().save_item(NAME(gtia.r.p1pl));
98   machine.save().save_item(NAME(gtia.r.p2pl));
99   machine.save().save_item(NAME(gtia.r.p3pl));
100   machine.save().save_item(NAME(gtia.r.but));
101   machine.save().save_item(NAME(gtia.r.pal));
102   machine.save().save_item(NAME(gtia.r.gtia15));
103   machine.save().save_item(NAME(gtia.r.gtia16));
104   machine.save().save_item(NAME(gtia.r.gtia17));
105   machine.save().save_item(NAME(gtia.r.gtia18));
106   machine.save().save_item(NAME(gtia.r.gtia19));
107   machine.save().save_item(NAME(gtia.r.gtia1a));
108   machine.save().save_item(NAME(gtia.r.gtia1b));
109   machine.save().save_item(NAME(gtia.r.gtia1c));
110   machine.save().save_item(NAME(gtia.r.gtia1d));
111   machine.save().save_item(NAME(gtia.r.gtia1e));
112   machine.save().save_item(NAME(gtia.r.cons));
113   machine.save().save_item(NAME(gtia.w.hposp0));
114   machine.save().save_item(NAME(gtia.w.hposp1));
115   machine.save().save_item(NAME(gtia.w.hposp2));
116   machine.save().save_item(NAME(gtia.w.hposp3));
117   machine.save().save_item(NAME(gtia.w.hposm0));
118   machine.save().save_item(NAME(gtia.w.hposm1));
119   machine.save().save_item(NAME(gtia.w.hposm2));
120   machine.save().save_item(NAME(gtia.w.hposm3));
121   machine.save().save_item(NAME(gtia.w.sizep0));
122   machine.save().save_item(NAME(gtia.w.sizep1));
123   machine.save().save_item(NAME(gtia.w.sizep2));
124   machine.save().save_item(NAME(gtia.w.sizep3));
125   machine.save().save_item(NAME(gtia.w.sizem));
126   machine.save().save_item(NAME(gtia.w.grafp0));
127   machine.save().save_item(NAME(gtia.w.grafp1));
128   machine.save().save_item(NAME(gtia.w.grafp2));
129   machine.save().save_item(NAME(gtia.w.grafp3));
130   machine.save().save_item(NAME(gtia.w.grafm));
131   machine.save().save_item(NAME(gtia.w.colpm0));
132   machine.save().save_item(NAME(gtia.w.colpm1));
133   machine.save().save_item(NAME(gtia.w.colpm2));
134   machine.save().save_item(NAME(gtia.w.colpm3));
135   machine.save().save_item(NAME(gtia.w.colpf0));
136   machine.save().save_item(NAME(gtia.w.colpf1));
137   machine.save().save_item(NAME(gtia.w.colpf2));
138   machine.save().save_item(NAME(gtia.w.colpf3));
139   machine.save().save_item(NAME(gtia.w.colbk));
140   machine.save().save_item(NAME(gtia.w.prior));
141   machine.save().save_item(NAME(gtia.w.vdelay));
142   machine.save().save_item(NAME(gtia.w.gractl));
143   machine.save().save_item(NAME(gtia.w.hitclr));
144   machine.save().save_item(NAME(gtia.w.cons));
145   machine.save().register_postload(save_prepost_delegate(FUNC(gtia_state_postload), &machine));
132   m_read_cb.resolve();
133   m_write_cb.resolve();
134   
135   save_item(NAME(m_r.m0pf));
136   save_item(NAME(m_r.m1pf));
137   save_item(NAME(m_r.m2pf));
138   save_item(NAME(m_r.m3pf));
139   save_item(NAME(m_r.p0pf));
140   save_item(NAME(m_r.p1pf));
141   save_item(NAME(m_r.p2pf));
142   save_item(NAME(m_r.p3pf));
143   save_item(NAME(m_r.m0pl));
144   save_item(NAME(m_r.m1pl));
145   save_item(NAME(m_r.m2pl));
146   save_item(NAME(m_r.m3pl));
147   save_item(NAME(m_r.p0pl));
148   save_item(NAME(m_r.p1pl));
149   save_item(NAME(m_r.p2pl));
150   save_item(NAME(m_r.p3pl));
151   save_item(NAME(m_r.but));
152   save_item(NAME(m_r.pal));
153   save_item(NAME(m_r.gtia15));
154   save_item(NAME(m_r.gtia16));
155   save_item(NAME(m_r.gtia17));
156   save_item(NAME(m_r.gtia18));
157   save_item(NAME(m_r.gtia19));
158   save_item(NAME(m_r.gtia1a));
159   save_item(NAME(m_r.gtia1b));
160   save_item(NAME(m_r.gtia1c));
161   save_item(NAME(m_r.gtia1d));
162   save_item(NAME(m_r.gtia1e));
163   save_item(NAME(m_r.cons));
164   save_item(NAME(m_w.hposp0));
165   save_item(NAME(m_w.hposp1));
166   save_item(NAME(m_w.hposp2));
167   save_item(NAME(m_w.hposp3));
168   save_item(NAME(m_w.hposm0));
169   save_item(NAME(m_w.hposm1));
170   save_item(NAME(m_w.hposm2));
171   save_item(NAME(m_w.hposm3));
172   save_item(NAME(m_w.sizep0));
173   save_item(NAME(m_w.sizep1));
174   save_item(NAME(m_w.sizep2));
175   save_item(NAME(m_w.sizep3));
176   save_item(NAME(m_w.sizem));
177   save_item(NAME(m_w.grafp0));
178   save_item(NAME(m_w.grafp1));
179   save_item(NAME(m_w.grafp2));
180   save_item(NAME(m_w.grafp3));
181   save_item(NAME(m_w.grafm));
182   save_item(NAME(m_w.colpm0));
183   save_item(NAME(m_w.colpm1));
184   save_item(NAME(m_w.colpm2));
185   save_item(NAME(m_w.colpm3));
186   save_item(NAME(m_w.colpf0));
187   save_item(NAME(m_w.colpf1));
188   save_item(NAME(m_w.colpf2));
189   save_item(NAME(m_w.colpf3));
190   save_item(NAME(m_w.colbk));
191   save_item(NAME(m_w.prior));
192   save_item(NAME(m_w.vdelay));
193   save_item(NAME(m_w.gractl));
194   save_item(NAME(m_w.hitclr));
195   save_item(NAME(m_w.cons));
196   machine().save().register_postload(save_prepost_delegate(FUNC(gtia_device::gtia_postload), this));
146197}
147198
148199
200//-------------------------------------------------
201//  device_reset - device-specific reset
202//-------------------------------------------------
149203
150static int is_ntsc(running_machine &machine)
204void gtia_device::device_reset()
151205{
152   return ATTOSECONDS_TO_HZ(machine.first_screen()->frame_period().attoseconds) > 55;
206   /* reset the GTIA read/write/helper registers */
207   for (int i = 0; i < 32; i++)
208      write(machine().driver_data()->generic_space(), i, 0);
209   memset(&m_r, 0, sizeof(m_r));
210   if (is_ntsc())
211      m_r.pal = 0xff;
212   else
213      m_r.pal = 0xf1;
214   m_r.gtia15 = 0xff;
215   m_r.gtia16 = 0xff;
216   m_r.gtia17 = 0xff;
217   m_r.gtia18 = 0xff;
218   m_r.gtia19 = 0xff;
219   m_r.gtia1a = 0xff;
220   m_r.gtia1b = 0xff;
221   m_r.gtia1c = 0xff;
222   m_r.gtia1d = 0xff;
223   m_r.gtia1e = 0xff;
224   m_r.cons = 0x07;     /* console keys */
225   SETCOL_B(ILL, 0x3e);     /* bright red */
226   SETCOL_B(EOR, 0xff);     /* yellow */
153227}
154228
155229
156230
157static void gtia_reset(running_machine &machine)
231int gtia_device::is_ntsc()
158232{
159   int i;
160   atari_common_state *state = machine.driver_data<atari_common_state>();
233   return ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds) > 55;
234}
161235
162   /* reset the GTIA read/write/helper registers */
163   for (i = 0; i < 32; i++)
164      state->atari_gtia_w(state->generic_space(),i,0);
165   memset(&gtia.r, 0, sizeof(gtia.r));
166   if (is_ntsc(machine))
167      gtia.r.pal = 0xff;
168   else
169      gtia.r.pal = 0xf1;
170   gtia.r.gtia15 = 0xff;
171   gtia.r.gtia16 = 0xff;
172   gtia.r.gtia17 = 0xff;
173   gtia.r.gtia18 = 0xff;
174   gtia.r.gtia19 = 0xff;
175   gtia.r.gtia1a = 0xff;
176   gtia.r.gtia1b = 0xff;
177   gtia.r.gtia1c = 0xff;
178   gtia.r.gtia1d = 0xff;
179   gtia.r.gtia1e = 0xff;
180   gtia.r.cons = 0x07;     /* console keys */
181   SETCOL_B(ILL,0x3e);     /* bright red */
182   SETCOL_B(EOR,0xff);     /* yellow */
236void gtia_device::button_interrupt(int button_count, UINT8 button_port)
237{
238   /* specify buttons relevant to this Atari variant */
239   for (int i = 0; i < button_count; i++)
240   {
241      if ((m_w.gractl & GTIA_TRIGGER) == 0)
242         m_r.but[i] = 1;
243      m_r.but[i] &= BIT(button_port, i);
244   }
245   
246   /* button registers for xl/xe */
247   if (button_count == 2)
248   {
249      m_r.but[2] = 1;  /* not used on xl/xe */
250      m_r.but[3] = 0;  /* 1 if external cartridge is inserted */
251   }
252   
183253}
184254
185255
r31963r31964
190260 *
191261 **************************************************************/
192262
193READ8_MEMBER( atari_common_state::atari_gtia_r )
263READ8_MEMBER( gtia_device::read )
194264{
195265   switch (offset & 31)
196266   {
197      case  0: return gtia.r.m0pf;
198      case  1: return gtia.r.m1pf;
199      case  2: return gtia.r.m2pf;
200      case  3: return gtia.r.m3pf;
201      case  4: return gtia.r.p0pf;
202      case  5: return gtia.r.p1pf;
203      case  6: return gtia.r.p2pf;
204      case  7: return gtia.r.p3pf;
205      case  8: return gtia.r.m0pl;
206      case  9: return gtia.r.m1pl;
207      case 10: return gtia.r.m2pl;
208      case 11: return gtia.r.m3pl;
209      case 12: return gtia.r.p0pl;
210      case 13: return gtia.r.p1pl;
211      case 14: return gtia.r.p2pl;
212      case 15: return gtia.r.p3pl;
267      case  0: return m_r.m0pf;
268      case  1: return m_r.m1pf;
269      case  2: return m_r.m2pf;
270      case  3: return m_r.m3pf;
271      case  4: return m_r.p0pf;
272      case  5: return m_r.p1pf;
273      case  6: return m_r.p2pf;
274      case  7: return m_r.p3pf;
275      case  8: return m_r.m0pl;
276      case  9: return m_r.m1pl;
277      case 10: return m_r.m2pl;
278      case 11: return m_r.m3pl;
279      case 12: return m_r.p0pl;
280      case 13: return m_r.p1pl;
281      case 14: return m_r.p2pl;
282      case 15: return m_r.p3pl;
213283
214      case 16: return gtia.r.but[0];
215      case 17: return gtia.r.but[1];
216      case 18: return gtia.r.but[2];
217      case 19: return gtia.r.but[3];
284      case 16: return m_r.but[0];
285      case 17: return m_r.but[1];
286      case 18: return m_r.but[2];
287      case 19: return m_r.but[3];
218288
219      case 20: return gtia.r.pal;
289      case 20: return m_r.pal;
220290
221      case 21: return gtia.r.gtia15;
222      case 22: return gtia.r.gtia16;
223      case 23: return gtia.r.gtia17;
224      case 24: return gtia.r.gtia18;
225      case 25: return gtia.r.gtia19;
226      case 26: return gtia.r.gtia1a;
227      case 27: return gtia.r.gtia1b;
228      case 28: return gtia.r.gtia1c;
229      case 29: return gtia.r.gtia1d;
230      case 30: return gtia.r.gtia1e;
291      case 21: return m_r.gtia15;
292      case 22: return m_r.gtia16;
293      case 23: return m_r.gtia17;
294      case 24: return m_r.gtia18;
295      case 25: return m_r.gtia19;
296      case 26: return m_r.gtia1a;
297      case 27: return m_r.gtia1b;
298      case 28: return m_r.gtia1c;
299      case 29: return m_r.gtia1d;
300      case 30: return m_r.gtia1e;
231301
232302      case 31:
233         gtia.r.cons = gtia.intf.console_read ? (gtia.intf.console_read(space) & 0x0F) : 0x00;
234         return gtia.r.cons;
303         m_r.cons = !m_read_cb.isnull() ? (m_read_cb(0) & 0x0f) : 0x00;
304         return m_r.cons;
235305   }
236306   return 0xff;
237307}
238308
239309
240310
241static void recalc_p0(void)
311void gtia_device::recalc_p0()
242312{
243313   if (
244314#if CHECK_GRACTL
245      (gtia.w.gractl & GTIA_PLAYER) == 0 ||
315      (m_w.gractl & GTIA_PLAYER) == 0 ||
246316#endif
247      gtia.w.grafp0[gtia.h.vdelay_p0] == 0 || gtia.w.hposp0 >= 224 )
317      m_w.grafp0[m_h.vdelay_p0] == 0 || m_w.hposp0 >= 224 )
248318   {
249      gtia.h.grafp0 = 0;
250      gtia.h.usedp &= ~0x10;
319      m_h.grafp0 = 0;
320      m_h.usedp &= ~0x10;
251321   }
252322   else
253323   {
254      gtia.h.grafp0 = gtia.w.grafp0[gtia.h.vdelay_p0];
255      gtia.h.usedp |= 0x10;
324      m_h.grafp0 = m_w.grafp0[m_h.vdelay_p0];
325      m_h.usedp |= 0x10;
256326   }
257327}
258328
259static void recalc_p1(void)
329void gtia_device::recalc_p1()
260330{
261331   if (
262332#if CHECK_GRACTL
263      (gtia.w.gractl & GTIA_PLAYER) == 0 ||
333      (m_w.gractl & GTIA_PLAYER) == 0 ||
264334#endif
265      gtia.w.grafp1[gtia.h.vdelay_p1] == 0 || gtia.w.hposp1 >= 224 )
335      m_w.grafp1[m_h.vdelay_p1] == 0 || m_w.hposp1 >= 224 )
266336   {
267      gtia.h.grafp1 = 0;
268      gtia.h.usedp &= ~0x20;
337      m_h.grafp1 = 0;
338      m_h.usedp &= ~0x20;
269339   }
270340   else
271341   {
272      gtia.h.grafp1 = gtia.w.grafp1[gtia.h.vdelay_p1];
273      gtia.h.usedp |= 0x20;
342      m_h.grafp1 = m_w.grafp1[m_h.vdelay_p1];
343      m_h.usedp |= 0x20;
274344   }
275345}
276346
277static void recalc_p2(void)
347void gtia_device::recalc_p2()
278348{
279349   if (
280350#if CHECK_GRACTL
281      (gtia.w.gractl & GTIA_PLAYER) == 0 ||
351      (m_w.gractl & GTIA_PLAYER) == 0 ||
282352#endif
283      gtia.w.grafp2[gtia.h.vdelay_p2] == 0 || gtia.w.hposp2 >= 224 )
353      m_w.grafp2[m_h.vdelay_p2] == 0 || m_w.hposp2 >= 224 )
284354   {
285      gtia.h.grafp2 = 0;
286      gtia.h.usedp &= ~0x40;
355      m_h.grafp2 = 0;
356      m_h.usedp &= ~0x40;
287357   }
288358   else
289359   {
290      gtia.h.grafp2 = gtia.w.grafp2[gtia.h.vdelay_p2];
291      gtia.h.usedp |= 0x40;
360      m_h.grafp2 = m_w.grafp2[m_h.vdelay_p2];
361      m_h.usedp |= 0x40;
292362   }
293363}
294364
295static void recalc_p3(void)
365void gtia_device::recalc_p3()
296366{
297367   if (
298368#if CHECK_GRACTL
299      (gtia.w.gractl & GTIA_PLAYER) == 0 ||
369      (m_w.gractl & GTIA_PLAYER) == 0 ||
300370#endif
301      gtia.w.grafp3[gtia.h.vdelay_p3] == 0 || gtia.w.hposp3 >= 224 )
371      m_w.grafp3[m_h.vdelay_p3] == 0 || m_w.hposp3 >= 224 )
302372   {
303      gtia.h.grafp3 = 0;
304      gtia.h.usedp &= ~0x80;
373      m_h.grafp3 = 0;
374      m_h.usedp &= ~0x80;
305375   }
306376   else
307377   {
308      gtia.h.grafp3 = gtia.w.grafp3[gtia.h.vdelay_p3];
309      gtia.h.usedp |= 0x80;
378      m_h.grafp3 = m_w.grafp3[m_h.vdelay_p3];
379      m_h.usedp |= 0x80;
310380   }
311381}
312382
313static void recalc_m0(void)
383void gtia_device::recalc_m0()
314384{
315385   if (
316386#if CHECK_GRACTL
317      (gtia.w.gractl & GTIA_MISSILE) == 0 ||
387      (m_w.gractl & GTIA_MISSILE) == 0 ||
318388#endif
319      (gtia.w.grafm[gtia.h.vdelay_m0] & 0x03) == 0 || gtia.w.hposm0 >= 224 )
389      (m_w.grafm[m_h.vdelay_m0] & 0x03) == 0 || m_w.hposm0 >= 224 )
320390   {
321      gtia.h.grafm0 = 0;
322      gtia.h.usedm0 = 0;
391      m_h.grafm0 = 0;
392      m_h.usedm0 = 0;
323393   }
324394   else
325395   {
326      gtia.h.grafm0 = (gtia.w.grafm[gtia.h.vdelay_m0] << 6) & 0xc0;
327      gtia.h.usedm0 = (gtia.w.prior & 0x10) ? 0x08 : 0x10;
396      m_h.grafm0 = (m_w.grafm[m_h.vdelay_m0] << 6) & 0xc0;
397      m_h.usedm0 = (m_w.prior & 0x10) ? 0x08 : 0x10;
328398   }
329399}
330400
331static void recalc_m1(void)
401void gtia_device::recalc_m1()
332402{
333403   if (
334404#if CHECK_GRACTL
335      (gtia.w.gractl & GTIA_MISSILE) == 0 ||
405      (m_w.gractl & GTIA_MISSILE) == 0 ||
336406#endif
337      (gtia.w.grafm[gtia.h.vdelay_m1] & 0x0c) == 0 || gtia.w.hposm1 >= 224 )
407      (m_w.grafm[m_h.vdelay_m1] & 0x0c) == 0 || m_w.hposm1 >= 224 )
338408   {
339      gtia.h.grafm1 = 0;
340      gtia.h.usedm1 = 0;
409      m_h.grafm1 = 0;
410      m_h.usedm1 = 0;
341411   }
342412   else
343413   {
344      gtia.h.grafm1 = (gtia.w.grafm[gtia.h.vdelay_m1] << 4) & 0xc0;
345      gtia.h.usedm1 = (gtia.w.prior & 0x10) ? 0x08 : 0x20;
414      m_h.grafm1 = (m_w.grafm[m_h.vdelay_m1] << 4) & 0xc0;
415      m_h.usedm1 = (m_w.prior & 0x10) ? 0x08 : 0x20;
346416   }
347417}
348418
349static void recalc_m2(void)
419void gtia_device::recalc_m2()
350420{
351421   if (
352422#if CHECK_GRACTL
353      (gtia.w.gractl & GTIA_MISSILE) == 0 ||
423      (m_w.gractl & GTIA_MISSILE) == 0 ||
354424#endif
355      (gtia.w.grafm[gtia.h.vdelay_m2] & 0x30) == 0 || gtia.w.hposm2 >= 224 )
425      (m_w.grafm[m_h.vdelay_m2] & 0x30) == 0 || m_w.hposm2 >= 224 )
356426   {
357      gtia.h.grafm2 = 0;
358      gtia.h.usedm2 = 0;
427      m_h.grafm2 = 0;
428      m_h.usedm2 = 0;
359429   }
360430   else
361431   {
362      gtia.h.grafm2 = (gtia.w.grafm[gtia.h.vdelay_m2] << 2) & 0xc0;
363      gtia.h.usedm2 = (gtia.w.prior & 0x10) ? 0x08 : 0x40;
432      m_h.grafm2 = (m_w.grafm[m_h.vdelay_m2] << 2) & 0xc0;
433      m_h.usedm2 = (m_w.prior & 0x10) ? 0x08 : 0x40;
364434   }
365435}
366436
367static void recalc_m3(void)
437void gtia_device::recalc_m3()
368438{
369439   if (
370440#if CHECK_GRACTL
371      (gtia.w.gractl & GTIA_MISSILE) == 0 ||
441      (m_w.gractl & GTIA_MISSILE) == 0 ||
372442#endif
373      (gtia.w.grafm[gtia.h.vdelay_m3] & 0xc0) == 0 || gtia.w.hposm3 >= 224)
443      (m_w.grafm[m_h.vdelay_m3] & 0xc0) == 0 || m_w.hposm3 >= 224)
374444   {
375      gtia.h.grafm3 = 0;
376      gtia.h.usedm3 = 0;
445      m_h.grafm3 = 0;
446      m_h.usedm3 = 0;
377447   }
378448   else
379449   {
380      gtia.h.grafm3 = (gtia.w.grafm[gtia.h.vdelay_m3] << 0) & 0xc0;
381      gtia.h.usedm3 = (gtia.w.prior & 0x10) ? 0x08 : 0x80;
450      m_h.grafm3 = (m_w.grafm[m_h.vdelay_m3] << 0) & 0xc0;
451      m_h.usedm3 = (m_w.prior & 0x10) ? 0x08 : 0x80;
382452   }
383453}
384454
385455
386456
387WRITE8_MEMBER( atari_common_state::atari_gtia_w )
457WRITE8_MEMBER( gtia_device::write )
388458{
389459   /* used for mixing hue/lum of different colors */
390460//  static UINT8 lumpm0=0,lumpm1=0,lumpm2=0,lumpm3=0,lumpm4=0;
r31963r31964
398468   switch (offset & 31)
399469   {
400470   case  0:
401      gtia.w.hposp0 = data;
471      m_w.hposp0 = data;
402472      recalc_p0();
403473      break;
404474   case  1:
405      gtia.w.hposp1 = data;
475      m_w.hposp1 = data;
406476      recalc_p1();
407477      break;
408478   case  2:
409      gtia.w.hposp2 = data;
479      m_w.hposp2 = data;
410480      recalc_p2();
411481      break;
412482   case  3:
413      gtia.w.hposp3 = data;
483      m_w.hposp3 = data;
414484      recalc_p3();
415485      break;
416486
417487   case  4:
418      gtia.w.hposm0 = data;
488      m_w.hposm0 = data;
419489      recalc_m0();
420490      break;
421491   case  5:
422      gtia.w.hposm1 = data;
492      m_w.hposm1 = data;
423493      recalc_m1();
424494      break;
425495   case  6:
426      gtia.w.hposm2 = data;
496      m_w.hposm2 = data;
427497      recalc_m2();
428498      break;
429499   case  7:
430      gtia.w.hposm3 = data;
500      m_w.hposm3 = data;
431501      recalc_m3();
432502      break;
433503
434504   case  8:
435505      data &= 3;
436      gtia.w.sizep0 = data;
506      m_w.sizep0 = data;
437507      recalc_p0();
438508      break;
439509   case  9:
440510      data &= 3;
441      gtia.w.sizep1 = data;
511      m_w.sizep1 = data;
442512      recalc_p1();
443513      break;
444514   case 10:
445515      data &= 3;
446      gtia.w.sizep2 = data;
516      m_w.sizep2 = data;
447517      recalc_p2();
448518      break;
449519   case 11:
450520      data &= 3;
451      gtia.w.sizep3 = data;
521      m_w.sizep3 = data;
452522      recalc_p3();
453523      break;
454524
455525   case 12:
456526      data &= 3;
457      gtia.w.sizem = data;
527      m_w.sizem = data;
458528      recalc_m0();
459529      recalc_m1();
460530      recalc_m2();
r31963r31964
462532      break;
463533
464534   case 13:
465      gtia.w.grafp0[0] = data;
535      m_w.grafp0[0] = data;
466536      recalc_p0();
467537      break;
468538   case 14:
469      gtia.w.grafp1[0] = data;
539      m_w.grafp1[0] = data;
470540      recalc_p1();
471541      break;
472542   case 15:
473      gtia.w.grafp2[0] = data;
543      m_w.grafp2[0] = data;
474544      recalc_p2();
475545      break;
476546   case 16:
477      gtia.w.grafp3[0] = data;
547      m_w.grafp3[0] = data;
478548      recalc_p3();
479549      break;
480550
481551   case 17:
482      gtia.w.grafm[0] = data;
552      m_w.grafm[0] = data;
483553      recalc_m0();
484554      recalc_m1();
485555      recalc_m2();
r31963r31964
487557      break;
488558
489559   case 18:    /* color for player/missile #0 */
490      if (data == gtia.w.colpm0)
560      if (data == m_w.colpm0)
491561         break;
492      gtia.w.colpm0 = data;
562      m_w.colpm0 = data;
493563      if (VERBOSE)
494564         logerror("atari colpm0 $%02x\n", data);
495565
496      SETCOL_B(PL0,data);     /* set player 0 color */
497      SETCOL_B(MI0,data);     /* set missile 0 color */
498      SETCOL_B(GT2,data);     /* set GTIA mode 2 color 0 */
499      SETCOL_B(P000,data);    /* set player 0 both pixels 0 */
500      SETCOL_L(P001,data);    /* set player 0 left pixel 0 */
501      SETCOL_R(P010,data);    /* set player 0 right pixel 0 */
502      SPLIT_HUE(data,huepm0);
566      SETCOL_B(PL0, data);     /* set player 0 color */
567      SETCOL_B(MI0, data);     /* set missile 0 color */
568      SETCOL_B(GT2, data);     /* set GTIA mode 2 color 0 */
569      SETCOL_B(P000, data);    /* set player 0 both pixels 0 */
570      SETCOL_L(P001, data);    /* set player 0 left pixel 0 */
571      SETCOL_R(P010, data);    /* set player 0 right pixel 0 */
572      SPLIT_HUE(data, huepm0);
503573      data = huepm0 | lumpf1;
504      SETCOL_R(P001,data);    /* set player 0 right pixel 1 */
505      SETCOL_L(P010,data);    /* set player 0 left pixel 1 */
506      SETCOL_B(P011,data);    /* set player 0 both pixels 1 */
574      SETCOL_R(P001, data);    /* set player 0 right pixel 1 */
575      SETCOL_L(P010, data);    /* set player 0 left pixel 1 */
576      SETCOL_B(P011, data);    /* set player 0 both pixels 1 */
507577      break;
508578
509579   case 19:    /* color for player/missile #1 */
510      if (data == gtia.w.colpm1)
580      if (data == m_w.colpm1)
511581         break;
512      gtia.w.colpm1 = data;
582      m_w.colpm1 = data;
513583      if (VERBOSE)
514584         logerror("atari colpm1 $%02x\n", data);
515585
516      SETCOL_B(PL1,data);     /* set player color 1 */
517      SETCOL_B(MI1,data);     /* set missile color 1 */
518      SETCOL_B(GT2+1,data);   /* set GTIA mode 2 color 1 */
519      SETCOL_B(P100,data);    /* set player 1 both pixels 0 */
520      SETCOL_L(P101,data);    /* set player 1 left pixel 0 */
521      SETCOL_R(P110,data);    /* set player 1 right pixel 0 */
522      SPLIT_HUE(data,huepm1);
586      SETCOL_B(PL1, data);     /* set player color 1 */
587      SETCOL_B(MI1, data);     /* set missile color 1 */
588      SETCOL_B(GT2+1, data);   /* set GTIA mode 2 color 1 */
589      SETCOL_B(P100, data);    /* set player 1 both pixels 0 */
590      SETCOL_L(P101, data);    /* set player 1 left pixel 0 */
591      SETCOL_R(P110, data);    /* set player 1 right pixel 0 */
592      SPLIT_HUE(data, huepm1);
523593      data = huepm1 | lumpf1;
524      SETCOL_R(P101,data);    /* set player 1 right pixel 1 */
525      SETCOL_L(P110,data);    /* set player 1 left pixel 1 */
526      SETCOL_B(P111,data);    /* set player 1 both pixels 1 */
594      SETCOL_R(P101, data);    /* set player 1 right pixel 1 */
595      SETCOL_L(P110, data);    /* set player 1 left pixel 1 */
596      SETCOL_B(P111, data);    /* set player 1 both pixels 1 */
527597      break;
528598
529599   case 20:    /* color for player/missile #2 */
530      if (data == gtia.w.colpm2)
600      if (data == m_w.colpm2)
531601         break;
532      gtia.w.colpm2 = data;
602      m_w.colpm2 = data;
533603      if (VERBOSE)
534604         logerror("atari colpm2 $%02x\n", data);
535605
536      SETCOL_B(PL2,data);     /* set player 2 color */
537      SETCOL_B(MI2,data);     /* set missile 2 color */
538      SETCOL_B(GT2+2,data);   /* set GTIA mode 2 color 2 */
539      SETCOL_B(P200,data);    /* set player 2 both pixels 0 */
540      SETCOL_L(P201,data);    /* set player 2 left pixel 0 */
541      SETCOL_R(P210,data);    /* set player 2 right pixel 0 */
542      SPLIT_HUE(data,huepm2);
606      SETCOL_B(PL2, data);     /* set player 2 color */
607      SETCOL_B(MI2, data);     /* set missile 2 color */
608      SETCOL_B(GT2+2, data);   /* set GTIA mode 2 color 2 */
609      SETCOL_B(P200, data);    /* set player 2 both pixels 0 */
610      SETCOL_L(P201, data);    /* set player 2 left pixel 0 */
611      SETCOL_R(P210, data);    /* set player 2 right pixel 0 */
612      SPLIT_HUE(data, huepm2);
543613      data = huepm2 | lumpf1;
544      SETCOL_R(P201,data);    /* set player 2 right pixel 1 */
545      SETCOL_L(P210,data);    /* set player 2 left pixel 1 */
546      SETCOL_B(P211,data);    /* set player 2 both pixels 1 */
614      SETCOL_R(P201, data);    /* set player 2 right pixel 1 */
615      SETCOL_L(P210, data);    /* set player 2 left pixel 1 */
616      SETCOL_B(P211, data);    /* set player 2 both pixels 1 */
547617      break;
548618
549619   case 21:    /* color for player/missile #3 */
550      if (data == gtia.w.colpm3)
620      if (data == m_w.colpm3)
551621         break;
552      gtia.w.colpm3 = data;
622      m_w.colpm3 = data;
553623      if (VERBOSE)
554624         logerror("atari colpm3 $%02x\n", data);
555625
556      SETCOL_B(PL3,data);     /* set player 3 color */
557      SETCOL_B(MI3,data);     /* set missile 3 color */
558      SETCOL_B(GT2+3,data);   /* set GTIA mode 2 color 3 */
559      SETCOL_B(P300,data);    /* set player 3 both pixels 0 */
560      SETCOL_L(P301,data);    /* set player 3 left pixel 0 */
561      SETCOL_R(P310,data);    /* set player 3 right pixel 0 */
562      SPLIT_HUE(data,huepm3);
626      SETCOL_B(PL3, data);     /* set player 3 color */
627      SETCOL_B(MI3, data);     /* set missile 3 color */
628      SETCOL_B(GT2+3, data);   /* set GTIA mode 2 color 3 */
629      SETCOL_B(P300, data);    /* set player 3 both pixels 0 */
630      SETCOL_L(P301, data);    /* set player 3 left pixel 0 */
631      SETCOL_R(P310, data);    /* set player 3 right pixel 0 */
632      SPLIT_HUE(data, huepm3);
563633      data = huepm3 | lumpf1;
564      SETCOL_R(P301,data);    /* set player 3 right pixel 1 */
565      SETCOL_L(P310,data);    /* set player 3 left pixel 1 */
566      SETCOL_B(P311,data);    /* set player 3 both pixels 1 */
634      SETCOL_R(P301, data);    /* set player 3 right pixel 1 */
635      SETCOL_L(P310, data);    /* set player 3 left pixel 1 */
636      SETCOL_B(P311, data);    /* set player 3 both pixels 1 */
567637      break;
568638
569639   case 22:    /* playfield color #0 */
570      if (data == gtia.w.colpf0)
640      if (data == m_w.colpf0)
571641         break;
572      gtia.w.colpf0 = data;
642      m_w.colpf0 = data;
573643      if (VERBOSE)
574644         logerror("atari colpf0 $%02x\n", data);
575645
576      SETCOL_B(PF0,data);     /* set playfield 0 color */
577      SETCOL_B(GT2+4,data);   /* set GTIA mode 2 color 4 */
646      SETCOL_B(PF0, data);     /* set playfield 0 color */
647      SETCOL_B(GT2+4, data);   /* set GTIA mode 2 color 4 */
578648      break;
579649
580650   case 23:    /* playfield color #1 */
581      if (data == gtia.w.colpf1)
651      if (data == m_w.colpf1)
582652         break;
583      gtia.w.colpf1 = data;
653      m_w.colpf1 = data;
584654      if (VERBOSE)
585655         logerror("atari colpf1 $%02x\n", data);
586656
587      SETCOL_B(PF1,data);     /* set playfield 1 color */
588      SETCOL_B(GT2+5,data);   /* set GTIA mode 2 color 5 */
589      SPLIT_LUM(data,lumpf1);
657      SETCOL_B(PF1, data);     /* set playfield 1 color */
658      SETCOL_B(GT2+5, data);   /* set GTIA mode 2 color 5 */
659      SPLIT_LUM(data, lumpf1);
590660      data = huepf2 | lumpf1;
591      SETCOL_R(T01,data);     /* set text mode right pixel 1 */
592      SETCOL_L(T10,data);     /* set text mode left pixel 1 */
593      SETCOL_B(T11,data);     /* set text mode both pixels 1 */
661      SETCOL_R(T01, data);     /* set text mode right pixel 1 */
662      SETCOL_L(T10, data);     /* set text mode left pixel 1 */
663      SETCOL_B(T11, data);     /* set text mode both pixels 1 */
594664      data = huebk | lumpf1;
595      SETCOL_R(G01,data);     /* set graphics mode right pixel 1 */
596      SETCOL_L(G10,data);     /* set graphics mode left pixel 1 */
597      SETCOL_B(G11,data);     /* set graphics mode both pixels 1 */
665      SETCOL_R(G01, data);     /* set graphics mode right pixel 1 */
666      SETCOL_L(G10, data);     /* set graphics mode left pixel 1 */
667      SETCOL_B(G11, data);     /* set graphics mode both pixels 1 */
598668      data = huepm0 | lumpf1;
599      SETCOL_R(P001,data);    /* set player 0 right pixel 1 */
600      SETCOL_L(P010,data);    /* set player 0 left pixel 1 */
601      SETCOL_B(P011,data);    /* set player 0 both pixels 1 */
669      SETCOL_R(P001, data);    /* set player 0 right pixel 1 */
670      SETCOL_L(P010, data);    /* set player 0 left pixel 1 */
671      SETCOL_B(P011, data);    /* set player 0 both pixels 1 */
602672      data = huepm1 | lumpf1;
603      SETCOL_R(P101,data);    /* set player 1 right pixel 1 */
604      SETCOL_L(P110,data);    /* set player 1 left pixel 1 */
605      SETCOL_B(P111,data);    /* set player 1 both pixels 1 */
673      SETCOL_R(P101, data);    /* set player 1 right pixel 1 */
674      SETCOL_L(P110, data);    /* set player 1 left pixel 1 */
675      SETCOL_B(P111, data);    /* set player 1 both pixels 1 */
606676      data = huepm2 | lumpf1;
607      SETCOL_R(P201,data);    /* set player 2 right pixel 1 */
608      SETCOL_L(P210,data);    /* set player 2 left pixel 1 */
609      SETCOL_B(P211,data);    /* set player 2 both pixels 1 */
677      SETCOL_R(P201, data);    /* set player 2 right pixel 1 */
678      SETCOL_L(P210, data);    /* set player 2 left pixel 1 */
679      SETCOL_B(P211, data);    /* set player 2 both pixels 1 */
610680      data = huepm3 | lumpf1;
611      SETCOL_R(P301,data);    /* set player 3 right pixel 1 */
612      SETCOL_L(P310,data);    /* set player 3 left pixel 1 */
613      SETCOL_B(P311,data);    /* set player 3 both pixels 1 */
681      SETCOL_R(P301, data);    /* set player 3 right pixel 1 */
682      SETCOL_L(P310, data);    /* set player 3 left pixel 1 */
683      SETCOL_B(P311, data);    /* set player 3 both pixels 1 */
614684      data = huepm4 | lumpf1;
615      SETCOL_R(P401,data);    /* set missiles right pixel 1 */
616      SETCOL_L(P410,data);    /* set missiles left pixel 1 */
617      SETCOL_B(P411,data);    /* set missiles both pixels 1 */
685      SETCOL_R(P401, data);    /* set missiles right pixel 1 */
686      SETCOL_L(P410, data);    /* set missiles left pixel 1 */
687      SETCOL_B(P411, data);    /* set missiles both pixels 1 */
618688      break;
619689
620690   case 24:    /* playfield color #2 */
621      if (data == gtia.w.colpf2)
691      if (data == m_w.colpf2)
622692         break;
623      gtia.w.colpf2 = data;
693      m_w.colpf2 = data;
624694      if (VERBOSE)
625695         logerror("atari colpf2 $%02x\n", data);
626696
627      SETCOL_B(PF2,data);     /* set playfield color 2 */
628      SETCOL_B(GT2+6,data);   /* set GTIA mode 2 color 6 */
629      SETCOL_B(T00,data);     /* set text mode both pixels 0 */
630      SETCOL_L(T01,data);     /* set text mode left pixel 0 */
631      SETCOL_R(T10,data);     /* set text mode right pixel 0 */
632      SPLIT_HUE(data,huepf2);
697      SETCOL_B(PF2, data);     /* set playfield color 2 */
698      SETCOL_B(GT2+6, data);   /* set GTIA mode 2 color 6 */
699      SETCOL_B(T00, data);     /* set text mode both pixels 0 */
700      SETCOL_L(T01, data);     /* set text mode left pixel 0 */
701      SETCOL_R(T10, data);     /* set text mode right pixel 0 */
702      SPLIT_HUE(data, huepf2);
633703      data = huepf2 | lumpf1;
634      SETCOL_R(T01,data);     /* set text mode right pixel 1 */
635      SETCOL_L(T10,data);     /* set text mode left pixel 1 */
636      SETCOL_B(T11,data);     /* set text mode both pixels 1 */
704      SETCOL_R(T01, data);     /* set text mode right pixel 1 */
705      SETCOL_L(T10, data);     /* set text mode left pixel 1 */
706      SETCOL_B(T11, data);     /* set text mode both pixels 1 */
637707      break;
638708
639709   case 25:    /* playfield color #3 */
640      if (data == gtia.w.colpf3)
710      if (data == m_w.colpf3)
641711         break;
642      gtia.w.colpf3 = data;
712      m_w.colpf3 = data;
643713      if (VERBOSE)
644714         logerror("atari colpf3 $%02x\n", data);
645715
646      SETCOL_B(PF3,data);     /* set playfield color 3 */
647      SETCOL_B(GT2+7,data);   /* set GTIA mode 2 color 7 */
648      SETCOL_B(P400,data);    /* set p/m xor mode both pixels 0 */
649      SETCOL_L(P401,data);    /* set p/m xor mode left pixel 0 */
650      SETCOL_R(P410,data);    /* set p/m xor mode right pixel 0 */
651      SPLIT_HUE(data,huepm4);
716      SETCOL_B(PF3, data);     /* set playfield color 3 */
717      SETCOL_B(GT2+7, data);   /* set GTIA mode 2 color 7 */
718      SETCOL_B(P400, data);    /* set p/m xor mode both pixels 0 */
719      SETCOL_L(P401, data);    /* set p/m xor mode left pixel 0 */
720      SETCOL_R(P410, data);    /* set p/m xor mode right pixel 0 */
721      SPLIT_HUE(data, huepm4);
652722      data = huepm4 | lumpf1;
653      SETCOL_R(P401,data);    /* set p/m xor mode right pixel 1 */
654      SETCOL_L(P410,data);    /* set p/m xor mode left pixel 1 */
655      SETCOL_B(P411,data);    /* set p/m xor mode both pixels 1 */
723      SETCOL_R(P401, data);    /* set p/m xor mode right pixel 1 */
724      SETCOL_L(P410, data);    /* set p/m xor mode left pixel 1 */
725      SETCOL_B(P411, data);    /* set p/m xor mode both pixels 1 */
656726      break;
657727
658728   case 26:    /* playfield background */
659      if (data == gtia.w.colbk)
729      if (data == m_w.colbk)
660730         break;
661      gtia.w.colbk = data;
731      m_w.colbk = data;
662732      if (VERBOSE)
663733         logerror("atari colbk  $%02x\n", data);
664734
665      SETCOL_B(PBK,data);     /* set background color */
666      SETCOL_B(GT2+8,data);   /* set GTIA mode 2 color 8 */
667      SETCOL_B(GT2+9,data);   /* set GTIA mode 2 color 9 */
668      SETCOL_B(GT2+10,data);  /* set GTIA mode 2 color 10 */
669      SETCOL_B(GT2+11,data);  /* set GTIA mode 2 color 11 */
670      SETCOL_B(GT2+12,data);  /* set GTIA mode 2 color 12 */
671      SETCOL_B(GT2+13,data);  /* set GTIA mode 2 color 13 */
672      SETCOL_B(GT2+14,data);  /* set GTIA mode 2 color 14 */
673      SETCOL_B(GT2+15,data);  /* set GTIA mode 2 color 15 */
674      SETCOL_B(G00,data);     /* set 2 color graphics both pixels 0 */
675      SETCOL_L(G01,data);     /* set 2 color graphics left pixel 0 */
676      SETCOL_R(G10,data);     /* set 2 color graphics right pixel 0 */
677      SPLIT_HUE(data,huebk);
735      SETCOL_B(PBK, data);     /* set background color */
736      SETCOL_B(GT2+8, data);   /* set GTIA mode 2 color 8 */
737      SETCOL_B(GT2+9, data);   /* set GTIA mode 2 color 9 */
738      SETCOL_B(GT2+10, data);  /* set GTIA mode 2 color 10 */
739      SETCOL_B(GT2+11, data);  /* set GTIA mode 2 color 11 */
740      SETCOL_B(GT2+12, data);  /* set GTIA mode 2 color 12 */
741      SETCOL_B(GT2+13, data);  /* set GTIA mode 2 color 13 */
742      SETCOL_B(GT2+14, data);  /* set GTIA mode 2 color 14 */
743      SETCOL_B(GT2+15, data);  /* set GTIA mode 2 color 15 */
744      SETCOL_B(G00, data);     /* set 2 color graphics both pixels 0 */
745      SETCOL_L(G01, data);     /* set 2 color graphics left pixel 0 */
746      SETCOL_R(G10, data);     /* set 2 color graphics right pixel 0 */
747      SPLIT_HUE(data, huebk);
678748      data = huebk | lumpf1;
679      SETCOL_R(G01,data);     /* set 2 color graphics right pixel 1 */
680      SETCOL_L(G10,data);     /* set 2 color graphics left pixel 1 */
681      SETCOL_B(G11,data);     /* set 2 color graphics both pixels 1 */
682      SETCOL_B(GT1+ 0,(data&HUE)+(0x00&LUM));   /* set GTIA mode 1 HUE + LUM 0..15 */
683      SETCOL_B(GT1+ 1,(data&HUE)+(0x11&LUM));
684      SETCOL_B(GT1+ 2,(data&HUE)+(0x22&LUM));
685      SETCOL_B(GT1+ 3,(data&HUE)+(0x33&LUM));
686      SETCOL_B(GT1+ 4,(data&HUE)+(0x44&LUM));
687      SETCOL_B(GT1+ 5,(data&HUE)+(0x55&LUM));
688      SETCOL_B(GT1+ 6,(data&HUE)+(0x66&LUM));
689      SETCOL_B(GT1+ 7,(data&HUE)+(0x77&LUM));
690      SETCOL_B(GT1+ 8,(data&HUE)+(0x88&LUM));
691      SETCOL_B(GT1+ 9,(data&HUE)+(0x99&LUM));
692      SETCOL_B(GT1+10,(data&HUE)+(0xaa&LUM));
693      SETCOL_B(GT1+11,(data&HUE)+(0xbb&LUM));
694      SETCOL_B(GT1+12,(data&HUE)+(0xcc&LUM));
695      SETCOL_B(GT1+13,(data&HUE)+(0xdd&LUM));
696      SETCOL_B(GT1+14,(data&HUE)+(0xee&LUM));
697      SETCOL_B(GT1+15,(data&HUE)+(0xff&LUM));
698      SETCOL_B(GT3+ 0,(data&LUM)+(0x00&HUE));   /* set GTIA mode 3 LUM + HUE 0..15 */
699      SETCOL_B(GT3+ 1,(data&LUM)+(0x11&HUE));
700      SETCOL_B(GT3+ 2,(data&LUM)+(0x22&HUE));
701      SETCOL_B(GT3+ 3,(data&LUM)+(0x33&HUE));
702      SETCOL_B(GT3+ 4,(data&LUM)+(0x44&HUE));
703      SETCOL_B(GT3+ 5,(data&LUM)+(0x55&HUE));
704      SETCOL_B(GT3+ 6,(data&LUM)+(0x66&HUE));
705      SETCOL_B(GT3+ 7,(data&LUM)+(0x77&HUE));
706      SETCOL_B(GT3+ 8,(data&LUM)+(0x88&HUE));
707      SETCOL_B(GT3+ 9,(data&LUM)+(0x99&HUE));
708      SETCOL_B(GT3+10,(data&LUM)+(0xaa&HUE));
709      SETCOL_B(GT3+11,(data&LUM)+(0xbb&HUE));
710      SETCOL_B(GT3+12,(data&LUM)+(0xcc&HUE));
711      SETCOL_B(GT3+13,(data&LUM)+(0xdd&HUE));
712      SETCOL_B(GT3+14,(data&LUM)+(0xee&HUE));
713      SETCOL_B(GT3+15,(data&LUM)+(0xff&HUE));
749      SETCOL_R(G01, data);     /* set 2 color graphics right pixel 1 */
750      SETCOL_L(G10, data);     /* set 2 color graphics left pixel 1 */
751      SETCOL_B(G11, data);     /* set 2 color graphics both pixels 1 */
752      SETCOL_B(GT1+ 0, (data & HUE) + (0x00 & LUM));   /* set GTIA mode 1 HUE + LUM 0..15 */
753      SETCOL_B(GT1+ 1, (data & HUE) + (0x11 & LUM));
754      SETCOL_B(GT1+ 2, (data & HUE) + (0x22 & LUM));
755      SETCOL_B(GT1+ 3, (data & HUE) + (0x33 & LUM));
756      SETCOL_B(GT1+ 4, (data & HUE) + (0x44 & LUM));
757      SETCOL_B(GT1+ 5, (data & HUE) + (0x55 & LUM));
758      SETCOL_B(GT1+ 6, (data & HUE) + (0x66 & LUM));
759      SETCOL_B(GT1+ 7, (data & HUE) + (0x77 & LUM));
760      SETCOL_B(GT1+ 8, (data & HUE) + (0x88 & LUM));
761      SETCOL_B(GT1+ 9, (data & HUE) + (0x99 & LUM));
762      SETCOL_B(GT1+10, (data & HUE) + (0xaa & LUM));
763      SETCOL_B(GT1+11, (data & HUE) + (0xbb & LUM));
764      SETCOL_B(GT1+12, (data & HUE) + (0xcc & LUM));
765      SETCOL_B(GT1+13, (data & HUE) + (0xdd & LUM));
766      SETCOL_B(GT1+14, (data & HUE) + (0xee & LUM));
767      SETCOL_B(GT1+15, (data & HUE) + (0xff & LUM));
768      SETCOL_B(GT3+ 0, (data & LUM) + (0x00 & HUE));   /* set GTIA mode 3 LUM + HUE 0..15 */
769      SETCOL_B(GT3+ 1, (data & LUM) + (0x11 & HUE));
770      SETCOL_B(GT3+ 2, (data & LUM) + (0x22 & HUE));
771      SETCOL_B(GT3+ 3, (data & LUM) + (0x33 & HUE));
772      SETCOL_B(GT3+ 4, (data & LUM) + (0x44 & HUE));
773      SETCOL_B(GT3+ 5, (data & LUM) + (0x55 & HUE));
774      SETCOL_B(GT3+ 6, (data & LUM) + (0x66 & HUE));
775      SETCOL_B(GT3+ 7, (data & LUM) + (0x77 & HUE));
776      SETCOL_B(GT3+ 8, (data & LUM) + (0x88 & HUE));
777      SETCOL_B(GT3+ 9, (data & LUM) + (0x99 & HUE));
778      SETCOL_B(GT3+10, (data & LUM) + (0xaa & HUE));
779      SETCOL_B(GT3+11, (data & LUM) + (0xbb & HUE));
780      SETCOL_B(GT3+12, (data & LUM) + (0xcc & HUE));
781      SETCOL_B(GT3+13, (data & LUM) + (0xdd & HUE));
782      SETCOL_B(GT3+14, (data & LUM) + (0xee & HUE));
783      SETCOL_B(GT3+15, (data & LUM) + (0xff & HUE));
714784      break;
715785
716786   case 27:
717      gtia.w.prior = data;
787      m_w.prior = data;
718788      recalc_m0();
719789      recalc_m1();
720790      recalc_m2();
r31963r31964
722792      break;
723793
724794   case 28:    /* delay until vertical retrace */
725      gtia.w.vdelay = data;
726      gtia.h.vdelay_m0 = (data >> 0) & 1;
727      gtia.h.vdelay_m1 = (data >> 1) & 1;
728      gtia.h.vdelay_m2 = (data >> 2) & 1;
729      gtia.h.vdelay_m3 = (data >> 3) & 1;
730      gtia.h.vdelay_p0 = (data >> 4) & 1;
731      gtia.h.vdelay_p1 = (data >> 5) & 1;
732      gtia.h.vdelay_p2 = (data >> 6) & 1;
733      gtia.h.vdelay_p3 = (data >> 7) & 1;
795      m_w.vdelay = data;
796      m_h.vdelay_m0 = (data >> 0) & 1;
797      m_h.vdelay_m1 = (data >> 1) & 1;
798      m_h.vdelay_m2 = (data >> 2) & 1;
799      m_h.vdelay_m3 = (data >> 3) & 1;
800      m_h.vdelay_p0 = (data >> 4) & 1;
801      m_h.vdelay_p1 = (data >> 5) & 1;
802      m_h.vdelay_p2 = (data >> 6) & 1;
803      m_h.vdelay_p3 = (data >> 7) & 1;
734804      break;
735805
736806   case 29:
737      gtia.w.gractl = data;
807      m_w.gractl = data;
738808      recalc_p0();
739809      recalc_p1();
740810      recalc_p2();
r31963r31964
746816      break;
747817
748818      case 30:    /* clear collisions */
749      gtia.r.m0pf = gtia.r.m1pf = gtia.r.m2pf = gtia.r.m3pf =
750      gtia.r.p0pf = gtia.r.p1pf = gtia.r.p2pf = gtia.r.p3pf =
751      gtia.r.m0pl = gtia.r.m1pl = gtia.r.m2pl = gtia.r.m3pl =
752      gtia.r.p0pl = gtia.r.p1pl = gtia.r.p2pl = gtia.r.p3pl = 0;
753      gtia.w.hitclr = data;
819      m_r.m0pf = m_r.m1pf = m_r.m2pf = m_r.m3pf =
820      m_r.p0pf = m_r.p1pf = m_r.p2pf = m_r.p3pf =
821      m_r.m0pl = m_r.m1pl = m_r.m2pl = m_r.m3pl =
822      m_r.p0pl = m_r.p1pl = m_r.p2pl = m_r.p3pl = 0;
823      m_w.hitclr = data;
754824      break;
755825
756826   case 31:    /* write console (speaker) */
757      if (data == gtia.w.cons)
827      if (data == m_w.cons)
758828         break;
759      gtia.w.cons  = data;
760      if (gtia.intf.console_write)
761         gtia.intf.console_write(space, gtia.w.cons);
829      m_w.cons  = data;
830      if (!m_write_cb.isnull())
831         m_write_cb((offs_t)0, m_w.cons);
762832      break;
763833   }
764834}
765835
766836
767837
768static void gtia_state_postload(running_machine &machine)
838void gtia_device::gtia_postload()
769839{
770840   recalc_p0();
771841   recalc_p1();
r31963r31964
818888/*     */   0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000
819889};
820890
821static inline void player_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst)
891inline void gtia_device::player_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst)
822892{
823893   // size is the number of bits in *dst to be filled: 1, 2 or 4
824894   if (size == 3)
r31963r31964
829899            dst[i * size + s] |= color;
830900}
831901
832static inline void missile_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst)
902inline void gtia_device::missile_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst)
833903{
834904   // size is the number of bits in *dst to be filled: 1, 2 or 4
835905   if (size == 3)
r31963r31964
841911}
842912
843913
844void gtia_render(UINT8 *src, UINT8 *dst, UINT8 *prio, UINT8 *pmbits)
914void gtia_device::render(UINT8 *src, UINT8 *dst, UINT8 *prio, UINT8 *pmbits)
845915{
846   if (gtia.h.grafp0)
847      player_render(gtia.h.grafp0, gtia.w.sizep0 + 1, P0, &pmbits[gtia.w.hposp0]);
848   if (gtia.h.grafp1)
849      player_render(gtia.h.grafp1, gtia.w.sizep1 + 1, P1, &pmbits[gtia.w.hposp1]);
850   if (gtia.h.grafp2)
851      player_render(gtia.h.grafp2, gtia.w.sizep2 + 1, P2, &pmbits[gtia.w.hposp2]);
852   if (gtia.h.grafp3)
853      player_render(gtia.h.grafp3, gtia.w.sizep3 + 1, P3, &pmbits[gtia.w.hposp3]);
916   if (m_h.grafp0)
917      player_render(m_h.grafp0, m_w.sizep0 + 1, GTIA_P0, &pmbits[m_w.hposp0]);
918   if (m_h.grafp1)
919      player_render(m_h.grafp1, m_w.sizep1 + 1, GTIA_P1, &pmbits[m_w.hposp1]);
920   if (m_h.grafp2)
921      player_render(m_h.grafp2, m_w.sizep2 + 1, GTIA_P2, &pmbits[m_w.hposp2]);
922   if (m_h.grafp3)
923      player_render(m_h.grafp3, m_w.sizep3 + 1, GTIA_P3, &pmbits[m_w.hposp3]);
854924   
855   if (gtia.h.grafm0)
856      missile_render(gtia.h.grafm0, gtia.w.sizem + 1, M0, &pmbits[gtia.w.hposm0]);
857   if (gtia.h.grafm1)
858      missile_render(gtia.h.grafm1, gtia.w.sizem + 1, M1, &pmbits[gtia.w.hposm1]);
859   if (gtia.h.grafm2)
860      missile_render(gtia.h.grafm2, gtia.w.sizem + 1, M2, &pmbits[gtia.w.hposm2]);
861   if (gtia.h.grafm3)
862      missile_render(gtia.h.grafm3, gtia.w.sizem + 1, M3, &pmbits[gtia.w.hposm3]);
925   if (m_h.grafm0)
926      missile_render(m_h.grafm0, m_w.sizem + 1, GTIA_M0, &pmbits[m_w.hposm0]);
927   if (m_h.grafm1)
928      missile_render(m_h.grafm1, m_w.sizem + 1, GTIA_M1, &pmbits[m_w.hposm1]);
929   if (m_h.grafm2)
930      missile_render(m_h.grafm2, m_w.sizem + 1, GTIA_M2, &pmbits[m_w.hposm2]);
931   if (m_h.grafm3)
932      missile_render(m_h.grafm3, m_w.sizem + 1, GTIA_M3, &pmbits[m_w.hposm3]);
863933
864   for (int x = 0; x < HWIDTH * 4; x++, src++, dst++)
934   for (int x = 0; x < GTIA_HWIDTH * 4; x++, src++, dst++)
865935   {
866936      UINT8 pm, pc, pf;
867937      if (!*src)
r31963r31964
872942      /* get the current playfield color */
873943      pc = *dst;
874944      pf = pf_collision[pc];
875      if (pm&P0) { gtia.r.p0pf |= pf; gtia.r.p0pl |= pm&(   P1|P2|P3); }
876      if (pm&P1) { gtia.r.p1pf |= pf; gtia.r.p1pl |= pm&(P0|   P2|P3); }
877      if (pm&P2) { gtia.r.p2pf |= pf; gtia.r.p2pl |= pm&(P0|P1|   P3); }
878      if (pm&P3) { gtia.r.p3pf |= pf; gtia.r.p3pl |= pm&(P0|P1|P2   ); }
879      if (pm&M0) { gtia.r.m0pf |= pf; gtia.r.m0pl |= pm&(P0|P1|P2|P3); }
880      if (pm&M1) { gtia.r.m1pf |= pf; gtia.r.m1pl |= pm&(P0|P1|P2|P3); }
881      if (pm&M2) { gtia.r.m2pf |= pf; gtia.r.m2pl |= pm&(P0|P1|P2|P3); }
882      if (pm&M3) { gtia.r.m3pf |= pf; gtia.r.m3pl |= pm&(P0|P1|P2|P3); }
945      if (pm & GTIA_P0) { m_r.p0pf |= pf; m_r.p0pl |= pm & (          GTIA_P1 | GTIA_P2 | GTIA_P3); }
946      if (pm & GTIA_P1) { m_r.p1pf |= pf; m_r.p1pl |= pm & (GTIA_P0 |           GTIA_P2 | GTIA_P3); }
947      if (pm & GTIA_P2) { m_r.p2pf |= pf; m_r.p2pl |= pm & (GTIA_P0 | GTIA_P1 |           GTIA_P3); }
948      if (pm & GTIA_P3) { m_r.p3pf |= pf; m_r.p3pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2          ); }
949      if (pm & GTIA_M0) { m_r.m0pf |= pf; m_r.m0pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); }
950      if (pm & GTIA_M1) { m_r.m1pf |= pf; m_r.m1pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); }
951      if (pm & GTIA_M2) { m_r.m2pf |= pf; m_r.m2pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); }
952      if (pm & GTIA_M3) { m_r.m3pf |= pf; m_r.m3pl |= pm & (GTIA_P0 | GTIA_P1 | GTIA_P2 | GTIA_P3); }
883953      /* color with higher priority? change playfield */
884954      pc = prio[pf_prioindex[pc] | pm];
885955      if (pc) *dst = pc;
886956   }
887957   /* copy player/missile graphics in case of vdelay */
888   gtia.w.grafp0[1] = gtia.w.grafp0[0];
889   gtia.w.grafp1[1] = gtia.w.grafp1[0];
890   gtia.w.grafp2[1] = gtia.w.grafp2[0];
891   gtia.w.grafp3[1] = gtia.w.grafp3[0];
892   gtia.w.grafm[1] = gtia.w.grafm[0];
958   m_w.grafp0[1] = m_w.grafp0[0];
959   m_w.grafp1[1] = m_w.grafp1[0];
960   m_w.grafp2[1] = m_w.grafp2[0];
961   m_w.grafp3[1] = m_w.grafp3[0];
962   m_w.grafm[1] = m_w.grafm[0];
893963}
trunk/src/mame/video/gtia.h
r31963r31964
1111#ifndef __GTIA_H__
1212#define __GTIA_H__
1313
14#include "includes/atari.h"
14#include "emu.h"
1515
16struct gtia_interface
17{
18   UINT8 (*console_read)(address_space &space);
19   void (*console_write)(address_space &space, UINT8 data);
20};
2116
22
23
24
2517/* reading registers */
2618struct gtia_readregs
2719{
r31963r31964
121113   UINT8   vdelay_p3;  /* vertical delay for player 3 */
122114};
123115
124struct gtia_struct
125{
126   gtia_interface intf;
127   gtia_readregs   r;          /* read registers */
128   gtia_writeregs  w;          /* write registers */
129   gtia_helpervars h;          /* helper variables */
116#define MCFG_GTIA_READ_CB(_devcb) \
117   devcb = &gtia_device::set_read_callback(*device, DEVCB_##_devcb);
130118
131   UINT16  color_lookup[256];  /* color lookup table */
132};
119#define MCFG_GTIA_WRITE_CB(_devcb) \
120   devcb = &gtia_device::set_write_callback(*device, DEVCB_##_devcb);
133121
134122
123// ======================> gtia_device
135124
136extern gtia_struct gtia;
125class gtia_device :  public device_t
126{
127public:
128   // construction/destruction
129   gtia_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
130   
131   template<class _Object> static devcb_base &set_read_callback(device_t &device, _Object object) { return downcast<gtia_device &>(device).m_read_cb.set_callback(object); }
132   template<class _Object> static devcb_base &set_write_callback(device_t &device, _Object object) { return downcast<gtia_device &>(device).m_write_cb.set_callback(object); }
133   
134   DECLARE_READ8_MEMBER( read );
135   DECLARE_WRITE8_MEMBER( write );
137136
138void gtia_init(running_machine &machine, const gtia_interface *intf);
137   UINT16 *get_color_lookup() { return m_color_lookup; }
138   void set_color_lookup(int i, UINT16 data) { m_color_lookup[i] = data; }
139139
140void gtia_render(UINT8 *src, UINT8 *dst, UINT8 *prio, UINT8 *pmbits);
140   UINT8 get_w_colbk() { return m_w.colbk; }
141   UINT8 get_w_colpf1() { return m_w.colpf1; }
142   UINT8 get_w_colpf2() { return m_w.colpf2; }
143   UINT8 get_w_prior() { return m_w.prior; }
144   void count_hitclr_frames() { m_h.hitclr_frames++; }
145   void button_interrupt(int button_count, UINT8 button_port);
146   
147   void render(UINT8 *src, UINT8 *dst, UINT8 *pmbits, UINT8 *prio);
148   
149protected:
150   // device-level overrides
151   virtual void device_start();
152   virtual void device_reset();
153   
154   void gtia_postload();
155   
156   int is_ntsc();
157   void recalc_p0();
158   void recalc_p1();
159   void recalc_p2();
160   void recalc_p3();
161   void recalc_m0();
162   void recalc_m1();
163   void recalc_m2();
164   void recalc_m3();
165   
166   void player_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst);
167   void missile_render(UINT8 gfx, int size, UINT8 color, UINT8 *dst);
168   
169private:
170   gtia_readregs   m_r;          /* read registers */
171   gtia_writeregs  m_w;          /* write registers */
172   gtia_helpervars m_h;          /* helper variables */
173   
174   UINT8 m_lumpf1;
175   UINT8 m_huepm0, m_huepm1, m_huepm2, m_huepm3, m_huepm4;
176   UINT8 m_huepf2, m_huebk;
177   
178   UINT16 m_color_lookup[256];  /* color lookup table */   // probably better fit to ANTIC, but it remains here for the moment...
179   
180   devcb_read8 m_read_cb;
181   devcb_write8 m_write_cb;
182};
141183
184
185// device type definition
186extern const device_type ATARI_GTIA;
187
142188#endif /* __GTIA_H__ */
trunk/src/mess/drivers/atari400.c
r31963r31964
263263
264264   DECLARE_MACHINE_RESET(a400);
265265
266   DECLARE_WRITE8_MEMBER(gtia_write);
267
266268   DECLARE_WRITE8_MEMBER(a600xl_pia_pb_w);
267269   DECLARE_WRITE8_MEMBER(a800xl_pia_pb_w);
268270   
r31963r31964
529531static ADDRESS_MAP_START(a400_mem, AS_PROGRAM, 8, a400_state)
530532   AM_RANGE(0x0000, 0xbfff) AM_NOP // RAM installed at runtime
531533   AM_RANGE(0xc000, 0xcfff) AM_ROM
532   AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
534   AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
533535   AM_RANGE(0xd100, 0xd1ff) AM_NOP
534536   AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
535537   AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
r31963r31964
544546   AM_RANGE(0x5000, 0x57ff) AM_READ(a600xl_low_r)    // self test or NOP
545547   AM_RANGE(0xa000, 0xbfff) AM_ROM // BASIC
546548   AM_RANGE(0xc000, 0xcfff) AM_ROM // OS
547   AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
549   AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
548550   AM_RANGE(0xd100, 0xd1ff) AM_NOP
549551   AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
550552   AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
r31963r31964
556558
557559static ADDRESS_MAP_START(a1200xl_mem, AS_PROGRAM, 8, a400_state)
558560   AM_RANGE(0x0000, 0xcfff) AM_READWRITE(a1200xl_low_r, xegs_low_w)
559   AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
561   AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
560562   AM_RANGE(0xd100, 0xd1ff) AM_NOP
561563   AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
562564   AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
r31963r31964
568570
569571static ADDRESS_MAP_START(a800xl_mem, AS_PROGRAM, 8, a400_state)
570572   AM_RANGE(0x0000, 0xcfff) AM_READWRITE(a800xl_low_r, a800xl_low_w)
571   AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
573   AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
572574   AM_RANGE(0xd100, 0xd1ff) AM_NOP
573575   AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
574576   AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
r31963r31964
580582
581583static ADDRESS_MAP_START(a130xe_mem, AS_PROGRAM, 8, a400_state)
582584   AM_RANGE(0x0000, 0xcfff) AM_READWRITE(a130xe_low_r, a800xl_low_w)
583   AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
585   AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
584586   AM_RANGE(0xd100, 0xd1ff) AM_NOP
585587   AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
586588   AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
r31963r31964
592594
593595static ADDRESS_MAP_START(xegs_mem, AS_PROGRAM, 8, a400_state)
594596   AM_RANGE(0x0000, 0xcfff) AM_READWRITE(xegs_low_r, xegs_low_w)
595   AM_RANGE(0xd000, 0xd0ff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
597   AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
596598   AM_RANGE(0xd100, 0xd1ff) AM_NOP
597599   AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
598600   AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
r31963r31964
605607static ADDRESS_MAP_START(a5200_mem, AS_PROGRAM, 8, a400_state)
606608   AM_RANGE(0x0000, 0x3fff) AM_RAM
607609   AM_RANGE(0x4000, 0xbfff) AM_NOP // ROM installed at machine start
608   AM_RANGE(0xc000, 0xcfff) AM_READWRITE(atari_gtia_r, atari_gtia_w)
610   AM_RANGE(0xc000, 0xcfff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
609611   AM_RANGE(0xd400, 0xdfff) AM_READWRITE(atari_antic_r, atari_antic_w)
610612   // 0xe000-0xe7ff - Expansion?
611613   AM_RANGE(0xe800, 0xefff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
r31963r31964
19281930   }   
19291931}
19301932
1931static UINT8 console_read(address_space &space)
1932{
1933   return space.machine().root_device().ioport("console")->read();
1934}
19351933
1936static void console_write(address_space &space, UINT8 data)
1937{
1938   dac_device *dac = space.machine().device<dac_device>("dac");
1939   if (data & 0x08)
1940      dac->write_unsigned8((UINT8)-120);
1941   else
1942      dac->write_unsigned8(+120);
1943}
1944
1945
19461934void a400_state::common_start()
19471935{   
1948   /* GTIA */
1949   gtia_interface gtia_intf;
1950   gtia_intf.console_read = console_read;
1951   gtia_intf.console_write = console_write;
1952   gtia_init(machine(), &gtia_intf);
1953   
19541936   /* ANTIC */
19551937   antic_start(machine());
19561938}
19571939
19581940void a400_state::a5200_start()
19591941{
1960   /* GTIA */
1961   gtia_interface gtia_intf;
1962   memset(&gtia_intf, 0, sizeof(gtia_intf));
1963   gtia_init(machine(), &gtia_intf);   
1964   
19651942   /* ANTIC */
19661943   antic_start(machine());
19671944}
r31963r31964
20232000   save_item(NAME(m_last_offs));
20242001}
20252002
2003
20262004/**************************************************************
20272005 *
2006 * GTIA interface
2007 *
2008 **************************************************************/
2009
2010WRITE8_MEMBER(a400_state::gtia_write)
2011{
2012   dac_device *dac = machine().device<dac_device>("dac");
2013   if (data & 0x08)
2014      dac->write_unsigned8((UINT8)-120);
2015   else
2016      dac->write_unsigned8(+120);
2017}
2018
2019/**************************************************************
2020 *
20282021 * PIA interface
20292022 *
20302023 **************************************************************/
r31963r31964
20992092   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
21002093MACHINE_CONFIG_END
21012094
2102
21032095static MACHINE_CONFIG_DERIVED( atari_common, atari_common_nodac )
21042096   MCFG_SOUND_ADD("dac", DAC, 0)
21052097   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
r31963r31964
21082100   MCFG_RAM_ADD(RAM_TAG)
21092101   MCFG_RAM_DEFAULT_SIZE("48K")
21102102
2103   MCFG_DEVICE_ADD("gtia", ATARI_GTIA, 0)
2104   MCFG_GTIA_READ_CB(IOPORT("console"))
2105   MCFG_GTIA_WRITE_CB(WRITE8(a400_state, gtia_write))
2106
21112107   /* devices */
21122108   MCFG_DEVICE_ADD("fdc", ATARI_FDC, 0)
21132109
r31963r31964
22922288
22932289   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
22942290
2291   MCFG_DEVICE_ADD("gtia", ATARI_GTIA, 0)
2292
22952293   MCFG_DEVICE_MODIFY("pia")
22962294   MCFG_PIA_READPA_HANDLER(NULL) // FIXME: is there anything connected here
22972295   MCFG_PIA_READPB_HANDLER(NULL) // FIXME: is there anything connected here

Previous 199869 Revisions Next


© 1997-2024 The MAME Team