comparison upd78k2_util.c @ 2734:6fff3906385c default tip

Fix handling of wraparound for timer comparison interrupts
author Michael Pavone <pavone@retrodev.com>
date Fri, 18 Jul 2025 23:36:18 -0700
parents 91a5949787a8
children
comparison
equal deleted inserted replaced
2733:d823e02fdae5 2734:6fff3906385c
36 uint32_t diff = (upd->cycles - upd->tm0_cycle) / upd->opts->gen.clock_divider; 36 uint32_t diff = (upd->cycles - upd->tm0_cycle) / upd->opts->gen.clock_divider;
37 upd->tm0_cycle += (diff & ~7) * upd->opts->gen.clock_divider; 37 upd->tm0_cycle += (diff & ~7) * upd->opts->gen.clock_divider;
38 diff >>= 3; 38 diff >>= 3;
39 if (upd->tmc0 & CE0) { 39 if (upd->tmc0 & CE0) {
40 uint32_t tmp = upd->tm0 + diff; 40 uint32_t tmp = upd->tm0 + diff;
41 uint32_t cr00 = upd->cr00 | (tmp > 0xFFFF ? 0x10000 : 0);
42 uint32_t cr01 = upd->cr01 | (tmp > 0xFFFF ? 0x10000 : 0);
41 //TODO: the rest of the CR00/CR01 stuff 43 //TODO: the rest of the CR00/CR01 stuff
42 if (upd->tm0 < upd->cr00 && tmp >= upd->cr00) { 44 if (upd->tm0 < cr00 && tmp >= cr00) {
43 upd->if0 |= CIF00; 45 upd->if0 |= CIF00;
44 } 46 }
45 if (upd->tm0 < upd->cr01 && tmp >= upd->cr01) { 47 if (upd->tm0 < cr01 && tmp >= cr01) {
46 upd->if0 |= CIF01; 48 upd->if0 |= CIF01;
47 if (upd->crc0 & 8) { 49 if (upd->crc0 & 8) {
48 //CR01 clear is enabled 50 //CR01 clear is enabled
49 if (upd->cr01) { 51 if (upd->cr01) {
50 while (tmp >= upd->cr01) { 52 while (tmp >= upd->cr01) {