From 1e4a175639a7b40ab062e697e43c826b384a492b Mon Sep 17 00:00:00 2001 From: "Raimon @ quifisraimon" Date: Wed, 16 Sep 2026 13:25:33 +0200 Subject: [PATCH] - [NEW] [tia] HMP0, HMP1, HMM0, HMM1, HMBL - [FIX] [tia] ficar posicions en pixel_clocks en compte de color_clocks. - [NEW] [tia] VDELP0, VDELP1, VDELBL, RESMP0, RESMP1, HMOVE --- tia.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/tia.cpp b/tia.cpp index 453c456..9bf7a8e 100644 --- a/tia.cpp +++ b/tia.cpp @@ -55,6 +55,8 @@ namespace tia bool player0_reflect = false; uint8_t player0_pos = 0; uint8_t player0_bits = 0; + int8_t player0_hmotion = 0; + bool player0_vert_delay = false; uint8_t player1_size = 1; uint8_t player1_num_copies = 1; @@ -63,14 +65,20 @@ namespace tia bool player1_reflect = false; uint8_t player1_pos = 0; uint8_t player1_bits = 0; + int8_t player1_hmotion = 0; + bool player1_vert_delay = false; bool missile0_enabled = false; uint8_t missile0_size = 1; uint8_t missile0_pos = 0; + int8_t missile0_hmotion = 0; + bool missile0_reset = false; bool missile1_enabled = false; uint8_t missile1_size = 1; uint8_t missile1_pos = 0; + int8_t missile1_hmotion = 0; + bool missile1_reset = false; uint32_t playfield_color = 0x00000000; bool playfield_reflected = false; @@ -87,11 +95,15 @@ namespace tia bool ball_enabled = false; uint8_t ball_size = 1; uint8_t ball_pos = 0; + int8_t ball_hmotion = 0; + bool ball_vert_delay = false; uint32_t background_color = 0x00000000; uint32_t current_frame_cycles = 0; + bool hmove = false; + bool vsync_set = false; bool vblank_set = false; bool vblank_latch = false; @@ -113,12 +125,21 @@ namespace tia color_clock = (color_clock + 1) % 228; if (color_clock == 0) { rdy_low = false; + hmove = false; current_scanline++; } + if (missile0_reset) missile0_pos = player0_pos + (4*player0_size); + if (missile1_reset) missile1_pos = player1_pos + (4*player1_size); + audio::tick(); // [TODO] Pintar pixels + if ( (!vsync_set) && (!vblank_set) && (color_clock >= 68) && (current_scanline >= 40) && (current_scanline < 232) && (!hmove || color_clock >= 92) ) { + const uint8_t pixel_clock = color_clock - 68; + + } + } @@ -238,15 +259,15 @@ namespace tia playfield_bits = (playfield_bits & 0x000fff00) | (uint32_t(value)); break; case 0x10: // RESP0 - player0_pos = color_clock < 68 ? 0 : color_clock; break; + player0_pos = color_clock < 68 ? 0 : color_clock-68; break; case 0x11: // RESP1 - player1_pos = color_clock < 68 ? 0 : color_clock; break; + player1_pos = color_clock < 68 ? 0 : color_clock-68; break; case 0x12: // RESM0 - missile0_pos = color_clock < 68 ? 0 : color_clock; break; + missile0_pos = color_clock < 68 ? 0 : color_clock-68; break; case 0x13: // RESM1 - missile1_pos = color_clock < 68 ? 0 : color_clock; break; + missile1_pos = color_clock < 68 ? 0 : color_clock-68; break; case 0x14: // RESBL - ball_pos = color_clock < 68 ? 0 : color_clock; break; + ball_pos = color_clock < 68 ? 0 : color_clock-68; break; case 0x15: // AUDC0 case 0x16: // AUDC1 @@ -269,7 +290,38 @@ namespace tia case 0x1F: //ENABL missile0_enabled = value & 0x02; break; + case 0x20: //HMP0 + player0_hmotion = int8_t(value) >> 4; break; + case 0x21: //HMP1 + player1_hmotion = int8_t(value) >> 4; break; + case 0x22: //HMM0 + missile0_hmotion = int8_t(value) >> 4; break; + case 0x23: //HMM1 + missile1_hmotion = int8_t(value) >> 4; break; + case 0x24: //HMBL + ball_hmotion = int8_t(value) >> 4; break; + + case 0x25: //VDELP0 + player0_vert_delay = value & 0x01; break; + case 0x26: //VDELP1 + player1_vert_delay = value & 0x01; break; + case 0x27: //VDELBL + ball_vert_delay = value & 0x01; break; + case 0x28: // RESMP0 + missile0_reset = value & 0x02; break; + case 0x29: // RESMP1 + missile1_reset = value & 0x02; break; + + case 0x2A: // HMOVE + // [TODO] Implementació bàsica, reemplazar per una que use els 15 color_clocks en el futur + player0_pos += player0_hmotion; + player1_pos += player1_hmotion; + missile0_pos += missile0_hmotion; + missile1_pos += missile1_hmotion; + ball_pos += ball_hmotion; + hmove = true; + break; } }