From a05d17fc9c61d1fdc26e9b9a82af07d7e57bfa8a Mon Sep 17 00:00:00 2001 From: Melissa Goad Date: Wed, 20 Sep 2017 21:24:37 -0500 Subject: [PATCH] Fix PTIMER some more --- src/video/vid_nv_riva128.c | 246 ++++++++++++++++++------------------- 1 file changed, 123 insertions(+), 123 deletions(-) diff --git a/src/video/vid_nv_riva128.c b/src/video/vid_nv_riva128.c index 3a838154c..00b2bc299 100644 --- a/src/video/vid_nv_riva128.c +++ b/src/video/vid_nv_riva128.c @@ -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",