- Speed up disk read

- Less overshot with accelerated disk read
- woz_LoadTrack to see where are the sectors
- Removed some unused code
This commit is contained in:
tudnai 2020-06-08 20:52:10 -07:00
parent 19ebe351b5
commit f2f725b8c5
4 changed files with 207 additions and 54 deletions

View File

@ -1176,7 +1176,7 @@
<scene sceneID="R2V-B0-nI4"> <scene sceneID="R2V-B0-nI4">
<objects> <objects>
<windowController id="B8D-0N-5wS" sceneMemberID="viewController"> <windowController id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="Apple ][ Emulator" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA"> <window key="window" title="Forever ][" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="196" y="240" width="1280" height="840"/> <rect key="contentRect" x="196" y="240" width="1280" height="840"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/> <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>

View File

@ -10,6 +10,7 @@
#include "6502.h" #include "6502.h"
#include "common.h" #include "common.h"
#include "woz.h" #include "woz.h"
#include "speaker.h"
disk_t disk = { disk_t disk = {
@ -17,7 +18,7 @@ disk_t disk = {
0, // clk_since_last_read 0, // clk_since_last_read
}; };
const int diskAccelerator_frames = 2; const int diskAccelerator_frames = 1;
int diskAccelerator_count = 0; int diskAccelerator_count = 0;
int diskAccelerator_speed = 25 * M / fps; // if less than actual CPU speed means no acceleration int diskAccelerator_speed = 25 * M / fps; // if less than actual CPU speed means no acceleration
@ -45,7 +46,8 @@ const int position_to_direction[8][8] = {
void disk_accelerator_speedup() { void disk_accelerator_speedup() {
if ( diskAccelerator_speed >= clk_6502_per_frm ) { if ( diskAccelerator_speed >= clk_6502_per_frm ) {
clk_6502_per_frm = diskAccelerator_speed; // clk_6502_per_frm_diskAccelerator; clk_6502_per_frm =
clk_6502_per_frm_max = diskAccelerator_speed; // clk_6502_per_frm_diskAccelerator;
diskAccelerator_count = diskAccelerator_frames; diskAccelerator_count = diskAccelerator_frames;
} }
} }
@ -66,7 +68,9 @@ void disk_phase() {
disk.phase.count = maxDiskPhaseNum; disk.phase.count = maxDiskPhaseNum;
} }
// printf(", p:%d d:%d l:%d: ph:%u trk:%u)", position, direction, lastPosition, phase.count, woz_tmap.phase[phase.count]); spkr_toggle();
// printf("Head Position: p:%d d:%d l:%d: ph:%u)\n", position, direction, lastPosition, disk.phase.count);
disk.clk_last_access = m6502.clktime; disk.clk_last_access = m6502.clktime;
disk_accelerator_speedup(); disk_accelerator_speedup();
@ -75,7 +79,7 @@ void disk_phase() {
// invalid magnet config // invalid magnet config
} }
printf("\n"); // printf("\n");
} }

View File

