summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/segag80v.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/includes/segag80v.h')
-rw-r--r--src/mame/includes/segag80v.h137
1 files changed, 98 insertions, 39 deletions
diff --git a/src/mame/includes/segag80v.h b/src/mame/includes/segag80v.h
index dd247ac859c..7f5fc5d007f 100644
--- a/src/mame/includes/segag80v.h
+++ b/src/mame/includes/segag80v.h
@@ -6,7 +6,10 @@
*************************************************************************/
-#include "audio/segasnd.h"
+#include "audio/segaspeech.h"
+#include "audio/segausb.h"
+#include "audio/segag80.h"
+#include "cpu/z80/z80.h"
#include "machine/segag80.h"
#include "sound/ay8910.h"
#include "sound/samples.h"
@@ -14,20 +17,45 @@
#include "screen.h"
-class segag80v_state : public segag80snd_common
+#define CPU_CLOCK 8000000 /* not used when video boards are connected */
+#define VIDEO_CLOCK 15468480
+
+class segag80v_state : public driver_device
{
public:
- segag80v_state(const machine_config &mconfig, device_type type, const char *tag)
- : segag80snd_common(mconfig, type, tag),
+ segag80v_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_mainrom(*this, "maincpu"),
m_mainram(*this, "mainram"),
m_vectorram(*this, "vectorram"),
m_maincpu(*this, "maincpu"),
m_samples(*this, "samples"),
- m_speech(*this, "segaspeech"),
+ m_speech(*this, "speech"),
m_usb(*this, "usbsnd"),
+ m_g80_audio(*this, "g80sound"),
m_aysnd(*this, "aysnd"),
m_vector(*this, "vector"),
- m_screen(*this, "screen")
+ m_screen(*this, "screen"),
+ m_d7d6(*this, "D7D6"),
+ m_d5d4(*this, "D5D4"),
+ m_d3d2(*this, "D3D2"),
+ m_d1d0(*this, "D1D0"),
+ m_fc(*this, "FC"),
+ m_coins(*this, "COINS"),
+ m_spinner(*this, "SPINNER"),
+ m_mult_data{0,0},
+ m_mult_result(0),
+ m_spinner_select(0),
+ m_spinner_sign(0),
+ m_spinner_count(0),
+ m_coin_ff_state(0),
+ m_coin_last_state(0),
+ m_edgint_ff_state(0),
+ m_scrambled_write_pc(0),
+ m_decrypt(nullptr),
+ m_min_x(0),
+ m_min_y(0),
+ m_draw_end_time(attotime::zero)
{ }
void g80v_base(machine_config &config);
@@ -37,6 +65,7 @@ public:
void zektor(machine_config &config);
void spacfury(machine_config &config);
+ void init_waitstates();
void init_zektor();
void init_startrek();
void init_elim4();
@@ -44,59 +73,89 @@ public:
void init_tacscan();
void init_spacfury();
- DECLARE_INPUT_CHANGED_MEMBER(service_switch);
DECLARE_READ_LINE_MEMBER(elim4_joint_coin_r);
+ DECLARE_READ_LINE_MEMBER(draw_r);
+ DECLARE_WRITE_LINE_MEMBER(service_switch_w);
+ DECLARE_WRITE_LINE_MEMBER(irq_ack_w);
+
+ template<int _Index>
+ DECLARE_WRITE_LINE_MEMBER( coin_w )
+ {
+ const u8 mask = 1 << _Index;
+
+ if (state == 0 && (m_coin_last_state & mask) != 0)
+ m_coin_ff_state |= mask;
+ else
+ m_coin_ff_state &= ~mask;
+
+ if (state)
+ m_coin_last_state |= mask;
+ else
+ m_coin_last_state &= ~mask;
+
+ update_int();
+ }
private:
- required_shared_ptr<uint8_t> m_mainram;
- required_shared_ptr<uint8_t> m_vectorram;
+ required_memory_region m_mainrom;
+ required_shared_ptr<u8> m_mainram;
+ required_shared_ptr<u8> m_vectorram;
- required_device<cpu_device> m_maincpu;
+ required_device<z80_device> m_maincpu;
optional_device<samples_device> m_samples;
- optional_device<speech_sound_device> m_speech;
+ optional_device<sega_speech_device> m_speech;
optional_device<usb_sound_device> m_usb;
+ optional_device<segag80_audio_device> m_g80_audio;
optional_device<ay8912_device> m_aysnd;
required_device<vector_device> m_vector;
required_device<screen_device> m_screen;
-
- uint8_t m_mult_data[2];
- uint16_t m_mult_result;
- uint8_t m_spinner_select;
- uint8_t m_spinner_sign;
- uint8_t m_spinner_count;
+ required_ioport m_d7d6;
+ required_ioport m_d5d4;
+ required_ioport m_d3d2;
+ required_ioport m_d1d0;
+ required_ioport m_fc;
+ optional_ioport m_coins;
+ optional_ioport m_spinner;
+
+ u8 m_mult_data[2];
+ u16 m_mult_result;
+ u8 m_spinner_select;
+ u8 m_spinner_sign;
+ u8 m_spinner_count;
+ u8 m_coin_ff_state;
+ u8 m_coin_last_state;
+ u8 m_edgint_ff_state;
offs_t m_scrambled_write_pc;
segag80_decrypt_func m_decrypt;
int m_min_x;
int m_min_y;
- uint8_t g80v_opcode_r(offs_t offset);
- void mainram_w(offs_t offset, uint8_t data);
- void vectorram_w(offs_t offset, uint8_t data);
- uint8_t mangled_ports_r(offs_t offset);
- void spinner_select_w(uint8_t data);
- uint8_t spinner_input_r();
- uint8_t elim4_input_r();
- void multiply_w(offs_t offset, uint8_t data);
- uint8_t multiply_r();
- void coin_count_w(uint8_t data);
- void unknown_w(uint8_t data);
-
- void elim1_sh_w(uint8_t data);
- void elim2_sh_w(uint8_t data);
- void zektor1_sh_w(uint8_t data);
- void zektor2_sh_w(uint8_t data);
- void spacfury1_sh_w(uint8_t data);
- void spacfury2_sh_w(uint8_t data);
-
- void usb_ram_w(offs_t offset, uint8_t data);
+ attotime m_draw_end_time;
+
+ u8 opcode_r(offs_t offset);
+ u8 mainrom_r(offs_t offset);
+ void mainram_w(offs_t offset, u8 data);
+ void vectorram_w(offs_t offset, u8 data);
+ u8 mangled_ports_r(offs_t offset);
+ void spinner_select_w(u8 data);
+ u8 spinner_input_r();
+ u8 elim4_input_r();
+ void multiply_w(offs_t offset, u8 data);
+ u8 multiply_r();
+ void coin_count_w(u8 data);
+ void unknown_w(u8 data);
+ void update_int();
+ void vblank_callback(screen_device &screen, bool state);
+
+ void usb_ram_w(offs_t offset, u8 data);
virtual void machine_start() override;
virtual void video_start() override;
uint32_t screen_update_segag80v(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- inline bool adjust_xy(int rawx, int rawy, int *outx, int *outy);
+ inline bool adjust_xy(int rawx, int rawy, int &outx, int &outy);
void sega_generate_vector_list();
offs_t decrypt_offset(offs_t offset);
- inline uint8_t demangle(uint8_t d7d6, uint8_t d5d4, uint8_t d3d2, uint8_t d1d0);
+ inline u8 demangle(u8 d7d6, u8 d5d4, u8 d3d2, u8 d1d0);
void main_map(address_map &map);
void opcodes_map(address_map &map);