mirror of
https://github.com/jfdelnero/HxCFloppyEmulator.git
synced 2026-10-27 06:20:50 +00:00
Stream import (scp,kf,pauline...) : fix random issue with index signal generation when weakbits are under the index start position.
This commit is contained in:
1 parent
61ee343e60
commit
6b9d851cfe
2 files changed
+45
-7
No files matched your search
@@ -35,6 +35,8 @@
|
||||
typedef struct _s_index_evt
|
||||
{
|
||||
uint32_t dump_offset;
|
||||
uint32_t dump_offset_end;
|
||||
|
||||
uint32_t cellpos;
|
||||
int32_t tick_offset;
|
||||
uint32_t clk;
|
||||
|
||||
@@ -513,9 +513,12 @@ HXCFE_SIDE* ScanAndDecodeStream(HXCFE* floppycontext,HXCFE_FXSA * fxs, int initi
|
||||
uint32_t leftbit;
|
||||
#endif
|
||||
uint32_t nextindex_pos;
|
||||
uint32_t nextindex_pos_end;
|
||||
|
||||
uint32_t nextindex;
|
||||
uint32_t tickoffset;
|
||||
int lastbitisflakey;
|
||||
int last_idx_bitoffset;
|
||||
|
||||
HXCFE_SIDE* hxcfe_track;
|
||||
|
||||
@@ -634,7 +637,7 @@ HXCFE_SIDE* ScanAndDecodeStream(HXCFE* floppycontext,HXCFE_FXSA * fxs, int initi
|
||||
|
||||
if(pl)
|
||||
{
|
||||
while ( ( i < (int)track->nb_of_index ) && ( track->index_evt_tab[i].dump_offset < start_index ) )
|
||||
while ( ( i < (int)track->nb_of_index ) && ( track->index_evt_tab[i].dump_offset < start_index ) && ( track->index_evt_tab[i].dump_offset_end < start_index ) )
|
||||
{
|
||||
i++;
|
||||
}
|
||||
@@ -642,10 +645,12 @@ HXCFE_SIDE* ScanAndDecodeStream(HXCFE* floppycontext,HXCFE_FXSA * fxs, int initi
|
||||
|
||||
nextindex = i;
|
||||
nextindex_pos = track->index_evt_tab[i].dump_offset;
|
||||
nextindex_pos_end = track->index_evt_tab[i].dump_offset_end;
|
||||
|
||||
lastbitisflakey = 0;
|
||||
tickoffset = 0;
|
||||
bitoffset = 0;
|
||||
last_idx_bitoffset = -1;
|
||||
for(i=0;i<size;i++)
|
||||
{
|
||||
|
||||
@@ -684,19 +689,34 @@ HXCFE_SIDE* ScanAndDecodeStream(HXCFE* floppycontext,HXCFE_FXSA * fxs, int initi
|
||||
|
||||
settrackbit(outtrack,TEMPBUFSIZE,0xFF,bitoffset,1);
|
||||
|
||||
if( nextindex_pos == (start_index + i) )
|
||||
if( (start_index + i) >= nextindex_pos && (start_index + i) <= nextindex_pos_end )
|
||||
{
|
||||
#ifdef FLUXSTREAMDBG
|
||||
floppycontext->hxc_printf(MSG_DEBUG,"Index reached : Position %d",nextindex_pos);
|
||||
#endif
|
||||
|
||||
// Generate index signal
|
||||
settrackbit(indextrack,TEMPBUFSIZE,0xFF,bitoffset,1);
|
||||
|
||||
nextindex++;
|
||||
if( nextindex < track->nb_of_index )
|
||||
if(last_idx_bitoffset < 0)
|
||||
last_idx_bitoffset = bitoffset;
|
||||
|
||||
// Fill index status between data pulses.
|
||||
for(;last_idx_bitoffset<=bitoffset;last_idx_bitoffset++)
|
||||
settrackbit(indextrack,TEMPBUFSIZE,0xFF,last_idx_bitoffset,1);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not under an index : Go to the next index window if the previous one was passed.
|
||||
last_idx_bitoffset = -1;
|
||||
if( (start_index + i) > nextindex_pos_end )
|
||||
{
|
||||
nextindex_pos = track->index_evt_tab[nextindex].dump_offset;
|
||||
nextindex++;
|
||||
if( nextindex < track->nb_of_index )
|
||||
{
|
||||
nextindex_pos = track->index_evt_tab[nextindex].dump_offset;
|
||||
nextindex_pos_end = track->index_evt_tab[nextindex].dump_offset_end;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -943,7 +963,7 @@ HXCFE_SIDE* ScanAndDecodeStream(HXCFE* floppycontext,HXCFE_FXSA * fxs, int initi
|
||||
{
|
||||
if(getbit(indextrack,i))
|
||||
{
|
||||
us2index(i % bitoffset,hxcfe_track,fxs->out_index_length_us,1,0);
|
||||
hxcfe_track->indexbuffer[(i % bitoffset)>>3] = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3743,6 +3763,22 @@ void hxcfe_FxStream_AddIndex( HXCFE_FXSA * fxs, HXCFE_TRKSTREAM * std, uint32_t
|
||||
std->index_evt_tab[std->nb_of_index].flags = flags;
|
||||
std->index_evt_tab[std->nb_of_index].dump_offset = streamposition;
|
||||
|
||||
cellpos = 0;
|
||||
int ticks = time_to_tick(fxs, fxs->out_index_length_us*100 );
|
||||
|
||||
// Set the index window
|
||||
i = streamposition;
|
||||
while( cellpos < ticks && i < std->channels[0].nb_of_pulses )
|
||||
{
|
||||
cellpos = cellpos + std->channels[0].stream[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
if( i >= std->channels[0].nb_of_pulses)
|
||||
std->index_evt_tab[std->nb_of_index].dump_offset_end = std->channels[0].nb_of_pulses - 1;
|
||||
else
|
||||
std->index_evt_tab[std->nb_of_index].dump_offset_end = i;
|
||||
|
||||
cellpos = 0;
|
||||
|
||||
for(i = 0;i < streamposition;i++)
|
||||
|
||||
Reference in new issue
Block a user