Fix PTIMER some more

This commit is contained in:
Melissa Goad
2017-09-20 21:24:37 -05:00
parent 43b055b5ee
commit a05d17fc9c

View File

@@ -1618,7 +1618,7 @@ void rivatnt_pgraph_ctx_switch(void *p)
}
}
void riva128_pgraph_interrupt(int num, void *p)
void riva128_pgraph_interrupt(int num, void *p)
{
riva128_t *riva128 = (riva128_t *)p;
@@ -1627,16 +1627,7 @@ void riva128_pgraph_interrupt(int num, void *p)
riva128_pmc_interrupt(12, riva128);
}
void riva128_pgraph_vblank_interrupt(void *p)
{
riva128_t *riva128 = (riva128_t *)p;
riva128->pgraph.intr |= (1 << 8);
riva128_pmc_interrupt(24, riva128);
}
void riva128_pgraph_invalid_interrupt(int num, void *p)
void riva128_pgraph_invalid_interrupt(int num, void *p)
{
riva128_t *riva128 = (riva128_t *)p;
@@ -1645,6 +1636,15 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
riva128_pgraph_interrupt(0, riva128);
}
void riva128_pgraph_vblank_interrupt(void *p)
{
riva128_t *riva128 = (riva128_t *)p;
riva128->pgraph.invalid |= (1 << 8);
riva128_pmc_interrupt(24, riva128);
}
uint8_t riva128_pramdac_read(uint32_t addr, void *p)
{
riva128_t *riva128 = (riva128_t *)p;
@@ -2024,14 +2024,16 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
}
}
void riva128_ptimer_tick(void *p)
void riva128_ptimer_tick(void *p)
{
riva128_t *riva128 = (riva128_t *)p;
double time = ((double)riva128->ptimer.clock_mul * 10000.0f) / (double)riva128->ptimer.clock_div;
double time = ((double)riva128->ptimer.clock_mul * 1000000.0f) / (double)riva128->ptimer.clock_div;
uint64_t tmp;
int alarm_check;
//if(cs == 0x0008 && !riva128->pgraph.beta) pclog("RIVA 128 PTIMER time elapsed %f alarm %08x, time_low %08x\n", time, riva128->ptimer.alarm, riva128->ptimer.time & 0xffffffff);
tmp = riva128->ptimer.time;
riva128->ptimer.time += (uint64_t)time << 5;
@@ -2048,18 +2050,20 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
{
riva128_t *riva128 = (riva128_t *)p;
if(riva128->card_id == 0x03) riva128_ptimer_tick(riva128);
if(!riva128->pgraph.beta) pclog("RIVA 128 MCLK poll PMC enable %08x\n", riva128->pmc.enable);
riva128->mtime += (int)((TIMER_USEC * 100.0) / riva128->mfreq);
if(!(riva128->pmc.enable & 0x00010000) && riva128->card_id == 0x03) riva128_ptimer_tick(riva128);
riva128->mtime += (int)((TIMER_USEC * 1000000.0) / riva128->mfreq);
}
void riva128_nvclk_poll(void *p)
{
riva128_t *riva128 = (riva128_t *)p;
if(riva128->card_id < 0x40 && riva128->card_id != 0x03) riva128_ptimer_tick(riva128);
if(!(riva128->pmc.enable & 0x00010000) && riva128->card_id < 0x40 && riva128->card_id != 0x03) riva128_ptimer_tick(riva128);
riva128->nvtime += (int)((TIMER_USEC * 100.0) / riva128->nvfreq);
riva128->nvtime += (int)((TIMER_USEC * 1000000.0) / riva128->nvfreq);
}
void riva128_vblank_start(svga_t *svga)
@@ -2446,14 +2450,6 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
ret = riva128->pci_regs[addr];
break;
case 0x18:
ret = 0x01;
break;
case 0x19: case 0x1a: case 0x1b:
ret = riva128->pci_regs[addr];
break;
case 0x2c:
case 0x2d:
case 0x2e:
@@ -2607,18 +2603,6 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
return;
}
case 0x19: case 0x1a: case 0x1b:
{
riva128->pci_regs[addr] = val;
riva128->rma_addr = riva128->pci_regs[0x19] << 8;
io_removehandler(riva128->rma_addr, 0x0100, riva128_rma_in, NULL, NULL, riva128_rma_out, NULL, NULL, riva128);
if(riva128->rma_addr)
{
io_sethandler(riva128->rma_addr, 0x0100, riva128_rma_in, NULL, NULL, riva128_rma_out, NULL, NULL, riva128);
}
return;
}
case 0x30:
case 0x32:
case 0x33:
@@ -2632,9 +2616,9 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
}
return;
/* case 0x3c:
case 0x3c:
riva128->pci_regs[0x3c] = val & 0x0f;
return; */
return;
case 0x40:
case 0x41:
@@ -2813,19 +2797,19 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
svga->clock = cpuclock / freq;
}
freq = 13.5;
freq = 13500000.0;
if(riva128->pramdac.m_m == 0) freq = 0;
else
{
freq = (freq * riva128->pramdac.m_n) / (1 << riva128->pramdac.m_p) / riva128->pramdac.m_m;
//pclog("RIVA 128 Core clock is %f Hz\n", freq);
//pclog("RIVA 128 Memory clock is %f Hz\n", freq);
}
riva128->mfreq = freq;
riva128->mtime = (int)((TIMER_USEC * 100.0) / riva128->mfreq);
riva128->mtime = (int)((TIMER_USEC * 1000000.0) / riva128->mfreq);
freq = 13.5;
freq = 13500000.0;
if(riva128->pramdac.nv_m == 0) freq = 0;
else
@@ -2835,7 +2819,7 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
}
riva128->nvfreq = freq;
riva128->nvtime = (int)((TIMER_USEC * 100.0) / riva128->nvfreq);
riva128->nvtime = (int)((TIMER_USEC * 1000000.0) / riva128->nvfreq);
}
void *riva128_init()
@@ -2901,11 +2885,6 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
riva128->pci_regs[6] = 0;
riva128->pci_regs[7] = 2;
riva128->pci_regs[0x18] = 0x01;
riva128->pci_regs[0x19] = 0xff;
riva128->pci_regs[0x1a] = 0xff;
riva128->pci_regs[0x1b] = 0xff;
riva128->pci_regs[0x2c] = 0xd2;
riva128->pci_regs[0x2d] = 0x12;
riva128->pci_regs[0x2e] = 0x00;
@@ -2964,35 +2943,13 @@ void riva128_pgraph_invalid_interrupt(int num, void *p)
}
}
double freq = 13.5;
if(riva128->pramdac.m_m == 0) freq = 0;
else
{
freq = (freq * riva128->pramdac.m_n) / (1 << riva128->pramdac.m_p) / riva128->pramdac.m_m;
//pclog("RIVA 128 Core clock is %f Hz\n", freq);
}
riva128->mfreq = freq;
riva128->mtime = (int)((TIMER_USEC * 100.0) / riva128->mfreq);
freq = 13.5;
if(riva128->pramdac.nv_m == 0) freq = 0;
else
{
freq = (freq * riva128->pramdac.nv_n) / (1 << riva128->pramdac.nv_p) / riva128->pramdac.nv_m;
//pclog("RIVA 128 Core clock is %f Hz\n", freq);
}
riva128->nvfreq = freq;
riva128->nvtime = (int)((TIMER_USEC * 100.0) / riva128->nvfreq);
timer_add(riva128_mclk_poll, &riva128->mtime, TIMER_ALWAYS_ENABLED, riva128);
timer_add(riva128_nvclk_poll, &riva128->nvtime, TIMER_ALWAYS_ENABLED, riva128);
riva128->svga.vblank_start = riva128_vblank_start;
riva128->pgraph.beta = 0xffffffff;
return riva128;
}
@@ -3211,34 +3168,10 @@ device_t riva128_device =
}
}
double freq = 13.5;
if(riva128->pramdac.m_m == 0) freq = 0;
else
{
freq = (freq * riva128->pramdac.m_n) / (1 << riva128->pramdac.m_p) / riva128->pramdac.m_m;
//pclog("RIVA 128 Core clock is %f Hz\n", freq);
}
riva128->mfreq = freq;
riva128->mtime = (int)((TIMER_USEC * 100.0) / riva128->mfreq);
freq = 13.5;
if(riva128->pramdac.nv_m == 0) freq = 0;
else
{
freq = (freq * riva128->pramdac.nv_n) / (1 << riva128->pramdac.nv_p) / riva128->pramdac.nv_m;
//pclog("RIVA 128 Core clock is %f Hz\n", freq);
}
riva128->nvfreq = freq;
riva128->nvtime = (int)((TIMER_USEC * 100.0) / riva128->nvfreq);
timer_add(riva128_mclk_poll, &riva128->mtime, TIMER_ALWAYS_ENABLED, riva128);
timer_add(riva128_nvclk_poll, &riva128->nvtime, TIMER_ALWAYS_ENABLED, riva128);
//riva128->svga.vblank_start = riva128_vblank_poll;
riva128->svga.vblank_start = riva128_vblank_start;
return riva128;
}
@@ -3436,34 +3369,10 @@ device_t rivatnt_device =
}
}
double freq = 13.5;
if(riva128->pramdac.m_m == 0) freq = 0;
else
{
freq = (freq * riva128->pramdac.m_n) / (1 << riva128->pramdac.m_p) / riva128->pramdac.m_m;
//pclog("RIVA 128 Core clock is %f Hz\n", freq);
}
riva128->mfreq = freq;
riva128->mtime = (int)((TIMER_USEC * 100.0) / riva128->mfreq);
freq = 13.5;
if(riva128->pramdac.nv_m == 0) freq = 0;
else
{
freq = (freq * riva128->pramdac.nv_n) / (1 << riva128->pramdac.nv_p) / riva128->pramdac.nv_m;
//pclog("RIVA 128 Core clock is %f Hz\n", freq);
}
riva128->nvfreq = freq;
riva128->nvtime = (int)((TIMER_USEC * 100.0) / riva128->nvfreq);
timer_add(riva128_mclk_poll, &riva128->mtime, TIMER_ALWAYS_ENABLED, riva128);
timer_add(riva128_nvclk_poll, &riva128->nvtime, TIMER_ALWAYS_ENABLED, riva128);
//riva128->svga.vblank_start = riva128_vblank_poll;
riva128->svga.vblank_start = riva128_vblank_start;
return riva128;
}
@@ -3547,6 +3456,97 @@ device_t rivatnt_device =
}
};
device_t rivatnt2_device =
{
"nVidia RIVA TNT2",
0,
rivatnt2_init,
rivatnt2_close,
rivatnt2_available,
rivatnt2_speed_changed,
rivatnt2_force_redraw,
rivatnt2_add_status_info,
rivatnt2_config
};
void rivatnt2_close(void *p)
{
riva128_t *riva128 = (riva128_t *)p;
FILE *f = fopen("vram.dmp", "wb");
fwrite(riva128->svga.vram, 4 << 20, 1, f);
fclose(f);
svga_close(&riva128->svga);
free(riva128);
}
int rivatnt2_available()
{
return rom_present(L"roms/video/nv_riva128/NV5diamond.bin") || rom_present(L"roms/video/nv_riva128/inno3d64bit.BIN") || rom_present(L"roms/video/nv_riva128/creative.BIN");
}
void rivatnt2_speed_changed(void *p)
{
riva128_t *riva128 = (riva128_t *)p;
svga_recalctimings(&riva128->svga);
}
void rivatnt2_force_redraw(void *p)
{
riva128_t *riva128 = (riva128_t *)p;
riva128->svga.fullchange = changeframecount;
}
void rivatnt2_add_status_info(char *s, int max_len, void *p)
{
riva128_t *riva128 = (riva128_t *)p;
svga_add_status_info(s, max_len, &riva128->svga);
}
device_config_t rivatnt2_config[] =
{
{
"model", "Card model", CONFIG_SELECTION, "", 0,
{
{
"Vanilla TNT2", 0,
},
{
"TNT2 Pro", 1,
},
{
"TNT2 Ultra", 2,
},
},
},
{
"memory", "Memory size", CONFIG_SELECTION, "", 32,
{
{
"4 MB", 4
},
{
"8 MB", 8
},
{
"16 MB", 16
},
{
"32 MB", 32
},
{
""
}
},
},
{
"", "", -1
}
};
device_t rivatnt2_device =
{
"nVidia RIVA TNT2",