- [NEW] Registres d'escritura del TIA: Implementats VSYNC, VBLANK, WSYNC i RSYNC
104 lines
2.7 KiB
C++
104 lines
2.7 KiB
C++
#include "tia.h"
|
|
|
|
namespace tia
|
|
{
|
|
uint8_t collisions[8] { 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
|
|
float paddle_pos[4] { 0.5f, 0.5f, 0.5f, 0.5f };
|
|
uint32_t paddle_charge_cycles[4] { 0, 0, 0, 0 };
|
|
|
|
bool joy0_button_pressed = false;
|
|
bool joy1_button_pressed = false;
|
|
|
|
uint32_t current_frame_cycles = 0;
|
|
|
|
bool vsync_set = false;
|
|
bool vblank_set = false;
|
|
bool vblank_latch = false;
|
|
bool vblank_dump = false;
|
|
|
|
uint16_t color_clock = 0;
|
|
bool rdy_low = false;
|
|
|
|
void reset()
|
|
{
|
|
|
|
}
|
|
|
|
void tick()
|
|
{
|
|
if (!vblank_dump) current_frame_cycles++;
|
|
color_clock = (color_clock + 1) % 228;
|
|
|
|
if (color_clock == 0) rdy_low = false;
|
|
|
|
// [TODO] Pintar pixels
|
|
}
|
|
|
|
|
|
uint8_t get_paddle_state(int index)
|
|
{
|
|
if (vblank_dump) return 0x00;
|
|
return (current_frame_cycles >= paddle_charge_cycles[index]) ? 0x80 : 0x00;
|
|
}
|
|
|
|
uint8_t read(uint16_t address)
|
|
{
|
|
switch (address & 0x0f) {
|
|
case 0x00: return collisions[0];
|
|
case 0x01: return collisions[2];
|
|
case 0x02: return collisions[3];
|
|
case 0x03: return collisions[4];
|
|
case 0x04: return collisions[5];
|
|
case 0x05: return collisions[6];
|
|
case 0x06: return collisions[7];
|
|
case 0x07: return collisions[8];
|
|
|
|
case 0x08: return get_paddle_state(0);
|
|
case 0x09: return get_paddle_state(1);
|
|
case 0x0A: return get_paddle_state(2);
|
|
case 0x0B: return get_paddle_state(3);
|
|
|
|
case 0x0C: return joy0_button_pressed ? 0x00 : 0x80;
|
|
case 0x0D: return joy1_button_pressed ? 0x00 : 0x80;
|
|
}
|
|
}
|
|
|
|
void write(uint16_t address, uint8_t value)
|
|
{
|
|
address &= 0x3f;
|
|
if (address >= 0x2d) address -= 0x20;
|
|
|
|
// [TODO] Procesar segons l'adreça resultant
|
|
switch (address) {
|
|
case 0x00: // VSYNC
|
|
vsync_set = value & 0x20;
|
|
break;
|
|
|
|
case 0x01: // VBLANK
|
|
bool prev_dump = vblank_dump;
|
|
vblank_set = value & 0x20;
|
|
vblank_latch = value & 0x40;
|
|
vblank_dump = value & 0x80;
|
|
if (prev_dump && !vblank_dump) {
|
|
current_frame_cycles = 0;
|
|
for (int i = 0; i < 4; ++i) paddle_charge_cycles[i] = static_cast<uint32_t>(paddle_pos[i] * 2400.0f);
|
|
}
|
|
break;
|
|
|
|
case 0x02: // WSYNC
|
|
rdy_low = true;
|
|
break;
|
|
|
|
case 0x03: // RSYNC
|
|
color_clock = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool is_rdy_low()
|
|
{
|
|
return rdy_low;
|
|
}
|
|
}
|