amiga.cpp: End driver_data use; make all functions and tables members (nw)

This commit is contained in:
AJR 2017-12-20 21:10:34 -05:00
parent a0d70d6d5b
commit aed7f9b5c7
5 changed files with 315 additions and 330 deletions

View File

@ -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);
}

View File

@ -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 );

View File

@ -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;

View File

@ -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<amiga_state>();
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<amiga_state>();
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<amiga_state>();
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<amiga_state>();
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<amiga_state>();
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

View File

@ -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<amiga_state>();
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);