Sync with MESS (no whatsnew)

This commit is contained in:
Miodrag Milanovic 2012-04-27 13:08:09 +00:00
parent ba4321da0b
commit 86d811c58a
5 changed files with 150 additions and 49 deletions

View File

@ -1289,7 +1289,9 @@ static UINT32 ide_controller_read(device_t *device, int bank, offs_t offset, int
if (ide->drive[ide->cur_drive].slot->is_ready()) { if (ide->drive[ide->cur_drive].slot->is_ready()) {
ide->status |= IDE_STATUS_DRIVE_READY; ide->status |= IDE_STATUS_DRIVE_READY;
} else { } else {
ide->status &= ~IDE_STATUS_DRIVE_READY; ide->status |= IDE_STATUS_DRIVE_READY;
ide->status |= IDE_STATUS_ERROR;
ide->error = IDE_ERROR_DEFAULT;
} }
switch (BANK(bank, offset)) switch (BANK(bank, offset))

View File

@ -36,6 +36,37 @@ enum
FM_ERASEAMD4, // part 4 of AMD erase sequence FM_ERASEAMD4, // part 4 of AMD erase sequence
FM_BYTEPROGRAM, FM_BYTEPROGRAM,
FM_BANKSELECT, FM_BANKSELECT,
FM_WRITEPAGEATMEL
};
enum
{
MFG_ALLIANCE = 0x52,
MFG_AMD = 0x01,
MFG_AMIC = 0x37,
MFG_ATMEL = 0x1f,
MFG_BRIGHT = 0xad,
MFG_CATALYST = 0x31,
MFG_EON = 0x1c,
MFG_FUJITSU = 0x04,
MFG_GIGADEVICE = 0xc8,
MFG_HYUNDAI = 0xad,
MFG_INTEL = 0x89,
MFG_ISSI = 0xd5,
MFG_MACRONIX = 0xc2,
MFG_PANASONIC = 0x32,
MFG_PMC = 0x9d,
MFG_SANYO = 0x62,
MFG_SHARP = 0xb0,
MFG_SPANSION = 0x01,
MFG_SST = 0xbf,
MFG_ST = 0x20,
MFG_SYNCMOS = 0x40,
MFG_TI = 0x97,
MFG_TI_OLD = 0x01,
MFG_WINBOND_NEX = 0xef,
MFG_WINBOND = 0xda
}; };
@ -130,28 +161,29 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type
case FLASH_SHARP_LH28F016S: case FLASH_SHARP_LH28F016S:
m_bits = 8; m_bits = 8;
m_size = 0x200000; m_size = 0x200000;
m_maker_id = 0x89; m_maker_id = MFG_INTEL;
m_device_id = 0xaa; m_device_id = 0xaa;
map = ADDRESS_MAP_NAME( memory_map8_16Mb ); map = ADDRESS_MAP_NAME( memory_map8_16Mb );
break; break;
case FLASH_ATMEL_29C010: case FLASH_ATMEL_29C010:
m_bits = 8; m_bits = 8;
m_size = 0x20000; m_size = 0x20000;
m_maker_id = 0x1f; m_page_size = 0x80;
m_maker_id = MFG_ATMEL;
m_device_id = 0xd5; m_device_id = 0xd5;
map = ADDRESS_MAP_NAME( memory_map8_1Mb ); map = ADDRESS_MAP_NAME( memory_map8_1Mb );
break; break;
case FLASH_AMD_29F040: case FLASH_AMD_29F040:
m_bits = 8; m_bits = 8;
m_size = 0x80000; m_size = 0x80000;
m_maker_id = 0x01; m_maker_id = MFG_AMD;
m_device_id = 0xa4; m_device_id = 0xa4;
map = ADDRESS_MAP_NAME( memory_map8_4Mb ); map = ADDRESS_MAP_NAME( memory_map8_4Mb );
break; break;
case FLASH_AMD_29F080: case FLASH_AMD_29F080:
m_bits = 8; m_bits = 8;
m_size = 0x100000; m_size = 0x100000;
m_maker_id = 0x01; m_maker_id = MFG_AMD;
m_device_id = 0xd5; m_device_id = 0xd5;
map = ADDRESS_MAP_NAME( memory_map8_8Mb ); map = ADDRESS_MAP_NAME( memory_map8_8Mb );
break; break;
@ -159,56 +191,56 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type
case FLASH_INTEL_E28F400: case FLASH_INTEL_E28F400:
m_bits = 16; m_bits = 16;
m_size = 0x80000; m_size = 0x80000;
m_maker_id = 0xb0; m_maker_id = MFG_SHARP;
m_device_id = 0xed; m_device_id = 0xed;
map = ADDRESS_MAP_NAME( memory_map16_4Mb ); map = ADDRESS_MAP_NAME( memory_map16_4Mb );
break; break;
case FLASH_FUJITSU_29F016A: case FLASH_FUJITSU_29F016A:
m_bits = 8; m_bits = 8;
m_size = 0x200000; m_size = 0x200000;
m_maker_id = 0x04; m_maker_id = MFG_FUJITSU;
m_device_id = 0xad; m_device_id = 0xad;
map = ADDRESS_MAP_NAME( memory_map8_16Mb ); map = ADDRESS_MAP_NAME( memory_map8_16Mb );
break; break;
case FLASH_FUJITSU_29DL16X: case FLASH_FUJITSU_29DL16X:
m_bits = 8; m_bits = 8;
m_size = 0x200000; m_size = 0x200000;
m_maker_id = 0x04; m_maker_id = MFG_FUJITSU;
m_device_id = 0x35; m_device_id = 0x35;
map = ADDRESS_MAP_NAME( memory_map8_16Mb ); map = ADDRESS_MAP_NAME( memory_map8_16Mb );
break; break;
case FLASH_INTEL_E28F008SA: case FLASH_INTEL_E28F008SA:
m_bits = 8; m_bits = 8;
m_size = 0x100000; m_size = 0x100000;
m_maker_id = 0x89; m_maker_id = MFG_INTEL;
m_device_id = 0xa2; m_device_id = 0xa2;
map = ADDRESS_MAP_NAME( memory_map8_8Mb ); map = ADDRESS_MAP_NAME( memory_map8_8Mb );
break; break;
case FLASH_INTEL_TE28F160: case FLASH_INTEL_TE28F160:
m_bits = 16; m_bits = 16;
m_size = 0x200000; m_size = 0x200000;
m_maker_id = 0xb0; m_maker_id = MFG_SHARP;
m_device_id = 0xd0; m_device_id = 0xd0;
map = ADDRESS_MAP_NAME( memory_map16_16Mb ); map = ADDRESS_MAP_NAME( memory_map16_16Mb );
break; break;
case FLASH_SHARP_UNK128MBIT: case FLASH_SHARP_UNK128MBIT:
m_bits = 16; m_bits = 16;
m_size = 0x800000; m_size = 0x800000;
m_maker_id = 0xb0; m_maker_id = MFG_SHARP;
m_device_id = 0xb0; m_device_id = 0xb0;
map = ADDRESS_MAP_NAME( memory_map16_64Mb ); map = ADDRESS_MAP_NAME( memory_map16_64Mb );
break; break;
case FLASH_MACRONIX_29L001MC: case FLASH_MACRONIX_29L001MC:
m_bits = 8; m_bits = 8;
m_size = 0x20000; m_size = 0x20000;
m_maker_id = 0xc2; m_maker_id = MFG_MACRONIX;
m_device_id = 0x51; m_device_id = 0x51;
map = ADDRESS_MAP_NAME( memory_map8_1Mb ); map = ADDRESS_MAP_NAME( memory_map8_1Mb );
break; break;
case FLASH_PANASONIC_MN63F805MNP: case FLASH_PANASONIC_MN63F805MNP:
m_bits = 8; m_bits = 8;
m_size = 0x10000; m_size = 0x10000;
m_maker_id = 0x32; m_maker_id = MFG_PANASONIC;
m_device_id = 0x1b; m_device_id = 0x1b;
m_sector_is_4k = true; m_sector_is_4k = true;
map = ADDRESS_MAP_NAME( memory_map8_512Kb ); map = ADDRESS_MAP_NAME( memory_map8_512Kb );
@ -216,7 +248,7 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type
case FLASH_SANYO_LE26FV10N1TS: case FLASH_SANYO_LE26FV10N1TS:
m_bits = 8; m_bits = 8;
m_size = 0x20000; m_size = 0x20000;
m_maker_id = 0x62; m_maker_id = MFG_SANYO;
m_device_id = 0x13; m_device_id = 0x13;
m_sector_is_4k = true; m_sector_is_4k = true;
map = ADDRESS_MAP_NAME( memory_map8_1Mb ); map = ADDRESS_MAP_NAME( memory_map8_1Mb );
@ -492,7 +524,7 @@ UINT32 intelfsh_device::read_full(UINT32 address)
break; break;
} }
// logerror( "intelflash_read( %d, %08x ) %08x\n", chip, address, data ); //logerror( "intelflash_read( %08x ) %08x\n", address, data );
return data; return data;
} }
@ -505,7 +537,7 @@ UINT32 intelfsh_device::read_full(UINT32 address)
void intelfsh_device::write_full(UINT32 address, UINT32 data) void intelfsh_device::write_full(UINT32 address, UINT32 data)
{ {
// logerror( "intelflash_write( %d, %08x, %08x )\n", chip, address, data ); //logerror( "intelflash_write( %u : %08x, %08x )\n", m_flash_mode, address, data );
address += m_bank << 16; address += m_bank << 16;
@ -610,7 +642,15 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data)
} }
else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xa0 ) else if( ( address & 0xffff ) == 0x5555 && ( data & 0xff ) == 0xa0 )
{ {
m_flash_mode = FM_BYTEPROGRAM; if (m_type == FLASH_ATMEL_29C010)
{
m_flash_mode = FM_WRITEPAGEATMEL;
m_byte_count = 0;
}
else
{
m_flash_mode = FM_BYTEPROGRAM;
}
} }
else if( ( address & 0xfff ) == 0xaaa && ( data & 0xff ) == 0xa0 ) else if( ( address & 0xfff ) == 0xaaa && ( data & 0xff ) == 0xa0 )
{ {
@ -770,6 +810,31 @@ void intelfsh_device::write_full(UINT32 address, UINT32 data)
m_status = 0x80; m_status = 0x80;
m_flash_mode = FM_READSTATUS; m_flash_mode = FM_READSTATUS;
break; break;
case FM_WRITEPAGEATMEL:
switch( m_bits )
{
case 8:
{
m_addrspace[0]->write_byte(address, data);
}
break;
case 16:
{
m_addrspace[0]->write_word(address * 2, data);
}
break;
default:
logerror( "FM_WRITEPAGEATMEL not supported when m_bits == %d\n", m_bits );
break;
}
m_byte_count++;
if (m_byte_count == m_page_size)
{
m_flash_mode = FM_NORMAL;
}
break;
case FM_CLEARPART1: case FM_CLEARPART1:
if( ( data & 0xff ) == 0xd0 ) if( ( data & 0xff ) == 0xd0 )
{ {

View File

@ -122,6 +122,7 @@ protected:
UINT8 m_device_id; UINT8 m_device_id;
UINT8 m_maker_id; UINT8 m_maker_id;
bool m_sector_is_4k; bool m_sector_is_4k;
UINT8 m_page_size;
// internal state // internal state
UINT8 m_status; UINT8 m_status;
@ -130,6 +131,7 @@ protected:
bool m_flash_master_lock; bool m_flash_master_lock;
emu_timer * m_timer; emu_timer * m_timer;
INT32 m_bank; INT32 m_bank;
UINT8 m_byte_count;
}; };

View File

@ -664,6 +664,15 @@ bool a2_16sect_format::save(io_generic *io, floppy_image *image)
{ {
int g_tracks, g_heads; int g_tracks, g_heads;
int visualgrid[16][35]; // visualizer grid, cleared/initialized below int visualgrid[16][35]; // visualizer grid, cleared/initialized below
// lenient addr check: if unset, only accept an addr mark if the checksum was good
// if set, accept an addr mark if the track and sector values are both sane
#undef LENIENT_ADDR_CHECK
// if set, use the old, not as robust logic for choosing which copy of a decoded sector to write
// to the resulting image if the sector has a bad checksum and/or postamble
#undef USE_OLD_BEST_SECTOR_PRIORITY
// select a sector order for resulting file: 0 = logical, 1 = dos3.3, 2 = prodos
#define SECTOR_ORDER 1
// nothing found
#define NOTFOUND 0 #define NOTFOUND 0
// address mark was found // address mark was found
#define ADDRFOUND 1 #define ADDRFOUND 1
@ -726,9 +735,15 @@ bool a2_16sect_format::save(io_generic *io, floppy_image *image)
UINT8 chk = gcr4_decode(h[6],h[7]); UINT8 chk = gcr4_decode(h[6],h[7]);
UINT32 post = (h[8]<<16)|(h[9]<<8)|h[10]; UINT32 post = (h[8]<<16)|(h[9]<<8)|h[10];
printf("Address Mark:\tVolume %d, Track %d, Sector %2d, Checksum %02X: %s, Postamble %03X: %s\n", vl, tr, se, chk, (chk ^ vl ^ tr ^ se)==0?"OK":"BAD", post, (post&0xFFFF00)==0xDEAA00?"OK":"BAD"); printf("Address Mark:\tVolume %d, Track %d, Sector %2d, Checksum %02X: %s, Postamble %03X: %s\n", vl, tr, se, chk, (chk ^ vl ^ tr ^ se)==0?"OK":"BAD", post, (post&0xFFFF00)==0xDEAA00?"OK":"BAD");
// sanity check
if (tr == track/2 && se < nsect) { if (tr == track/2 && se < nsect) {
visualgrid[se][track/2] |= ADDRFOUND; visualgrid[se][track/2] |= ADDRFOUND;
visualgrid[se][track/2] |= (chk ^ vl ^ tr ^ se)==0?ADDRGOOD:0; visualgrid[se][track/2] |= ((chk ^ vl ^ tr ^ se)==0)?ADDRGOOD:0;
#ifdef LENIENT_ADDR_CHECK
if ((visualgrid[se][track/2] & ADDRFOUND) == ADDRFOUND) {
#else
if ((visualgrid[se][track/2] & ADDRGOOD) == ADDRGOOD) {
#endif
int opos = pos; int opos = pos;
int owrap = wrap; int owrap = wrap;
hb = 0; hb = 0;
@ -747,11 +762,22 @@ bool a2_16sect_format::save(io_generic *io, floppy_image *image)
} }
if((hb == 4)&&(dosver == 0)) { if((hb == 4)&&(dosver == 0)) {
visualgrid[se][track/2] |= DATAFOUND; visualgrid[se][track/2] |= DATAFOUND;
int prodos_translate[16] = { int sector_translate[16] = {
#if SECTOR_ORDER == 0
// logical order (0-15)
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
#elif SECTOR_ORDER == 1
// DOS order (*.do)
0x00, 0x07, 0x0E, 0x06, 0x0D, 0x05, 0x0C, 0x04,
0x0B, 0x03, 0x0A, 0x02, 0x09, 0x01, 0x08, 0x0F
#elif SECTOR_ORDER == 2
// prodos order (*.po)
0x00, 0x08, 0x01, 0x09, 0x02, 0x0A, 0x03, 0x0B, 0x00, 0x08, 0x01, 0x09, 0x02, 0x0A, 0x03, 0x0B,
0x04, 0x0C, 0x05, 0x0D, 0x06, 0x0E, 0x07, 0x0F 0x04, 0x0C, 0x05, 0x0D, 0x06, 0x0E, 0x07, 0x0F
#endif
}; };
UINT8 *dest = sectdata+(256)*prodos_translate[se]; UINT8 *dest = sectdata+(256)*sector_translate[se];
UINT8 data[0x157]; UINT8 data[0x157];
UINT32 dpost = 0; UINT32 dpost = 0;
UINT8 c = 0; UINT8 c = 0;
@ -818,6 +844,7 @@ bool a2_16sect_format::save(io_generic *io, floppy_image *image)
pos = opos; pos = opos;
wrap = owrap; wrap = owrap;
} }
}
} }
hb = 0; hb = 0;
} }

View File

@ -47,6 +47,7 @@
#define NUMBER_OF_MULTIREADS 3 #define NUMBER_OF_MULTIREADS 3
// threshholds for brickwall windowing // threshholds for brickwall windowing
//define MIN_CLOCKS 65 //define MIN_CLOCKS 65
// number_please apple2 wants 40 min
#define MIN_CLOCKS 40 #define MIN_CLOCKS 40
//define MAX_CLOCKS 260 //define MAX_CLOCKS 260
#define MAX_CLOCKS 270 #define MAX_CLOCKS 270
@ -88,7 +89,7 @@ int dfi_format::identify(io_generic *io, UINT32 form_factor)
{ {
char sign[4]; char sign[4];
io_generic_read(io, sign, 0, 4); io_generic_read(io, sign, 0, 4);
if (memcmp(sign, "DFER", 4)) if (memcmp(sign, "DFER", 4)==0)
fatalerror("Old type Discferret image detected; the mess Discferret decoder will not handle this properly, bailing out!\n"); fatalerror("Old type Discferret image detected; the mess Discferret decoder will not handle this properly, bailing out!\n");
return memcmp(sign, "DFE2", 4) ? 0 : 100; return memcmp(sign, "DFE2", 4) ? 0 : 100;
} }
@ -132,24 +133,27 @@ bool dfi_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
int index_time = 0; // what point the last index happened int index_time = 0; // what point the last index happened
int index_count = 0; // number of index pulses per track int index_count = 0; // number of index pulses per track
int index_polarity = 0; // current polarity of index //int index_polarity = 1; // current polarity of index, starts high
int total_time = 0; // total sampled time per track int total_time = 0; // total sampled time per track
for(int i=0; i<tsize; i++) { for(int i=0; i<tsize; i++) {
UINT8 v = data[i]; UINT8 v = data[i];
if (v == 0xFF) { fprintf(stderr,"DFI stream contained a 0xFF at t%d, position%d, THIS SHOULD NEVER HAPPEN!\n", track, i); exit(1); } if (v == 0xFF) { fprintf(stderr,"DFI stream contained a 0xFF at t%d, position%d, THIS SHOULD NEVER HAPPEN! Bailing out!\n", track, i); exit(1); }
if((v & 0x7f) == 0x7f) if((v & 0x7f) == 0x7f)
total_time += 0x7f; total_time += 0x7f;
else { else if(v & 0x80) {
if((v & 0x80)==0) total_time += v & 0x7f; total_time += v & 0x7f;
if(v & 0x80) { index_time = total_time;
index_time = total_time; //index_polarity ^= 1;
if (onerev_time == 0) onerev_time = total_time; //fprintf(stderr,"index state changed to %d at time=%d\n", index_polarity, total_time);
//index_polarity ^= 1; //fprintf(stderr,"index rising edge seen at time=%d\n", total_time);
//index_count =+ index_polarity; if (onerev_time == 0) onerev_time = total_time;
index_count++; index_count += 1;//index_polarity;
} } else // (v & 0x80) == 0
} total_time += v & 0x7f;
} }
// its possible on single read images for there to be no index pulse during the image at all!
if (onerev_time == 0) onerev_time = total_time;
if(!track && !head) if(!track && !head)
fprintf(stderr, "%02d:%d tt=%10d it=%10d\n", track, head, total_time, index_time); fprintf(stderr, "%02d:%d tt=%10d it=%10d\n", track, head, total_time, index_time);
@ -194,21 +198,21 @@ bool dfi_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
time_buckets[i] = 0; time_buckets[i] = 0;
#endif #endif
index_count = 0; index_count = 0;
index_polarity = 0; //index_polarity = 0;
UINT32 mg = floppy_image::MG_A; UINT32 mg = floppy_image::MG_A;
UINT32 *buf = image->get_buffer(track, head); UINT32 *buf = image->get_buffer(track, head);
int tpos = 0; int tpos = 0;
buf[tpos++] = mg; buf[tpos++] = mg;
for(int i=0; i<tsize; i++) { for(int i=0; i<tsize; i++) {
UINT8 v = data[i]; UINT8 v = data[i];
if((v & 0x7f) == 0x7f) {// 0x7F or 0xFF: no transition, but a carry if((v & 0x7f) == 0x7f) // 0x7F : no transition, but a carry (FF is a board-on-fire error and is checked for above)
cur_time += 0x7f; // should this be done if v&80 is also set? cur_time += 0x7f;
if(v & 0x80) { // 0xFF an index, note the index (TODO: actually do this!) and do not add number else if(v & 0x80) { // 0x80 set, note the index (TODO: actually do this!) and add number to count
index_polarity ^= 1; cur_time += v & 0x7f;
index_count += index_polarity; //index_polarity ^= 1;
//if (index_count == NUMBER_OF_MULTIREADS) break; index_count += 1;//index_polarity;
//if (index_count == NUMBER_OF_MULTIREADS) break;
} }
}
else if((v & 0x80) == 0) { // 0x00-0x7E: not an index or carry, add the number and store transition else if((v & 0x80) == 0) { // 0x00-0x7E: not an index or carry, add the number and store transition
cur_time += v & 0x7f; cur_time += v & 0x7f;
int trans_time = cur_time - prev_time; int trans_time = cur_time - prev_time;
@ -219,23 +223,24 @@ bool dfi_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
// TODO for 4/22/2012: ACTUALLY DO THIS RESCALING STEP // TODO for 4/22/2012: ACTUALLY DO THIS RESCALING STEP
// filter out spurious crap // filter out spurious crap
//if (trans_time <= MIN_THRESH) fprintf(stderr, "DFI: Throwing out short transition of length %d\n", trans_time); //if (trans_time <= MIN_THRESH) fprintf(stderr, "DFI: Throwing out short transition of length %d\n", trans_time);
//if ((prev_time == 0) || ((trans_time > MIN_THRESH))) { // the normal case: write the transition at the appropriate time
if ((prev_time == 0) || ((trans_time > MIN_THRESH) && (trans_time <= MAX_THRESH))) { if ((prev_time == 0) || ((trans_time > MIN_THRESH) && (trans_time <= MAX_THRESH))) {
mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A; mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
buf[tpos++] = mg | UINT32((200000000ULL*cur_time)/index_time); buf[tpos++] = mg | UINT32((200000000ULL*cur_time)/index_time);
prev_time = cur_time; prev_time = cur_time;
} }
if (trans_time > MAX_THRESH) { // we probably missed a transition // the long case: we probably missed a transition, stuff an extra guessed one in there to see if it helps
if (trans_time > MAX_THRESH) {
mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A; mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
if (((track%2)==0)&&(head==0)) fprintf(stderr,"missed transition, total time for transition is %d\n",trans_time); if (((track%2)==0)&&(head==0)) fprintf(stderr,"missed transition, total time for transition is %d\n",trans_time);
buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-(trans_time/2)))/index_time); // generate imaginary transition at half period //buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-(trans_time/2)))/index_time); // generate imaginary transition at half period
buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-((trans_time*2)/3)))/index_time);
mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-(trans_time/3)))/index_time);
mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
buf[tpos++] = mg | UINT32(200000000ULL*cur_time/index_time); // generate transition now buf[tpos++] = mg | UINT32(200000000ULL*cur_time/index_time); // generate transition now
prev_time = cur_time; prev_time = cur_time;
} }
} else if(v & 0x80) { // 0x80-0xFF an index, note the index (TODO: actually do this!) and do not add number
index_polarity ^= 1;
index_count += index_polarity;
if (index_count == NUMBER_OF_MULTIREADS) break;
} }
} }
#ifdef TRACK_HISTOGRAM #ifdef TRACK_HISTOGRAM