summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/amiga/amiga.h3
-rw-r--r--src/mame/amiga/amiga_m.cpp34
-rw-r--r--src/mame/amiga/amigaaga.cpp24
3 files changed, 38 insertions, 23 deletions
diff --git a/src/mame/amiga/amiga.h b/src/mame/amiga/amiga.h
index dbf98b71aa5..3120c4ddf50 100644
--- a/src/mame/amiga/amiga.h
+++ b/src/mame/amiga/amiga.h
@@ -660,7 +660,8 @@ private:
void render_scanline(bitmap_rgb32 &bitmap, int scanline);
// AGA video helpers
- void aga_palette_write(int color_reg, uint16_t data);
+ u16 aga_palette_read(offs_t color_reg);
+ void aga_palette_write(offs_t 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 num);
diff --git a/src/mame/amiga/amiga_m.cpp b/src/mame/amiga/amiga_m.cpp
index 120c61c0780..fbce57267ec 100644
--- a/src/mame/amiga/amiga_m.cpp
+++ b/src/mame/amiga/amiga_m.cpp
@@ -1191,7 +1191,17 @@ void amiga_state::ocs_map(address_map &map)
// Sprite section
// map(0x120, 0x17f).m(amiga_state::sprxpt_map));
// Color section
-// map(0x180, 0x1bf).m(amiga_state::colorxx_map));
+ map(0x180, 0x1bf).lrw16(
+ NAME([this] (offs_t offset) {
+ return CUSTOM_REG(REG_COLOR00 + offset);
+ }),
+ NAME([this] (offs_t offset, u16 data) {
+ CUSTOM_REG(REG_COLOR00 + offset) = data;
+ data &= 0xfff;
+ // Extra Half-Brite
+ CUSTOM_REG(REG_COLOR00 + offset + 32) = (data >> 1) & 0x777;
+ })
+ );
}
void amiga_state::ecs_map(address_map &map)
@@ -1229,6 +1239,8 @@ void amiga_state::aga_map(address_map &map)
map(0x10e, 0x10f).w(FUNC(amiga_state::clxcon2_w));
+ map(0x180, 0x1bf).rw(FUNC(amiga_state::aga_palette_read), FUNC(amiga_state::aga_palette_write));
+
// UHRES regs
// TODO: may be shared with ECS?
// map(0x1e6, 0x1e7).w(FUNC(amiga_state::bplhmod_w));
@@ -1699,26 +1711,6 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data)
data &= ~1;
break;
- case REG_COLOR00: case REG_COLOR01: case REG_COLOR02: case REG_COLOR03:
- case REG_COLOR04: case REG_COLOR05: case REG_COLOR06: case REG_COLOR07:
- case REG_COLOR08: case REG_COLOR09: case REG_COLOR10: case REG_COLOR11:
- case REG_COLOR12: case REG_COLOR13: case REG_COLOR14: case REG_COLOR15:
- case REG_COLOR16: case REG_COLOR17: case REG_COLOR18: case REG_COLOR19:
- 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())
- {
- aga_palette_write(offset - REG_COLOR00, data);
- }
- else
- {
- data &= 0xfff;
- // Extra Half-Brite
- CUSTOM_REG(offset + 32) = (data >> 1) & 0x777;
- }
- break;
-
// display window start/stop
case REG_DIWSTRT:
case REG_DIWSTOP:
diff --git a/src/mame/amiga/amigaaga.cpp b/src/mame/amiga/amigaaga.cpp
index a108a430070..cd39030b37e 100644
--- a/src/mame/amiga/amigaaga.cpp
+++ b/src/mame/amiga/amigaaga.cpp
@@ -41,7 +41,26 @@ TODO:
*
*************************************/
-void amiga_state::aga_palette_write(int color_reg, uint16_t data)
+u16 amiga_state::aga_palette_read(offs_t color_reg)
+{
+ u8 pal_bank = (CUSTOM_REG(REG_BPLCON3) >> 13) & 0x07;
+
+ int color = (pal_bank * 32) + color_reg;
+
+ u8 cr = m_aga_palette[color].r();
+ u8 cg = m_aga_palette[color].g();
+ u8 cb = m_aga_palette[color].b();
+
+ // LOCT
+ if (BIT(CUSTOM_REG(REG_BPLCON3),9))
+ {
+ return ((cr & 0xf) << 8) | ((cg & 0xf) << 4) | ((cb & 0xf) << 0);
+ }
+
+ return ((cr & 0xf0) << 4) | (cg & 0xf0) | ((cb & 0xf0) >> 4);
+}
+
+void amiga_state::aga_palette_write(offs_t color_reg, uint16_t data)
{
int r,g,b;
int cr,cg,cb;
@@ -68,7 +87,9 @@ void amiga_state::aga_palette_write(int color_reg, uint16_t data)
cr = (r << 4) | r;
cg = (g << 4) | g;
cb = (b << 4) | b;
+ // TODO: transparency, bit 15
}
+
m_aga_palette[color] = rgb_t(cr, cg, cb);
// make a copy for Extra Half Brite mode
if (pal_bank == 0)
@@ -499,6 +520,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
CUSTOM_REG(REG_VPOSR) ^= VPOSR_LOF;
m_copper->vblank_sync(true);
+ // TODO: shouldn't be raw color ...
m_ham_color = CUSTOM_REG(REG_COLOR00);
}