@@ -220,6 +220,7 @@ typedef struct {
220
220
uint16_t v_count ;
221
221
uint16_t v_irqline ; // raster interrupt line, updated when ctrl_1 or raster is written
222
222
uint16_t vc ; // 10-bit video counter
223
+ uint16_t next_vc ;
223
224
uint16_t vc_base ; // 10-bit video counter base
224
225
uint8_t rc ; // 3-bit raster counter
225
226
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) {
411
412
r -> h_count = 0 ;
412
413
r -> v_count = 0 ;
413
414
r -> v_irqline = 0 ;
414
- r -> vc = r -> vc_base = 0 ;
415
+ r -> vc = r -> next_vc = r -> vc_base = 0 ;
415
416
r -> rc = 0 ;
416
417
r -> display_state = false;
417
418
r -> badline = false;
@@ -1266,7 +1267,7 @@ static inline void _m6569_rs_update_display_state(m6569_t* vic) {
1266
1267
this phase, RC is also reset to zero.
1267
1268
*/
1268
1269
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 ;
1270
1271
vic -> vm .vmli = 0 ;
1271
1272
vic -> vm .next_vmli = 0 ;
1272
1273
if (vic -> rs .badline ) {
@@ -1356,7 +1357,7 @@ static inline uint8_t _m6569_g_i_access(m6569_t* vic) {
1356
1357
addr = ((vic -> vm .line [vic -> vm .vmli ]& 0xFF )<<3 ) | vic -> rs .rc ;
1357
1358
addr = (addr | vic -> mem .g_addr_or ) & vic -> mem .g_addr_and ;
1358
1359
}
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
1360
1361
vic -> vm .next_vmli = (vic -> vm .vmli + 1 ) & 0x3F ; // VMLI is a 6-bit counter
1361
1362
return (uint8_t ) vic -> mem .fetch_cb (addr , vic -> mem .user_data );
1362
1363
} else {
@@ -1481,14 +1482,18 @@ static uint64_t _m6569_tick(m6569_t* vic, uint64_t pins) {
1481
1482
case 11 :
1482
1483
break ;
1483
1484
case 12 :
1485
+ pins = _m6569_ba (vic , pins );
1486
+ break ;
1484
1487
case 13 :
1488
+ pins = _m6569_ba (vic , pins );
1489
+ break ;
1485
1490
case 14 :
1486
1491
pins = _m6569_ba (vic , pins );
1492
+ _m6569_rs_rewind_vc_vmli_rc (vic );
1487
1493
break ;
1488
1494
case 15 :
1489
1495
pins = _m6569_ba (vic , pins );
1490
1496
pins = _m6569_aec (pins );
1491
- _m6569_rs_rewind_vc_vmli_rc (vic );
1492
1497
break ;
1493
1498
case 16 :
1494
1499
pins = _m6569_ba (vic , pins );
@@ -1521,7 +1526,6 @@ static uint64_t _m6569_tick(m6569_t* vic, uint64_t pins) {
1521
1526
g_data = _m6569_g_i_access (vic );
1522
1527
break ;
1523
1528
case 55 :
1524
- pins = _m6569_aec (pins );
1525
1529
vic -> gunit .enabled = vic -> rs .display_state ;
1526
1530
_m6569_c_access (vic );
1527
1531
g_data = _m6569_g_i_access (vic );
@@ -1607,6 +1611,7 @@ static uint64_t _m6569_tick(m6569_t* vic, uint64_t pins) {
1607
1611
uint8_t * dst = vic -> crt .fb + (y * M6569_FRAMEBUFFER_WIDTH ) + (x * M6569_PIXELS_PER_TICK );
1608
1612
_m6569_decode_pixels (vic , g_data , dst );
1609
1613
}
1614
+ vic -> rs .vc = vic -> rs .next_vc ;
1610
1615
vic -> vm .vmli = vic -> vm .next_vmli ;
1611
1616
return pins ;
1612
1617
}
0 commit comments