mirror of
https://github.com/trudnai/Steve2.git
synced 2024-05-29 03:41:28 +00:00
- Disk read huge speed bump by accelerating CPU clock for 200ms
This commit is contained in:
parent
0c72992e8a
commit
9b3b79cca0
|
@ -429,6 +429,7 @@ class ViewController: NSViewController {
|
||||||
mhz = freq
|
mhz = freq
|
||||||
MHz_6502 = UInt64(mhz * M)
|
MHz_6502 = UInt64(mhz * M)
|
||||||
clk_6502_per_frm = MHz_6502 / UInt64(fps)
|
clk_6502_per_frm = MHz_6502 / UInt64(fps)
|
||||||
|
clk_6502_per_frm_set = clk_6502_per_frm
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func speedSelected(_ sender: NSButton) {
|
@IBAction func speedSelected(_ sender: NSButton) {
|
||||||
|
|
|
@ -33,10 +33,12 @@ void ViewController_spk_dn_play(void);
|
||||||
const unsigned long long int iterations = G;
|
const unsigned long long int iterations = G;
|
||||||
unsigned long long int inst_cnt = 0;
|
unsigned long long int inst_cnt = 0;
|
||||||
|
|
||||||
const unsigned int fps = 30;
|
//const unsigned int fps = 30;
|
||||||
const unsigned long long default_MHz_6502 = 1.023 * M; // 2 * M; // 4 * M; // 8 * M; // 16 * M; // 128 * M; // 256 * M; // 512 * M;
|
const unsigned long long default_MHz_6502 = 1.023 * M; // 2 * M; // 4 * M; // 8 * M; // 16 * M; // 128 * M; // 256 * M; // 512 * M;
|
||||||
unsigned long long MHz_6502 = default_MHz_6502;
|
unsigned long long MHz_6502 = default_MHz_6502;
|
||||||
unsigned long long clk_6502_per_frm = default_MHz_6502 / fps;
|
unsigned long long clk_6502_per_frm = default_MHz_6502 / fps;
|
||||||
|
unsigned long long clk_6502_per_frm_set = default_MHz_6502 / fps;
|
||||||
|
|
||||||
|
|
||||||
unsigned long long tick_per_sec = G;
|
unsigned long long tick_per_sec = G;
|
||||||
unsigned long long tick_6502_per_sec = 0;
|
unsigned long long tick_6502_per_sec = 0;
|
||||||
|
@ -77,13 +79,56 @@ disassembly_t disassembly;
|
||||||
#include "disassembler.h"
|
#include "disassembler.h"
|
||||||
#include "mmio.h"
|
#include "mmio.h"
|
||||||
|
|
||||||
|
|
||||||
uint16_t videoShadow [0x1000];
|
uint16_t videoShadow [0x1000];
|
||||||
uint32_t videoMem [0x2000];
|
uint32_t videoMem [0x2000];
|
||||||
uint32_t * videoMemPtr = videoMem;
|
uint32_t * videoMemPtr = videoMem;
|
||||||
|
|
||||||
uint16_t HiResLineAddrTbl [0x2000];
|
uint16_t HiResLineAddrTbl [0x2000];
|
||||||
|
|
||||||
|
|
||||||
|
INLINE void set_flags_N( const uint8_t test ) {
|
||||||
|
m6502.N = BITTEST(test, 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void set_flags_V( const uint8_t test ) {
|
||||||
|
m6502.V = BITTEST(test, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void set_flags_Z( const uint8_t test ) {
|
||||||
|
m6502.Z = test == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void set_flags_C( const int16_t test ) {
|
||||||
|
m6502.C = test >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void set_flags_NZ( const uint8_t test ) {
|
||||||
|
set_flags_N(test);
|
||||||
|
set_flags_Z(test);
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void set_flags_NV( const uint8_t test ) {
|
||||||
|
set_flags_N(test);
|
||||||
|
set_flags_V(test);
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void set_flags_NVZ( const uint8_t test ) {
|
||||||
|
set_flags_NZ(test);
|
||||||
|
set_flags_V(test);
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void set_flags_NZC( const int16_t test ) {
|
||||||
|
set_flags_NZ(test);
|
||||||
|
set_flags_C(test);
|
||||||
|
}
|
||||||
|
|
||||||
|
//INLINE void set_flags_NZCV( int test ) {
|
||||||
|
// set_flags_NZC(test);
|
||||||
|
// set_flags_V(test);
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void initHiResLineAddresses() {
|
void initHiResLineAddresses() {
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
for ( uint16_t x = 0; x <= 0x50; x+= 0x28 ) {
|
for ( uint16_t x = 0; x <= 0x50; x+= 0x28 ) {
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
extern unsigned long long MHz_6502;
|
extern unsigned long long MHz_6502;
|
||||||
extern unsigned long long clk_6502_per_frm;
|
extern unsigned long long clk_6502_per_frm;
|
||||||
|
extern unsigned long long clk_6502_per_frm_set;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -99,7 +100,8 @@ extern void hires_Update(void);
|
||||||
|
|
||||||
extern double mips;
|
extern double mips;
|
||||||
extern double mhz;
|
extern double mhz;
|
||||||
extern const unsigned int fps;
|
|
||||||
|
#define fps 30
|
||||||
|
|
||||||
extern void tst6502(void);
|
extern void tst6502(void);
|
||||||
extern void m6502_ColdReset(void);
|
extern void m6502_ColdReset(void);
|
||||||
|
@ -107,46 +109,5 @@ extern void m6502_Run(void);
|
||||||
extern void kbdInput ( uint8_t code );
|
extern void kbdInput ( uint8_t code );
|
||||||
|
|
||||||
|
|
||||||
INLINE void set_flags_N( const uint8_t test ) {
|
|
||||||
m6502.N = BITTEST(test, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void set_flags_V( const uint8_t test ) {
|
|
||||||
m6502.V = BITTEST(test, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void set_flags_Z( const uint8_t test ) {
|
|
||||||
m6502.Z = test == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void set_flags_C( const int16_t test ) {
|
|
||||||
m6502.C = test >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void set_flags_NZ( const uint8_t test ) {
|
|
||||||
set_flags_N(test);
|
|
||||||
set_flags_Z(test);
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void set_flags_NV( const uint8_t test ) {
|
|
||||||
set_flags_N(test);
|
|
||||||
set_flags_V(test);
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void set_flags_NVZ( const uint8_t test ) {
|
|
||||||
set_flags_NZ(test);
|
|
||||||
set_flags_V(test);
|
|
||||||
}
|
|
||||||
|
|
||||||
INLINE void set_flags_NZC( const int16_t test ) {
|
|
||||||
set_flags_NZ(test);
|
|
||||||
set_flags_C(test);
|
|
||||||
}
|
|
||||||
|
|
||||||
//INLINE void set_flags_NZCV( int test ) {
|
|
||||||
// set_flags_NZC(test);
|
|
||||||
// set_flags_V(test);
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __6502_H__ */
|
#endif /* __6502_H__ */
|
||||||
|
|
|
@ -65,6 +65,12 @@ INLINE void RTS() {
|
||||||
dbgPrintf("RTS ");
|
dbgPrintf("RTS ");
|
||||||
disPrintf(disassembly.inst, "RTS");
|
disPrintf(disassembly.inst, "RTS");
|
||||||
m6502.PC = POP_addr() +1;
|
m6502.PC = POP_addr() +1;
|
||||||
|
|
||||||
|
// disk accelerator would only work for a certain amount of time
|
||||||
|
// currently it is 200ms simulated times
|
||||||
|
if ( m6502.clktime - disk.clk_since_last_read > clk_diskAcceleratorTimeout ) {
|
||||||
|
clk_6502_per_frm = clk_6502_per_frm_set;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,9 +13,12 @@
|
||||||
|
|
||||||
|
|
||||||
disk_t disk = {
|
disk_t disk = {
|
||||||
{ 0, 0, 0 }, // phase
|
{ 0, 0, 0 }, // phase
|
||||||
|
0, // clk_since_last_read
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const unsigned long long clk_6502_per_frm_diskAccelerator = 100 * M / fps; // disk acceleration bumps up CPU clock to 100 MHz
|
||||||
|
const unsigned long long clk_diskAcceleratorTimeout = 200000ULL;
|
||||||
|
|
||||||
|
|
||||||
// motor position from the magnet state
|
// motor position from the magnet state
|
||||||
|
@ -57,6 +60,9 @@ void disk_phase() {
|
||||||
|
|
||||||
// printf(", p:%d d:%d l:%d: ph:%u trk:%u)", position, direction, lastPosition, phase.count, woz_tmap.phase[phase.count]);
|
// printf(", p:%d d:%d l:%d: ph:%u trk:%u)", position, direction, lastPosition, phase.count, woz_tmap.phase[phase.count]);
|
||||||
|
|
||||||
|
disk.clk_since_last_read = m6502.clktime;
|
||||||
|
clk_6502_per_frm = clk_6502_per_frm_diskAccelerator;
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// invalid magnet config
|
// invalid magnet config
|
||||||
|
@ -68,6 +74,8 @@ void disk_phase() {
|
||||||
|
|
||||||
uint8_t disk_read() {
|
uint8_t disk_read() {
|
||||||
dbgPrintf("io_DISK_READ (S%u)\n", 6);
|
dbgPrintf("io_DISK_READ (S%u)\n", 6);
|
||||||
|
disk.clk_since_last_read = m6502.clktime;
|
||||||
|
clk_6502_per_frm = clk_6502_per_frm_diskAccelerator;
|
||||||
return woz_read();
|
return woz_read();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ typedef struct phase_s {
|
||||||
|
|
||||||
typedef struct disk_s {
|
typedef struct disk_s {
|
||||||
phase_t phase;
|
phase_t phase;
|
||||||
|
uint64_t clk_since_last_read;
|
||||||
} disk_t;
|
} disk_t;
|
||||||
|
|
||||||
extern disk_t disk;
|
extern disk_t disk;
|
||||||
|
@ -47,9 +48,11 @@ extern disk_t disk;
|
||||||
|
|
||||||
extern const int magnet_to_Poistion[16];
|
extern const int magnet_to_Poistion[16];
|
||||||
extern const int position_to_direction[8][8];
|
extern const int position_to_direction[8][8];
|
||||||
|
extern const unsigned long long clk_6502_per_frm_diskAccelerator;
|
||||||
|
extern const unsigned long long clk_diskAcceleratorTimeout;
|
||||||
|
|
||||||
extern void disk_phase();
|
extern void disk_phase(void);
|
||||||
extern uint8_t disk_read();
|
extern uint8_t disk_read(void);
|
||||||
|
|
||||||
|
|
||||||
#endif /* disk_h */
|
#endif /* disk_h */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user