diff options
-rw-r--r-- | src/mame/video/avgdvg.cpp | 195 | ||||
-rw-r--r-- | src/mame/video/avgdvg.h | 11 |
2 files changed, 98 insertions, 108 deletions
diff --git a/src/mame/video/avgdvg.cpp b/src/mame/video/avgdvg.cpp index 4d554c8a863..27d57109897 100644 --- a/src/mame/video/avgdvg.cpp +++ b/src/mame/video/avgdvg.cpp @@ -29,13 +29,6 @@ #define VGVECTOR 0 #define VGCLIP 1 -#define OP0 (m_op & 1) -#define OP1 (m_op & 2) -#define OP2 (m_op & 4) -#define OP3 (m_op & 8) - -#define ST3 (m_state_latch & 8) - /************************************* * @@ -191,14 +184,14 @@ void avgdvg_device_base::vg_add_clip(int xmin, int ymin, int xmax, int ymax) void dvg_device::update_databus() // dvg_data { // DVG uses low bit of state for address - m_data = m_memspace->read_byte(m_membase | (m_pc << 1) | (m_state_latch & 1)); + m_data = m_memspace->read_byte(m_membase + (m_pc << 1) + (m_state_latch & 1)); } u8 dvg_device::state_addr() // dvg_state_addr { u8 addr = ((((m_state_latch >> 4) ^ 1) & 1) << 7) | (m_state_latch & 0xf); - if (OP3) + if (OP3()) addr |= ((m_op & 7) << 4); return addr; @@ -206,7 +199,7 @@ u8 dvg_device::state_addr() // dvg_state_addr int dvg_device::handler_0() // dvg_dmapush { - if (!OP0) + if (!OP0()) { m_sp = (m_sp + 1) & 0xf; m_stack[m_sp & 3] = m_pc; @@ -216,7 +209,7 @@ int dvg_device::handler_0() // dvg_dmapush int dvg_device::handler_1() // dvg_dmald { - if (OP0) + if (OP0()) { m_pc = m_stack[m_sp & 3]; m_sp = (m_sp - 1) & 0xf; @@ -262,11 +255,11 @@ int dvg_device::handler_2() //dvg_gostrobe int fin = 0xfff - (((2 << scale) & 0x7ff) ^ 0xfff); - /* Count up or down */ + // Count up or down const int dx = (m_dvx & 0x400) ? -1 : +1; const int dy = (m_dvy & 0x400) ? -1 : +1; - /* Scale factor for rate multipliers */ + // Scale factor for rate multipliers const int mx = (m_dvx << 2) & 0xfff; const int my = (m_dvy << 2) & 0xfff; @@ -315,15 +308,12 @@ int dvg_device::handler_2() //dvg_gostrobe if (countx) { - /* Is y valid and x entering or leaving the valid range? */ - if (((m_ypos & 0x400) == 0) - && ((m_xpos ^ (m_xpos + dx)) & 0x400)) + // Is y valid and x entering or leaving the valid range? + if (!(m_ypos & 0x400) && ((m_xpos ^ (m_xpos + dx)) & 0x400)) { - if ((m_xpos + dx) & 0x400) - /* We are leaving the valid range */ + if ((m_xpos + dx) & 0x400) // We are leaving the valid range dvg_draw_to(m_xpos, m_ypos, m_intensity); - else - /* We are entering the valid range */ + else // We are entering the valid range dvg_draw_to((m_xpos + dx) & 0xfff, m_ypos, 0); } m_xpos = (m_xpos + dx) & 0xfff; @@ -331,10 +321,9 @@ int dvg_device::handler_2() //dvg_gostrobe if (county) { - if (((m_xpos & 0x400) == 0) - && ((m_ypos ^ (m_ypos + dy)) & 0x400)) + if (!(m_xpos & 0x400) && ((m_ypos ^ (m_ypos + dy)) & 0x400)) { - if ((m_xpos & 0x400) == 0) + if (!(m_xpos & 0x400)) { if ((m_ypos + dy) & 0x400) dvg_draw_to(m_xpos, m_ypos, m_intensity); @@ -344,7 +333,6 @@ int dvg_device::handler_2() //dvg_gostrobe } m_ypos = (m_ypos + dy) & 0xfff; } - } dvg_draw_to(m_xpos, m_ypos, m_intensity); @@ -354,9 +342,9 @@ int dvg_device::handler_2() //dvg_gostrobe int dvg_device::handler_3() // dvg_haltstrobe { - m_halt = OP0; + m_halt = OP0(); - if (!OP0) + if (!OP0()) { m_xpos = m_dvx & 0xfff; m_ypos = m_dvy & 0xfff; @@ -367,7 +355,7 @@ int dvg_device::handler_3() // dvg_haltstrobe int dvg_device::handler_7() // dvg_latch3 { - m_dvx = (m_dvx & 0xff) | ((m_data & 0xf) << 8); + m_dvx = (m_dvx & 0xff) | ((m_data & 0xf) << 8); m_intensity = m_data >> 4; return 0; } @@ -378,7 +366,7 @@ int dvg_device::handler_6() // dvg_latch2 if (m_op != 0xf) m_dvx = (m_dvx & 0xf00) | m_data; - if ((m_op & 0xa) == 0xa) + if (OP1() && OP3()) m_scale = m_intensity; m_pc++; @@ -387,8 +375,7 @@ int dvg_device::handler_6() // dvg_latch2 int dvg_device::handler_5() // dvg_latch1 { - m_dvy = (m_dvy & 0xff) - | ((m_data & 0xf) << 8); + m_dvy = (m_dvy & 0xff) | ((m_data & 0xf) << 8); m_op = m_data >> 4; if (m_op == 0xf) @@ -440,14 +427,14 @@ void dvg_device::vgrst() // dvg_vgrst u8 avg_device::state_addr() // avg_state_addr { return (((m_state_latch >> 4) ^ 1) << 7) - | (m_op << 4) - | (m_state_latch & 0xf); + | (m_op << 4) + | (m_state_latch & 0xf); } void avg_device::update_databus() // avg_data { - m_data = m_memspace->read_byte(m_membase | (m_pc ^ 1)); + m_data = m_memspace->read_byte(m_membase + (m_pc ^ 1)); } void avg_device::vggo() // avg_vggo @@ -479,8 +466,7 @@ int avg_device::handler_1() // avg_latch1 m_op = m_data >> 5; m_int_latch = 0; - m_dvy = (m_dvy12 << 12) - | ((m_data & 0xf) << 8); + m_dvy = (m_dvy12 << 12) | ((m_data & 0xf) << 8); m_dvx = 0; m_pc++; @@ -499,8 +485,8 @@ int avg_device::handler_3() // avg_latch3 { m_int_latch = m_data >> 4; m_dvx = ((m_int_latch & 1) << 12) - | ((m_data & 0xf) << 8) - | (m_dvx & 0xff); + | ((m_data & 0xf) << 8) + | (m_dvx & 0xff); m_pc++; return 0; @@ -508,7 +494,7 @@ int avg_device::handler_3() // avg_latch3 int avg_device::handler_4() // avg_strobe0 { - if (OP0) + if (OP0()) { m_stack[m_sp & 3] = m_pc; } @@ -534,10 +520,10 @@ int avg_device::handler_4() // avg_strobe0 m_dvy = (m_dvy & 0x1000) | ((m_dvy << 1) & 0x1fff); m_dvx = (m_dvx & 0x1000) | ((m_dvx << 1) & 0x1fff); m_timer >>= 1; - m_timer |= 0x4000 | (OP1 << 6); + m_timer |= 0x4000 | (OP1() << 7); } - if (OP1) + if (OP1()) m_timer &= 0xff; } @@ -547,9 +533,9 @@ int avg_device::handler_4() // avg_strobe0 int avg_device::avg_common_strobe1() { - if (OP2) + if (OP2()) { - if (OP1) + if (OP1()) m_sp = (m_sp - 1) & 0xf; else m_sp = (m_sp + 1) & 0xf; @@ -559,14 +545,14 @@ int avg_device::avg_common_strobe1() int avg_device::handler_5() // avg_strobe1 { - if (!OP2) + if (!OP2()) { for (int i = m_bin_scale; i > 0; i--) { m_timer >>= 1; - m_timer |= 0x4000 | (OP1 << 6); + m_timer |= 0x4000 | (OP1() << 7); } - if (OP1) + if (OP1()) m_timer &= 0xff; } @@ -576,9 +562,9 @@ int avg_device::handler_5() // avg_strobe1 int avg_device::avg_common_strobe2() { - if (OP2) + if (OP2()) { - if (OP0) + if (OP0()) { m_pc = m_dvy << 1; @@ -625,7 +611,7 @@ int avg_device::avg_common_strobe2() int avg_device::handler_6() // avg_strobe2 { - if (!OP2 && !m_dvy12) + if (!OP2() && !m_dvy12) { m_color = m_dvy & 0x7; m_intensity = (m_dvy >> 4) & 0xf; @@ -638,11 +624,11 @@ int avg_device::avg_common_strobe3() { int cycles = 0; - m_halt = OP0; + m_halt = OP0(); - if ((m_op & 5) == 0) + if (!OP0() && !OP2()) { - if (OP1) + if (OP1()) { cycles = 0x100 - (m_timer & 0xff); } @@ -655,7 +641,8 @@ int avg_device::avg_common_strobe3() m_xpos += ((((m_dvx >> 3) ^ m_xdac_xor) - 0x200) * cycles * (m_scale ^ 0xff)) >> 4; m_ypos -= ((((m_dvy >> 3) ^ m_ydac_xor) - 0x200) * cycles * (m_scale ^ 0xff)) >> 4; } - if (OP2) + + if (OP2()) { cycles = 0x8000 - m_timer; m_timer = 0; @@ -671,10 +658,13 @@ int avg_device::handler_7() // avg_strobe3 { const int cycles = avg_common_strobe3(); - if ((m_op & 5) == 0) + if (!OP0() && !OP2()) { - vg_add_point_buf(m_xpos, m_ypos, vector_device::color111(m_color), - (((m_int_latch >> 1) == 1)? m_intensity: m_int_latch & 0xe) << 4); + vg_add_point_buf( + m_xpos, + m_ypos, + vector_device::color111(m_color), + (((m_int_latch >> 1) == 1) ? m_intensity : m_int_latch & 0xe) << 4); } return cycles; @@ -688,7 +678,7 @@ int avg_device::handler_7() // avg_strobe3 int avg_tempest_device::handler_6() // tempest_strobe2 { - if (!OP2 && !m_dvy12) + if (!OP2() && !m_dvy12) { // Contrary to previous documentation in MAME, Tempest does not have the m_enspkl bit. if (m_dvy & 0x800) @@ -704,7 +694,7 @@ int avg_tempest_device::handler_7() // tempest_strobe3 { const int cycles = avg_common_strobe3(); - if ((m_op & 5) == 0) + if (!OP0() && !OP2()) { const u8 data = m_colorram[m_color]; const u8 bit3 = BIT(~data, 3); @@ -765,7 +755,7 @@ int avg_mhavoc_device::handler_1() // mhavoc_latch1 int avg_mhavoc_device::handler_6() // mhavoc_strobe2 { - if (!OP2) + if (!OP2()) { if (m_dvy12) { @@ -781,11 +771,7 @@ int avg_mhavoc_device::handler_6() // mhavoc_strobe2 if (m_dvy & 0x800) { m_enspkl = 1; - m_spkl_shift = ((m_dvy >> 3) & 1) - | ((m_dvy >> 1) & 2) - | ((m_dvy << 1) & 4) - | ((m_dvy << 2) & 8) - | ((machine().rand() & 0x7) << 4); + m_spkl_shift = bitswap<4>(m_dvy, 1, 1, 2, 3) | ((machine().rand() & 0x7) << 4); } else { @@ -805,12 +791,12 @@ int avg_mhavoc_device::handler_6() // mhavoc_strobe2 int avg_mhavoc_device::handler_7() // mhavoc_strobe3 { - m_halt = OP0; + m_halt = OP0(); int cycles = 0; - if ((m_op & 5) == 0) + if (!OP0() && !OP2()) { - if (OP1) + if (OP1()) { cycles = 0x100 - (m_timer & 0xff); } @@ -869,7 +855,8 @@ int avg_mhavoc_device::handler_7() // mhavoc_strobe3 (((m_int_latch >> 1) == 1) ? m_intensity : m_int_latch & 0xe) << 4); } } - if (OP2) + + if (OP2()) { cycles = 0x8000 - m_timer; m_timer = 0; @@ -886,7 +873,7 @@ void avg_mhavoc_device::update_databus() // mhavoc_data if (m_pc & 0x2000) m_data = m_bank_region[(m_map << 13) | ((m_pc ^ 1) & 0x1fff)]; else - m_data = m_memspace->read_byte(m_membase | (m_pc ^ 1)); + m_data = m_memspace->read_byte(m_membase + (m_pc ^ 1)); } void avg_mhavoc_device::vgrst() // mhavoc_vgrst @@ -904,12 +891,12 @@ void avg_mhavoc_device::vgrst() // mhavoc_vgrst void avg_starwars_device::update_databus() // starwars_data { - m_data = m_memspace->read_byte(m_membase | m_pc); + m_data = m_memspace->read_byte(m_membase + m_pc); } int avg_starwars_device::handler_6() // starwars_strobe2 { - if (!OP2 && !m_dvy12) + if (!OP2() && !m_dvy12) { m_intensity = m_dvy & 0xff; m_color = (m_dvy >> 8) & 0xf; @@ -922,7 +909,7 @@ int avg_starwars_device::handler_7() // starwars_strobe3 { const int cycles = avg_common_strobe3(); - if ((m_op & 5) == 0) + if (!OP0() && !OP2()) { vg_add_point_buf( m_xpos, @@ -942,7 +929,7 @@ int avg_starwars_device::handler_7() // starwars_strobe3 void avg_quantum_device::update_databus() // quantum_data { - m_data = m_memspace->read_word(m_membase | m_pc); + m_data = m_memspace->read_word(m_membase + m_pc); } void avg_quantum_device::vggo() // tempest_vggo @@ -1001,7 +988,7 @@ int avg_quantum_device::handler_3() // quantum_latch3 int avg_quantum_device::handler_4() // quantum_strobe0 { - if (OP0) + if (OP0()) { m_stack[m_sp & 3] = m_pc; } @@ -1025,7 +1012,7 @@ int avg_quantum_device::handler_4() // quantum_strobe0 int avg_quantum_device::handler_5() // quantum_strobe1 { - if (!OP2) + if (!OP2()) { for (int i = m_bin_scale; i > 0; i--) { @@ -1039,7 +1026,7 @@ int avg_quantum_device::handler_5() // quantum_strobe1 int avg_quantum_device::handler_6() // quantum_strobe2 { - if (!OP2 && !m_dvy12 && (m_dvy & 0x800)) + if (!OP2() && !m_dvy12 && (m_dvy & 0x800)) { m_color = m_dvy & 0xf; m_intensity = (m_dvy >> 4) & 0xf; @@ -1052,9 +1039,9 @@ int avg_quantum_device::handler_7() // quantum_strobe3 { int cycles = 0; - m_halt = OP0; + m_halt = OP0(); - if ((m_op & 5) == 0) + if (!OP0() && !OP2()) { const u16 data = m_colorram[m_color]; const u8 bit3 = BIT(~data, 3); @@ -1083,7 +1070,7 @@ int avg_quantum_device::handler_7() // quantum_strobe3 rgb_t(r, g, b), ((m_int_latch == 2) ? m_intensity : m_int_latch) << 4); } - if (OP2) + if (OP2()) { cycles = 0x4000 - m_timer; m_timer = 0; @@ -1130,7 +1117,7 @@ int avg_bzone_device::handler_1() // bzone_latch1 int avg_bzone_device::handler_6() // bzone_strobe2 { - if (!OP2 && !m_dvy12) + if (!OP2() && !m_dvy12) { m_intensity = (m_dvy >> 4) & 0xf; @@ -1153,13 +1140,16 @@ int avg_bzone_device::handler_6() // bzone_strobe2 int avg_bzone_device::handler_7() // bzone_strobe3 { - /* Battle Zone is B/W */ + // Battle Zone is B/W const int cycles = avg_common_strobe3(); - if ((m_op & 5) == 0) + if (!OP0() && !OP2()) { - vg_add_point_buf(m_xpos, m_ypos, vector_device::color111(7), - (((m_int_latch >> 1) == 1)? m_intensity: m_int_latch & 0xe) << 4); + vg_add_point_buf( + m_xpos, + m_ypos, + vector_device::color111(7), + (((m_int_latch >> 1) == 1) ? m_intensity : m_int_latch & 0xe) << 4); } return cycles; @@ -1206,7 +1196,7 @@ TIMER_CALLBACK_MEMBER(avgdvg_device_base::run_state_machine) // Get next state m_state_latch = (m_state_latch & 0x10) | (m_prom[state_addr()] & 0xf); - if (ST3) + if (ST3()) { // Read vector RAM/ROM update_databus(); @@ -1420,32 +1410,25 @@ avgdvg_device_base::avgdvg_device_base(const machine_config &mconfig, device_typ m_vector(*this, finder_base::DUMMY_TAG), m_memspace(*this, finder_base::DUMMY_TAG, -1), m_membase(0), + m_nvect(0), + m_pc(0), + m_sp(0), + m_dvx(0), + m_dvy(0), + m_stack{ 0, 0, 0, 0 }, + m_data(0), + m_state_latch(0), + m_scale(0), + m_intensity(0), + m_op(0), + m_halt(0), + m_sync_halt(0), + m_xpos(0), + m_ypos(0), m_prom(*this, "prom"), m_vg_run_timer(nullptr), m_vg_halt_timer(nullptr) { - m_pc = 0; - m_sp = 0; - m_dvx = 0; - m_dvy = 0; - m_stack[0] = 0; - m_stack[1] = 0; - m_stack[2] = 0; - m_stack[3] = 0; - m_data = 0; - - m_state_latch = 0; - m_scale = 0; - m_intensity = 0; - - m_op = 0; - m_halt = 0; - m_sync_halt = 0; - - m_xpos = 0; - m_ypos = 0; - - m_nvect = 0; } dvg_device::dvg_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : diff --git a/src/mame/video/avgdvg.h b/src/mame/video/avgdvg.h index 3d8431e182c..c4d0b8156da 100644 --- a/src/mame/video/avgdvg.h +++ b/src/mame/video/avgdvg.h @@ -62,6 +62,13 @@ protected: virtual void vggo() = 0; virtual void vgrst() = 0; + u8 OP0() const { return BIT(m_op, 0); } + u8 OP1() const { return BIT(m_op, 1); } + u8 OP2() const { return BIT(m_op, 2); } + u8 OP3() const { return BIT(m_op, 3); } + + u8 ST3() const { return BIT(m_state_latch, 3); } + void apply_flipping(int &x, int &y) const; void vg_set_halt(int dummy); @@ -76,8 +83,6 @@ protected: int m_xmin, m_ymin; int m_xcenter, m_ycenter; - bool m_flip_x, m_flip_y; - int m_nvect; vgvector m_vectbuf[MAXVECT]; @@ -105,6 +110,8 @@ private: required_region_ptr<u8> m_prom; emu_timer *m_vg_run_timer, *m_vg_halt_timer; + + bool m_flip_x, m_flip_y; }; |