diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index d8bd418..65851bf 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -429,6 +429,7 @@ class ViewController: NSViewController { mhz = freq MHz_6502 = UInt64(mhz * M) clk_6502_per_frm = MHz_6502 / UInt64(fps) + clk_6502_per_frm_set = clk_6502_per_frm } @IBAction func speedSelected(_ sender: NSButton) { diff --git a/A2Mac/src/cpu/6502.c b/A2Mac/src/cpu/6502.c index f4c6e3f..de465c6 100644 --- a/A2Mac/src/cpu/6502.c +++ b/A2Mac/src/cpu/6502.c @@ -33,10 +33,12 @@ void ViewController_spk_dn_play(void); const unsigned long long int iterations = G; 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; 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_set = default_MHz_6502 / fps; + unsigned long long tick_per_sec = G; unsigned long long tick_6502_per_sec = 0; @@ -77,13 +79,56 @@ disassembly_t disassembly; #include "disassembler.h" #include "mmio.h" - uint16_t videoShadow [0x1000]; uint32_t videoMem [0x2000]; uint32_t * videoMemPtr = videoMem; 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() { uint16_t i = 0; for ( uint16_t x = 0; x <= 0x50; x+= 0x28 ) { diff --git a/A2Mac/src/cpu/6502.h b/A2Mac/src/cpu/6502.h index ef1d5c7..6537859 100644 --- a/A2Mac/src/cpu/6502.h +++ b/A2Mac/src/cpu/6502.h @@ -15,6 +15,7 @@ extern unsigned long long MHz_6502; extern unsigned long long clk_6502_per_frm; +extern unsigned long long clk_6502_per_frm_set; typedef enum { @@ -99,7 +100,8 @@ extern void hires_Update(void); extern double mips; extern double mhz; -extern const unsigned int fps; + +#define fps 30 extern void tst6502(void); extern void m6502_ColdReset(void); @@ -107,46 +109,5 @@ extern void m6502_Run(void); 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__ */ diff --git a/A2Mac/src/cpu/instructions/6502_instr_call_ret_jump.h b/A2Mac/src/cpu/instructions/6502_instr_call_ret_jump.h index 94dd16c..b903d54 100644 --- a/A2Mac/src/cpu/instructions/6502_instr_call_ret_jump.h +++ b/A2Mac/src/cpu/instructions/6502_instr_call_ret_jump.h @@ -65,6 +65,12 @@ INLINE void RTS() { dbgPrintf("RTS "); disPrintf(disassembly.inst, "RTS"); 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; + } } /** diff --git a/A2Mac/src/dev/disk/disk.c b/A2Mac/src/dev/disk/disk.c index fb05ab3..9e722bd 100644 --- a/A2Mac/src/dev/disk/disk.c +++ b/A2Mac/src/dev/disk/disk.c @@ -13,9 +13,12 @@ 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 @@ -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]); + disk.clk_since_last_read = m6502.clktime; + clk_6502_per_frm = clk_6502_per_frm_diskAccelerator; + } else { // invalid magnet config @@ -68,6 +74,8 @@ void disk_phase() { uint8_t disk_read() { 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(); } diff --git a/A2Mac/src/dev/disk/disk.h b/A2Mac/src/dev/disk/disk.h index a443cd5..ff683f7 100644 --- a/A2Mac/src/dev/disk/disk.h +++ b/A2Mac/src/dev/disk/disk.h @@ -26,6 +26,7 @@ typedef struct phase_s { typedef struct disk_s { phase_t phase; + uint64_t clk_since_last_read; } disk_t; extern disk_t disk; @@ -47,9 +48,11 @@ extern disk_t disk; extern const int magnet_to_Poistion[16]; 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 uint8_t disk_read(); +extern void disk_phase(void); +extern uint8_t disk_read(void); #endif /* disk_h */