From 19e894a3a9d9aeb0fbb3bf10ead34bed35f15a05 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Mon, 1 Apr 2013 11:28:58 -0500 Subject: [PATCH] Added FPS counter. --- src/cdrom.cpp | 37 ++++++++++++++++++++++++++++++++----- src/gui/mainwin.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/gui/mainwin.h | 5 +++++ 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/cdrom.cpp b/src/cdrom.cpp index b6279f9..a984c20 100644 --- a/src/cdrom.cpp +++ b/src/cdrom.cpp @@ -37,7 +37,7 @@ SB_TIME equ BUTCH+$20 ; Subcode time and compare enable (D24) FIFO_DATA equ BUTCH+$24 ; i2s FIFO data I2SDAT1 equ BUTCH+$24 ; i2s FIFO data I2SDAT2 equ BUTCH+$28 ; i2s FIFO data -2C = ? + equ BUTCH+$2C ; CD EEPROM interface ; ; Butch's hardware registers @@ -112,20 +112,47 @@ $70nn - Set oversampling mode Commands send through serial bus: -$100 - ? Acknowledge ? -$130 - ? (Seems to always prefix the $14n commands) -$140 - Returns ACK (1) (Write to NVRAM?) +$100 - ? Acknowledge ? (Erase/Write disable) +$130 - ? (Seems to always prefix the $14n commands) (Erase/Write enable) +$140 - Returns ACK (1) (Write to NVRAM?) (Write selected register) $141 - Returns ACK (1) $142 - Returns ACK (1) $143 - Returns ACK (1) $144 - Returns ACK (1) $145 - Returns ACK (1) -$180 - Returns 16-bit value (NVRAM?) +$180 - Returns 16-bit value (NVRAM?) (read from EEPROM) $181 - Returns 16-bit value $182 - Returns 16-bit value $183 - Returns 16-bit value $184 - Returns 16-bit value $185 - Returns 16-bit value + +; The BUTCH interface for the CD-ROM module is a long-word register, +; where only the least signifigant 4 bits are used +; +eeprom equ $DFFF2c ;interface to CD-eeprom +; +; bit3 - busy if 0 after write cmd, or Data In after read cmd +; bit2 - Data Out +; bit1 - clock +; bit0 - Chip Select (CS) +; +; +; Commands specific to the National Semiconductor NM93C14 +; +; +; 9-bit commands.. +; 876543210 +eREAD equ %110000000 ;read from EEPROM +eEWEN equ %100110000 ;Erase/write Enable +eERASE equ %111000000 ;Erase selected register +eWRITE equ %101000000 ;Write selected register +eERAL equ %100100000 ;Erase all registers +eWRAL equ %100010000 ;Writes all registers +eEWDS equ %100000000 ;Erase/Write disable (default) + +So... are there $40 words of memory? 128 bytes? + */ // Private function prototypes diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 02da8c7..ba2c0dd 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -89,6 +89,12 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), for(int i=0; i<8; i++) keyHeld[i] = false; + // FPS management + for(int i=0; iupdateGL(); + +#if 1 + // FPS handling + // Approach: We use a ring buffer to store timestamps over a given amount + // of frames, then sum them to figure out the FPS. + uint32_t timestamp = SDL_GetTicks(); + // This assumes the ring buffer size is a power of 2 + ringBufferPointer = (ringBufferPointer + 1) & (RING_BUFFER_SIZE - 1); + ringBuffer[ringBufferPointer] = timestamp - oldTimestamp; + uint32_t elapsedTime = 0; + + for(uint32_t i=0; ishowMessage(QString("%1 FPS").arg(framesPerSecond)); +#else + // This is in frames per 10 seconds, so we can have 1 decimal + uint32_t framesPerSecond = (uint32_t)(((float)RING_BUFFER_SIZE / (float)elapsedTime) * 10000.0); + uint32_t fpsIntegerPart = framesPerSecond / 10; + uint32_t fpsDecimalPart = framesPerSecond % 10; + statusBar()->showMessage(QString("%1.%2 FPS").arg(fpsIntegerPart).arg(fpsDecimalPart)); +#endif + oldTimestamp = timestamp; +#endif } diff --git a/src/gui/mainwin.h b/src/gui/mainwin.h index 9efddfd..c87ce99 100644 --- a/src/gui/mainwin.h +++ b/src/gui/mainwin.h @@ -12,6 +12,8 @@ #include #include "tom.h" +#define RING_BUFFER_SIZE 32 + // Forward declarations class GLWidget; class AboutWindow; @@ -100,6 +102,9 @@ class MainWin: public QMainWindow bool fullScreen; public: bool plzDontKillMyComputer; + uint32_t oldTimestamp; + uint32_t ringBufferPointer; + uint32_t ringBuffer[RING_BUFFER_SIZE]; private: QPoint mainWinPosition; // QSize mainWinSize; -- 2.37.2