Skip to content

Commit e30eec5

Browse files
committed
m6569.h: raster line timing tweaks
(fixes visual artifacts in Dawnfall demo)
1 parent 9b5b781 commit e30eec5

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

chips/m6569.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ typedef struct {
220220
uint16_t v_count;
221221
uint16_t v_irqline; // raster interrupt line, updated when ctrl_1 or raster is written
222222
uint16_t vc; // 10-bit video counter
223+
uint16_t next_vc;
223224
uint16_t vc_base; // 10-bit video counter base
224225
uint8_t rc; // 3-bit raster counter
225226
bool display_state; // true: in display state, false: in idle state
@@ -411,7 +412,7 @@ static void _m6569_reset_raster_unit(m6569_raster_unit_t* r) {
411412
r->h_count = 0;
412413
r->v_count = 0;
413414
r->v_irqline = 0;
414-
r->vc = r->vc_base = 0;
415+
r->vc = r->next_vc = r->vc_base = 0;
415416
r->rc = 0;
416417
r->display_state = false;
417418
r->badline = false;
@@ -1266,7 +1267,7 @@ static inline void _m6569_rs_update_display_state(m6569_t* vic) {
12661267
this phase, RC is also reset to zero.
12671268
*/
12681269
static inline void _m6569_rs_rewind_vc_vmli_rc(m6569_t* vic) {
1269-
vic->rs.vc = vic->rs.vc_base;
1270+
vic->rs.vc = vic->rs.next_vc = vic->rs.vc_base;
12701271
vic->vm.vmli = 0;
12711272
vic->vm.next_vmli = 0;
12721273
if (vic->rs.badline) {
@@ -1356,7 +1357,7 @@ static inline uint8_t _m6569_g_i_access(m6569_t* vic) {
13561357
addr = ((vic->vm.line[vic->vm.vmli]&0xFF)<<3) | vic->rs.rc;
13571358
addr = (addr | vic->mem.g_addr_or) & vic->mem.g_addr_and;
13581359
}
1359-
vic->rs.vc = (vic->rs.vc + 1) & 0x3FF; // VC is a 10-bit counter
1360+
vic->rs.next_vc = (vic->rs.vc + 1) & 0x3FF; // VC is a 10-bit counter
13601361
vic->vm.next_vmli = (vic->vm.vmli + 1) & 0x3F; // VMLI is a 6-bit counter
13611362
return (uint8_t) vic->mem.fetch_cb(addr, vic->mem.user_data);
13621363
} else {
@@ -1481,14 +1482,18 @@ static uint64_t _m6569_tick(m6569_t* vic, uint64_t pins) {
14811482
case 11:
14821483
break;
14831484
case 12:
1485+
pins = _m6569_ba(vic, pins);
1486+
break;
14841487
case 13:
1488+
pins = _m6569_ba(vic, pins);
1489+
break;
14851490
case 14:
14861491
pins = _m6569_ba(vic, pins);
1492+
_m6569_rs_rewind_vc_vmli_rc(vic);
14871493
break;
14881494
case 15:
14891495
pins = _m6569_ba(vic, pins);
14901496
pins = _m6569_aec(pins);
1491-
_m6569_rs_rewind_vc_vmli_rc(vic);
14921497
break;
14931498
case 16:
14941499
pins = _m6569_ba(vic, pins);
@@ -1521,7 +1526,6 @@ static uint64_t _m6569_tick(m6569_t* vic, uint64_t pins) {
15211526
g_data = _m6569_g_i_access(vic);
15221527
break;
15231528
case 55:
1524-
pins = _m6569_aec(pins);
15251529
vic->gunit.enabled = vic->rs.display_state;
15261530
_m6569_c_access(vic);
15271531
g_data = _m6569_g_i_access(vic);
@@ -1607,6 +1611,7 @@ static uint64_t _m6569_tick(m6569_t* vic, uint64_t pins) {
16071611
uint8_t* dst = vic->crt.fb + (y * M6569_FRAMEBUFFER_WIDTH) + (x * M6569_PIXELS_PER_TICK);
16081612
_m6569_decode_pixels(vic, g_data, dst);
16091613
}
1614+
vic->rs.vc = vic->rs.next_vc;
16101615
vic->vm.vmli = vic->vm.next_vmli;
16111616
return pins;
16121617
}

0 commit comments

Comments
 (0)