]> Shamusworld >> Repos - virtualjaguar/commitdiff
Added FPS counter.
authorShamus Hammons <jlhamm@acm.org>
Mon, 1 Apr 2013 16:28:58 +0000 (11:28 -0500)
committerShamus Hammons <jlhamm@acm.org>
Mon, 1 Apr 2013 16:28:58 +0000 (11:28 -0500)
src/cdrom.cpp
src/gui/mainwin.cpp
src/gui/mainwin.h

index b6279f93c2bd33e575f9acda8a43d0b52b18dede..a984c203b1331565ac3dd328cc2c6858c141f990 100644 (file)
@@ -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
index 02da8c7ba3c8adf289fa29f201fe985474f7a8e6..ba2c0dd2c4682025b5ac549581724e8f87d9939d 100644 (file)
@@ -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; i<RING_BUFFER_SIZE; i++)
+               ringBuffer[i] = 0;
+
+       ringBufferPointer = RING_BUFFER_SIZE - 1;
+
        videoWidget = new GLWidget(this);
        setCentralWidget(videoWidget);
        setWindowIcon(QIcon(":/res/vj-icon.png"));
@@ -674,6 +680,36 @@ void MainWin::Timer(void)
        }
 
        videoWidget->updateGL();
+
+#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; i<RING_BUFFER_SIZE; i++)
+               elapsedTime += ringBuffer[i];
+
+       // elapsedTime must be non-zero
+       if (elapsedTime == 0)
+               elapsedTime = 1;
+
+#if 0
+       float framesPerSecond = ((float)RING_BUFFER_SIZE / (float)elapsedTime) * 1000.0;
+       statusBar()->showMessage(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
 }
 
 
index 9efddfd83133554c63ced950cd4584a48efe167f..c87ce997dd4ee1fe44ac96ebe83e86eae030dbfd 100644 (file)
@@ -12,6 +12,8 @@
 #include <QtGui>
 #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;