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
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
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"));
}
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
}