@ -54,7 +54,7 @@ readState_t readState = readNormal;
uint8_t readLatch; uint8_t readLatch;
void woz_loadTrack( int track ) { void woz_loadTrack_old( int track ) {
trackEntry_t reg = {0}; trackEntry_t reg = {0};
reg.shift = woz_trks[track].data[0]; reg.shift = woz_trks[track].data[0];
@ -77,6 +77,125 @@ void woz_loadTrack( int track ) {
} }
typedef enum wozTrackState_e {
wozTrackState_Start = 0,
wozTrackState_D5,
wozTrackState_D5_AA,
wozTrackState_D5_AA_96,
wozTrackState_vol1,
wozTrackState_vol2,
wozTrackState_trk1,
wozTrackState_trk2,
wozTrackState_sec1,
wozTrackState_sec2,
} wozTrackState_t;
void woz_loadTrack( int track ) {
trackEntry_t reg = {0};
wozTrackState_t wozTrackState = wozTrackState_Start;
reg.shift = 0;
reg.data = 0;
prepared_track[0] = reg;
int vol = 0;
int trk = 0;
int sec = 0;
int bitOffs_D5_SecHdr = 0; // bit offset of D5 Sector Header
int bitOffs = 0;
for ( int byteOffs = 0; byteOffs < WOZ_TRACK_BYTE_COUNT; byteOffs++ ) {
reg.data = woz_trks[track].data[ byteOffs ];
for ( int i = 0; i < 8; i++ ) {
reg.shift16 <<= 1;
if (reg.shift & 0x80) {
switch (wozTrackState) {
case wozTrackState_D5:
switch (reg.shift) {
case 0xAA:
// printf("D5 AA at bitOffset:%d\n", bitOffs);
wozTrackState = wozTrackState_D5_AA;
break;
default:
wozTrackState = wozTrackState_Start;
break;
}
break;
case wozTrackState_D5_AA:
switch (reg.shift) {
case 0x96:
wozTrackState = wozTrackState_vol1;
// printf("D5 AA 96 at bitOffset:%d\n", bitOffs);
// printf("Sector Header at bitOffset:%d\n", bitOffs_D5_SecHdr);
break;
default:
wozTrackState = wozTrackState_Start;
break;
}
break;
case wozTrackState_vol1:
vol = (reg.shift << 1) | 1;
wozTrackState = wozTrackState_vol2;
break;
case wozTrackState_vol2:
vol &= reg.shift;
wozTrackState = wozTrackState_trk1;
break;
case wozTrackState_trk1:
trk = (reg.shift << 1) | 1;
wozTrackState = wozTrackState_trk2;
break;
case wozTrackState_trk2:
trk &= reg.shift;
wozTrackState = wozTrackState_sec1;
break;
case wozTrackState_sec1:
sec = (reg.shift << 1) | 1;
wozTrackState = wozTrackState_sec2;
break;
case wozTrackState_sec2:
sec &= reg.shift;
wozTrackState = wozTrackState_Start;
printf("Vol:%d Track:%d Sector:%d at bitOffset:%d\n", vol, trk, sec, bitOffs_D5_SecHdr);
break;
default:
if ( reg.shift == 0xD5 ) {
// printf("D5 at bitOffset:%d\n", bitOffs);
wozTrackState = wozTrackState_D5;
bitOffs_D5_SecHdr = bitOffs;
}
break;
}
reg.shift = 0;
}
bitOffs++;
}
}
}
uint8_t woz_read() { uint8_t woz_read() {
int track = woz_tmap.phase[disk.phase.count]; int track = woz_tmap.phase[disk.phase.count];
@ -251,20 +370,42 @@ uint8_t woz_read() {
#else // WOZ_REAL_SPIN #else // WOZ_REAL_SPIN
static int clkBeforeSync = 0;
clkelpased = m6502.clktime + clkfrm - m6502.clklast; clkelpased = m6502.clktime + clkfrm - m6502.clklast;
m6502.clklast = m6502.clktime + clkfrm; m6502.clklast = m6502.clktime + clkfrm;
const int clkBeforeAdjusting = 250; clkBeforeSync += clkelpased;
const int clkBeforeAdjusting = 512;
const int magicShiftOffset = 80; const int magicShiftOffset = 80;
uint16_t usedBytes = woz_trks[track].bytes_used < WOZ_TRACK_BYTE_COUNT ? woz_trks[track].bytes_used : WOZ_TRACK_BYTE_COUNT; uint16_t usedBytes = woz_trks[track].bytes_used < WOZ_TRACK_BYTE_COUNT ? woz_trks[track].bytes_used : WOZ_TRACK_BYTE_COUNT;
if ( usedBytes ) { if ( usedBytes ) {
if ( clkelpased > clkBeforeAdjusting ) { if ( clkelpased > clkBeforeAdjusting ) {
// printf("NEED SYNC : %llu\n", clkelpased); printf("NEED SYNC : %llu (clkBefRd:%d)\n", clkelpased, clkBeforeSync);
clkBeforeSync = 0;
bitOffset = (clkelpased >> 2) & 7; bitOffset = (clkelpased >> 2) & 7;
trackOffset += ((clkelpased >> 5) + magicShiftOffset) % usedBytes; trackOffset += clkelpased >> 5;
trackOffset %= usedBytes; trackOffset %= usedBytes;
WOZread.data = woz_trks[track].data[trackOffset];
// preroll data stream
WOZread.shift16 = 0;
WOZread.data = woz_trks[track].data[trackOffset++];
WOZread.shift16 <<= bitOffset;
for ( int i = 0; i < magicShiftOffset; i++ ) {
for ( ; bitOffset < 8; bitOffset++ ) {
WOZread.shift16 <<= 1;
if (WOZread.shift & 0x80) {
WOZread.shift = 0;
}
}
WOZread.data = woz_trks[track].data[trackOffset++];
bitOffset = 0;
}
} }
// to avoid infinite loop and to search for bit 7 high // to avoid infinite loop and to search for bit 7 high
@ -325,7 +466,11 @@ int woz_loadFile( const char * filename ) {
long r = fread( &woz_chunk_header, 1, sizeof(woz_chunk_header_t), f); long r = fread( &woz_chunk_header, 1, sizeof(woz_chunk_header_t), f);
if ( r != sizeof(woz_chunk_header_t) ) { if ( r != sizeof(woz_chunk_header_t) ) {
return r == 0 ? 0 : WOZ_ERR_BAD_CHUNK_HDR; if ( r ) {
return WOZ_ERR_BAD_CHUNK_HDR;
}
// ok we just reached the end of the file, we should exit properly, close file handle etc
break;
} }
long foffs = ftell(f); long foffs = ftell(f);
@ -362,6 +507,10 @@ int woz_loadFile( const char * filename ) {
} }
fclose(f); fclose(f);
// DO NOT COMMIT THIS! ONLY FOR DEBUG!!!
// woz_loadTrack(0x11);
return WOZ_ERR_OK; return WOZ_ERR_OK;
} }

View File

@ -953,22 +953,22 @@ INLINE uint8_t memread8_low( uint16_t addr ) {
INLINE uint8_t memread8_high( uint16_t addr ) { INLINE uint8_t memread8_high( uint16_t addr ) {
return RDHIMEM[addr]; return RDHIMEM[addr];
} }
INLINE uint8_t memread8( uint16_t addr ) { //INLINE uint8_t memread8( uint16_t addr ) {
if (addr >= 0xC000) { // if (addr >= 0xC000) {
return memread8_high(addr); // return memread8_high(addr);
} // }
//
return memread8_low(addr); // return memread8_low(addr);
} //}
/** /**
Naive implementation of RAM read from address Naive implementation of RAM read from address
**/ **/
INLINE uint16_t memread16_low( uint16_t addr ) { INLINE uint16_t memread16_low( uint16_t addr ) {
return * (uint16_t*) ( Apple2_64K_MEM + addr ); return * (uint16_t*) ( Apple2_64K_MEM + addr );
} }
INLINE uint16_t memread16_high( uint16_t addr ) { //INLINE uint16_t memread16_high( uint16_t addr ) {
return * (uint16_t*) ( RDHIMEM + addr ); // return * (uint16_t*) ( RDHIMEM + addr );
} //}
INLINE uint16_t memread16( uint16_t addr ) { INLINE uint16_t memread16( uint16_t addr ) {
// if (addr >= 0xC000) { // if (addr >= 0xC000) {
@ -1085,9 +1085,9 @@ INLINE uint16_t fetch16() {
} }
INLINE uint8_t * dest( uint8_t * mem, uint16_t addr ) { //INLINE uint8_t * dest( uint8_t * mem, uint16_t addr ) {
return mem + addr; // return mem + addr;
} //}
/** /**
@ -1102,9 +1102,9 @@ INLINE uint16_t addr_abs() {
INLINE uint8_t src_abs() { INLINE uint8_t src_abs() {
return memread( addr_abs() ); return memread( addr_abs() );
} }
INLINE uint8_t * dest_abs() { //INLINE uint8_t * dest_abs() {
return WRLOMEM + addr_abs(); // return WRLOMEM + addr_abs();
} //}
INLINE int8_t rel_addr() { INLINE int8_t rel_addr() {
@ -1133,9 +1133,9 @@ INLINE uint16_t addr_abs_X() {
INLINE uint8_t src_abs_X() { INLINE uint8_t src_abs_X() {
return memread( addr_abs_X() ); return memread( addr_abs_X() );
} }
INLINE uint8_t * dest_abs_X() { //INLINE uint8_t * dest_abs_X() {
return WRLOMEM + addr_abs_X(); // return WRLOMEM + addr_abs_X();
} //}
/** /**
@ -1150,9 +1150,9 @@ INLINE uint16_t addr_abs_Y() {
INLINE uint8_t src_abs_Y() { INLINE uint8_t src_abs_Y() {
return memread(addr_abs_Y()); return memread(addr_abs_Y());
} }
INLINE uint8_t * dest_abs_Y() { //INLINE uint8_t * dest_abs_Y() {
return WRLOMEM + addr_abs_Y(); // return WRLOMEM + addr_abs_Y();
} //}
INLINE uint8_t imm() { INLINE uint8_t imm() {
disPrintf(disassembly.oper, "#$%02X", memread8(m6502.PC)) disPrintf(disassembly.oper, "#$%02X", memread8(m6502.PC))
@ -1172,19 +1172,19 @@ INLINE uint8_t addr_zp() {
INLINE uint8_t src_zp() { INLINE uint8_t src_zp() {
return memread8_low(addr_zp()); return memread8_low(addr_zp());
} }
INLINE uint8_t * dest_zp() { //INLINE uint8_t * dest_zp() {
return WRLOMEM + addr_zp(); // return WRLOMEM + addr_zp();
} //}
/** /**
get a 16 bit address from the zp:zp+1 get a 16 bit address from the zp:zp+1
**/ **/
INLINE uint16_t addr_zp_ind( uint8_t addr ) { //INLINE uint16_t addr_zp_ind( uint8_t addr ) {
dbgPrintf("zpi:%02X:%04X(%02X) ", RAM[m6502.PC], *((uint16_t*)&RAM[m6502.PC]), RAM[*((uint16_t*)&RAM[m6502.PC])]); // dbgPrintf("zpi:%02X:%04X(%02X) ", RAM[m6502.PC], *((uint16_t*)&RAM[m6502.PC]), RAM[*((uint16_t*)&RAM[m6502.PC])]);
disPrintf(disassembly.oper, "($%02X)", memread8(m6502.PC) ); // disPrintf(disassembly.oper, "($%02X)", memread8(m6502.PC) );
disPrintf(disassembly.comment, "ind_addr:%04X", memread16( memread8(m6502.PC) ) ); // disPrintf(disassembly.comment, "ind_addr:%04X", memread16( memread8(m6502.PC) ) );
return memread16(addr); // return memread16(addr);
} //}
/** /**
X,ind .... X-indexed, indirect OPC ($LL,X) X,ind .... X-indexed, indirect OPC ($LL,X)
@ -1200,9 +1200,9 @@ INLINE uint16_t addr_ind_X() {
INLINE uint8_t src_X_ind() { INLINE uint8_t src_X_ind() {
return memread( addr_ind_X() ); return memread( addr_ind_X() );
} }
INLINE uint8_t * dest_X_ind() { //INLINE uint8_t * dest_X_ind() {
return WRLOMEM + addr_ind_X(); // return WRLOMEM + addr_ind_X();
} //}
/** /**
ind,Y .... indirect, Y-indexed OPC ($LL),Y ind,Y .... indirect, Y-indexed OPC ($LL),Y
@ -1219,9 +1219,9 @@ INLINE uint16_t addr_ind_Y() {
INLINE uint8_t src_ind_Y() { INLINE uint8_t src_ind_Y() {
return memread( addr_ind_Y() ); return memread( addr_ind_Y() );
} }
INLINE uint8_t * dest_ind_Y() { //INLINE uint8_t * dest_ind_Y() {
return WRLOMEM + addr_ind_Y(); // return WRLOMEM + addr_ind_Y();
} //}
/** /**
zpg,X .... zeropage, X-indexed OPC $LL,X zpg,X .... zeropage, X-indexed OPC $LL,X
@ -1235,9 +1235,9 @@ INLINE uint8_t addr_zp_X() {
INLINE uint8_t src_zp_X() { INLINE uint8_t src_zp_X() {
return memread8_low(addr_zp_X()); return memread8_low(addr_zp_X());
} }
INLINE uint8_t * dest_zp_X() { //INLINE uint8_t * dest_zp_X() {
return WRLOMEM + addr_zp_X(); // return WRLOMEM + addr_zp_X();
} //}
/** /**
zpg,Y .... zeropage, Y-indexed OPC $LL,Y zpg,Y .... zeropage, Y-indexed OPC $LL,Y
@ -1251,9 +1251,9 @@ INLINE uint8_t addr_zp_Y() {
INLINE uint8_t src_zp_Y() { INLINE uint8_t src_zp_Y() {
return memread8_low(addr_zp_Y()); return memread8_low(addr_zp_Y());
} }
INLINE uint8_t * dest_zp_Y() { //INLINE uint8_t * dest_zp_Y() {
return WRLOMEM + addr_zp_Y(); // return WRLOMEM + addr_zp_Y();
} //}
#endif // __APPLE2_MMIO_H__ #endif // __APPLE2_MMIO_H__