// license:BSD-3-Clause // copyright-holders:Phil Stroffolino /** * @file namcos21.h */ #include "namcos2.h" #include "machine/namcoio_gearbox.h" #include "machine/timer.h" #define NAMCOS21_POLY_FRAME_WIDTH 496 #define NAMCOS21_POLY_FRAME_HEIGHT 480 #define WINRUN_MAX_POLY_PARAM (1+256*3) #define DSP_BUF_MAX (4096*12) struct dsp_state { unsigned masterSourceAddr; uint16_t slaveInputBuffer[DSP_BUF_MAX]; unsigned slaveBytesAvailable; unsigned slaveBytesAdvertised; unsigned slaveInputStart; uint16_t slaveOutputBuffer[DSP_BUF_MAX]; unsigned slaveOutputSize; uint16_t masterDirectDrawBuffer[256]; unsigned masterDirectDrawSize; int masterFinished; int slaveActive; }; struct n21_vertex { double x,y; double z; }; struct edge { double x; double z; }; class namcos21_state : public namcos2_shared_state { public: namcos21_state(const machine_config &mconfig, device_type type, const char *tag) : namcos2_shared_state(mconfig, type, tag), m_winrun_dspbios(*this,"winrun_dspbios"), m_winrun_polydata(*this,"winrun_polydata"), m_dspram16(*this,"dspram16"), m_mpDualPortRAM(*this,"mpdualportram"), m_master_dsp_code(*this,"master_dsp_code"), m_ptrom24(*this,"point24"), m_ptrom16(*this,"point16"), m_dsp(*this, "dsp"), m_io_gearbox(*this, "gearbox"), m_gpu_intc(*this, "gpu_intc") { } optional_shared_ptr m_winrun_dspbios; optional_shared_ptr m_winrun_polydata; optional_shared_ptr m_dspram16; required_shared_ptr m_mpDualPortRAM; optional_shared_ptr m_master_dsp_code; optional_region_ptr m_ptrom24; optional_region_ptr m_ptrom16; optional_device m_dsp; optional_device m_io_gearbox; optional_device m_gpu_intc; std::unique_ptr m_videoram; std::unique_ptr m_maskram; std::unique_ptr m_winrun_dspcomram; uint16_t m_winrun_poly_buf[WINRUN_MAX_POLY_PARAM]; int m_winrun_poly_index; uint32_t m_winrun_pointrom_addr; int m_winrun_dsp_alive; uint16_t m_winrun_dspcomram_control[8]; uint16_t m_video_enable; std::unique_ptr m_pointram; int m_pointram_idx; uint16_t m_pointram_control; std::unique_ptr m_mpDspState; int m_mbNeedsKickstart; uint32_t m_pointrom_idx; uint8_t m_mPointRomMSB; int m_mbPointRomDataAvailable; int m_irq_enable; uint8_t m_depthcue[2][0x400]; std::unique_ptr m_mpPolyFrameBufferPens; std::unique_ptr m_mpPolyFrameBufferZ; std::unique_ptr m_mpPolyFrameBufferPens2; std::unique_ptr m_mpPolyFrameBufferZ2; uint16_t m_winrun_color; uint16_t m_winrun_gpu_register[0x10/2]; DECLARE_READ16_MEMBER(namcos21_video_enable_r); DECLARE_WRITE16_MEMBER(namcos21_video_enable_w); DECLARE_WRITE16_MEMBER(dspcuskey_w); DECLARE_READ16_MEMBER(dspcuskey_r); DECLARE_READ16_MEMBER(dspram16_r); template DECLARE_WRITE16_MEMBER(dspram16_w); DECLARE_READ16_MEMBER(dsp_port0_r); DECLARE_WRITE16_MEMBER(dsp_port0_w); DECLARE_READ16_MEMBER(dsp_port1_r); DECLARE_WRITE16_MEMBER(dsp_port1_w); DECLARE_READ16_MEMBER(dsp_port2_r); DECLARE_WRITE16_MEMBER(dsp_port2_w); DECLARE_READ16_MEMBER(dsp_port3_idc_rcv_enable_r); DECLARE_WRITE16_MEMBER(dsp_port3_w); DECLARE_WRITE16_MEMBER(dsp_port4_w); DECLARE_READ16_MEMBER(dsp_port8_r); DECLARE_WRITE16_MEMBER(dsp_port8_w); DECLARE_READ16_MEMBER(dsp_port9_r); DECLARE_READ16_MEMBER(dsp_porta_r); DECLARE_WRITE16_MEMBER(dsp_porta_w); DECLARE_READ16_MEMBER(dsp_portb_r); DECLARE_WRITE16_MEMBER(dsp_portb_w); DECLARE_WRITE16_MEMBER(dsp_portc_w); DECLARE_READ16_MEMBER(dsp_portf_r); DECLARE_WRITE16_MEMBER(dsp_xf_w); DECLARE_READ16_MEMBER(slave_port0_r); DECLARE_WRITE16_MEMBER(slave_port0_w); DECLARE_READ16_MEMBER(slave_port2_r); DECLARE_READ16_MEMBER(slave_port3_r); DECLARE_WRITE16_MEMBER(slave_port3_w); DECLARE_WRITE16_MEMBER(slave_XF_output_w); DECLARE_READ16_MEMBER(slave_portf_r); DECLARE_WRITE16_MEMBER(pointram_control_w); DECLARE_READ16_MEMBER(pointram_data_r); DECLARE_WRITE16_MEMBER(pointram_data_w); DECLARE_READ16_MEMBER(namcos21_depthcue_r); DECLARE_WRITE16_MEMBER(namcos21_depthcue_w); DECLARE_READ16_MEMBER(namcos2_68k_dualportram_word_r); DECLARE_WRITE16_MEMBER(namcos2_68k_dualportram_word_w); DECLARE_READ8_MEMBER(namcos2_dualportram_byte_r); DECLARE_WRITE8_MEMBER(namcos2_dualportram_byte_w); DECLARE_READ16_MEMBER(winrun_dspcomram_r); DECLARE_WRITE16_MEMBER(winrun_dspcomram_w); DECLARE_READ16_MEMBER(winrun_cuskey_r); DECLARE_WRITE16_MEMBER(winrun_cuskey_w); DECLARE_READ16_MEMBER(winrun_poly_reset_r); DECLARE_WRITE16_MEMBER(winrun_dsp_render_w); DECLARE_WRITE16_MEMBER(winrun_dsp_pointrom_addr_w); DECLARE_READ16_MEMBER(winrun_dsp_pointrom_data_r); DECLARE_WRITE16_MEMBER(winrun_dsp_complete_w); DECLARE_READ16_MEMBER(winrun_table_r); DECLARE_WRITE16_MEMBER(winrun_dspbios_w); DECLARE_READ16_MEMBER(winrun_68k_dspcomram_r); DECLARE_WRITE16_MEMBER(winrun_68k_dspcomram_w); DECLARE_READ16_MEMBER(winrun_dspcomram_control_r); DECLARE_WRITE16_MEMBER(winrun_dspcomram_control_w); DECLARE_READ16_MEMBER(winrun_gpu_color_r); DECLARE_WRITE16_MEMBER(winrun_gpu_color_w); DECLARE_READ16_MEMBER(winrun_gpu_register_r); DECLARE_WRITE16_MEMBER(winrun_gpu_register_w); DECLARE_WRITE16_MEMBER(winrun_gpu_videoram_w); DECLARE_READ16_MEMBER(winrun_gpu_videoram_r); TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); uint8_t m_gearbox_state; DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r); void init_driveyes(); void init_winrun(); void init_starblad(); void init_solvalou(); void init_cybsled(); void init_aircomb(); DECLARE_MACHINE_START(namcos21); DECLARE_VIDEO_START(namcos21); uint32_t screen_update_namcos21(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_winrun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_driveyes(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void allocate_poly_framebuffer(); void clear_poly_framebuffer(); void copy_visible_poly_framebuffer(bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi); void winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &cliprect); void renderscanline_flat(const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable); void rendertri(const n21_vertex *v0, const n21_vertex *v1, const n21_vertex *v2, unsigned color, int depthcueenable); void draw_quad(int sx[4], int sy[4], int zcode[4], int color); int32_t read_pointrom_data(unsigned offset); void transmit_word_to_slave(uint16_t data); void transfer_dsp_data(); uint16_t read_word_from_slave_input(); uint16_t get_input_bytes_advertised_for_slave(); int init_dsp(); void render_slave_output(uint16_t data); void winrun_flush_poly(); void init(int game_type); void configure_c148_standard(machine_config &config); void driveyes(machine_config &config); void winrun(machine_config &config); void namcos21(machine_config &config); void common_map(address_map &map); void driveyes_common_map(address_map &map); void driveyes_master_map(address_map &map); void driveyes_slave_map(address_map &map); void master_dsp_data(address_map &map); void master_dsp_io(address_map &map); void master_dsp_program(address_map &map); void master_map(address_map &map); void mcu_map(address_map &map); void slave_dsp_data(address_map &map); void slave_dsp_io(address_map &map); void slave_dsp_program(address_map &map); void slave_map(address_map &map); void sound_map(address_map &map); void winrun_dsp_data(address_map &map); void winrun_dsp_io(address_map &map); void winrun_dsp_program(address_map &map); void winrun_gpu_map(address_map &map); void winrun_master_map(address_map &map); void winrun_slave_map(address_map &map); };