diff --git a/src/mame/drivers/alg.cpp b/src/mame/drivers/alg.cpp index 6e86fc37fe4..ee7b82c5401 100644 --- a/src/mame/drivers/alg.cpp +++ b/src/mame/drivers/alg.cpp @@ -115,7 +115,7 @@ VIDEO_START_MEMBER(alg_state,alg) /* configure pen 4096 as transparent in the renderer and use it for the genlock color */ m_palette->set_pen_color(4096, rgb_t(0,0,0,0)); - amiga_set_genlock_color(machine(), 4096); + set_genlock_color(4096); } diff --git a/src/mame/includes/amiga.h b/src/mame/includes/amiga.h index 532bbe6341d..43432720cbb 100644 --- a/src/mame/includes/amiga.h +++ b/src/mame/includes/amiga.h @@ -28,24 +28,6 @@ Ernesto Corvi & Mariusz Wojcieszek #include "screen.h" -/************************************* - * - * Debugging - * - *************************************/ - -#define LOG_COPPER 0 -#define GUESS_COPPER_OFFSET 0 -#define LOG_SPRITE_DMA 0 - -/* A bit of a trick here: some registers are 32-bit. In order to efficiently */ -/* read them on both big-endian and little-endian systems, we store the custom */ -/* registers in 32-bit natural order. This means we need to XOR the register */ -/* address with 1 on little-endian systems. */ -#define CUSTOM_REG(x) (state->m_custom_regs[BYTE_XOR_BE(x)]) -#define CUSTOM_REG_SIGNED(x) ((int16_t)CUSTOM_REG(x)) -#define CUSTOM_REG_LONG(x) (*(uint32_t *)&state->m_custom_regs[x]) - /* A = Angus D = Denise @@ -321,12 +303,6 @@ Ernesto Corvi & Mariusz Wojcieszek #define MAX_PLANES 6 /* 0 to 6, inclusive ( but we count from 0 to 5 ) */ -// chipset -#define IS_OCS(state) (state->m_denise_id == 0xff) -#define IS_ECS(state) (state->m_denise_id == 0xfc) -#define IS_AGA(state) (state->m_denise_id == 0xf8) - - class amiga_state : public driver_device { public: @@ -415,9 +391,7 @@ public: uint16_t m_copper_waitmask; uint16_t m_copper_pending_offset; uint16_t m_copper_pending_data; -#if GUESS_COPPER_OFFSET int m_wait_offset; -#endif /* playfield states */ int m_last_scanline; @@ -442,8 +416,6 @@ public: DECLARE_VIDEO_START( amiga_aga ); DECLARE_PALETTE_INIT( amiga ); - void render_scanline(bitmap_ind16 &bitmap, int scanline); - void aga_render_scanline(bitmap_rgb32 &bitmap, int scanline); uint32_t screen_update_amiga(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_amiga_aga(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void update_screenmode(); @@ -514,8 +486,6 @@ public: uint16_t m_agnus_id; uint16_t m_denise_id; - uint16_t m_custom_regs[256]; - void custom_chip_w(uint16_t offset, uint16_t data, uint16_t mem_mask = 0xffff) { custom_chip_w(m_maincpu->space(AS_PROGRAM), offset, data, mem_mask); @@ -524,6 +494,14 @@ public: void blitter_setup(); protected: + // A bit of a trick here: some registers are 32-bit. In order to efficiently + // read them on both big-endian and little-endian systems, we store the custom + // registers in 32-bit natural order. This means we need to XOR the register + // address with 1 on little-endian systems. + uint16_t &CUSTOM_REG(offs_t x) { return m_custom_regs[BYTE_XOR_BE(x)]; } + int16_t &CUSTOM_REG_SIGNED(offs_t x) { return (int16_t &)CUSTOM_REG(x); } + uint32_t &CUSTOM_REG_LONG(offs_t x) { return *(uint32_t *)&m_custom_regs[x]; } + // agnus/alice chip id enum { @@ -547,6 +525,11 @@ protected: LISA = 0x00f8 }; + // chipset + bool IS_OCS() const { return m_denise_id == 0xff; } + bool IS_ECS() const { return m_denise_id == 0xfc; } + bool IS_AGA() const { return m_denise_id == 0xf8; } + // driver_device overrides virtual void machine_start() override; virtual void machine_reset() override; @@ -607,7 +590,45 @@ protected: int m_cia_0_irq; int m_cia_1_irq; + uint16_t m_custom_regs[256]; + static const char *const s_custom_reg_names[0x100]; + private: + // blitter helpers + uint32_t blit_ascending(); + uint32_t blit_descending(); + uint32_t blit_line(); + + // video helpers +protected: + void set_genlock_color(uint16_t color); +private: + void copper_setpc(uint32_t pc); + int copper_execute_next(int xpos); + void sprite_dma_reset(int which); + void sprite_enable_comparitor(int which, int enable); + void fetch_sprite_data(int scanline, int sprite); + void update_sprite_dma(int scanline); + uint32_t interleave_sprite_data(uint16_t lobits, uint16_t hibits); + int get_sprite_pixel(int x); + uint8_t assemble_odd_bitplanes(int planes, int ebitoffs); + uint8_t assemble_even_bitplanes(int planes, int ebitoffs); + void fetch_bitplane_data(int plane); + int update_ham(int newpix); + void update_display_window(); + void render_scanline(bitmap_ind16 &bitmap, int scanline); + + // AGA video helpers + void aga_palette_write(int color_reg, uint16_t data); + void aga_fetch_sprite_data(int scanline, int sprite); + void aga_render_scanline(bitmap_rgb32 &bitmap, int scanline); + void aga_update_sprite_dma(int scanline); + int aga_get_sprite_pixel(int x); + uint8_t aga_assemble_odd_bitplanes(int planes, int obitoffs); + uint8_t aga_assemble_even_bitplanes(int planes, int ebitoffs); + void aga_fetch_bitplane_data(int plane); + rgb_t aga_update_ham(int newpix); + enum { TIMER_SCANLINE, @@ -641,6 +662,8 @@ private: SERPER_LONG = 0x8000 // 9-bit mode }; + static const uint16_t s_expand_byte[256]; + // pot counters int m_pot0x, m_pot1x, m_pot0y, m_pot1y; @@ -660,7 +683,6 @@ private: // display window rectangle m_diw; bool m_diwhigh_valid; - void update_display_window(); bool m_previous_lof; bitmap_ind16 m_flickerfixer; @@ -685,23 +707,6 @@ private: uint32_t amiga_gethvpos(); }; - -/*----------- defined in machine/amiga.c -----------*/ - -extern const char *const amiga_custom_names[0x100]; - - -/*----------- defined in video/amiga.c -----------*/ - -extern const uint16_t amiga_expand_byte[256]; - -void amiga_copper_setpc(running_machine &machine, uint32_t pc); -int amiga_copper_execute_next(running_machine &machine, int xpos); - -void amiga_set_genlock_color(running_machine &machine, uint16_t color); -void amiga_sprite_dma_reset(running_machine &machine, int which); -void amiga_sprite_enable_comparitor(running_machine &machine, int which, int enable); - MACHINE_CONFIG_EXTERN( pal_video ); MACHINE_CONFIG_EXTERN( ntsc_video ); diff --git a/src/mame/machine/amiga.cpp b/src/mame/machine/amiga.cpp index e84416d629b..f1568a27d22 100644 --- a/src/mame/machine/amiga.cpp +++ b/src/mame/machine/amiga.cpp @@ -48,7 +48,7 @@ * *************************************/ -const char *const amiga_custom_names[0x100] = +const char *const amiga_state::s_custom_reg_names[0x100] = { /* 0x000 */ "BLTDDAT", "DMACONR", "VPOSR", "VHPOSR", @@ -241,7 +241,6 @@ void amiga_state::vblank() // todo: cia a clock can be connected to either a fixed 50/60hz signal from the power supply, or the vblank TIMER_CALLBACK_MEMBER( amiga_state::scanline_callback ) { - amiga_state *state = this; int scanline = param; // vblank start @@ -278,7 +277,7 @@ TIMER_CALLBACK_MEMBER( amiga_state::scanline_callback ) // render up to this scanline if (!m_screen->update_partial(scanline)) { - if (IS_AGA(this)) + if (IS_AGA()) { bitmap_rgb32 dummy_bitmap; aga_render_scanline(dummy_bitmap, scanline); @@ -336,8 +335,6 @@ void amiga_state::update_int6() void amiga_state::update_irqs() { - amiga_state *state = this; - // if the external interrupt line is still active, set the interrupt request bit if (int2_pending()) CUSTOM_REG(REG_INTREQ) |= INTENA_PORTS; @@ -423,7 +420,7 @@ CUSTOM_INPUT_MEMBER( amiga_state::amiga_joystick_convert ) * *************************************/ -static uint32_t blit_ascending(amiga_state *state) +uint32_t amiga_state::blit_ascending() { uint32_t shifta = (CUSTOM_REG(REG_BLTCON0) >> 12) & 0xf; uint32_t shiftb = (CUSTOM_REG(REG_BLTCON1) >> 12) & 0xf; @@ -446,22 +443,22 @@ static uint32_t blit_ascending(amiga_state *state) /* fetch data for A */ if (CUSTOM_REG(REG_BLTCON0) & 0x0800) { - //CUSTOM_REG(REG_BLTADAT) = state->m_maincpu->space(AS_PROGRAM).read_word(CUSTOM_REG_LONG(REG_BLTAPTH)); - CUSTOM_REG(REG_BLTADAT) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BLTAPTH)); + //CUSTOM_REG(REG_BLTADAT) = m_maincpu->space(AS_PROGRAM).read_word(CUSTOM_REG_LONG(REG_BLTAPTH)); + CUSTOM_REG(REG_BLTADAT) = chip_ram_r(CUSTOM_REG_LONG(REG_BLTAPTH)); CUSTOM_REG_LONG(REG_BLTAPTH) += 2; } /* fetch data for B */ if (CUSTOM_REG(REG_BLTCON0) & 0x0400) { - CUSTOM_REG(REG_BLTBDAT) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BLTBPTH)); + CUSTOM_REG(REG_BLTBDAT) = chip_ram_r(CUSTOM_REG_LONG(REG_BLTBPTH)); CUSTOM_REG_LONG(REG_BLTBPTH) += 2; } /* fetch data for C */ if (CUSTOM_REG(REG_BLTCON0) & 0x0200) { - CUSTOM_REG(REG_BLTCDAT) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BLTCPTH)); + CUSTOM_REG(REG_BLTCDAT) = chip_ram_r(CUSTOM_REG_LONG(REG_BLTCPTH)); CUSTOM_REG_LONG(REG_BLTCPTH) += 2; } @@ -517,7 +514,7 @@ static uint32_t blit_ascending(amiga_state *state) /* write to the destination */ if (CUSTOM_REG(REG_BLTCON0) & 0x0100) { - state->chip_ram_w(CUSTOM_REG_LONG(REG_BLTDPTH), tempd); + chip_ram_w(CUSTOM_REG_LONG(REG_BLTDPTH), tempd); CUSTOM_REG_LONG(REG_BLTDPTH) += 2; } } @@ -545,7 +542,7 @@ static uint32_t blit_ascending(amiga_state *state) * *************************************/ -static uint32_t blit_descending(amiga_state *state) +uint32_t amiga_state::blit_descending() { uint32_t fill_exclusive = (CUSTOM_REG(REG_BLTCON1) >> 4); uint32_t fill_inclusive = (CUSTOM_REG(REG_BLTCON1) >> 3); @@ -572,21 +569,21 @@ static uint32_t blit_descending(amiga_state *state) /* fetch data for A */ if (CUSTOM_REG(REG_BLTCON0) & 0x0800) { - CUSTOM_REG(REG_BLTADAT) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BLTAPTH)); + CUSTOM_REG(REG_BLTADAT) = chip_ram_r(CUSTOM_REG_LONG(REG_BLTAPTH)); CUSTOM_REG_LONG(REG_BLTAPTH) -= 2; } /* fetch data for B */ if (CUSTOM_REG(REG_BLTCON0) & 0x0400) { - CUSTOM_REG(REG_BLTBDAT) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BLTBPTH)); + CUSTOM_REG(REG_BLTBDAT) = chip_ram_r(CUSTOM_REG_LONG(REG_BLTBPTH)); CUSTOM_REG_LONG(REG_BLTBPTH) -= 2; } /* fetch data for C */ if (CUSTOM_REG(REG_BLTCON0) & 0x0200) { - CUSTOM_REG(REG_BLTCDAT) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BLTCPTH)); + CUSTOM_REG(REG_BLTCDAT) = chip_ram_r(CUSTOM_REG_LONG(REG_BLTCPTH)); CUSTOM_REG_LONG(REG_BLTCPTH) -= 2; } @@ -659,7 +656,7 @@ static uint32_t blit_descending(amiga_state *state) /* write to the destination */ if (CUSTOM_REG(REG_BLTCON0) & 0x0100) { - state->chip_ram_w(CUSTOM_REG_LONG(REG_BLTDPTH), tempd); + chip_ram_w(CUSTOM_REG_LONG(REG_BLTDPTH), tempd); CUSTOM_REG_LONG(REG_BLTDPTH) -= 2; } } @@ -726,7 +723,7 @@ static uint32_t blit_descending(amiga_state *state) BLTAMOD = 4 * (dy - dx) and BLTBMOD = 4 * dy. */ -static uint32_t blit_line(amiga_state *state) +uint32_t amiga_state::blit_line() { uint32_t singlemode = (CUSTOM_REG(REG_BLTCON1) & 0x0002) ? 0x0000 : 0xffff; uint32_t singlemask = 0xffff; @@ -735,9 +732,9 @@ static uint32_t blit_line(amiga_state *state) /* see if folks are breaking the rules */ if (CUSTOM_REG(REG_BLTSIZH) != 0x0002) - state->logerror("Blitter: Blit width != 2 in line mode!\n"); + logerror("Blitter: Blit width != 2 in line mode!\n"); if ((CUSTOM_REG(REG_BLTCON0) & 0x0a00) != 0x0a00) - state->logerror("Blitter: Channel selection incorrect in line mode!\n" ); + logerror("Blitter: Channel selection incorrect in line mode!\n" ); /* extract the length of the line */ height = CUSTOM_REG(REG_BLTSIZV); @@ -751,7 +748,7 @@ static uint32_t blit_line(amiga_state *state) /* fetch data for C */ if (CUSTOM_REG(REG_BLTCON0) & 0x0200) - CUSTOM_REG(REG_BLTCDAT) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BLTCPTH)); + CUSTOM_REG(REG_BLTCDAT) = chip_ram_r(CUSTOM_REG_LONG(REG_BLTCPTH)); /* rotate the A data according to the shift */ tempa = CUSTOM_REG(REG_BLTADAT) >> (CUSTOM_REG(REG_BLTCON0) >> 12); @@ -802,7 +799,7 @@ static uint32_t blit_line(amiga_state *state) blitsum |= tempd; /* write to the destination */ - state->chip_ram_w(CUSTOM_REG_LONG(REG_BLTDPTH), tempd); + chip_ram_w(CUSTOM_REG_LONG(REG_BLTDPTH), tempd); /* always increment along the major axis */ if (CUSTOM_REG(REG_BLTCON1) & 0x0010) @@ -879,7 +876,6 @@ static uint32_t blit_line(amiga_state *state) TIMER_CALLBACK_MEMBER( amiga_state::amiga_blitter_proc ) { - amiga_state *state = this; uint32_t blitsum = 0; /* logging */ @@ -904,16 +900,16 @@ TIMER_CALLBACK_MEMBER( amiga_state::amiga_blitter_proc ) switch (CUSTOM_REG(REG_BLTCON1) & 0x0003) { case 0: /* ascending */ - blitsum = blit_ascending(this); + blitsum = blit_ascending(); break; case 2: /* descending */ - blitsum = blit_descending(this); + blitsum = blit_descending(); break; case 1: /* line */ case 3: - blitsum = blit_line(this); + blitsum = blit_line(); break; } @@ -941,7 +937,6 @@ TIMER_CALLBACK_MEMBER( amiga_state::amiga_blitter_proc ) void amiga_state::blitter_setup() { - amiga_state *state = this; int ticks, width, height, blittime; /* is there another blitting in progress? */ @@ -986,7 +981,7 @@ void amiga_state::blitter_setup() } /* AGA has twice the bus bandwidth, so blits take half the time */ - if (IS_AGA(state)) + if (IS_AGA()) blittime /= 2; /* signal blitter busy */ @@ -1139,8 +1134,6 @@ WRITE_LINE_MEMBER( amiga_state::cia_1_irq ) void amiga_state::custom_chip_reset() { - amiga_state *state = this; - CUSTOM_REG(REG_DENISEID) = m_denise_id; CUSTOM_REG(REG_VPOSR) = m_agnus_id << 8; CUSTOM_REG(REG_DDFSTRT) = 0x18; @@ -1152,11 +1145,10 @@ void amiga_state::custom_chip_reset() READ16_MEMBER( amiga_state::custom_chip_r ) { - amiga_state *state = this; uint16_t temp; if (LOG_CUSTOM) - logerror("%06X:read from custom %s\n", space.device().safe_pc(), amiga_custom_names[offset & 0xff]); + logerror("%06X:read from custom %s\n", space.device().safe_pc(), s_custom_reg_names[offset & 0xff]); switch (offset & 0xff) { @@ -1232,11 +1224,11 @@ READ16_MEMBER( amiga_state::custom_chip_r ) return CUSTOM_REG(REG_INTREQ); case REG_COPJMP1: - amiga_copper_setpc(machine(), CUSTOM_REG_LONG(REG_COP1LCH)); + copper_setpc(CUSTOM_REG_LONG(REG_COP1LCH)); break; case REG_COPJMP2: - amiga_copper_setpc(machine(), CUSTOM_REG_LONG(REG_COP2LCH)); + copper_setpc(CUSTOM_REG_LONG(REG_COP2LCH)); break; case REG_CLXDAT: @@ -1266,12 +1258,11 @@ READ16_MEMBER( amiga_state::custom_chip_r ) WRITE16_MEMBER( amiga_state::custom_chip_w ) { - amiga_state *state = this; uint16_t temp; offset &= 0xff; if (LOG_CUSTOM) - logerror("%06X:write to custom %s = %04X\n", space.device().safe_pc(), amiga_custom_names[offset & 0xff], data); + logerror("%06X:write to custom %s = %04X\n", space.device().safe_pc(), s_custom_reg_names[offset & 0xff], data); // paula will handle some of those registers m_paula->reg_w(space, offset, data, mem_mask); @@ -1362,7 +1353,7 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) break; case REG_BLTSIZV: - if (IS_ECS(state) || IS_AGA(state)) + if (IS_ECS() || IS_AGA()) { CUSTOM_REG(REG_BLTSIZV) = data & 0x7fff; if ( CUSTOM_REG(REG_BLTSIZV) == 0 ) CUSTOM_REG(REG_BLTSIZV) = 0x8000; @@ -1370,7 +1361,7 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) break; case REG_BLTSIZH: - if (IS_ECS(state) || IS_AGA(state)) + if (IS_ECS() || IS_AGA()) { CUSTOM_REG(REG_BLTSIZH) = data & 0x7ff; if ( CUSTOM_REG(REG_BLTSIZH) == 0 ) CUSTOM_REG(REG_BLTSIZH) = 0x800; @@ -1379,7 +1370,7 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) break; case REG_BLTCON0L: - if (IS_ECS(state) || IS_AGA(state)) + if (IS_ECS() || IS_AGA()) { CUSTOM_REG(REG_BLTCON0) &= 0xff00; CUSTOM_REG(REG_BLTCON0) |= data & 0xff; @@ -1393,19 +1384,19 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) case REG_SPR0PTL: case REG_SPR1PTL: case REG_SPR2PTL: case REG_SPR3PTL: case REG_SPR4PTL: case REG_SPR5PTL: case REG_SPR6PTL: case REG_SPR7PTL: - amiga_sprite_dma_reset(machine(), (offset - REG_SPR0PTL) / 2); + sprite_dma_reset((offset - REG_SPR0PTL) / 2); break; case REG_SPR0CTL: case REG_SPR1CTL: case REG_SPR2CTL: case REG_SPR3CTL: case REG_SPR4CTL: case REG_SPR5CTL: case REG_SPR6CTL: case REG_SPR7CTL: /* disable comparitor on writes here */ - amiga_sprite_enable_comparitor(machine(), (offset - REG_SPR0CTL) / 4, false); + sprite_enable_comparitor((offset - REG_SPR0CTL) / 4, false); break; case REG_SPR0DATA: case REG_SPR1DATA: case REG_SPR2DATA: case REG_SPR3DATA: case REG_SPR4DATA: case REG_SPR5DATA: case REG_SPR6DATA: case REG_SPR7DATA: /* enable comparitor on writes here */ - amiga_sprite_enable_comparitor(machine(), (offset - REG_SPR0DATA) / 4, true); + sprite_enable_comparitor((offset - REG_SPR0DATA) / 4, true); break; case REG_COP1LCH: @@ -1414,11 +1405,11 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) break; case REG_COPJMP1: - amiga_copper_setpc(machine(), CUSTOM_REG_LONG(REG_COP1LCH)); + copper_setpc(CUSTOM_REG_LONG(REG_COP1LCH)); break; case REG_COPJMP2: - amiga_copper_setpc(machine(), CUSTOM_REG_LONG(REG_COP2LCH)); + copper_setpc(CUSTOM_REG_LONG(REG_COP2LCH)); break; case REG_DDFSTRT: @@ -1514,9 +1505,9 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) case REG_COLOR20: case REG_COLOR21: case REG_COLOR22: case REG_COLOR23: case REG_COLOR24: case REG_COLOR25: case REG_COLOR26: case REG_COLOR27: case REG_COLOR28: case REG_COLOR29: case REG_COLOR30: case REG_COLOR31: - if (IS_AGA(state)) + if (IS_AGA()) { - amiga_aga_palette_write(machine(), offset - REG_COLOR00, data); + aga_palette_write(offset - REG_COLOR00, data); } else { @@ -1533,7 +1524,7 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) // display window high case REG_DIWHIGH: - if (IS_ECS(state) || IS_AGA(state)) + if (IS_ECS() || IS_AGA()) { m_diwhigh_valid = true; CUSTOM_REG(REG_DIWHIGH) = data; @@ -1553,7 +1544,7 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) break; } - if (IS_AGA(state)) + if (IS_AGA()) CUSTOM_REG(offset) = data; else if (offset <= REG_COLOR31) @@ -1567,8 +1558,6 @@ WRITE16_MEMBER( amiga_state::custom_chip_w ) void amiga_state::serial_adjust() { - amiga_state *state = this; - uint32_t divisor = (CUSTOM_REG(REG_SERPER) & 0x7fff) + 1; uint32_t baud = m_paula->clock() / divisor; @@ -1577,8 +1566,6 @@ void amiga_state::serial_adjust() void amiga_state::serial_shift() { - amiga_state *state = this; - if (CUSTOM_REG(REG_ADKCON) & ADKCON_UARTBRK) { // break active, force low @@ -1690,8 +1677,6 @@ void amiga_state::rs232_tx(int state) void amiga_state::rx_write(int level) { - amiga_state *state = this; - m_rx_previous = BIT(CUSTOM_REG(REG_SERDATR), 11); CUSTOM_REG(REG_SERDATR) &= ~SERDATR_RXD; CUSTOM_REG(REG_SERDATR) |= level << 11; diff --git a/src/mame/video/amiga.cpp b/src/mame/video/amiga.cpp index 349cda7262a..eeeeb3b6c7f 100644 --- a/src/mame/video/amiga.cpp +++ b/src/mame/video/amiga.cpp @@ -13,6 +13,18 @@ +/************************************* + * + * Debugging + * + *************************************/ + +#define LOG_COPPER 0 +#define GUESS_COPPER_OFFSET 0 +#define LOG_SPRITE_DMA 0 + + + /************************************* * * Macros @@ -30,7 +42,7 @@ *************************************/ /* expand an 8-bit bit pattern into 16 bits, every other bit */ -const uint16_t amiga_expand_byte[256] = +const uint16_t amiga_state::s_expand_byte[256] = { 0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015, 0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055, @@ -128,6 +140,8 @@ VIDEO_START_MEMBER( amiga_state, amiga ) #if GUESS_COPPER_OFFSET m_wait_offset = 3; +#else + (void)m_wait_offset; #endif /* reset the genlock color */ @@ -148,7 +162,6 @@ VIDEO_START_MEMBER( amiga_state, amiga ) uint32_t amiga_state::amiga_gethvpos() { - amiga_state *state = this; uint32_t hvpos = (m_last_scanline << 8) | (m_screen->hpos() >> 2); uint32_t latchedpos = m_hvpos.read_safe(0); @@ -169,11 +182,9 @@ uint32_t amiga_state::amiga_gethvpos() * *************************************/ -void amiga_set_genlock_color(running_machine &machine, uint16_t color) +void amiga_state::set_genlock_color(uint16_t color) { - amiga_state *state = machine.driver_data(); - - state->m_genlock_color = color; + m_genlock_color = color; } @@ -184,22 +195,19 @@ void amiga_set_genlock_color(running_machine &machine, uint16_t color) * *************************************/ -void amiga_copper_setpc(running_machine &machine, uint32_t pc) +void amiga_state::copper_setpc(uint32_t pc) { - amiga_state *state = machine.driver_data(); - if (LOG_COPPER) - state->logerror("copper_setpc(%06x)\n", pc); + logerror("copper_setpc(%06x)\n", pc); - state->m_copper_pc = pc; - state->m_copper_waiting = false; + m_copper_pc = pc; + m_copper_waiting = false; } -int amiga_copper_execute_next(running_machine &machine, int xpos) +int amiga_state::copper_execute_next(int xpos) { - amiga_state *state = machine.driver_data(); - uint8_t ypos = state->m_last_scanline & 0xff; + uint8_t ypos = m_last_scanline & 0xff; int word0, word1; /* bail if not enabled */ @@ -207,33 +215,33 @@ int amiga_copper_execute_next(running_machine &machine, int xpos) return 511; /* flush any pending writes */ - if (state->m_copper_pending_offset) + if (m_copper_pending_offset) { if (LOG_COPPER) - state->logerror("%02X.%02X: Write to %s = %04x\n", state->m_last_scanline, xpos / 2, amiga_custom_names[state->m_copper_pending_offset & 0xff], state->m_copper_pending_data); - state->custom_chip_w(state->m_copper_pending_offset, state->m_copper_pending_data); - state->m_copper_pending_offset = 0; + logerror("%02X.%02X: Write to %s = %04x\n", m_last_scanline, xpos / 2, s_custom_reg_names[m_copper_pending_offset & 0xff], m_copper_pending_data); + custom_chip_w(m_copper_pending_offset, m_copper_pending_data); + m_copper_pending_offset = 0; } /* if we're waiting, check for a breakthrough */ - if (state->m_copper_waiting) + if (m_copper_waiting) { int curpos = (ypos << 8) | (xpos >> 1); /* if we're past the wait time, stop it and hold up 2 cycles */ - if ((curpos & state->m_copper_waitmask) >= (state->m_copper_waitval & state->m_copper_waitmask) && - (!state->m_copper_waitblit || !(CUSTOM_REG(REG_DMACON) & DMACON_BBUSY))) + if ((curpos & m_copper_waitmask) >= (m_copper_waitval & m_copper_waitmask) && + (!m_copper_waitblit || !(CUSTOM_REG(REG_DMACON) & DMACON_BBUSY))) { - state->m_copper_waiting = false; + m_copper_waiting = false; #if GUESS_COPPER_OFFSET - return xpos + COPPER_CYCLES_TO_PIXELS(1 + state->m_wait_offset); + return xpos + COPPER_CYCLES_TO_PIXELS(1 + m_wait_offset); #else return xpos + COPPER_CYCLES_TO_PIXELS(1 + 3); #endif } /* otherwise, see if this line is even a possibility; if not, punt */ - if (((curpos | 0xff) & state->m_copper_waitmask) < (state->m_copper_waitval & state->m_copper_waitmask)) + if (((curpos | 0xff) & m_copper_waitmask) < (m_copper_waitval & m_copper_waitmask)) return 511; /* else just advance another pixel */ @@ -242,17 +250,17 @@ int amiga_copper_execute_next(running_machine &machine, int xpos) } /* fetch the first data word */ - word0 = state->chip_ram_r(state->m_copper_pc); - state->m_copper_pc += 2; + word0 = chip_ram_r(m_copper_pc); + m_copper_pc += 2; xpos += COPPER_CYCLES_TO_PIXELS(1); /* fetch the second data word */ - word1 = state->chip_ram_r(state->m_copper_pc); - state->m_copper_pc += 2; + word1 = chip_ram_r(m_copper_pc); + m_copper_pc += 2; xpos += COPPER_CYCLES_TO_PIXELS(1); if (LOG_COPPER) - state->logerror("%02X.%02X: Copper inst @ %06x = %04x %04x\n", state->m_last_scanline, xpos / 2, state->m_copper_pc, word0, word1); + logerror("%02X.%02X: Copper inst @ %06x = %04x %04x\n", m_last_scanline, xpos / 2, m_copper_pc, word0, word1); /* handle a move */ if ((word0 & 1) == 0) @@ -266,13 +274,13 @@ int amiga_copper_execute_next(running_machine &machine, int xpos) if (delay[word0] == 0) { if (LOG_COPPER) - state->logerror("%02X.%02X: Write to %s = %04x\n", state->m_last_scanline, xpos / 2, amiga_custom_names[word0 & 0xff], word1); - state->custom_chip_w(word0, word1); + logerror("%02X.%02X: Write to %s = %04x\n", m_last_scanline, xpos / 2, s_custom_reg_names[word0 & 0xff], word1); + custom_chip_w(word0, word1); } else // additional 2 cycles needed for non-Agnus registers { - state->m_copper_pending_offset = word0; - state->m_copper_pending_data = word1; + m_copper_pending_offset = word0; + m_copper_pending_data = word1; } } @@ -280,12 +288,12 @@ int amiga_copper_execute_next(running_machine &machine, int xpos) else { if (LOG_COPPER) - state->logerror("%02X.%02X: Aborting copper on illegal write\n", state->m_last_scanline, xpos / 2); + logerror("%02X.%02X: Aborting copper on illegal write\n", m_last_scanline, xpos / 2); - state->m_copper_waitval = 0xffff; - state->m_copper_waitmask = 0xffff; - state->m_copper_waitblit = false; - state->m_copper_waiting = true; + m_copper_waitval = 0xffff; + m_copper_waitmask = 0xffff; + m_copper_waitblit = false; + m_copper_waiting = true; return 511; } @@ -293,23 +301,23 @@ int amiga_copper_execute_next(running_machine &machine, int xpos) else { /* extract common wait/skip values */ - state->m_copper_waitval = word0 & 0xfffe; + m_copper_waitval = word0 & 0xfffe; #if 0 - if (state->m_copper_waitval != 0xfffe) - state->m_copper_waitval = (word0 & 0x00fe) | ((((word0 >> 8) & 0xff) + 1) << 8); + if (m_copper_waitval != 0xfffe) + m_copper_waitval = (word0 & 0x00fe) | ((((word0 >> 8) & 0xff) + 1) << 8); #endif - state->m_copper_waitmask = word1 | 0x8001; - state->m_copper_waitblit = (~word1 >> 15) & 1; + m_copper_waitmask = word1 | 0x8001; + m_copper_waitblit = (~word1 >> 15) & 1; /* handle a wait */ if ((word1 & 1) == 0) { if (LOG_COPPER) - state->logerror(" Waiting for %04x & %04x (currently %04x)\n", state->m_copper_waitval, state->m_copper_waitmask, (state->m_last_scanline << 8) | (xpos >> 1)); + logerror(" Waiting for %04x & %04x (currently %04x)\n", m_copper_waitval, m_copper_waitmask, (m_last_scanline << 8) | (xpos >> 1)); - state->m_copper_waiting = true; + m_copper_waiting = true; } /* handle a skip */ @@ -318,17 +326,17 @@ int amiga_copper_execute_next(running_machine &machine, int xpos) int curpos = (ypos << 8) | (xpos >> 1); if (LOG_COPPER) - state->logerror(" Skipping if %04x & %04x (currently %04x)\n", state->m_copper_waitval, state->m_copper_waitmask, (state->m_last_scanline << 8) | (xpos >> 1)); + logerror(" Skipping if %04x & %04x (currently %04x)\n", m_copper_waitval, m_copper_waitmask, (m_last_scanline << 8) | (xpos >> 1)); /* if we're past the wait time, stop it and hold up 2 cycles */ - if ((curpos & state->m_copper_waitmask) >= (state->m_copper_waitval & state->m_copper_waitmask) && - (!state->m_copper_waitblit || !(CUSTOM_REG(REG_DMACON) & DMACON_BBUSY))) + if ((curpos & m_copper_waitmask) >= (m_copper_waitval & m_copper_waitmask) && + (!m_copper_waitblit || !(CUSTOM_REG(REG_DMACON) & DMACON_BBUSY))) { if (LOG_COPPER) - state->logerror(" Skipped\n"); + logerror(" Skipped\n"); /* count the cycles it out have taken to fetch the next instruction */ - state->m_copper_pc += 4; + m_copper_pc += 4; xpos += COPPER_CYCLES_TO_PIXELS(2); } } @@ -346,30 +354,26 @@ int amiga_copper_execute_next(running_machine &machine, int xpos) * *************************************/ -void amiga_sprite_dma_reset(running_machine &machine, int which) +void amiga_state::sprite_dma_reset(int which) { - amiga_state *state = machine.driver_data(); - - if (LOG_SPRITE_DMA) state->logerror("sprite %d dma reset\n", which ); - state->m_sprite_dma_reload_mask |= 1 << which; - state->m_sprite_dma_live_mask |= 1 << which; + if (LOG_SPRITE_DMA) logerror("sprite %d dma reset\n", which ); + m_sprite_dma_reload_mask |= 1 << which; + m_sprite_dma_live_mask |= 1 << which; } -void amiga_sprite_enable_comparitor(running_machine &machine, int which, int enable) +void amiga_state::sprite_enable_comparitor(int which, int enable) { - amiga_state *state = machine.driver_data(); - - if (LOG_SPRITE_DMA) state->logerror("sprite %d comparitor %sable\n", which, enable ? "en" : "dis" ); + if (LOG_SPRITE_DMA) logerror("sprite %d comparitor %sable\n", which, enable ? "en" : "dis" ); if (enable) { - state->m_sprite_comparitor_enable_mask |= 1 << which; - state->m_sprite_dma_live_mask &= ~(1 << which); + m_sprite_comparitor_enable_mask |= 1 << which; + m_sprite_dma_live_mask &= ~(1 << which); } else { - state->m_sprite_comparitor_enable_mask &= ~(1 << which); - state->m_sprite_ctl_written |= (1 << which); + m_sprite_comparitor_enable_mask &= ~(1 << which); + m_sprite_ctl_written |= (1 << which); } } @@ -381,15 +385,15 @@ void amiga_sprite_enable_comparitor(running_machine &machine, int which, int ena * *************************************/ -static inline void fetch_sprite_data(amiga_state *state, int scanline, int sprite) +void amiga_state::fetch_sprite_data(int scanline, int sprite) { - CUSTOM_REG(REG_SPR0DATA + 4 * sprite) = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - CUSTOM_REG(REG_SPR0DATB + 4 * sprite) = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + CUSTOM_REG(REG_SPR0DATA + 4 * sprite) = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + CUSTOM_REG(REG_SPR0DATB + 4 * sprite) = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d fetch: data=%04X-%04X\n", scanline, sprite, CUSTOM_REG(REG_SPR0DATA + 4 * sprite), CUSTOM_REG(REG_SPR0DATB + 4 * sprite)); + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X\n", scanline, sprite, CUSTOM_REG(REG_SPR0DATA + 4 * sprite), CUSTOM_REG(REG_SPR0DATB + 4 * sprite)); } -static void update_sprite_dma(amiga_state *state, int scanline) +void amiga_state::update_sprite_dma(int scanline) { int dmaenable = (CUSTOM_REG(REG_DMACON) & (DMACON_SPREN | DMACON_DMAEN)) == (DMACON_SPREN | DMACON_DMAEN); int num, maxdma; @@ -406,17 +410,17 @@ static void update_sprite_dma(amiga_state *state, int scanline) int vstart, vstop; /* if we are == VSTOP, fetch new control words */ - if (dmaenable && (state->m_sprite_dma_live_mask & bitmask) && (state->m_sprite_dma_reload_mask & bitmask)) + if (dmaenable && (m_sprite_dma_live_mask & bitmask) && (m_sprite_dma_reload_mask & bitmask)) { /* disable the sprite */ - state->m_sprite_comparitor_enable_mask &= ~bitmask; - state->m_sprite_dma_reload_mask &= ~bitmask; + m_sprite_comparitor_enable_mask &= ~bitmask; + m_sprite_dma_reload_mask &= ~bitmask; /* fetch data into the control words */ - CUSTOM_REG(REG_SPR0POS + 4 * num) = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 0); - CUSTOM_REG(REG_SPR0CTL + 4 * num) = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 2); + CUSTOM_REG(REG_SPR0POS + 4 * num) = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 0); + CUSTOM_REG(REG_SPR0CTL + 4 * num) = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) += 4; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d fetch: pos=%04X ctl=%04X\n", scanline, num, CUSTOM_REG(REG_SPR0POS + 4 * num), CUSTOM_REG(REG_SPR0CTL + 4 * num)); + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: pos=%04X ctl=%04X\n", scanline, num, CUSTOM_REG(REG_SPR0POS + 4 * num), CUSTOM_REG(REG_SPR0CTL + 4 * num)); } /* compute vstart/vstop */ @@ -426,25 +430,25 @@ static void update_sprite_dma(amiga_state *state, int scanline) /* if we hit vstart, enable the comparitor */ if (scanline == vstart) { - state->m_sprite_comparitor_enable_mask |= 1 << num; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d comparitor enable\n", scanline, num); + m_sprite_comparitor_enable_mask |= 1 << num; + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d comparitor enable\n", scanline, num); } /* if we hit vstop, disable the comparitor and trigger a reload for the next scanline */ if (scanline == vstop) { - state->m_sprite_ctl_written &= ~bitmask; - state->m_sprite_comparitor_enable_mask &= ~bitmask; - state->m_sprite_dma_reload_mask |= 1 << num; + m_sprite_ctl_written &= ~bitmask; + m_sprite_comparitor_enable_mask &= ~bitmask; + m_sprite_dma_reload_mask |= 1 << num; CUSTOM_REG(REG_SPR0DATA + 4 * num) = 0; /* just a guess */ CUSTOM_REG(REG_SPR0DATB + 4 * num) = 0; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d comparitor disable, prepare for reload\n", scanline, num); + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d comparitor disable, prepare for reload\n", scanline, num); } /* fetch data if this sprite is enabled */ - if (dmaenable && (state->m_sprite_dma_live_mask & bitmask) && (state->m_sprite_comparitor_enable_mask & bitmask)) + if (dmaenable && (m_sprite_dma_live_mask & bitmask) && (m_sprite_comparitor_enable_mask & bitmask)) { - fetch_sprite_data(state, scanline, num); + fetch_sprite_data(scanline, num); } } } @@ -457,39 +461,39 @@ static void update_sprite_dma(amiga_state *state, int scanline) * *************************************/ -static inline uint32_t interleave_sprite_data(uint16_t lobits, uint16_t hibits) +uint32_t amiga_state::interleave_sprite_data(uint16_t lobits, uint16_t hibits) { - return (amiga_expand_byte[lobits & 0xff] << 0) | (amiga_expand_byte[lobits >> 8] << 16) | - (amiga_expand_byte[hibits & 0xff] << 1) | (amiga_expand_byte[hibits >> 8] << 17); + return (s_expand_byte[lobits & 0xff] << 0) | (s_expand_byte[lobits >> 8] << 16) | + (s_expand_byte[hibits & 0xff] << 1) | (s_expand_byte[hibits >> 8] << 17); } -static int get_sprite_pixel(amiga_state *state, int x) +int amiga_state::get_sprite_pixel(int x) { int pixels = 0; int num, pair; /* loop over sprite channels */ for (num = 0; num < 8; num++) - if (state->m_sprite_comparitor_enable_mask & (1 << num)) + if (m_sprite_comparitor_enable_mask & (1 << num)) { /* if we're not currently clocking, check against hstart */ - if (state->m_sprite_remain[num] == 0) + if (m_sprite_remain[num] == 0) { int hstart = ((CUSTOM_REG(REG_SPR0POS + 4 * num) & 0xff) << 1) | (CUSTOM_REG(REG_SPR0CTL + 4 * num) & 1); if (hstart == x) { - state->m_sprite_remain[num] = 16; - state->m_sprite_shiftreg[num] = interleave_sprite_data(CUSTOM_REG(REG_SPR0DATA + 4 * num), CUSTOM_REG(REG_SPR0DATB + 4 * num)); + m_sprite_remain[num] = 16; + m_sprite_shiftreg[num] = interleave_sprite_data(CUSTOM_REG(REG_SPR0DATA + 4 * num), CUSTOM_REG(REG_SPR0DATB + 4 * num)); } } /* clock the next pixel if we're doing it */ - if (state->m_sprite_remain[num] != 0) + if (m_sprite_remain[num] != 0) { - state->m_sprite_remain[num]--; - pixels |= (state->m_sprite_shiftreg[num] & 0xc0000000) >> (16 + 2 * (7 - num)); - state->m_sprite_shiftreg[num] <<= 2; + m_sprite_remain[num]--; + pixels |= (m_sprite_shiftreg[num] & 0xc0000000) >> (16 + 2 * (7 - num)); + m_sprite_shiftreg[num] <<= 2; } } @@ -557,7 +561,7 @@ static int get_sprite_pixel(amiga_state *state, int x) * *************************************/ -static inline uint8_t assemble_odd_bitplanes(amiga_state *state, int planes, int obitoffs) +uint8_t amiga_state::assemble_odd_bitplanes(int planes, int obitoffs) { uint8_t pix = (CUSTOM_REG(REG_BPL1DAT) >> obitoffs) & 1; if (planes >= 3) @@ -570,7 +574,7 @@ static inline uint8_t assemble_odd_bitplanes(amiga_state *state, int planes, int } -static inline uint8_t assemble_even_bitplanes(amiga_state *state, int planes, int ebitoffs) +uint8_t amiga_state::assemble_even_bitplanes(int planes, int ebitoffs) { uint8_t pix = 0; if (planes >= 2) @@ -586,9 +590,9 @@ static inline uint8_t assemble_even_bitplanes(amiga_state *state, int planes, in return pix; } -static inline void fetch_bitplane_data(amiga_state *state, int plane) +void amiga_state::fetch_bitplane_data(int plane) { - CUSTOM_REG(REG_BPL1DAT + plane) = state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)); + CUSTOM_REG(REG_BPL1DAT + plane) = chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)); CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; } @@ -599,27 +603,27 @@ static inline void fetch_bitplane_data(amiga_state *state, int plane) * *************************************/ -static inline int update_ham(amiga_state *state, int newpix) +int amiga_state::update_ham(int newpix) { switch (newpix >> 4) { case 0: - state->m_ham_color = CUSTOM_REG(REG_COLOR00 + (newpix & 0xf)); + m_ham_color = CUSTOM_REG(REG_COLOR00 + (newpix & 0xf)); break; case 1: - state->m_ham_color = (state->m_ham_color & 0xff0) | ((newpix & 0xf) << 0); + m_ham_color = (m_ham_color & 0xff0) | ((newpix & 0xf) << 0); break; case 2: - state->m_ham_color = (state->m_ham_color & 0x0ff) | ((newpix & 0xf) << 8); + m_ham_color = (m_ham_color & 0x0ff) | ((newpix & 0xf) << 8); break; case 3: - state->m_ham_color = (state->m_ham_color & 0xf0f) | ((newpix & 0xf) << 4); + m_ham_color = (m_ham_color & 0xf0f) | ((newpix & 0xf) << 4); break; } - return state->m_ham_color; + return m_ham_color; } @@ -629,8 +633,6 @@ static inline int update_ham(amiga_state *state, int newpix) void amiga_state::update_display_window() { - amiga_state *state = this; - int vstart = CUSTOM_REG(REG_DIWSTRT) >> 8; int vstop = CUSTOM_REG(REG_DIWSTOP) >> 8; int hstart = CUSTOM_REG(REG_DIWSTRT) & 0xff; @@ -667,7 +669,6 @@ void amiga_state::update_display_window() void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) { - amiga_state *state = this; uint16_t save_color0 = CUSTOM_REG(REG_COLOR00); int ddf_start_pixel = 0, ddf_stop_pixel = 0; int hires = 0, dualpf = 0, ham = 0; @@ -694,7 +695,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) CUSTOM_REG(REG_VPOSR) ^= VPOSR_LOF; // reset copper and ham color - amiga_copper_setpc(machine(), CUSTOM_REG_LONG(REG_COP1LCH)); + copper_setpc(CUSTOM_REG_LONG(REG_COP1LCH)); m_ham_color = CUSTOM_REG(REG_COLOR00); } @@ -726,7 +727,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) m_last_scanline = scanline; /* update sprite data fetching */ - update_sprite_dma(state, scanline); + update_sprite_dma(scanline); /* all sprites off at the start of the line */ memset(m_sprite_remain, 0, sizeof(m_sprite_remain)); @@ -746,7 +747,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) { /* execute the next batch, restoring and re-saving color 0 around it */ CUSTOM_REG(REG_COLOR00) = save_color0; - next_copper_x = amiga_copper_execute_next(machine(), x); + next_copper_x = copper_execute_next(x); save_color0 = CUSTOM_REG(REG_COLOR00); if (m_genlock_color != 0xffff) CUSTOM_REG(REG_COLOR00) = m_genlock_color; @@ -811,7 +812,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) } /* need to run the sprite engine every pixel to ensure display */ - sprpix = get_sprite_pixel(state, x); + sprpix = get_sprite_pixel(x); /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */ /* vertical display window */ @@ -828,12 +829,12 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) { for (pl = 0; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + fetch_bitplane_data(pl); } } /* now assemble the bits */ - pfpix0 |= assemble_odd_bitplanes(state, planes, obitoffs); + pfpix0 |= assemble_odd_bitplanes(planes, obitoffs); obitoffs--; /* for high res, assemble a second set of bits */ @@ -846,11 +847,11 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) for (pl = 0; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + fetch_bitplane_data(pl); } } - pfpix1 |= assemble_odd_bitplanes(state, planes, obitoffs); + pfpix1 |= assemble_odd_bitplanes(planes, obitoffs); obitoffs--; } else @@ -869,12 +870,12 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) { for (pl = 1; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + fetch_bitplane_data(pl); } } /* now assemble the bits */ - pfpix0 |= assemble_even_bitplanes(state, planes, ebitoffs); + pfpix0 |= assemble_even_bitplanes(planes, ebitoffs); ebitoffs--; /* for high res, assemble a second set of bits */ @@ -887,11 +888,11 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) for (pl = 1; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + fetch_bitplane_data(pl); } } - pfpix1 |= assemble_even_bitplanes(state, planes, ebitoffs); + pfpix1 |= assemble_even_bitplanes(planes, ebitoffs); ebitoffs--; } else @@ -929,7 +930,7 @@ void amiga_state::render_scanline(bitmap_ind16 &bitmap, int scanline) if (ham) { /* update the HAM color */ - pfpix0 = update_ham(state, pfpix0); + pfpix0 = update_ham(pfpix0); pix = sprpix & 0x1f; pri = (sprpix >> 10); @@ -1065,7 +1066,6 @@ uint32_t amiga_state::screen_update_amiga(screen_device &screen, bitmap_ind16 &b void amiga_state::update_screenmode() { - amiga_state *state = this; bool pal; // first let's see if we're PAL or NTSC diff --git a/src/mame/video/amigaaga.cpp b/src/mame/video/amigaaga.cpp index cff74a74625..d73a1f4c373 100644 --- a/src/mame/video/amigaaga.cpp +++ b/src/mame/video/amigaaga.cpp @@ -26,20 +26,23 @@ To do: /************************************* * - * Statics + * Debugging * *************************************/ +#define GUESS_COPPER_OFFSET 0 +#define LOG_SPRITE_DMA 0 + + + /************************************* * * Palette * *************************************/ -void amiga_aga_palette_write(running_machine &machine, int color_reg, uint16_t data) +void amiga_state::aga_palette_write(int color_reg, uint16_t data) { - amiga_state *state = machine.driver_data(); - rgb_t *aga_palette = state->m_aga_palette; int r,g,b; int cr,cg,cb; int color; @@ -48,9 +51,9 @@ void amiga_aga_palette_write(running_machine &machine, int color_reg, uint16_t d r = (data & 0xf00) >> 8; g = (data & 0x0f0) >> 4; b = (data & 0x00f) >> 0; - cr = aga_palette[color].r(); - cg = aga_palette[color].g(); - cb = aga_palette[color].b(); + cr = m_aga_palette[color].r(); + cg = m_aga_palette[color].g(); + cb = m_aga_palette[color].b(); if (BIT(CUSTOM_REG(REG_BPLCON3),9)) { // load low nibbles @@ -64,7 +67,7 @@ void amiga_aga_palette_write(running_machine &machine, int color_reg, uint16_t d cg = (g << 4) | g; cb = (b << 4) | b; } - aga_palette[color] = rgb_t(cr,cg,cb); + m_aga_palette[color] = rgb_t(cr,cg,cb); } /************************************* @@ -89,54 +92,54 @@ VIDEO_START_MEMBER(amiga_state,amiga_aga) * *************************************/ -static inline void fetch_sprite_data(amiga_state *state, int scanline, int sprite) +void amiga_state::aga_fetch_sprite_data(int scanline, int sprite) { switch((CUSTOM_REG(REG_FMODE) >> 2) & 0x03) { case 0: - state->m_aga_sprdata[sprite][0] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - state->m_aga_sprdatb[sprite][0] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + m_aga_sprdata[sprite][0] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + m_aga_sprdatb[sprite][0] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - state->m_aga_sprite_fetched_words = 1; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d fetch: data=%04X-%04X\n", scanline, sprite, state->m_aga_sprdata[sprite][0], state->m_aga_sprdatb[sprite][0]); + m_aga_sprite_fetched_words = 1; + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X\n", scanline, sprite, m_aga_sprdata[sprite][0], m_aga_sprdatb[sprite][0]); break; case 1: case 2: - state->m_aga_sprdata[sprite][0] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - state->m_aga_sprdata[sprite][1] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + m_aga_sprdata[sprite][0] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + m_aga_sprdata[sprite][1] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - state->m_aga_sprdatb[sprite][0] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - state->m_aga_sprdatb[sprite][1] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + m_aga_sprdatb[sprite][0] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + m_aga_sprdatb[sprite][1] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - state->m_aga_sprite_fetched_words = 2; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d fetch: data=%04X-%04X %04X-%04X\n", scanline, sprite, state->m_aga_sprdata[sprite][0], state->m_aga_sprdatb[sprite][0], state->m_aga_sprdata[sprite][1], state->m_aga_sprdatb[sprite][1] ); + m_aga_sprite_fetched_words = 2; + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X %04X-%04X\n", scanline, sprite, m_aga_sprdata[sprite][0], m_aga_sprdatb[sprite][0], m_aga_sprdata[sprite][1], m_aga_sprdatb[sprite][1] ); break; case 3: - state->m_aga_sprdata[sprite][0] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - state->m_aga_sprdata[sprite][1] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + m_aga_sprdata[sprite][0] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + m_aga_sprdata[sprite][1] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - state->m_aga_sprdata[sprite][2] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - state->m_aga_sprdata[sprite][3] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + m_aga_sprdata[sprite][2] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + m_aga_sprdata[sprite][3] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - state->m_aga_sprdatb[sprite][0] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - state->m_aga_sprdatb[sprite][1] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + m_aga_sprdatb[sprite][0] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + m_aga_sprdatb[sprite][1] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - state->m_aga_sprdatb[sprite][2] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); - state->m_aga_sprdatb[sprite][3] = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); + m_aga_sprdatb[sprite][2] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 0); + m_aga_sprdatb[sprite][3] = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * sprite) += 4; - state->m_aga_sprite_fetched_words = 4; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d fetch: data=%04X-%04X %04X-%04X %04X-%04X %04X-%04X\n", + m_aga_sprite_fetched_words = 4; + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: data=%04X-%04X %04X-%04X %04X-%04X %04X-%04X\n", scanline, sprite, - state->m_aga_sprdata[sprite][0], state->m_aga_sprdatb[sprite][0], - state->m_aga_sprdata[sprite][1], state->m_aga_sprdatb[sprite][1], - state->m_aga_sprdata[sprite][2], state->m_aga_sprdatb[sprite][2], - state->m_aga_sprdata[sprite][3], state->m_aga_sprdatb[sprite][3]); + m_aga_sprdata[sprite][0], m_aga_sprdatb[sprite][0], + m_aga_sprdata[sprite][1], m_aga_sprdatb[sprite][1], + m_aga_sprdata[sprite][2], m_aga_sprdatb[sprite][2], + m_aga_sprdata[sprite][3], m_aga_sprdatb[sprite][3]); break; } - state->m_aga_sprite_dma_used_words[sprite] = 0; + m_aga_sprite_dma_used_words[sprite] = 0; } -static void update_sprite_dma(amiga_state *state, int scanline) +void amiga_state::aga_update_sprite_dma(int scanline) { int dmaenable = (CUSTOM_REG(REG_DMACON) & (DMACON_SPREN | DMACON_DMAEN)) == (DMACON_SPREN | DMACON_DMAEN); int num, maxdma; @@ -153,15 +156,15 @@ static void update_sprite_dma(amiga_state *state, int scanline) int vstart, vstop; /* if we are == VSTOP, fetch new control words */ - if (dmaenable && (state->m_sprite_dma_live_mask & bitmask) && (state->m_sprite_dma_reload_mask & bitmask) && !(state->m_sprite_ctl_written & bitmask)) + if (dmaenable && (m_sprite_dma_live_mask & bitmask) && (m_sprite_dma_reload_mask & bitmask) && !(m_sprite_ctl_written & bitmask)) { /* disable the sprite */ - state->m_sprite_comparitor_enable_mask &= ~bitmask; - state->m_sprite_dma_reload_mask &= ~bitmask; + m_sprite_comparitor_enable_mask &= ~bitmask; + m_sprite_dma_reload_mask &= ~bitmask; /* fetch data into the control words */ - CUSTOM_REG(REG_SPR0POS + 4 * num) = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 0); - CUSTOM_REG(REG_SPR0CTL + 4 * num) = state->chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 2); + CUSTOM_REG(REG_SPR0POS + 4 * num) = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 0); + CUSTOM_REG(REG_SPR0CTL + 4 * num) = chip_ram_r(CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) + 2); CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) += 4; /* fetch additional words */ switch((CUSTOM_REG(REG_FMODE) >> 2) & 0x03) @@ -176,7 +179,7 @@ static void update_sprite_dma(amiga_state *state, int scanline) CUSTOM_REG_LONG(REG_SPR0PTH + 2 * num) += 3*4; break; } - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d fetch: pos=%04X ctl=%04X\n", scanline, num, CUSTOM_REG(REG_SPR0POS + 4 * num), CUSTOM_REG(REG_SPR0CTL + 4 * num)); + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d fetch: pos=%04X ctl=%04X\n", scanline, num, CUSTOM_REG(REG_SPR0POS + 4 * num), CUSTOM_REG(REG_SPR0CTL + 4 * num)); } /* compute vstart/vstop */ @@ -186,25 +189,25 @@ static void update_sprite_dma(amiga_state *state, int scanline) /* if we hit vstart, enable the comparitor */ if (scanline == vstart) { - state->m_sprite_comparitor_enable_mask |= 1 << num; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d comparitor enable\n", scanline, num); + m_sprite_comparitor_enable_mask |= 1 << num; + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d comparitor enable\n", scanline, num); } /* if we hit vstop, disable the comparitor and trigger a reload for the next scanline */ if (scanline == vstop) { - state->m_sprite_ctl_written &= ~bitmask; - state->m_sprite_comparitor_enable_mask &= ~bitmask; - state->m_sprite_dma_reload_mask |= 1 << num; + m_sprite_ctl_written &= ~bitmask; + m_sprite_comparitor_enable_mask &= ~bitmask; + m_sprite_dma_reload_mask |= 1 << num; CUSTOM_REG(REG_SPR0DATA + 4 * num) = 0; /* just a guess */ CUSTOM_REG(REG_SPR0DATB + 4 * num) = 0; - if (LOG_SPRITE_DMA) state->logerror("%3d:sprite %d comparitor disable, prepare for reload\n", scanline, num); + if (LOG_SPRITE_DMA) logerror("%3d:sprite %d comparitor disable, prepare for reload\n", scanline, num); } /* fetch data if this sprite is enabled */ - if (dmaenable && (state->m_sprite_dma_live_mask & bitmask) && (state->m_sprite_comparitor_enable_mask & bitmask)) + if (dmaenable && (m_sprite_dma_live_mask & bitmask) && (m_sprite_comparitor_enable_mask & bitmask)) { - fetch_sprite_data(state, scanline, num); + aga_fetch_sprite_data(scanline, num); } } } @@ -217,49 +220,42 @@ static void update_sprite_dma(amiga_state *state, int scanline) * *************************************/ -static inline uint32_t interleave_sprite_data(uint16_t lobits, uint16_t hibits) -{ - return (amiga_expand_byte[lobits & 0xff] << 0) | (amiga_expand_byte[lobits >> 8] << 16) | - (amiga_expand_byte[hibits & 0xff] << 1) | (amiga_expand_byte[hibits >> 8] << 17); -} - - -static int get_sprite_pixel(amiga_state *state, int x) +int amiga_state::aga_get_sprite_pixel(int x) { int pixels = 0; int num, pair; /* loop over sprite channels */ for (num = 0; num < 8; num++) - if (state->m_sprite_comparitor_enable_mask & (1 << num)) + if (m_sprite_comparitor_enable_mask & (1 << num)) { /* if we're not currently clocking, check against hstart */ - if (state->m_sprite_remain[num] == 0) + if (m_sprite_remain[num] == 0) { int hstart = ((CUSTOM_REG(REG_SPR0POS + 4 * num) & 0xff) << 1) | (CUSTOM_REG(REG_SPR0CTL + 4 * num) & 1); if (hstart == x) { - state->m_sprite_remain[num] = 16; - state->m_sprite_shiftreg[num] = interleave_sprite_data(state->m_aga_sprdata[num][0], state->m_aga_sprdatb[num][0]); - state->m_aga_sprite_dma_used_words[num] = 1; + m_sprite_remain[num] = 16; + m_sprite_shiftreg[num] = interleave_sprite_data(m_aga_sprdata[num][0], m_aga_sprdatb[num][0]); + m_aga_sprite_dma_used_words[num] = 1; } } /* clock the next pixel if we're doing it */ - if (state->m_sprite_remain[num] != 0) + if (m_sprite_remain[num] != 0) { - state->m_sprite_remain[num]--; - pixels |= (state->m_sprite_shiftreg[num] & 0xc0000000) >> (16 + 2 * (7 - num)); - state->m_sprite_shiftreg[num] <<= 2; + m_sprite_remain[num]--; + pixels |= (m_sprite_shiftreg[num] & 0xc0000000) >> (16 + 2 * (7 - num)); + m_sprite_shiftreg[num] <<= 2; - if (state->m_sprite_remain[num] == 0) + if (m_sprite_remain[num] == 0) { - if (state->m_aga_sprite_dma_used_words[num] < state->m_aga_sprite_fetched_words) + if (m_aga_sprite_dma_used_words[num] < m_aga_sprite_fetched_words) { - int w = state->m_aga_sprite_dma_used_words[num]; - state->m_sprite_remain[num] = 16; - state->m_sprite_shiftreg[num] = interleave_sprite_data(state->m_aga_sprdata[num][w], state->m_aga_sprdatb[num][w]); - state->m_aga_sprite_dma_used_words[num]++; + int w = m_aga_sprite_dma_used_words[num]; + m_sprite_remain[num] = 16; + m_sprite_shiftreg[num] = interleave_sprite_data(m_aga_sprdata[num][w], m_aga_sprdatb[num][w]); + m_aga_sprite_dma_used_words[num]++; } } } @@ -332,9 +328,9 @@ static int get_sprite_pixel(amiga_state *state, int x) * *************************************/ -static inline uint8_t assemble_odd_bitplanes(amiga_state *state, int planes, int obitoffs) +uint8_t amiga_state::aga_assemble_odd_bitplanes(int planes, int obitoffs) { - uint64_t *aga_bpldat = state->m_aga_bpldat; + uint64_t *aga_bpldat = m_aga_bpldat; uint8_t pix = (aga_bpldat[0] >> obitoffs) & 1; if (planes >= 3) { @@ -350,12 +346,12 @@ static inline uint8_t assemble_odd_bitplanes(amiga_state *state, int planes, int } -static inline uint8_t assemble_even_bitplanes(amiga_state *state, int planes, int ebitoffs) +uint8_t amiga_state::aga_assemble_even_bitplanes(int planes, int ebitoffs) { uint8_t pix = 0; if (planes >= 2) { - uint64_t *aga_bpldat = state->m_aga_bpldat; + uint64_t *aga_bpldat = m_aga_bpldat; pix |= ((aga_bpldat[1] >> ebitoffs) & 1) << 1; if (planes >= 4) { @@ -371,31 +367,31 @@ static inline uint8_t assemble_even_bitplanes(amiga_state *state, int planes, in return pix; } -static inline void fetch_bitplane_data(amiga_state *state, int plane) +void amiga_state::aga_fetch_bitplane_data(int plane) { - uint64_t *aga_bpldat = state->m_aga_bpldat; + uint64_t *aga_bpldat = m_aga_bpldat; switch (CUSTOM_REG(REG_FMODE) & 0x03) { case 0: - aga_bpldat[plane] = (uint64_t)state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)); + aga_bpldat[plane] = (uint64_t)chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)); CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; break; case 1: case 2: - aga_bpldat[plane] = (uint64_t)state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)) << 16; + aga_bpldat[plane] = (uint64_t)chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)) << 16; CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; - aga_bpldat[plane] |= ((uint64_t)state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2))); + aga_bpldat[plane] |= ((uint64_t)chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2))); CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; break; case 3: - aga_bpldat[plane] = (uint64_t)state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)) << 48; + aga_bpldat[plane] = (uint64_t)chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)) << 48; CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; - aga_bpldat[plane] |= ((uint64_t)state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2))) << 32; + aga_bpldat[plane] |= ((uint64_t)chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2))) << 32; CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; - aga_bpldat[plane] |= ((uint64_t)state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2))) << 16; + aga_bpldat[plane] |= ((uint64_t)chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2))) << 16; CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; - aga_bpldat[plane] |= (uint64_t)state->chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)); + aga_bpldat[plane] |= (uint64_t)chip_ram_r(CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2)); CUSTOM_REG_LONG(REG_BPL1PTH + plane * 2) += 2; break; } @@ -409,27 +405,27 @@ static inline void fetch_bitplane_data(amiga_state *state, int plane) * *************************************/ -static inline rgb_t update_ham(amiga_state *state, int newpix) +rgb_t amiga_state::aga_update_ham(int newpix) { switch (newpix & 0x03) { case 0: - state->m_ham_color = state->m_aga_palette[(newpix >> 2) & 0x3f]; + m_ham_color = m_aga_palette[(newpix >> 2) & 0x3f]; break; case 1: - state->m_ham_color = rgb_t(state->m_ham_color.r(), state->m_ham_color.g(), (newpix & 0xfc) | (state->m_ham_color.b() & 0x03)); + m_ham_color = rgb_t(m_ham_color.r(), m_ham_color.g(), (newpix & 0xfc) | (m_ham_color.b() & 0x03)); break; case 2: - state->m_ham_color = rgb_t((newpix & 0xfc) | (state->m_ham_color.r() & 0x03), state->m_ham_color.g(), state->m_ham_color.b()); + m_ham_color = rgb_t((newpix & 0xfc) | (m_ham_color.r() & 0x03), m_ham_color.g(), m_ham_color.b()); break; case 3: - state->m_ham_color = rgb_t(state->m_ham_color.r(), (newpix & 0xfc) | (state->m_ham_color.g() & 0x03), state->m_ham_color.b()); + m_ham_color = rgb_t(m_ham_color.r(), (newpix & 0xfc) | (m_ham_color.g() & 0x03), m_ham_color.b()); break; } - return state->m_ham_color; + return m_ham_color; } @@ -442,7 +438,6 @@ static inline rgb_t update_ham(amiga_state *state, int newpix) void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) { - amiga_state *state = this; uint16_t save_color0 = CUSTOM_REG(REG_COLOR00); int ddf_start_pixel = 0, ddf_stop_pixel = 0; int hires = 0, dualpf = 0, ham = 0; @@ -469,7 +464,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) if (CUSTOM_REG(REG_BPLCON0) & BPLCON0_LACE) CUSTOM_REG(REG_VPOSR) ^= VPOSR_LOF; - amiga_copper_setpc(machine(), CUSTOM_REG_LONG(REG_COP1LCH)); + copper_setpc(CUSTOM_REG_LONG(REG_COP1LCH)); m_ham_color = CUSTOM_REG(REG_COLOR00); } @@ -501,7 +496,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) m_last_scanline = scanline; /* update sprite data fetching */ - update_sprite_dma(state, scanline); + aga_update_sprite_dma(scanline); /* all sprites off at the start of the line */ memset(m_sprite_remain, 0, sizeof(m_sprite_remain)); @@ -521,7 +516,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) { /* execute the next batch, restoring and re-saving color 0 around it */ CUSTOM_REG(REG_COLOR00) = save_color0; - next_copper_x = amiga_copper_execute_next(machine(), x); + next_copper_x = copper_execute_next(x); save_color0 = CUSTOM_REG(REG_COLOR00); if (m_genlock_color != 0xffff) CUSTOM_REG(REG_COLOR00) = m_genlock_color; @@ -596,7 +591,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) } /* need to run the sprite engine every pixel to ensure display */ - sprpix = get_sprite_pixel(state, x); + sprpix = aga_get_sprite_pixel(x); /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */ /* vertical display window */ @@ -613,12 +608,12 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) { for (pl = 0; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + aga_fetch_bitplane_data(pl); } } /* now assemble the bits */ - pfpix0 |= assemble_odd_bitplanes(state, planes, obitoffs); + pfpix0 |= aga_assemble_odd_bitplanes(planes, obitoffs); obitoffs--; /* for high res, assemble a second set of bits */ @@ -631,11 +626,11 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) for (pl = 0; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + aga_fetch_bitplane_data(pl); } } - pfpix1 |= assemble_odd_bitplanes(state, planes, obitoffs); + pfpix1 |= aga_assemble_odd_bitplanes(planes, obitoffs); obitoffs--; } else @@ -654,12 +649,12 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) { for (pl = 1; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + aga_fetch_bitplane_data(pl); } } /* now assemble the bits */ - pfpix0 |= assemble_even_bitplanes(state, planes, ebitoffs); + pfpix0 |= aga_assemble_even_bitplanes(planes, ebitoffs); ebitoffs--; /* for high res, assemble a second set of bits */ @@ -672,11 +667,11 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) for (pl = 1; pl < planes; pl += 2) { - fetch_bitplane_data(state, pl); + aga_fetch_bitplane_data(pl); } } - pfpix1 |= assemble_even_bitplanes(state, planes, ebitoffs); + pfpix1 |= aga_assemble_even_bitplanes(planes, ebitoffs); ebitoffs--; } else @@ -714,7 +709,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) if (ham) { /* update the HAM color */ - pfpix0 = update_ham(state, pfpix0); + pfpix0 = aga_update_ham(pfpix0); pix = sprpix & 0xff; pri = (sprpix >> 10);