mirror of
https://github.com/holub/mame
synced 2025-04-23 17:00:53 +03:00
amiga.cpp: End driver_data use; make all functions and tables members (nw)
This commit is contained in:
parent
a0d70d6d5b
commit
aed7f9b5c7
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user