RETCODE HxCADFLibWriteSector(struct Device *dev, long sector, int size, unsigned char* buf) { unsigned long i,c,sector_count; int fp_track,fp_head,fp_sector,fdcstatus; unsigned char tmpSectBuf[512]; int remainSize; sector_count = size / gb_fsmng->sectorsize; if(size&0x1FF) sector_count++; remainSize = size; lba2chs(gb_fsmng,sector, &fp_track,&fp_head,&fp_sector); gb_fsmng->hxcfe->hxc_printf(MSG_DEBUG,"HxCADFLibWriteSector : media_write, sector: 0x%.8X, sector count : %d, Track: %d, Side: %d, Sector: %d",sector,sector_count,fp_track,fp_head,fp_sector); c = 0; for(i=0;i<sector_count;i++) { lba2chs(gb_fsmng,sector + i, &fp_track,&fp_head,&fp_sector); if(remainSize>=512) { memcpy(tmpSectBuf,&buf[i*gb_fsmng->sectorsize],512); } else { hxcfe_readSectorFDC (gb_fsmng->fdc,(unsigned char)fp_track,(unsigned char)fp_head,(unsigned char)fp_sector,gb_fsmng->sectorsize,AMIGA_MFM_ENCODING,1,(unsigned char*)&tmpSectBuf,gb_fsmng->sectorsize,&fdcstatus); memcpy(tmpSectBuf,&buf[i*gb_fsmng->sectorsize],remainSize); } if(hxcfe_writeSectorFDC (gb_fsmng->fdc,(unsigned char)fp_track,(unsigned char)fp_head,(unsigned char)fp_sector,gb_fsmng->sectorsize,AMIGA_MFM_ENCODING,1,(unsigned char*)&tmpSectBuf,gb_fsmng->sectorsize,&fdcstatus) == 1) { if(!fdcstatus) { c++; } else { gb_fsmng->hxcfe->hxc_printf(MSG_DEBUG,"HxCADFLibWriteSector : media_write !!! ERROR !!!, sector: 0x%.8X, sector count : %d, Track: %d, Side: %d, Sector: %d",sector,sector_count,fp_track,fp_head,fp_sector,fdcstatus); } } } if( c == sector_count ) return RC_OK; else return 0; }
static int setup_handover(const struct part_iter *iter, struct data_area *data) { struct disk_dos_part_entry *ha; uint32_t synth_size = sizeof *ha; /* * we have to cover both non-iterated but otherwise properly detected * gpt/dos schemes as well as raw disks; checking index for 0 covers both */ if (iter->index == 0) { uint32_t len; /* RAW handover protocol */ ha = malloc(synth_size); if (!ha) { critm(); goto bail; } len = ~0u; if (iter->length < len) len = iter->length; lba2chs(&ha->start, &iter->di, 0, L2C_CADD); lba2chs(&ha->end, &iter->di, len - 1, L2C_CADD); ha->active_flag = 0x80; ha->ostype = 0xDA; /* "Non-FS Data", anything is good here though ... */ ha->start_lba = 0; ha->length = len; } else if (iter->type == typegpt) { uint32_t *plen; /* GPT handover protocol */ synth_size += sizeof *plen + iter->gpt.pe_size; ha = malloc(synth_size); if (!ha) { critm(); goto bail; } lba2chs(&ha->start, &iter->di, iter->abs_lba, L2C_CADD); lba2chs(&ha->end, &iter->di, iter->abs_lba + iter->length - 1, L2C_CADD); ha->active_flag = 0x80; ha->ostype = 0xED; /* All bits set by default */ ha->start_lba = ~0u; ha->length = ~0u; /* If these fit the precision, pass them on */ if (iter->abs_lba < ha->start_lba) ha->start_lba = iter->abs_lba; if (iter->length < ha->length) ha->length = iter->length; /* Next comes the GPT partition record length */ plen = (uint32_t *)(ha + 1); plen[0] = iter->gpt.pe_size; /* Next comes the GPT partition record copy */ memcpy(plen + 1, iter->record, plen[0]); #ifdef DEBUG dprintf("GPT handover:\n"); disk_dos_part_dump(ha); disk_gpt_part_dump((struct disk_gpt_part_entry *)(plen + 1)); #endif /* the only possible case left is dos scheme */ } else if (iter->type == typedos) { /* MBR handover protocol */ ha = malloc(synth_size); if (!ha) { critm(); goto bail; } memcpy(ha, iter->record, synth_size); /* make sure these match bios imaginations and are ebr agnostic */ lba2chs(&ha->start, &iter->di, iter->abs_lba, L2C_CADD); lba2chs(&ha->end, &iter->di, iter->abs_lba + iter->length - 1, L2C_CADD); ha->start_lba = iter->abs_lba; ha->length = iter->length; #ifdef DEBUG dprintf("MBR handover:\n"); disk_dos_part_dump(ha); #endif } else { /* shouldn't ever happen */ goto bail; } data->base = 0x7be; data->size = synth_size; data->data = (void *)ha; return 0; bail: return -1; }