diff --git a/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream.c b/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream.c index 15dbcee0..1e4b4cf1 100644 --- a/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream.c +++ b/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream.c @@ -58,20 +58,12 @@ #include "kryofluxstream_loader.h" #include "kryofluxstream_format.h" #include "kryofluxstream.h" - -#include "libhxcadaptor.h" - -/* -#define KF_MCLOCK 48054857,14 //(((18432000 * 73) / 14) / 2) -#define KF_SCLOCK ((float)KF_MCLOCK / (float)2) -#define KF_ICLOCK (KF_MCLOCK / 16) -*/ - -#define KF_NS_PER_TICK 41619 // 41,619 ns per tick - -#define MAX_INDEX 128 - -//#define KFSTREAMDBG 1 + +#include "libhxcadaptor.h" + +#define MAX_INDEX 128 + +//#define KFSTREAMDBG 1 typedef struct Index_ { @@ -111,15 +103,16 @@ HXCFE_TRKSTREAM* DecodeKFStreamFile(HXCFE* floppycontext,HXCFE_FXSA * fxs,char * HXCFE_TRKSTREAM * track_dump; Index index_events[MAX_INDEX]; - - FILE* f; - - #ifdef KFSTREAMDBG - - char * tempstr; - s_oob_StreamRead * streamRead; - s_oob_StreamEnd * streamEnd; - + + FILE* f; + + char * tempstr; + + #ifdef KFSTREAMDBG + + s_oob_StreamRead * streamRead; + s_oob_StreamEnd * streamEnd; + #endif unsigned char * kfstreambuffer; @@ -145,12 +138,19 @@ HXCFE_TRKSTREAM* DecodeKFStreamFile(HXCFE* floppycontext,HXCFE_FXSA * fxs,char * uint8_t cur_op,cur_op_len; int new_cell_available; - track_dump = NULL; - kfstreambuffer = NULL; - - if(fxs) - { - f = hxc_fopen(file,"rb"); + track_dump = NULL; + kfstreambuffer = NULL; + + double sck; + double sampleperiod; + char *sck_strpos; + + sck = DEFAULT_KF_SCLOCK; + sampleperiod = (1E9/sck) * 1000.0; // default 41.619 ns + + if(fxs) + { + f = hxc_fopen(file,"rb"); if(f) { filesize = hxc_fgetsize(f); @@ -359,24 +359,59 @@ HXCFE_TRKSTREAM* DecodeKFStreamFile(HXCFE* floppycontext,HXCFE_FXSA * fxs,char * break; case OOBTYPE_String: - #ifdef KFSTREAMDBG - floppycontext->hxc_printf(MSG_DEBUG,"---String---"); - #endif - #ifdef KFSTREAMDBG - tempstr = malloc(oob->Size+1); - if( tempstr ) - { - memset(tempstr,0,oob->Size+1); - memcpy(tempstr,&kfstreambuffer[stream_ofs + sizeof(s_oob_header)],oob->Size); + #ifdef KFSTREAMDBG + floppycontext->hxc_printf(MSG_DEBUG,"---String---"); + #endif + tempstr = malloc(oob->Size+1); + if( tempstr ) + { + memset(tempstr,0,oob->Size+1); + memcpy(tempstr,&kfstreambuffer[stream_ofs + sizeof(s_oob_header)],oob->Size); + + #ifdef KFSTREAMDBG + floppycontext->hxc_printf(MSG_DEBUG,"String : %s",tempstr); + #endif + + sck_strpos = strstr(tempstr, "sck="); + if( sck_strpos ) + { + char tmpstrfreq[64]; + int str_i; + sck_strpos += strlen("sck="); + str_i = 0; + while( *sck_strpos != 0 && *sck_strpos != ',' && str_i<(sizeof(tmpstrfreq) - 1)) + { + if( (*sck_strpos >= '0' && *sck_strpos <= '9') || *sck_strpos == '.' ) + { + tmpstrfreq[str_i++] = *sck_strpos; + } + sck_strpos++; + } + tmpstrfreq[str_i++] = 0; + sck = atof(tmpstrfreq); - floppycontext->hxc_printf(MSG_DEBUG,"String : %s",tempstr); - free(tempstr); - tempstr = NULL; - } - #endif - break; - - case OOBTYPE_End: + floppycontext->hxc_printf(MSG_DEBUG,"sck: %.16f",sck); + + if( sck >= (4 * 1000000) && sck <= (250 * 1000000) ) + { + // ns per tick + sampleperiod = (1E9/sck) * 1000.0; + floppycontext->hxc_printf(MSG_DEBUG,"sampleperiod: %.16f",sampleperiod); + } + else + { + floppycontext->hxc_printf(MSG_ERROR,"sck is out of range! (%.16f)",sck); + sck = DEFAULT_KF_SCLOCK; + sampleperiod = (1E9/sck) * 1000.0; + } + } + + free(tempstr); + tempstr = NULL; + } + break; + + case OOBTYPE_End: oobEnd = 1; break; @@ -450,13 +485,13 @@ HXCFE_TRKSTREAM* DecodeKFStreamFile(HXCFE* floppycontext,HXCFE_FXSA * fxs,char * } } } - } - } - - hxcfe_FxStream_setResolution(fxs,KF_NS_PER_TICK); - - track_dump = hxcfe_FxStream_ImportStream(fxs,cellstream,32,cellpos, HXCFE_STREAMCHANNEL_TYPE_RLEEVT, "data",NULL); - + } + } + + hxcfe_FxStream_setResolution(fxs,(int)sampleperiod); + + track_dump = hxcfe_FxStream_ImportStream(fxs,cellstream,32,cellpos, HXCFE_STREAMCHANNEL_TYPE_RLEEVT, "data",NULL); + for(i=0;i ( Prev_Max_Index_Tick / 4 ) * 3 ) && ( index_events[i].Next_Index_Tick > ( Next_Max_Index_Tick / 4 ) * 3 ) ) { @@ -567,14 +602,14 @@ HXCFE_TRKSTREAM* DecodeKFStreamFile(HXCFE* floppycontext,HXCFE_FXSA * fxs,char * } } - for( i = 0; i < nbindex ; i++ ) - { - floppycontext->hxc_printf(MSG_DEBUG,"Index %d : Prev delta %f ms, Next delta %f ms, Type : 0x%x",i, \ - (float)index_events[i].Prev_Index_Tick * ((float)KF_NS_PER_TICK * 10E-10), \ - (float)index_events[i].Next_Index_Tick * ((float)KF_NS_PER_TICK * 10E-10), \ - index_events[i].type); - - hxcfe_FxStream_AddIndex(fxs,track_dump,index_events[i].CellPos,index_events[i].Timer,index_events[i].type); + for( i = 0; i < nbindex ; i++ ) + { + floppycontext->hxc_printf(MSG_DEBUG,"Index %d : Prev delta %f ms, Next delta %f ms, Type : 0x%x",i, \ + (float)index_events[i].Prev_Index_Tick * (sampleperiod * 10E-10), \ + (float)index_events[i].Next_Index_Tick * (sampleperiod * 10E-10), \ + index_events[i].type); + + hxcfe_FxStream_AddIndex(fxs,track_dump,index_events[i].CellPos,index_events[i].Timer,index_events[i].type); } } diff --git a/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream_format.h b/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream_format.h index 3f5706ac..fe8de208 100644 --- a/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream_format.h +++ b/libhxcfe/sources/loaders/kryofluxstream_loader/kryofluxstream_format.h @@ -63,7 +63,10 @@ typedef struct s_oob_DiskIndex_ #define OOBTYPE_Stream_Read 0x01 // Start of flux transition timing data block (multiple per track) #define OOBTYPE_Index 0x02 // Index Index signal data #define OOBTYPE_Stream_End 0x03 // Stream End Signifies there are no more stream read blocks (one per track) -#define OOBTYPE_String 0x04 // String info -#define OOBTYPE_End 0x0D // End of data (no more data to process) - -#pragma pack() +#define OOBTYPE_String 0x04 // String info +#define OOBTYPE_End 0x0D // End of data (no more data to process) + +#define DEFAULT_KF_MCLOCK (double)48054857.14285714 // (((18432000 * 73) / 14) / 2) +#define DEFAULT_KF_SCLOCK (double)(DEFAULT_KF_MCLOCK / 2) // Default 41.619 ns per tick + +#pragma pack()