From c8368c833836d650a87255fccabd25a35fbc2c98 Mon Sep 17 00:00:00 2001 From: MooglyGuy Date: Sat, 28 Dec 2024 02:45:43 +0100 Subject: taitotz.cpp: Standards cleanup and fixed direct-poly packet-size calculation. Raizin Ping Pong no longer fatalerrors in attract. [Ryan Holtz] (#13124) Co-authored-by: Ryan Holtz --- src/mame/taito/taitotz.cpp | 1220 +++++++++++++++++++------------------------- 1 file changed, 538 insertions(+), 682 deletions(-) diff --git a/src/mame/taito/taitotz.cpp b/src/mame/taito/taitotz.cpp index c3ddcb03cd1..4cec9e9b8bc 100644 --- a/src/mame/taito/taitotz.cpp +++ b/src/mame/taito/taitotz.cpp @@ -180,10 +180,25 @@ Notes: #include "video/poly.h" #include "screen.h" -#define LOG_PPC_TO_TLCS_COMMANDS (1U << 1) -#define LOG_TLCS_TO_PPC_COMMANDS (1U << 2) +#define LOG_PPC_TO_TLCS_COMMANDS (1U << 1) +#define LOG_TLCS_TO_PPC_COMMANDS (1U << 2) +#define LOG_VIDEO_REG_1_RD (1U << 3) +#define LOG_VIDEO_REG_2_RD (1U << 4) +#define LOG_VIDEO_REG_UNK_RD (1U << 5) +#define LOG_VIDEO_REG_1_WR (1U << 6) +#define LOG_VIDEO_REG_2_WR (1U << 7) +#define LOG_VIDEO_REG_UNK_WR (1U << 8) +#define LOG_VIDEO_CHIP_UNK_RD (1U << 9) +#define LOG_VIDEO_CHIP_UNK_WR (1U << 10) +#define LOG_DIRECT_FIFO (1U << 11) +#define LOG_TNL_FIFO (1U << 12) +#define LOG_RTC_UNK_RD (1U << 13) +#define LOG_RTC_UNK_WR (1U << 14) +#define LOG_VIDEO_MEM_UNK_RD (1U << 15) +#define LOG_VIDEO_MEM_UNK_WR (1U << 16) + +#define VERBOSE (0) -#define VERBOSE (LOG_PPC_TO_TLCS_COMMANDS | LOG_TLCS_TO_PPC_COMMANDS) #include "logmacro.h" @@ -366,40 +381,40 @@ Notes: Display list format ------------------- - 0xffff0010: ? + 0xffff0010: ? - 0xffff0011: Draw Polygon Object - 0 = Polygon data address (21 bits) in screen RAM (in dwords). If 0x400000 set, no matrix. - 1 = Object scale (float), if <1.0f multiply scale by 2.0f - 2 = 0x80 = object alpha enable, 0x1f = object alpha (0x1f = opaque) - 3 = ? - 4...15 = 4x3 matrix + 0xffff0011: Draw Polygon Object + Word 0: Polygon data address (21 bits) in screen RAM (in dwords). If 0x400000 set, no matrix. + Word 1: Object scale (float), if <1.0f multiply scale by 2.0f + Word 2: 0x80 = object alpha enable, 0x1f = object alpha (0x1f = opaque) + Word 3: ? + Words 4...15: 4x3 matrix - 0xffff0020: ? (no parameters) + 0xffff0020: ? (no parameters) - 0xffff0021: Draw Pretransformed Polygon (used for drawing the background images) - 0 = address? (if 0x400 set, 24 words) - 1 = Texture number (* 0x4000 to address the texture) - 2 = ? - 3 = ? (usually 0) + 0xffff0021: Draw Pretransformed Polygon (used for drawing the background images) + Word 0: Address? (if 0x400 set, 24 words) + Word 1: Texture number (* 0x4000 to address the texture) + Word 2: ? + Word 3: ? (usually 0) - Vertex data: 4x or 5x 4 words - 0 = XY coordinates. X = high 16 bits, Y = low 16 bits - 1 = Z value? - 2 = UV coordinates. U = high 16 bits, V = low 16 bits (possibly shifted left by 4?) - 3 = ? (usually 0) + Vertex data: 4 or 5 groups of 4 words + Word 0: XY coordinates. X in high 16 bits, Y in low 16 bits. + Word 1: Z value? + Word 2: UV coordinates. U in high 16 bits, V in low 16 bits (possibly shifted left by 4?) + Word 3: ? (usually 0) - 0xffff0022: ? (1 word) - 0 = ? (Set to 0x00000001 before drawing the background. Z-buffer read disable?) + 0xffff0022: ? (1 word) + Word 0: ? (Set to 0x00000001 before drawing the background. Z-buffer read disable?) - 0xffff0030: ? (2 + n words) FIFO write? - 0 = ? - 1 = num of words - n words = ? + 0xffff0030: ? (2 + n words) FIFO write? + Word 0: ? + Word 1: Word count + Words 2...n: ? - 0xffff0080: Display List Call? + 0xffff0080: Display List Call? - 0xffff00ff: End of List? + 0xffff00ff: End of List? Polygon data format ------------------- @@ -447,22 +462,11 @@ Notes: e1000185 0cee7d03 0c000000 00000000 Trackpiece f1000068 0c007f00 0c7e0000 0400007f Car shadow (BG2 0x1f160) - - - - - - - - - - - Vertex data: 3x (triangle) or 4x (quad) 4 words Word 0: -------- -------- -------- xxxxxxxx Texture V coordinate (0..63 with max 4x repeat) -------- -------- xxxxxxxx -------- Texture U coordinate (0..63 with max 4x repeat) - -------- xxxxxxxx -------- -------- Usually 0x40. HUD elements set 0xff. Self-illumination? + -------- xxxxxxxx -------- -------- Usually 0x40. HUD elements set 0xff. Emissive? xxxxxxxx -------- -------- -------- ? (seen 0x00, 0x83, 0x40) Word 1: @@ -518,8 +522,6 @@ Notes: namespace { -#define ENABLE_LIGHTING 1 - #define PPC_TLCS_COMM_TRIGGER 12345 #define TLCS_PPC_COMM_TRIGGER 12346 @@ -532,9 +534,9 @@ typedef float VECTOR3[3]; struct taitotz_polydata { - uint32_t texture; - uint32_t alpha; - uint32_t flags; + u32 texture; + u32 alpha; + u32 flags; int diffuse_r, diffuse_g, diffuse_b; int ambient_r, ambient_g, ambient_b; int specular_r, specular_g, specular_b; @@ -581,71 +583,73 @@ protected: virtual void video_start() override ATTR_COLD; private: - required_device m_maincpu; - required_device m_iocpu; - required_shared_ptr m_work_ram; - required_shared_ptr m_mbox_ram; - required_device m_ata; + static constexpr bool ENABLE_DEBUG_PRINTS = false; + static constexpr bool ENABLE_DEBUG_RAM = false; - uint64_t ppc_common_r(offs_t offset, uint64_t mem_mask = ~0); - void ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); - uint64_t ieee1394_r(offs_t offset, uint64_t mem_mask = ~0); - void ieee1394_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); - uint64_t video_chip_r(offs_t offset, uint64_t mem_mask = ~0); - void video_chip_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); - uint64_t video_fifo_r(offs_t offset, uint64_t mem_mask = ~0); - void video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); + void landhigh_tlcs900h_mem(address_map &map) ATTR_COLD; + void ppc603e_mem(address_map &map) ATTR_COLD; + void tlcs900h_mem(address_map &map) ATTR_COLD; - std::unique_ptr m_screen_ram; - std::unique_ptr m_frame_ram; - std::unique_ptr m_texture_ram; - uint32_t m_video_unk_reg[0x10]{}; + u64 ppc_common_r(offs_t offset, u64 mem_mask = ~0); + void ppc_common_w(offs_t offset, u64 data, u64 mem_mask = ~0); + u64 ieee1394_r(offs_t offset, u64 mem_mask = ~0); + void ieee1394_w(offs_t offset, u64 data, u64 mem_mask = ~0); + + void dump_video_ram(); + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void draw_tile(u32 pos, u32 tile); + void vblank(int state); + u64 video_chip_r(offs_t offset, u64 mem_mask = ~0); + void video_chip_w(offs_t offset, u64 data, u64 mem_mask = ~0); + u64 video_fifo_r(offs_t offset, u64 mem_mask = ~0); + void video_fifo_w(offs_t offset, u64 data, u64 mem_mask = ~0); + u32 video_mem_r(u32 address); + void video_mem_w(u32 address, u32 data); + u32 video_reg_r(u32 reg); + void video_reg_w(u32 reg, u32 data); + + u16 tlcs_ide0_r(offs_t offset, u16 mem_mask = ~0); + u16 tlcs_ide1_r(offs_t offset, u16 mem_mask = ~0); + u8 tlcs_common_r(offs_t offset); + void tlcs_common_w(offs_t offset, u8 data); + u8 tlcs_rtc_r(offs_t offset); + void tlcs_rtc_w(offs_t offset, u8 data); + void ide_interrupt(int state); - uint32_t m_video_fifo_ptr = 0; - uint32_t m_video_ram_ptr = 0; - uint32_t m_video_reg = 0; - uint32_t m_scr_base = 0; + void init_taitotz_152(); + void init_taitotz_111a(); - //uint64_t m_video_fifo_mem[4]{}; + required_device m_maincpu; + required_device m_iocpu; + required_shared_ptr m_work_ram; + required_shared_ptr m_mbox_ram; + required_device m_ata; - uint16_t m_io_share_ram[0x2000]{}; + std::unique_ptr m_screen_ram; + std::unique_ptr m_frame_ram; + std::unique_ptr m_texture_ram; + u32 m_video_unk_reg[0x10]{}; - const char *m_hdd_serial_number = nullptr; + u32 m_video_fifo_ptr = 0; + u32 m_video_ram_ptr = 0; + u32 m_video_reg = 0; + u32 m_scr_base = 0; - uint8_t tlcs_common_r(offs_t offset); - void tlcs_common_w(offs_t offset, uint8_t data); - uint8_t tlcs_rtc_r(offs_t offset); - void tlcs_rtc_w(offs_t offset, uint8_t data); + u16 m_io_share_ram[0x2000]{}; - uint8_t m_rtcdata[8]{}; + const char *m_hdd_serial_number = nullptr; + u8 m_rtcdata[8]{}; - uint32_t m_reg105 = 0; + u32 m_reg105 = 0; std::unique_ptr m_renderer; - - uint32_t screen_update_taitotz(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(taitotz_vbi); - uint16_t tlcs_ide0_r(offs_t offset, uint16_t mem_mask = ~0); - uint16_t tlcs_ide1_r(offs_t offset, uint16_t mem_mask = ~0); - void ide_interrupt(int state); - void draw_tile(uint32_t pos, uint32_t tile); - uint32_t video_mem_r(uint32_t address); - void video_mem_w(uint32_t address, uint32_t data); - uint32_t video_reg_r(uint32_t reg); - void video_reg_w(uint32_t reg, uint32_t data); - void init_taitotz_152(); - void init_taitotz_111a(); - - void landhigh_tlcs900h_mem(address_map &map) ATTR_COLD; - void ppc603e_mem(address_map &map) ATTR_COLD; - void tlcs900h_mem(address_map &map) ATTR_COLD; }; class taitotz_renderer : public poly_manager { public: - taitotz_renderer(taitotz_state &state, int width, int height, uint32_t *scrram, uint32_t *texram) + taitotz_renderer(taitotz_state &state, int width, int height, u32 *scrram, u32 *texram) : poly_manager(state.machine()), m_state(state) { @@ -665,19 +669,24 @@ public: } void render_displaylist(const rectangle &cliprect); - void draw_object(uint32_t address, float scale, uint8_t alpha); + void draw_object(u32 address, float scale, u8 alpha); float line_plane_intersection(const vertex_t *v1, const vertex_t *v2, PLANE cp); int clip_polygon(const vertex_t *v, int num_vertices, PLANE cp, vertex_t *vout); void setup_viewport(int x, int y, int width, int height, int center_x, int center_y); - void draw_scanline_noz(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); - void draw_scanline(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); + void draw_scanline_noz(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); + void draw_scanline(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); - void push_tnl_fifo(uint32_t data); - void push_direct_poly_fifo(uint32_t data); + void push_tnl_fifo(u32 data); + void push_direct_poly_fifo(u32 data); - void render_tnl_object(uint32_t address, float scale, uint8_t alpha); + void render_tnl_object(u32 address, float scale, u8 alpha); void draw(bitmap_rgb32 &bitmap, const rectangle &cliprect); + int direct_fifo_ptr() const { return m_direct_fifo_ptr; } + + static float dot_product_vec3(VECTOR3 a, const VECTOR3 b); + static float clamp_pos(float v); + static u32 generate_texel_address(int iu, int iv); private: enum @@ -690,13 +699,13 @@ private: POLY_NZ = 5 }; - //static const float ZBUFFER_MAX = 10000000000.0f; + static constexpr bool ENABLE_LIGHTING = true; taitotz_state &m_state; std::unique_ptr m_fb; std::unique_ptr m_zbuffer; - uint32_t *m_texture = nullptr; - uint32_t *m_screen_ram = nullptr; + u32 *m_texture = nullptr; + u32 *m_screen_ram = nullptr; rectangle m_cliprect; @@ -725,119 +734,87 @@ private: float m_vp_y = 0; float m_vp_mul = 0; - uint32_t m_reg_100 = 0; - uint32_t m_reg_101 = 0; - uint32_t m_reg_102 = 0; + u32 m_reg_100 = 0; + u32 m_reg_101 = 0; + u32 m_reg_102 = 0; - uint32_t m_reg_10000100 = 0; - uint32_t m_reg_10000101 = 0; + u32 m_reg_10000100 = 0; + u32 m_reg_10000101 = 0; - uint32_t m_tnl_fifo[64]{}; - uint32_t m_direct_fifo[64]{}; + u32 m_tnl_fifo[64]{}; + u32 m_direct_fifo[64]{}; int m_tnl_fifo_ptr = 0; int m_direct_fifo_ptr = 0; -}; - + static const float DOT3_TEX_TABLE[32]; +}; -/* -void taitotz_state::taitotz_exit() +void taitotz_state::dump_video_ram() { + FILE *file = fopen("screen_ram.bin","wb"); + for (int i = 0; i < 0x200000; i++) + { + fputc((u8)(m_screen_ram[i] >> 24), file); + fputc((u8)(m_screen_ram[i] >> 16), file); + fputc((u8)(m_screen_ram[i] >> 8), file); + fputc((u8)(m_screen_ram[i] >> 0), file); + } + fclose(file); + file = fopen("frame_ram.bin","wb"); + for (int i = 0; i < 0x80000; i++) + { + fputc((u8)(m_frame_ram[i] >> 24), file); + fputc((u8)(m_frame_ram[i] >> 16), file); + fputc((u8)(m_frame_ram[i] >> 8), file); + fputc((u8)(m_frame_ram[i] >> 0), file); + } + fclose(file); - FILE *file; - int i; - - file = fopen("screen_ram.bin","wb"); - for (i=0; i < 0x200000; i++) - { - fputc((uint8_t)(m_screen_ram[i] >> 24), file); - fputc((uint8_t)(m_screen_ram[i] >> 16), file); - fputc((uint8_t)(m_screen_ram[i] >> 8), file); - fputc((uint8_t)(m_screen_ram[i] >> 0), file); - } - fclose(file); - - file = fopen("frame_ram.bin","wb"); - for (i=0; i < 0x80000; i++) - { - fputc((uint8_t)(m_frame_ram[i] >> 24), file); - fputc((uint8_t)(m_frame_ram[i] >> 16), file); - fputc((uint8_t)(m_frame_ram[i] >> 8), file); - fputc((uint8_t)(m_frame_ram[i] >> 0), file); - } - fclose(file); - - file = fopen("texture_ram.bin","wb"); - for (i=0; i < 0x800000; i++) - { - fputc((uint8_t)(m_texture_ram[i] >> 24), file); - fputc((uint8_t)(m_texture_ram[i] >> 16), file); - fputc((uint8_t)(m_texture_ram[i] >> 8), file); - fputc((uint8_t)(m_texture_ram[i] >> 0), file); - } - fclose(file); - + file = fopen("texture_ram.bin","wb"); + for (int i = 0; i < 0x800000; i++) + { + fputc((u8)(m_texture_ram[i] >> 24), file); + fputc((u8)(m_texture_ram[i] >> 16), file); + fputc((u8)(m_texture_ram[i] >> 8), file); + fputc((u8)(m_texture_ram[i] >> 0), file); + } + fclose(file); } -*/ + void taitotz_state::video_start() { int width = m_screen->width(); int height = m_screen->height(); - m_screen_ram = std::make_unique(0x200000); - m_frame_ram = std::make_unique(0x80000); - m_texture_ram = std::make_unique(0x800000); + m_screen_ram = std::make_unique(0x200000); + m_frame_ram = std::make_unique(0x80000); + m_texture_ram = std::make_unique(0x800000); - /* create renderer */ m_renderer = std::make_unique(*this, width, height, m_screen_ram.get(), m_texture_ram.get()); - //machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&taitotz_exit, &machine())); + if (ENABLE_DEBUG_RAM) + { + machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&taitotz_state::dump_video_ram, this)); + } m_video_reg = 0; } -static const float dot3_tex_table[32] = +const float taitotz_renderer::DOT3_TEX_TABLE[32] = { -0.500000f, -0.466666f, -0.433333f, -0.400000f, -0.366666f, -0.333333f, -0.300000f, -0.266666f, -0.233333f, -0.200000f, -0.166666f, -0.133333f, -0.100000f, -0.066666f, -0.033333f, -0.000000f, - 0.000000f, 0.033333f, 0.066666f, 0.100000f, 0.133333f, 0.166666f, 0.200000f, 0.233333f, - 0.266666f, 0.300000f, 0.333333f, 0.366666f, 0.400000f, 0.433333f, 0.466666f, 0.500000f, + 0.000000f, 0.033333f, 0.066666f, 0.100000f, 0.133333f, 0.166666f, 0.200000f, 0.233333f, + 0.266666f, 0.300000f, 0.333333f, 0.366666f, 0.400000f, 0.433333f, 0.466666f, 0.500000f, }; -static inline float dot_product_vec3(VECTOR3 a, VECTOR3 b) +float taitotz_renderer::dot_product_vec3(VECTOR3 a, const VECTOR3 b) { return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]); } -// Fast inverse square-root -// Adapted from http://en.wikipedia.org/wiki/Fast_inverse_square_root -static inline float finvsqrt(float number) -{ - uint32_t i; - float x2, y; - const float threehalfs = 1.5f; - - x2 = number * 0.5f; - y = number; - i = *(uint32_t*)&y; - i = 0x5f3759df - ( i >> 1 ); - y = *(float*)&i; - y = y * ( threehalfs - ( x2 * y * y ) ); - return y; -} - -#if 0 -static inline void normalize_vec3(VECTOR3 *v) -{ - float l = finvsqrt(*v[0] * *v[0] + *v[1] * *v[1] + *v[2] * *v[2]); - *v[0] *= l; - *v[1] *= l; - *v[2] *= l; -} -#endif - -static inline float clamp_pos(float v) +float taitotz_renderer::clamp_pos(float v) { if (v < 0.0f) return 0.0f; @@ -845,10 +822,10 @@ static inline float clamp_pos(float v) return v; } -static inline uint32_t generate_texel_address(int iu, int iv) +u32 taitotz_renderer::generate_texel_address(int iu, int iv) { // generate texel address from U and V - uint32_t addr = 0; + u32 addr = 0; addr += (iu & 0x01) ? 1 : 0; addr += (iu >> 1) * 4; addr += (iv & 0x01) ? 2 : 0; @@ -857,16 +834,16 @@ static inline uint32_t generate_texel_address(int iu, int iv) return addr; } -void taitotz_renderer::draw_scanline_noz(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) +void taitotz_renderer::draw_scanline_noz(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) { - uint32_t *const fb = &m_fb->pix(scanline); + u32 *const fb = &m_fb->pix(scanline); float u = extent.param[POLY_U].start; float v = extent.param[POLY_V].start; float const du = extent.param[POLY_U].dpdx; float const dv = extent.param[POLY_V].dpdx; - uint32_t *texram = &m_texture[extradata.texture * 0x1000]; + u32 *texram = &m_texture[extradata.texture * 0x1000]; int shift = 16; // TODO: subtexture @@ -875,9 +852,9 @@ void taitotz_renderer::draw_scanline_noz(int32_t scanline, const extent_t &exten int iu = (int)(u) & 0x3f; int iv = (int)(v) & 0x3f; - uint32_t addr = generate_texel_address(iu, iv); + u32 addr = generate_texel_address(iu, iv); - uint32_t texel = (texram[addr] >> shift) & 0xffff; + u32 texel = (texram[addr] >> shift) & 0xffff; if (!(texel & 0x8000)) { int r = (texel & 0x7c00) << 9; @@ -891,9 +868,9 @@ void taitotz_renderer::draw_scanline_noz(int32_t scanline, const extent_t &exten } } -void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) +void taitotz_renderer::draw_scanline(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) { - uint32_t *const fb = &m_fb->pix(scanline); + u32 *const fb = &m_fb->pix(scanline); float *const zb = (float*)&m_zbuffer->pix(scanline); float ooz = extent.param[POLY_Z].start; @@ -903,48 +880,24 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c const float duoz = extent.param[POLY_U].dpdx; const float dvoz = extent.param[POLY_V].dpdx; - float nx= extent.param[POLY_NX].start; - float dnx = extent.param[POLY_NX].dpdx; + float nx = extent.param[POLY_NX].start; float ny = extent.param[POLY_NY].start; - const float dny = extent.param[POLY_NY].dpdx; float nz = extent.param[POLY_NZ].start; + const float dnx = extent.param[POLY_NX].dpdx; + const float dny = extent.param[POLY_NY].dpdx; const float dnz = extent.param[POLY_NZ].dpdx; - uint32_t *const texram = &m_texture[extradata.texture * 0x1000]; - uint32_t alpha = extradata.alpha & 0x1f; - uint32_t alpha_enable = extradata.alpha & 0x80; - - int texmode = extradata.flags & 0x3; - -#if ENABLE_LIGHTING - int diff_r = extradata.diffuse_r; - int diff_g = extradata.diffuse_g; - int diff_b = extradata.diffuse_b; - int amb_r = extradata.ambient_r; - int amb_g = extradata.ambient_g; - int amb_b = extradata.ambient_b; - int spec_r = extradata.specular_r; - int spec_g = extradata.specular_g; - int spec_b = extradata.specular_b; + u32 *const texram = &m_texture[extradata.texture * 0x1000]; + u32 alpha = extradata.alpha & 0x1f; + u32 alpha_enable = extradata.alpha & 0x80; VECTOR3 view = { -0.0f, -0.0f, -1.0f }; - VECTOR3 light_vector; - light_vector[0] = extradata.light[0]; - light_vector[1] = extradata.light[1]; - light_vector[2] = extradata.light[2]; -#endif - // TODO: these might get swapped around, the color texture doesn't always seem to be tex0 - //int tex0_shift = (extradata.flags & 1) ? 16 : 0; - int tex0_shift, tex1_shift; - switch (texmode) - { - case 0: tex0_shift = 16; tex1_shift = 0; break; - case 1: tex0_shift = 16; tex1_shift = 0; break; - case 2: tex0_shift = 16; tex1_shift = 0; break; - default: tex0_shift = 0; tex1_shift = 16; break; - } + static constexpr int TEX_SHIFTS[4][2] = { { 16, 0 }, { 16, 0 }, { 16, 0 }, { 0, 16 } }; + int texmode = extradata.flags & 3; + int tex0_shift = TEX_SHIFTS[texmode][0]; + int tex1_shift = TEX_SHIFTS[texmode][1]; for (int x = extent.startx; x < extent.stopx; x++) { @@ -956,10 +909,10 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int iu = (int)(u) & 0x3f; int iv = (int)(v) & 0x3f; - uint32_t addr = generate_texel_address(iu, iv); + u32 addr = generate_texel_address(iu, iv); - uint32_t texel = texram[addr]; - uint32_t texel0 = (texel >> tex0_shift) & 0xffff; + u32 texel = texram[addr]; + u32 texel0 = (texel >> tex0_shift) & 0xffff; if (!(texel0 & 0x8000)) { // extract texel0 RGB @@ -967,58 +920,53 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int g0 = (texel0 & 0x03e0) >> 2; int b0 = (texel0 & 0x001f) << 3; -#if ENABLE_LIGHTING - // fetch texture1 and apply normal map - uint32_t texel1 = (texel >> tex1_shift) & 0xffff; - - VECTOR3 normal; - VECTOR3 half; - - float bumpx = dot3_tex_table[(texel1 & 0x7c00) >> 10]; - float bumpy = dot3_tex_table[(texel1 & 0x03e0) >> 5]; - float bumpz = dot3_tex_table[(texel1 & 0x001f)]; - - // FIXME!!! the normal needs to be in tangent-space so the bump normal can be applied!!! - normal[0] = nx + bumpx; - normal[1] = ny + bumpy; - normal[2] = nz + bumpz; - - // normalize - float l = finvsqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]); - normal[0] *= l; - normal[1] *= l; - normal[2] *= l; - - // calculate per-pixel lighting - float dot = dot_product_vec3(normal, light_vector); - - - // calculate half-angle vector for specular - half[0] = light_vector[0] + view[0]; - half[1] = light_vector[1] + view[1]; - half[2] = light_vector[2] + view[2]; - // normalize it - l = finvsqrt(half[0] * half[0] + half[1] * half[1] + half[2] * half[2]); - half[0] *= l; - half[1] *= l; - half[2] *= l; - - // calculate specularity - int specular = (int)(pow(clamp_pos(dot_product_vec3(normal, half)), m_specular_power) * m_specular_intensity); - int intensity = (int)(dot * m_diffuse_intensity); - - // apply lighting - r0 = ((r0 * intensity * diff_r) >> 16) + ((r0 * amb_r) >> 8) + ((specular * spec_r) >> 8); - g0 = ((g0 * intensity * diff_g) >> 16) + ((g0 * amb_g) >> 8) + ((specular * spec_g) >> 8); - b0 = ((b0 * intensity * diff_b) >> 16) + ((b0 * amb_b) >> 8) + ((specular * spec_b) >> 8); - - if (r0 > 255) r0 = 255; - if (g0 > 255) g0 = 255; - if (b0 > 255) b0 = 255; - if (r0 < 0) r0 = 0; - if (g0 < 0) g0 = 0; - if (b0 < 0) b0 = 0; -#endif + if (ENABLE_LIGHTING) + { + // fetch texture1 and apply normal map + u32 texel1 = (texel >> tex1_shift) & 0xffff; + + const float bumpx = DOT3_TEX_TABLE[(texel1 & 0x7c00) >> 10]; + const float bumpy = DOT3_TEX_TABLE[(texel1 & 0x03e0) >> 5]; + const float bumpz = DOT3_TEX_TABLE[(texel1 & 0x001f)]; + + // FIXME!!! the normal needs to be in tangent-space so the bump normal can be applied!!! + VECTOR3 normal; + normal[0] = nx + bumpx; + normal[1] = ny + bumpy; + normal[2] = nz + bumpz; + + // normalize + float l = 1.0f / sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]); + normal[0] *= l; + normal[1] *= l; + normal[2] *= l; + + // calculate per-pixel lighting + float dot = dot_product_vec3(normal, extradata.light); + + // calculate half-angle vector for specular + VECTOR3 half; + half[0] = extradata.light[0] + view[0]; + half[1] = extradata.light[1] + view[1]; + half[2] = extradata.light[2] + view[2]; + // normalize it + l = 1.0f / sqrtf(half[0] * half[0] + half[1] * half[1] + half[2] * half[2]); + half[0] *= l; + half[1] *= l; + half[2] *= l; + + // calculate specularity + const int specular = (int)(pow(clamp_pos(dot_product_vec3(normal, half)), m_specular_power) * m_specular_intensity); + const int intensity = (int)(dot * m_diffuse_intensity); + + // apply lighting + r0 = ((r0 * intensity * extradata.diffuse_r) >> 16) + ((r0 * extradata.ambient_r) >> 8) + ((specular * extradata.specular_r) >> 8); + g0 = ((g0 * intensity * extradata.diffuse_g) >> 16) + ((g0 * extradata.ambient_g) >> 8) + ((specular * extradata.specular_g) >> 8); + b0 = ((b0 * intensity * extradata.diffuse_b) >> 16) + ((b0 * extradata.ambient_b) >> 8) + ((specular * extradata.specular_b) >> 8); + r0 = std::clamp(r0, 0, 255); + g0 = std::clamp(g0, 0, 255); + b0 = std::clamp(b0, 0, 255); + } // texture alpha mask if (texmode == 2) @@ -1029,7 +977,7 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int b0 = (texel0 & 0x001f) << 3; // fetch texture1 - uint32_t texel1 = (texel >> tex1_shift) & 0xffff; + u32 texel1 = (texel >> tex1_shift) & 0xffff; if (!(texel1 & 0x8000)) { @@ -1059,7 +1007,7 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int b0 = texel0 & 0x1f; // fetch texture1 - uint32_t texel1 = (texel >> tex1_shift) & 0xffff; + u32 texel1 = (texel >> tex1_shift) & 0xffff; int r1 = (texel1 & 0x7c00) >> 7; int g1 = (texel1 & 0x03e0) >> 2; @@ -1141,25 +1089,21 @@ int taitotz_renderer::clip_polygon(const vertex_t *v, int num_vertices, PLANE cp { vertex_t clipv[10]; int clip_verts = 0; - float t; - int i; - int previ = num_vertices - 1; - - for (i=0; i < num_vertices; i++) + for (int i = 0; i < num_vertices; i++) { int v1_in = is_point_inside(v[i].x, v[i].y, v[i].p[POLY_Z], cp); int v2_in = is_point_inside(v[previ].x, v[previ].y, v[previ].p[POLY_Z], cp); - if (v1_in && v2_in) /* edge is completely inside the volume */ + if (v1_in && v2_in) // edge is completely inside the volume { clipv[clip_verts] = v[i]; ++clip_verts; } - else if (!v1_in && v2_in) /* edge is entering the volume */ + else if (!v1_in && v2_in) // edge is entering the volume { - /* insert vertex at intersection point */ - t = line_plane_intersection(&v[i], &v[previ], cp); + // insert vertex at intersection point + float t = line_plane_intersection(&v[i], &v[previ], cp); clipv[clip_verts].x = v[i].x + ((v[previ].x - v[i].x) * t); clipv[clip_verts].y = v[i].y + ((v[previ].y - v[i].y) * t); clipv[clip_verts].p[POLY_Z] = v[i].p[POLY_Z] + ((v[previ].p[POLY_Z] - v[i].p[POLY_Z]) * t); @@ -1172,10 +1116,10 @@ int taitotz_renderer::clip_polygon(const vertex_t *v, int num_vertices, PLANE cp ++clip_verts; } - else if (v1_in && !v2_in) /* edge is leaving the volume */ + else if (v1_in && !v2_in) // edge is leaving the volume { - /* insert vertex at intersection point */ - t = line_plane_intersection(&v[i], &v[previ], cp); + // insert vertex at intersection point + float t = line_plane_intersection(&v[i], &v[previ], cp); clipv[clip_verts].x = v[i].x + ((v[previ].x - v[i].x) * t); clipv[clip_verts].y = v[i].y + ((v[previ].y - v[i].y) * t); clipv[clip_verts].p[POLY_Z] = v[i].p[POLY_Z] + ((v[previ].p[POLY_Z] - v[i].p[POLY_Z]) * t); @@ -1188,7 +1132,7 @@ int taitotz_renderer::clip_polygon(const vertex_t *v, int num_vertices, PLANE cp ++clip_verts; - /* insert the existing vertex */ + // insert the existing vertex clipv[clip_verts] = v[i]; ++clip_verts; } @@ -1209,9 +1153,6 @@ void taitotz_renderer::setup_viewport(int x, int y, int width, int height, int c m_vp_y = y; // set up clip planes - //float angleh = atan2(512/2, 512.0f) - 0.0001; - //float anglev = atan2(384/2, 512.0f) - 0.0001; - float angleh = atan2(width, m_vp_focus) - 0.0001; float anglev = atan2(height, m_vp_focus) - 0.0001; float sh = sin(angleh); @@ -1250,9 +1191,9 @@ void taitotz_renderer::setup_viewport(int x, int y, int width, int height, int c m_clip_plane[4].d = 0.1f; } -void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t alpha) +void taitotz_renderer::render_tnl_object(u32 address, float scale, u8 alpha) { - uint32_t *src = &m_screen_ram[address]; + u32 *src = &m_screen_ram[address]; vertex_t v[10]; bool end = false; @@ -1279,26 +1220,26 @@ void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t for (int i=0; i < num_verts; i++) { // texture coords - uint8_t tu = src[index] >> 8; - uint8_t tv = src[index] & 0xff; + u8 tu = src[index] >> 8; + u8 tv = src[index] & 0xff; v[i].p[POLY_U] = (float)(tu); v[i].p[POLY_V] = (float)(tv); // coords - int16_t x = src[index + 1] & 0xffff; - int16_t y = src[index + 2] & 0xffff; - int16_t z = src[index + 3] & 0xffff; - float px = ((float)(x) / 256.0f) * scale; - float py = ((float)(y) / 256.0f) * scale; - float pz = ((float)(z) / 256.0f) * scale; + s16 x = src[index + 1] & 0xffff; + s16 y = src[index + 2] & 0xffff; + s16 z = src[index + 3] & 0xffff; + float px = (x * scale) / 256.0f; + float py = (y * scale) / 256.0f; + float pz = (z * scale) / 256.0f; // normals - int8_t inx = (src[index + 1] >> 16) & 0xff; - int8_t iny = (src[index + 2] >> 16) & 0xff; - int8_t inz = (src[index + 3] >> 16) & 0xff; - float nx = (float)(inx) / 128.0f; - float ny = (float)(iny) / 128.0f; - float nz = (float)(inz) / 128.0f; + s8 inx = (src[index + 1] >> 16) & 0xff; + s8 iny = (src[index + 2] >> 16) & 0xff; + s8 inz = (src[index + 3] >> 16) & 0xff; + float nx = inx / 128.0f; + float ny = iny / 128.0f; + float nz = inz / 128.0f; // transform v[i].x = (px * m_matrix[0][0]) + (py * m_matrix[1][0]) + (pz * m_matrix[2][0]) + m_matrix[3][0]; @@ -1346,16 +1287,14 @@ void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t extra.light[1] = 0.0f; extra.light[2] = -1.0f; - for (int i=2; i < num_verts; i++) + for (int i = 2; i < num_verts; i++) { - render_triangle<6>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline, this), v[0], v[i-1], v[i]); + render_triangle<6>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline, this), v[0], v[i - 1], v[i]); } } while (!end); } - - void taitotz_renderer::draw(bitmap_rgb32 &bitmap, const rectangle &cliprect) { wait(); @@ -1365,7 +1304,7 @@ void taitotz_renderer::draw(bitmap_rgb32 &bitmap, const rectangle &cliprect) m_zbuffer->fill(*(int*)&zvalue, cliprect); } -void taitotz_renderer::push_tnl_fifo(uint32_t data) +void taitotz_renderer::push_tnl_fifo(u32 data) { m_tnl_fifo[m_tnl_fifo_ptr] = data; m_tnl_fifo_ptr++; @@ -1391,7 +1330,7 @@ void taitotz_renderer::push_tnl_fifo(uint32_t data) if (scale < 1.0f) scale *= 2.0f; - uint32_t alpha = m_tnl_fifo[2]; + u32 alpha = m_tnl_fifo[2]; render_tnl_object(m_tnl_fifo[0] & 0x1fffff, scale, alpha); // printf("TNL FIFO: %08X, %f, %08X, %08X\n", m_tnl_fifo[0], u2f(m_tnl_fifo[1]), m_tnl_fifo[2], m_tnl_fifo[3]); @@ -1399,44 +1338,33 @@ void taitotz_renderer::push_tnl_fifo(uint32_t data) } } -void taitotz_renderer::push_direct_poly_fifo(uint32_t data) +void taitotz_renderer::push_direct_poly_fifo(u32 data) { m_direct_fifo[m_direct_fifo_ptr] = data; m_direct_fifo_ptr++; - int num_verts = ((m_direct_fifo[0] >> 8) & 0x7) + 1; - int expected_size; - switch ((m_direct_fifo[0] >> 8) & 0x7) - { - case 0: expected_size = 24; break; - case 2: expected_size = 16; break; - case 3: expected_size = 24; break; - case 4: expected_size = 24; break; - case 5: expected_size = 32; break; - case 6: expected_size = 32; break; - default: fatalerror("push_direct_poly_fifo: %08X, num_verts = %d\n", m_direct_fifo[0], num_verts); break; - } - + int num_verts = ((m_direct_fifo[0] >> 8) & 7) + 1; + int expected_size = 4 + num_verts * 4; if (m_direct_fifo_ptr >= expected_size) { vertex_t v[8]; taitotz_polydata &extra = object_data().next(); int index = 4; - for (int i=0; i < num_verts; i++) + for (int i = 0; i < num_verts; i++) { - v[i].x = (m_direct_fifo[index+0] >> 16) & 0xffff; - v[i].y = m_direct_fifo[index+0] & 0xffff; - v[i].p[POLY_U] = (m_direct_fifo[index+2] >> 20) & 0xfff; - v[i].p[POLY_V] = (m_direct_fifo[index+2] >> 4) & 0xfff; - //uint16_t z = m_direct_fifo[index+1] & 0xffff; + v[i].x = (m_direct_fifo[index + 0] >> 16) & 0xffff; + v[i].y = m_direct_fifo[index + 0] & 0xffff; + v[i].p[POLY_U] = (m_direct_fifo[index + 2] >> 20) & 0xfff; + v[i].p[POLY_V] = (m_direct_fifo[index + 2] >> 4) & 0xfff; + //u16 z = m_direct_fifo[index+1] & 0xffff; index += 4; } extra.texture = m_direct_fifo[1] & 0x7ff; - for (int i=2; i < num_verts; i++) + for (int i = 2; i < num_verts; i++) { render_triangle<3>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline_noz, this), v[0], v[i-1], v[i]); } @@ -1445,24 +1373,24 @@ void taitotz_renderer::push_direct_poly_fifo(uint32_t data) } } -uint32_t taitotz_state::screen_update_taitotz(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 taitotz_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { m_renderer->draw(bitmap, cliprect); - uint16_t const *screen_src = (uint16_t*)&m_screen_ram[m_scr_base]; + u16 const *screen_src = (u16*)&m_screen_ram[m_scr_base]; - for (int j=0; j < 384; j++) + for (int j = 0; j < 384; j++) { - uint32_t *const fb = &bitmap.pix(j); - for (int i=0; i < 512; i++) + u32 *const fb = &bitmap.pix(j); + for (int i = 0; i < 512; i++) { - uint16_t p = *screen_src++; + u16 p = *screen_src++; if (p & 0x8000) // draw 2D framebuffer if there's an opaque pixel { - int r = ((p >> 10) & 0x1f) << (3+16); - int g = ((p >> 5) & 0x1f) << (3+8); + int r = ((p >> 10) & 0x1f) << (3 + 16); + int g = ((p >> 5) & 0x1f) << (3 + 8); int b = (p & 0x1f) << 3; - fb[i^1] = 0xff000000 | r | g | b; + fb[i ^ 1] = 0xff000000 | r | g | b; } } } @@ -1470,49 +1398,43 @@ uint32_t taitotz_state::screen_update_taitotz(screen_device &screen, bitmap_rgb3 return 0; } -void taitotz_state::draw_tile(uint32_t pos, uint32_t tile) +void taitotz_state::draw_tile(u32 pos, u32 tile) { - int tileu = (tile & 0x1f) * 16; - int tilev = ((tile >> 5)) * 16; + int tileu = (tile & 0x1f) << 4; + int tilev = ((tile >> 5)) << 4; - int tilex = (pos & 0x1f) * 16; - int tiley = ((pos >> 5) & 0x1f) * 16; + int tilex = (pos & 0x1f) << 4; + int tiley = ((pos >> 5) & 0x1f) << 4; - uint16_t *src_tile = (uint16_t*)&m_screen_ram[0x180000]; - uint16_t *dst = (uint16_t*)&m_screen_ram[m_scr_base]; + u16 *src_tile = (u16*)&m_screen_ram[0x180000]; + u16 *dst = (u16*)&m_screen_ram[m_scr_base]; int v = tilev; - - for (int j=tiley; j < (tiley+16); j++) + for (int j = tiley; j < tiley + 16; j++, v++) { int u = tileu; - for (int i=tilex; i < (tilex+16); i++) + for (int i = tilex; i < tilex + 16; i++, u++) { - uint16_t p = src_tile[((v*512) + u)]; - dst[(j*512) + i] = p; - u++; + u16 p = src_tile[v * 512 + u]; + dst[j * 512 + i] = p; } - v++; } } /* Video chip memory map - 0x800000...0x9fffff Screen RAM - 0x980000...7fff Char RAM - 0x9c0000...fffff Tile RAM? - + 0x0800000...0x9fffff Screen RAM + 0x980000...987fff Char RAM + 0x9c0000...9fffff Tile RAM? 0x1000000...0x17fffff Texture RAM - 0x1800000...0x187ffff Frame RAM - landhigh puts fullscreen images into 0x9c0000 batlgr2 into 0x9e0000 */ -uint32_t taitotz_state::video_mem_r(uint32_t address) +u32 taitotz_state::video_mem_r(u32 address) { if (address >= 0x800000 && address < 0x1000000) { @@ -1528,12 +1450,12 @@ uint32_t taitotz_state::video_mem_r(uint32_t address) } else { - printf("video_mem_r: %08X\n", address); + LOGMASKED(LOG_VIDEO_MEM_UNK_RD, "%s: video_mem_r: unknown address %08x\n", address); return 0; } } -void taitotz_state::video_mem_w(uint32_t address, uint32_t data) +void taitotz_state::video_mem_w(u32 address, u32 data) { if (address >= 0x800000 && address < 0x1000000) { @@ -1549,50 +1471,49 @@ void taitotz_state::video_mem_w(uint32_t address, uint32_t data) } else { - printf("video_mem_w: %08X, %08X\n", address, data); + LOGMASKED(LOG_VIDEO_MEM_UNK_WR, "%s: video_mem_w: unknown address %08x = %08x\n", address, data); } } -uint32_t taitotz_state::video_reg_r(uint32_t reg) +u32 taitotz_state::video_reg_r(u32 reg) { + u32 data = 0; switch ((reg >> 28) & 0xf) { - case 0x1: + case 0x1: + if (reg == 0x10000105) // Gets spammed a lot. Probably a status register. { - if (reg == 0x10000105) // Gets spammed a lot. Probably a status register. - { - m_reg105 ^= 0xffffffff; - return m_reg105; - } - - logerror("video_reg_r: reg: %08X\n", reg); - return 0xffffffff; + m_reg105 ^= 0xffffffff; + return m_reg105; } - case 0x2: - { - int subreg = reg & 0xfffffff; - if (reg != 0x20000008) - logerror("video_reg_r: reg: %08X\n", reg); + data = 0xffffffff; + LOGMASKED(LOG_VIDEO_REG_1_RD, "%s: video_reg_r: reg %08x: %08x\n", machine().describe_context(), reg, data); + return data; - if (subreg < 0x10) - { - return m_video_unk_reg[subreg]; - } - break; - } - case 0xb: + case 0x2: + { + int subreg = reg & 0xfffffff; + if (subreg < 0x10) { - return video_mem_r(reg & 0xfffffff); + data = m_video_unk_reg[subreg]; + LOGMASKED(LOG_VIDEO_REG_2_RD, "%s: video_reg_r: reg %08x: %08x\n", machine().describe_context(), reg, data); } - default: + else { - logerror("video_reg_r: reg: %08X\n", reg); - break; + LOGMASKED(LOG_VIDEO_REG_2_RD, "%s: video_reg_r: unhandled reg %08x: %08x\n", machine().describe_context(), reg, data); } + return data; } + case 0xb: + return video_mem_r(reg & 0xfffffff); - return 0; + default: + LOGMASKED(LOG_VIDEO_REG_UNK_RD, "%s: video_reg_r: unknown reg %08x: %08x\n", machine().describe_context(), reg, data); + break; + } + + return data; } /* @@ -1616,57 +1537,52 @@ video_reg_w: r: 20000003 d: 019501AA video_reg_w: r: 20000004 d: 00000000 */ -void taitotz_state::video_reg_w(uint32_t reg, uint32_t data) +void taitotz_state::video_reg_w(u32 reg, u32 data) { switch ((reg >> 28) & 0xf) { case 0x1: // Register write? + if (reg == 0x10000105) { - if (reg == 0x10000105) - { - // This register gets spammed a lot. VB IRQ ack or buffer swap? - } - else - { - logerror("video_reg_w: reg: %08X data: %08X\n", reg, data); - } - break; + // This register gets spammed a lot. VB IRQ ack or buffer swap? } - case 0x2: // ??? + else { - int subreg = reg & 0xfffffff; - if (subreg < 0x10) - { - m_video_unk_reg[subreg] = data; - } - logerror("video_reg_w: reg: %08X data: %08X\n", reg, data); - break; + LOGMASKED(LOG_VIDEO_REG_1_WR, "%s: video_reg_w: reg %08x = %08x\n", machine().describe_context(), reg, data); } - case 0x3: // Draw 16x16 tile + break; + + case 0x2: // ??? + { + int subreg = reg & 0xfffffff; + if (subreg < 0x10) { - uint32_t pos = (data >> 12) & 0xfff; - uint32_t tile = data & 0xfff; - draw_tile(pos, tile); - break; + m_video_unk_reg[subreg] = data; + LOGMASKED(LOG_VIDEO_REG_2_WR, "%s: video_reg_w: reg %08x = %08x\n", machine().describe_context(), reg, data); } - case 0xb: // RAM write? + else { - video_mem_w(m_video_ram_ptr, data); - m_video_ram_ptr++; - break; + LOGMASKED(LOG_VIDEO_REG_2_WR, "%s: video_reg_w: unhandled reg %08x = %08x\n", machine().describe_context(), reg, data); } + break; + } + case 0x3: // Draw 16x16 tile + draw_tile((data >> 12) & 0xfff, data & 0xfff); + break; + case 0xb: // RAM write? + video_mem_w(m_video_ram_ptr, data); + m_video_ram_ptr++; + break; default: - { - logerror("video_reg_w: reg: %08X data: %08X\n", reg, data); - break; - } + LOGMASKED(LOG_VIDEO_REG_UNK_WR, "%s: video_reg_w: unknown reg %08x = %08x\n", machine().describe_context(), reg, data); + break; } } -uint64_t taitotz_state::video_chip_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::video_chip_r(offs_t offset, u64 mem_mask) { - uint64_t r = 0; - uint32_t reg = offset * 8; + u64 r = 0; + u32 reg = offset * 8; if (ACCESSING_BITS_0_31) { @@ -1674,148 +1590,120 @@ uint64_t taitotz_state::video_chip_r(offs_t offset, uint64_t mem_mask) switch (reg) { - case 0x14: - { - r |= 0xff; // more busy flags? (value & 0x11ff == 0xff expected) - break; - } + case 0x14: + r |= 0xff; // more busy flags? (value & 0x11ff == 0xff expected) + break; - default: - printf("video_chip_r: %04X\n", reg); - break; + default: + LOGMASKED(LOG_VIDEO_CHIP_UNK_RD, "%s: video_chip_r: unknown reg %08x & %08x%08x\n", machine().describe_context(), reg, (u32)(mem_mask >> 32), (u32)mem_mask); + break; } } + if (ACCESSING_BITS_32_63) { switch (reg) { - case 0x0: - { - r |= (uint64_t)(video_reg_r(m_video_reg)) << 32; - break; - } + case 0x0: + r |= (u64)video_reg_r(m_video_reg) << 32; + break; - case 0x10: - { - r |= (uint64_t)(0xff) << 32; // busy flags? landhigh expects this - break; - } + case 0x10: + r |= 0x000000ff00000000ULL; // busy flags? landhigh expects this + break; - default: - { - printf("video_chip_r: %04X\n", reg); - break; - } + default: + LOGMASKED(LOG_VIDEO_CHIP_UNK_RD, "%s: video_chip_r: unknown reg %08x & %08x%08x\n", machine().describe_context(), reg, (u32)(mem_mask >> 32), (u32)mem_mask); + break; } } return r; } -void taitotz_state::video_chip_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::video_chip_w(offs_t offset, u64 data, u64 mem_mask) { - uint32_t reg = offset * 8; - uint32_t regdata; + u32 reg = offset * 8; + u32 regdata; if (ACCESSING_BITS_0_31) { reg += 4; - regdata = (uint32_t)(data); + regdata = (u32)data; switch (reg) { default: - { - logerror("video_chip_w: port 0x%02X: %08X\n", reg, regdata); + LOGMASKED(LOG_VIDEO_CHIP_UNK_WR, "%s: video_chip_w: unknown port %02x = %08x%08x & %08x%08x\n", machine().describe_context(), reg, (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); break; - } } } + if (ACCESSING_BITS_32_63) { - regdata = (uint32_t)(data >> 32); + regdata = (u32)(data >> 32); switch (reg) { - case 0: + case 0: + video_reg_w(m_video_reg, regdata); + break; + case 0x8: + m_video_reg = regdata; + m_video_fifo_ptr = 0; + + switch ((m_video_reg >> 28) & 0xf) { - video_reg_w(m_video_reg, regdata); + case 0xb: + m_video_ram_ptr = m_video_reg & 0xfffffff; break; - } - case 0x8: - { - m_video_reg = regdata; - m_video_fifo_ptr = 0; - - switch ((m_video_reg >> 28) & 0xf) - { - case 0xb: - { - m_video_ram_ptr = m_video_reg & 0xfffffff; - //logerror("video_chip_ram sel %08X at %08X\n", m_video_reg & 0x0fffffff, m_maincpu->pc()); - break; - } - case 0x0: - { - break; - } - case 0x1: - { - break; - } - case 0x2: - { - break; - } - case 0x3: - { - // video_chip_w: port 0x08: 30000001 gets spammed a lot - break; - } - default: - { - logerror("video_chip_w: port 0x%02X: %08X\n", reg, regdata); - break; - } - } + case 0x0: + break; + case 0x1: + break; + case 0x2: + break; + case 0x3: + // video_chip_w: port 0x08: 30000001 gets spammed a lot break; - } default: - { - logerror("video_chip_w: port 0x%02X: %08X\n", reg, regdata); + LOGMASKED(LOG_VIDEO_CHIP_UNK_WR, "%s: video_chip_w: port %02x = %08x%08x & %08x%08x (reg 8)\n", machine().describe_context(), reg, (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); break; } + break; + default: + LOGMASKED(LOG_VIDEO_CHIP_UNK_WR, "%s: video_chip_w: unknown port %02x = %08x%08x & %08x%08x\n", machine().describe_context(), reg, (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); + break; } } } -uint64_t taitotz_state::video_fifo_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::video_fifo_r(offs_t offset, u64 mem_mask) { - uint64_t r = 0; + u64 r = 0; if (ACCESSING_BITS_32_63) { - r |= (uint64_t)(video_mem_r(m_video_ram_ptr)) << 32; + r |= (u64)video_mem_r(m_video_ram_ptr) << 32; m_video_ram_ptr++; } if (ACCESSING_BITS_0_31) { - r |= (uint64_t)(video_mem_r(m_video_ram_ptr)); + r |= (u64)video_mem_r(m_video_ram_ptr); m_video_ram_ptr++; } return r; } -void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::video_fifo_w(offs_t offset, u64 data, u64 mem_mask) { int command = (m_video_reg >> 28) & 0xf; if (command == 0xb) { // FIFO mem access - if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - video_mem_w(m_video_ram_ptr, (uint32_t)(data >> 32)); + video_mem_w(m_video_ram_ptr, (u32)(data >> 32)); m_video_ram_ptr++; } m_video_fifo_ptr++; @@ -1824,7 +1712,7 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - video_mem_w(m_video_ram_ptr, (uint32_t)(data)); + video_mem_w(m_video_ram_ptr, (u32)data); m_video_ram_ptr++; } m_video_fifo_ptr++; @@ -1833,13 +1721,13 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask else if (command == 0x1) { // Direct Polygon FIFO - + LOGMASKED(LOG_DIRECT_FIFO, "%s: Direct polygon FIFO write: %08x%08x & %08x%08x\n", machine().describe_context(), (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - m_renderer->push_direct_poly_fifo((uint32_t)(data >> 32)); - //logerror("FIFO packet w: %08X at %08X\n", (uint32_t)(data >> 32), m_maincpu->pc()); + m_renderer->push_direct_poly_fifo((u32)(data >> 32)); + LOGMASKED(LOG_DIRECT_FIFO, "%s: push_direct_poly_fifo: %08x [%d]\n", machine().describe_context(), (u32)(data >> 32), m_renderer->direct_fifo_ptr()); } m_video_fifo_ptr++; } @@ -1847,8 +1735,8 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - m_renderer->push_direct_poly_fifo((uint32_t)(data)); - //logerror("FIFO packet w: %08X at %08X\n", (uint32_t)(data), m_maincpu->pc()); + m_renderer->push_direct_poly_fifo((u32)data); + LOGMASKED(LOG_DIRECT_FIFO, "%s: push_direct_poly_fifo: %08x [%d]\n", machine().describe_context(), (u32)data, m_renderer->direct_fifo_ptr()); } m_video_fifo_ptr++; } @@ -1856,12 +1744,13 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask else if (command == 0x0) { // T&L FIFO - + LOGMASKED(LOG_TNL_FIFO, "%s: T&L FIFO write: %08x%08x & %08x%08x\n", machine().describe_context(), (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - m_renderer->push_tnl_fifo((uint32_t)(data >> 32)); + m_renderer->push_tnl_fifo((u32)(data >> 32)); + LOGMASKED(LOG_TNL_FIFO, "%s: push_tnl_fifo: %08x\n", machine().describe_context(), (u32)(data >> 32)); } m_video_fifo_ptr++; } @@ -1869,18 +1758,20 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - m_renderer->push_tnl_fifo((uint32_t)(data)); + m_renderer->push_tnl_fifo((u32)data); + LOGMASKED(LOG_TNL_FIFO, "%s: push_tnl_fifo: %08x\n", machine().describe_context(), (u32)data); } m_video_fifo_ptr++; } } else { + LOGMASKED(LOG_DIRECT_FIFO, "%s: Unknown FIFO write: %08x%08x & %08x%08x\n", machine().describe_context(), (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - printf("FIFO write with cmd %02X: %08X\n", command, (uint32_t)(data >> 32)); + printf("FIFO write with cmd %02X: %08X\n", command, (u32)(data >> 32)); } m_video_fifo_ptr++; } @@ -1888,128 +1779,88 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - printf("FIFO write with cmd %02X: %08X\n", command, (uint32_t)(data)); + printf("FIFO write with cmd %02X: %08X\n", command, (u32)data); } m_video_fifo_ptr++; } } - - //COMBINE_DATA(m_video_fifo_mem + offset); } -uint64_t taitotz_state::ieee1394_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::ieee1394_r(offs_t offset, u64 mem_mask) { if (offset == 4) { - return 0xffffffffffffffffU; + return ~0ULL; } - //logerror("ieee1394_r: %08X, %08X%08X\n", offset, (uint32_t)(mem_mask >> 32), (uint32_t)(mem_mask)); return 0; } -void taitotz_state::ieee1394_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::ieee1394_w(offs_t offset, u64 data, u64 mem_mask) { - //logerror("ieee1394_w: %08X, %08X%08X, %08X%08X\n", offset, (uint32_t)(data >> 32), (uint32_t)(data), (uint32_t)(mem_mask >> 32), (uint32_t)(mem_mask)); - if (ACCESSING_BITS_32_63) - { - } - if (ACCESSING_BITS_0_31) - { - } } -uint64_t taitotz_state::ppc_common_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::ppc_common_r(offs_t offset, u64 mem_mask) { - uint64_t res = 0; + u64 res = 0; if (ACCESSING_BITS_0_15) { - res |= m_io_share_ram[(offset * 2) + 1]; + res |= m_io_share_ram[offset * 2 + 1]; } if (ACCESSING_BITS_32_47) { - res |= (uint64_t)(m_io_share_ram[(offset * 2) + 0]) << 32; + res |= (u64)m_io_share_ram[offset * 2] << 32; } return res; } -void taitotz_state::ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::ppc_common_w(offs_t offset, u64 data, u64 mem_mask) { if (ACCESSING_BITS_0_15) { - m_io_share_ram[(offset * 2) + 1] = (uint16_t)(data); + m_io_share_ram[offset * 2 + 1] = (u16)data; } if (ACCESSING_BITS_32_47) { - m_io_share_ram[(offset * 2) + 0] = (uint16_t)(data >> 32); + m_io_share_ram[offset * 2] = (u16)(data >> 32); } if (offset == 0x7ff) { - if (m_io_share_ram[0xfff] != 0x0000 && - m_io_share_ram[0xfff] != 0x1010 && - m_io_share_ram[0xfff] != 0x1020 && - m_io_share_ram[0xfff] != 0x6000 && - m_io_share_ram[0xfff] != 0x6010 && - m_io_share_ram[0xfff] != 0x7004 && - m_io_share_ram[0xfff] != 0x4001 && - m_io_share_ram[0xfff] != 0x4002 && - m_io_share_ram[0xfff] != 0x4003) - { - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, "PPC -> TLCS cmd %04X\n", m_io_share_ram[0xfff]); - } - - if (m_io_share_ram[0xfff] == 0x4000) + const u16 tlcs_cmd = m_io_share_ram[0xfff]; + if (tlcs_cmd != 0x0000 && tlcs_cmd != 0x1010 && tlcs_cmd != 0x1020 && tlcs_cmd != 0x6000 && tlcs_cmd != 0x6010 && + tlcs_cmd != 0x7004 && tlcs_cmd != 0x4001 && tlcs_cmd != 0x4002 && tlcs_cmd != 0x4003) { - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04X %04X %04X %04X %04X %04X %04X %04X %04X %04X\n", - m_io_share_ram[0x1c34/2], - m_io_share_ram[0x1c36/2], - m_io_share_ram[0x1c38/2], - m_io_share_ram[0x1c3a/2], - m_io_share_ram[0x1c2c/2], - m_io_share_ram[0x1c2e/2], - m_io_share_ram[0x1c30/2], - m_io_share_ram[0x1c32/2], - m_io_share_ram[0x1c24/2], - m_io_share_ram[0x1c26/2] - ); - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04X %04X %04X %04X %04X %04X %04X %04X %04X %04X\n", - m_io_share_ram[0x1c28/2], - m_io_share_ram[0x1c2a/2], - m_io_share_ram[0x1c1c/2], - m_io_share_ram[0x1c1e/2], - m_io_share_ram[0x1c20/2], - m_io_share_ram[0x1c22/2], - m_io_share_ram[0x1c14/2], - m_io_share_ram[0x1c16/2], - m_io_share_ram[0x1c18/2], - m_io_share_ram[0x1c1a/2] - ); + LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, "PPC -> TLCS cmd %04x\n", tlcs_cmd); } - /* - if (m_io_share_ram[0xfff] == 0x1010) + if (tlcs_cmd == 0x4000) { - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, "PPC -> TLCS cmd 1010: %04X %04X %04X %04X\n", m_io_share_ram[0x1a02/2], m_io_share_ram[0x1a04/2], m_io_share_ram[0x1a06/2], m_io_share_ram[0x1a08/2]); + LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n", + m_io_share_ram[0x1c34 / 2], m_io_share_ram[0x1c36 / 2], m_io_share_ram[0x1c38 / 2], m_io_share_ram[0x1c3a / 2], + m_io_share_ram[0x1c2c / 2], m_io_share_ram[0x1c2e / 2], m_io_share_ram[0x1c30 / 2], m_io_share_ram[0x1c32 / 2], + m_io_share_ram[0x1c24 / 2], m_io_share_ram[0x1c26 / 2]); + LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n", + m_io_share_ram[0x1c28 / 2], m_io_share_ram[0x1c2a / 2], m_io_share_ram[0x1c1c / 2], m_io_share_ram[0x1c1e / 2], + m_io_share_ram[0x1c20 / 2], m_io_share_ram[0x1c22 / 2], m_io_share_ram[0x1c14 / 2], m_io_share_ram[0x1c16 / 2], + m_io_share_ram[0x1c18 / 2], m_io_share_ram[0x1c1a / 2]); } - */ - // hacky way to handle some commands for now - if (m_io_share_ram[0xfff] == 0x4001) + if (tlcs_cmd == 0x4001) { m_io_share_ram[0xfff] = 0x0000; m_io_share_ram[0xe00] = 0xffff; m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); } - else if (m_io_share_ram[0xfff] == 0x4004 || m_io_share_ram[0xfff] == 0x4000) + else if (tlcs_cmd == 0x4004 || tlcs_cmd == 0x4000) { m_io_share_ram[0xfff] = 0x0000; m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); } - else if (m_io_share_ram[0xfff] == 0x7004) + else if (tlcs_cmd == 0x7004) { // this command seems to turn off interrupts on TLCS... m_io_share_ram[0xfff] = 0x0000; @@ -2023,15 +1874,15 @@ void taitotz_state::ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask // The PPC always goes to busy loop waiting for TLCS here, so we can free up the timeslice. // Only do it for HDD access and backup RAM for now... - if (m_io_share_ram[0xfff] == 0x1010 || m_io_share_ram[0xfff] == 0x1020 || - m_io_share_ram[0xfff] == 0x6000 || m_io_share_ram[0xfff] == 0x6010) + if (tlcs_cmd == 0x1010 || tlcs_cmd == 0x1020 || + tlcs_cmd == 0x6000 || tlcs_cmd == 0x6010) { //m_maincpu->spin_until_trigger(PPC_TLCS_COMM_TRIGGER); //m_maincpu->spin_until_interrupt(); } // pwrshovl sometimes writes commands during command handling... make sure that doesn't happen - if (m_io_share_ram[0xfff] == 0x0000) + if (tlcs_cmd == 0x0000) { m_maincpu->spin_until_time(attotime::from_usec(100)); } @@ -2040,29 +1891,30 @@ void taitotz_state::ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask } } -#if 0 - // debug hookup - if ((m_io_share_ram[0xd82] & 0xff) == 0xff) + if (ENABLE_DEBUG_PRINTS) { - for (int i=0; i < 0x80; i++) + // debug hookup + if ((u8)m_io_share_ram[0xd82] == 0xff) { - uint16_t w = m_io_share_ram[0x900+i]; - printf("%c%c", w & 0xff, (w >> 8) & 0xff); + for (int i = 0; i < 0x80; i++) + { + u16 w = m_io_share_ram[0x900 + i]; + printf("%c%c", (s8)w, (s8)(w >> 8)); + } + printf("\n"); + m_io_share_ram[0xd82] = 0; } - printf("\n"); - m_io_share_ram[0xd82] = 0; - } - if ((m_io_share_ram[0xd8a] & 0xff) == 0xff) - { - for (int i=0; i < 0x80; i++) + if ((u8)m_io_share_ram[0xd8a] == 0xff) { - uint16_t w = m_io_share_ram[0xb00+i]; - printf("%c%c", w & 0xff, (w >> 8) & 0xff); + for (int i = 0; i < 0x80; i++) + { + u16 w = m_io_share_ram[0xb00 + i]; + printf("%c%c", (s8)w, (s8)(w >> 8)); + } + printf("\n"); + m_io_share_ram[0xd8a] = 0; } - printf("\n"); - m_io_share_ram[0xd8a] = 0; } -#endif } // BAT Config: @@ -2090,26 +1942,24 @@ void taitotz_state::ppc603e_mem(address_map &map) map(0xfff00000, 0xffffffff).rom().region("user1", 0); } - - -uint8_t taitotz_state::tlcs_common_r(offs_t offset) +u8 taitotz_state::tlcs_common_r(offs_t offset) { if (offset & 1) { - return (uint8_t)(m_io_share_ram[offset / 2] >> 8); + return (u8)(m_io_share_ram[offset / 2] >> 8); } else { - return (uint8_t)(m_io_share_ram[offset / 2]); + return (u8)(m_io_share_ram[offset / 2]); } } -void taitotz_state::tlcs_common_w(offs_t offset, uint8_t data) +void taitotz_state::tlcs_common_w(offs_t offset, u8 data) { if (offset & 1) { m_io_share_ram[offset / 2] &= 0x00ff; - m_io_share_ram[offset / 2] |= (uint16_t)(data) << 8; + m_io_share_ram[offset / 2] |= (u16)data << 8; } else { @@ -2125,7 +1975,6 @@ void taitotz_state::tlcs_common_w(offs_t offset, uint8_t data) m_io_share_ram[0xffe] != 0x1022) { LOGMASKED(LOG_TLCS_TO_PPC_COMMANDS, "TLCS -> PPC cmd %04X\n", m_io_share_ram[0xffe]); - //LOGMASKED(LOG_TLCS_TO_PPC_COMMANDS, "0x40080104 = %08X\n", (uint32_t)(m_work_ram[0x80104/8])); } m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); @@ -2150,7 +1999,7 @@ void taitotz_state::tlcs_common_w(offs_t offset, uint8_t data) } // RTC could be Epson RTC-64613, same as taitopjc.cpp -uint8_t taitotz_state::tlcs_rtc_r(offs_t offset) +u8 taitotz_state::tlcs_rtc_r(offs_t offset) { switch (offset) { @@ -2167,14 +2016,14 @@ uint8_t taitotz_state::tlcs_rtc_r(offs_t offset) case 0x0e: return 0; default: - printf("tlcs_rtc_r: %02X\n", offset); + LOGMASKED(LOG_RTC_UNK_RD, "%s: tlcs_rtc_r: unknown reg %02x\n", offset); break; } return 0; } -void taitotz_state::tlcs_rtc_w(offs_t offset, uint8_t data) +void taitotz_state::tlcs_rtc_w(offs_t offset, u8 data) { switch (offset) { @@ -2190,26 +2039,32 @@ void taitotz_state::tlcs_rtc_w(offs_t offset, uint8_t data) break; default: - //printf("tlcs_rtc_w: %02X, %02X\n", offset, data); + LOGMASKED(LOG_RTC_UNK_WR, "%s: tlcs_rtc_w: unknown reg %02x = %02x\n", offset, data); break; } } -uint16_t taitotz_state::tlcs_ide0_r(offs_t offset, uint16_t mem_mask) +u16 taitotz_state::tlcs_ide0_r(offs_t offset, u16 mem_mask) { - uint16_t d = m_ata->cs0_r(offset, mem_mask); + u16 d = m_ata->cs0_r(offset, mem_mask); if (offset == 7) - d &= ~0x2; // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up... - // The status check explicitly checks for 0x50 (drive ready, seek complete). + { + // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up. + // The status check explicitly checks for 0x50 (drive ready, seek complete). + d &= ~0x2; + } return d; } -uint16_t taitotz_state::tlcs_ide1_r(offs_t offset, uint16_t mem_mask) +u16 taitotz_state::tlcs_ide1_r(offs_t offset, u16 mem_mask) { - uint16_t d = m_ata->cs1_r(offset, mem_mask); + u16 d = m_ata->cs1_r(offset, mem_mask); if (offset == 6) - d &= ~0x2; // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up... - // The status check explicitly checks for 0x50 (drive ready, seek complete). + { + // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up. + // The status check explicitly checks for 0x50 (drive ready, seek complete). + d &= ~0x2; + } return d; } @@ -2226,7 +2081,7 @@ uint16_t taitotz_state::tlcs_ide1_r(offs_t offset, uint16_t mem_mask) // 0xfc0147: INT5 - // 0xfc0148: INT6 - // 0xfc0149: INT7 - -// 0xfc014a: int8_t Sound chip interrupt? +// 0xfc014a: INT8 Sound chip interrupt? // 0xfc0120: INTAD - // 0xfc0120: INTTR8-A - // 0xfc0120: INTT0 - @@ -2240,7 +2095,7 @@ uint16_t taitotz_state::tlcs_ide1_r(offs_t offset, uint16_t mem_mask) void taitotz_state::tlcs900h_mem(address_map &map) { - map(0x010000, 0x02ffff).ram(); // Work RAM + map(0x010000, 0x02ffff).ram(); // Work RAM map(0x040000, 0x041fff).ram().share("nvram"); // Backup RAM map(0x044000, 0x04400f).rw(FUNC(taitotz_state::tlcs_rtc_r), FUNC(taitotz_state::tlcs_rtc_w)); map(0x060000, 0x061fff).rw(FUNC(taitotz_state::tlcs_common_r), FUNC(taitotz_state::tlcs_common_w)); @@ -2252,7 +2107,7 @@ void taitotz_state::tlcs900h_mem(address_map &map) void taitotz_state::landhigh_tlcs900h_mem(address_map &map) { - map(0x200000, 0x21ffff).ram(); // Work RAM + map(0x200000, 0x21ffff).ram(); // Work RAM map(0x400000, 0x401fff).ram().share("nvram"); // Backup RAM map(0x404000, 0x40400f).rw(FUNC(taitotz_state::tlcs_rtc_r), FUNC(taitotz_state::tlcs_rtc_w)); map(0x900000, 0x901fff).rw(FUNC(taitotz_state::tlcs_common_r), FUNC(taitotz_state::tlcs_common_w)); @@ -2262,12 +2117,10 @@ void taitotz_state::landhigh_tlcs900h_mem(address_map &map) map(0xfc0000, 0xffffff).rom().region("io_cpu", 0); } - - static INPUT_PORTS_START( taitotz ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2316,7 +2169,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( landhigh ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2375,7 +2228,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( batlgr2 ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2430,7 +2283,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( pwrshovl ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2494,7 +2347,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( styphp ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2549,7 +2402,7 @@ INPUT_PORTS_END static INPUT_PORTS_START(dendego3) PORT_START("INPUTS1") PORT_BIT(0x00000001, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_SERVICE_NO_TOGGLE(0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE(0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT(0x00000004, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x00000008, IP_ACTIVE_LOW, IPT_SERVICE) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT(0x00000010, IP_ACTIVE_LOW, IPT_UNUSED) @@ -2601,28 +2454,30 @@ void taitotz_state::machine_reset() if (m_hdd_serial_number != nullptr) { ide_hdd_device *hdd = m_ata->subdevice("0")->subdevice("hdd"); - uint16_t *identify_device = hdd->identify_device_buffer(); + u16 *identify_device = hdd->identify_device_buffer(); - for (int i=0; i < 10; i++) + for (int i = 0; i < 10; i++) { - identify_device[10+i] = (m_hdd_serial_number[i*2] << 8) | m_hdd_serial_number[i*2+1]; + identify_device[10 + i] = (m_hdd_serial_number[i * 2] << 8) | m_hdd_serial_number[i * 2 + 1]; } } } void taitotz_state::machine_start() { - /* set conservative DRC options */ + // set conservative DRC options m_maincpu->ppcdrc_set_options(PPCDRC_COMPATIBLE_OPTIONS); - /* configure fast RAM regions for DRC */ + // configure fast RAM regions for DRC m_maincpu->ppcdrc_add_fastram(0x40000000, 0x40ffffff, false, m_work_ram); } - -INTERRUPT_GEN_MEMBER(taitotz_state::taitotz_vbi) +void taitotz_state::vblank(int state) { - m_iocpu->set_input_line(TLCS900_INT3, ASSERT_LINE); + if (state) + { + m_iocpu->set_input_line(TLCS900_INT3, ASSERT_LINE); + } } void taitotz_state::ide_interrupt(int state) @@ -2632,12 +2487,12 @@ void taitotz_state::ide_interrupt(int state) void taitotz_state::taitotz(machine_config &config) { - /* IBM EMPPC603eBG-100 */ + // IBM EMPPC603eBG-100 PPC603E(config, m_maincpu, 100000000); - m_maincpu->set_bus_frequency(XTAL(66'666'700)); /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + m_maincpu->set_bus_frequency(XTAL(66'666'700)); // Multiplier 1.5, Bus = 66MHz, Core = 100MHz m_maincpu->set_addrmap(AS_PROGRAM, &taitotz_state::ppc603e_mem); - /* TMP95C063F I/O CPU */ + // TMP95C063F I/O CPU TMP95C063(config, m_iocpu, 25000000); m_iocpu->port9_read().set_ioport("INPUTS1"); m_iocpu->portb_read().set_ioport("INPUTS2"); @@ -2652,9 +2507,8 @@ void taitotz_state::taitotz(machine_config &config) m_iocpu->an_read<6>().set_ioport("ANALOG7"); m_iocpu->an_read<7>().set_ioport("ANALOG8"); m_iocpu->set_addrmap(AS_PROGRAM, &taitotz_state::tlcs900h_mem); - m_iocpu->set_vblank_int("screen", FUNC(taitotz_state::taitotz_vbi)); - /* MN1020819DA sound CPU */ + // MN1020819DA sound CPU (not yet dumped/implemented) config.set_maximum_quantum(attotime::from_hz(120)); @@ -2668,7 +2522,8 @@ void taitotz_state::taitotz(machine_config &config) m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); m_screen->set_size(512, 384); m_screen->set_visarea(0, 511, 0, 383); - m_screen->set_screen_update(FUNC(taitotz_state::screen_update_taitotz)); + m_screen->set_screen_update(FUNC(taitotz_state::screen_update)); + m_screen->screen_vblank().set(FUNC(taitotz_state::vblank)); } void taitotz_state::landhigh(machine_config &config) @@ -2681,21 +2536,22 @@ void taitotz_state::landhigh(machine_config &config) // Init for BIOS v1.52 void taitotz_state::init_taitotz_152() { - uint32_t *rom = (uint32_t*)memregion("user1")->base(); - rom[(0x2c87c^4)/4] = 0x38600000; // skip sound load timeout... -// rom[(0x2c620^4)/4] = 0x48000014; // ID check skip (not needed with correct serial number) - -#if 0 - rom[(0x2c164^4)/4] = 0x39600001; // enable game debug output - rom[(0x2c174^4)/4] = 0x39200001; // enable game debug output - rom[(0x2c978^4)/4] = 0x48000028; -#endif + u32 *rom = (u32*)memregion("user1")->base(); + rom[(0x2c87c ^ 4) / 4] = 0x38600000; // skip sound load timeout... +// rom[(0x2c620 ^ 4) / 4] = 0x48000014; // ID check skip (not needed with correct serial number) + + if (ENABLE_DEBUG_PRINTS) + { + rom[(0x2c164 ^ 4) / 4] = 0x39600001; // enable game debug output + rom[(0x2c174 ^ 4) / 4] = 0x39200001; + rom[(0x2c978 ^ 4) / 4] = 0x48000028; + } } // Init for BIOS 1.11a void taitotz_state::init_taitotz_111a() { - uint32_t *rom = (uint32_t*)memregion("user1")->base(); + u32 *rom = (u32*)memregion("user1")->base(); rom[(0x2b748^4)/4] = 0x480000b8; // skip sound load timeout } @@ -2829,7 +2685,7 @@ ROM_START( taitotz ) TAITOTZ_BIOS_V152 ROM_REGION16_LE( 0x40000, "io_cpu", ROMREGION_ERASE00 ) - ROM_REGION( 0x10000, "sound_cpu", ROMREGION_ERASE00 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", ROMREGION_ERASE00 ) // Undumped internal ROM ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 ) DISK_REGION( "ata:0:hdd" ) ROM_END @@ -2860,7 +2716,7 @@ ROM_START( landhigh ) ROM_LOAD16_BYTE( "e82-03.ic14", 0x000000, 0x020000, CRC(0de65b4d) SHA1(932316f7435259b723a29843d58b2e3dca92e7b7) ) ROM_LOAD16_BYTE( "e82-04.ic15", 0x000001, 0x020000, CRC(b3cb0f3d) SHA1(80414f50a1593c6b849d9f37e94a32168699a5c1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION( 0x500, "plds", 0 ) @@ -2880,7 +2736,7 @@ ROM_START( landhigha ) ROM_LOAD16_BYTE( "e82-03.ic14", 0x000000, 0x020000, CRC(0de65b4d) SHA1(932316f7435259b723a29843d58b2e3dca92e7b7) ) ROM_LOAD16_BYTE( "e82-04.ic15", 0x000001, 0x020000, CRC(b3cb0f3d) SHA1(80414f50a1593c6b849d9f37e94a32168699a5c1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION( 0x500, "plds", 0 ) @@ -2900,7 +2756,7 @@ ROM_START( batlgear ) ROM_LOAD16_BYTE( "e68-07.ic14", 0x000000, 0x020000, CRC(554c6fd7) SHA1(9f203dead81c7ccf73d7fd462cab147cd17f890f) ) ROM_LOAD16_BYTE( "e68-08.ic15", 0x000001, 0x020000, CRC(f1932380) SHA1(64d12e858af15a9ba8254917da13863ac7c9c050) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -2915,7 +2771,7 @@ ROM_START( batlgr2 ) ROM_LOAD16_BYTE( "e87-03.ic14", 0x000000, 0x020000, CRC(49ae7cd0) SHA1(15f07a6bb2044a85a2139481f1dc95a44520c929) ) ROM_LOAD16_BYTE( "e87-04.ic15", 0x000001, 0x020000, CRC(59f8f75f) SHA1(f5595751b10c0033f460114c43f5e2c192fe61f1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) // BATTLE GEAR 2 M9005023A VER.2.04J @@ -2932,7 +2788,7 @@ ROM_START( batlgr2a ) ROM_LOAD16_BYTE( "e87-03.ic14", 0x000000, 0x020000, CRC(49ae7cd0) SHA1(15f07a6bb2044a85a2139481f1dc95a44520c929) ) ROM_LOAD16_BYTE( "e87-04.ic15", 0x000001, 0x020000, CRC(59f8f75f) SHA1(f5595751b10c0033f460114c43f5e2c192fe61f1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -2947,7 +2803,7 @@ ROM_START( pwrshovl ) ROM_LOAD16_BYTE( "e74-04++.ic14", 0x000000, 0x020000, CRC(ef21a261) SHA1(7398826dbf48014b9c7e9454f978f3e419ebc64b) ) // actually labeled E74-04** ROM_LOAD16_BYTE( "e74-05++.ic15", 0x000001, 0x020000, CRC(2466217d) SHA1(dc814da3a1679cff001f179d3c1641af985a6490) ) // actually labeled E74-05** - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION16_LE( 0x20000, "io_cpu2", 0 ) // another TMP95C063F, not hooked up yet @@ -2971,7 +2827,7 @@ ROM_START( pwrshovla ) ROM_LOAD16_BYTE( "e74-04++.ic14", 0x000000, 0x020000, CRC(ef21a261) SHA1(7398826dbf48014b9c7e9454f978f3e419ebc64b) ) // actually labeled E74-04** ROM_LOAD16_BYTE( "e74-05++.ic15", 0x000001, 0x020000, CRC(2466217d) SHA1(dc814da3a1679cff001f179d3c1641af985a6490) ) // actually labeled E74-05** - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION16_LE( 0x20000, "io_cpu2", 0 ) // another TMP95C063F, not hooked up yet @@ -2995,7 +2851,7 @@ ROM_START( raizpin ) ROM_LOAD16_BYTE( "f14-01.ic14", 0x000000, 0x020000, CRC(f86a184d) SHA1(46abd11430c08d4f384fb79a5a3a39e54f83b8d8) ) ROM_LOAD16_BYTE( "f14-02.ic15", 0x000001, 0x020000, CRC(bd2d0dee) SHA1(652f810702598184551de9fd69436862d48c1608) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -3010,7 +2866,7 @@ ROM_START( raizpinj ) ROM_LOAD16_BYTE( "f14-01.ic14", 0x000000, 0x020000, CRC(f86a184d) SHA1(46abd11430c08d4f384fb79a5a3a39e54f83b8d8) ) ROM_LOAD16_BYTE( "f14-02.ic15", 0x000001, 0x020000, CRC(bd2d0dee) SHA1(652f810702598184551de9fd69436862d48c1608) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -3025,7 +2881,7 @@ ROM_START( styphp ) ROM_LOAD16_BYTE( "e98-01.ic14", 0x000000, 0x020000, CRC(479b37ad) SHA1(a0e59d990665244a7919a104dc4b6869ccf90be1) ) ROM_LOAD16_BYTE( "e98-02.ic15", 0x000001, 0x020000, CRC(d8da590f) SHA1(b33a67d81e388d7863adaf03041911c7f84d193b) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -3056,7 +2912,7 @@ ROM_END } // anonymous namespace -GAME( 1999, taitotz, 0, taitotz, taitotz, taitotz_state, empty_init, ROT0, "Taito", "Type Zero BIOS", MACHINE_NO_SOUND|MACHINE_NOT_WORKING|MACHINE_IS_BIOS_ROOT ) +GAME( 1999, taitotz, 0, taitotz, taitotz, taitotz_state, empty_init, ROT0, "Taito", "Type Zero BIOS", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_IS_BIOS_ROOT ) GAME( 1998, batlgear, taitotz, taitotz, batlgr2, taitotz_state, init_batlgear, ROT0, "Taito", "Battle Gear (Ver 2.40 A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_NODEVICE_LAN ) GAME( 1999, landhigh, taitotz, landhigh, landhigh, taitotz_state, init_landhigh, ROT0, "Taito", "Landing High Japan (Ver 2.01 OK)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) GAME( 1999, landhigha, landhigh, landhigh, landhigh, taitotz_state, init_landhigha,ROT0, "Taito", "Landing High Japan (Ver 2.02 O)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) -- cgit v1.2.3