Fix PTIMER some more
This commit is contained in:
@@ -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",
|
||||
|
Reference in New Issue
Block a user