// writes a dir entry to disk byte write_dir_entry(dir_entry_t* de, byte* buf) { dword de_sec_offset; dword de_sec_start; byte b; word cluster_rev; dword filesize_rev; de_sec_offset = de->entry_addr % 512; de_sec_start = de->entry_addr - de_sec_offset; b = read_block(buf, de_sec_start); memreverse((void*)&(de->first_cluster), &cluster_rev, 2); memreverse((void*)&(de->filesize), &filesize_rev, 4); // enter dir_entry info into buffer (based on http://en.wikipedia.org/wiki/8.3_filename) memmove(buf+de_sec_offset, de->filename, 11); memmove(buf+de_sec_offset+0x0b, &(de->attributes), 1); memmove(buf+de_sec_offset+0x0c, &(de->unused_attr), 14); memmove(buf+de_sec_offset+0x1a, &cluster_rev, 2); memmove(buf+de_sec_offset+0x1c, &filesize_rev, 4); if(!write_block(buf, de_sec_start)) { #if DEBUG pmsg("problem writing direntry!\r\n"); #endif return 0; } return 1; }
// sets FAT[_cluster_] to 0x00 and returns FAT[_cluster_]'s original value word clear_FAT(byte* buf, word cluster) { dword abs_addr; dword sec_start; word ori_cluster; abs_addr = prtn.FAT_addr + cluster*2; sec_start = abs_addr - (abs_addr % 512); if(!read_block(buf, sec_start)) { #if DEBUG pmsg("Problem clearing FAT!\r\n"); #endif return 0; } memreverse(buf + (abs_addr % 512), &ori_cluster, 2); memmove(buf + (abs_addr % 512), (word)0, 2); if (!write_block(buf, sec_start)) { #if DEBUG pmsg("Problem clearing FAT!\r\n"); #endif return 0; } return ori_cluster; }
// make FAT[_cluster_] point to cluster _value_ byte update_FAT(byte* buf, word cluster, word value) { dword abs_addr; dword sec_start; word value_rev; memreverse(&value, &value_rev, 2); abs_addr = prtn.FAT_addr + cluster*2; sec_start = abs_addr - (abs_addr % 512); if(!read_block(buf, sec_start)) { #if DEBUG pmsg("Problem updating FAT!\r\n"); #endif return 0; } memmove(buf + (abs_addr % 512), &value_rev, 2); if (!write_block(buf, sec_start)) { #if DEBUG pmsg("Problem updating FAT!\r\n"); #endif return 0; } return 1; }
void HdrImage::FlipX() { for (int y = 0; y < mHeight; y++) { memreverse(mData+y*mWidth, mWidth, sizeof(rgba)); } }
byte getFile(dir_entry_t* de, byte* buf, char* filename, byte length) { int i,j; word cluster; dword file_size; byte b; char filename_upper[12]; for (i = 0; i < prtn.root_dir_size/512; i++) { b = read_block(buf, prtn.root_dir_addr + i*512); for(j = 0; j < 16; j++) { if (*(buf + j*32)==0 || *(buf + j*32)==0x2e || *(buf + j*32)==0xe5) { continue; } strncpy(filename_upper, (char*)(buf+j*32), 11); filename_upper[11] = '\0'; if(strcmp(filename, str_toupper(filename_upper)) == 0) { #if DEBUG pmsg("found file!\r\n"); #endif memreverse(buf + j*32 + 0x1c, &file_size, 4); memreverse(buf + j*32 + 0x1a, &cluster, 2); #if DEBUG pmsg("cluster numer:"); disword_dec(cluster); pmsg("\r\n"); #endif // fill in dir_entry memmove(de->filename, filename, length); de->attributes = *(buf + j*32 + 0x0b); memmove(de->unused_attr, buf + j*32 + 0x0c, 14); de->filesize = file_size; de->entry_addr = prtn.root_dir_addr + i*512 + j*32; de->first_cluster = cluster; return 1; } } } return 0; }
word next_clus(word clus, byte *buf) { dword addr; word next; addr = prtn.FAT_addr + 2*clus; if(!read_block(buf, addr - addr % 512)) { #if DEBUG pmsg("next_clus failed when reading block!\r\n"); #endif return 0; } memreverse(buf + addr%512, &next, 2); return next; }
void HdrImage::FlipXY() { memreverse(mData, mWidth*mHeight, sizeof(rgba)); }
int main(int argc, char *argv[]) { char str[8] = "Hello !"; memreverse(str, 2, 3); puts(str); return 0; }