void MON_LABELS::add(u8 *address, char *name) { if (n_pairs >= align_by(n_pairs, 1024)) pairs = (MON_LABEL*)realloc(pairs, sizeof(MON_LABEL) * align_by(n_pairs+1, 1024)); pairs[n_pairs].address = address; pairs[n_pairs].name_offs = add_name(name); n_pairs++; }
//============================================================================= // eTape::Reserve //----------------------------------------------------------------------------- void eTape::Reserve(dword datasize) { const int blocksize = 16384; dword newsize = align_by(datasize+tape_imagesize+1, blocksize); if(!tape_image) tape_image = (byte*)malloc(newsize); if(align_by(tape_imagesize, blocksize) < newsize) tape_image = (byte*)realloc(tape_image, newsize); }
unsigned MON_LABELS::add_name(char *name) { unsigned len = strlen(name)+1, new_size = names_size + len; if (new_size > align_by(names_size, 4096)) names = (char*)realloc(names, align_by(new_size, 4096)); unsigned result = names_size; memcpy(names + result, name, len); names_size = new_size; return result; }
int FDD::read_udi() { free(); unsigned c,s; unsigned mem = 0; u8 *ptr = snbuf + 0x10; for (c = 0; c <= snbuf[9]; c++) { for (s = 0; s <= snbuf[10]; s++) { if (*ptr) return 0; unsigned sz = *(u16*)(ptr+1); sz += sz/8 + ((sz & 7)? 1 : 0); mem += sz; ptr += 3 + sz; if (ptr > snbuf + snapsize) return 0; } } cyls = snbuf[9]+1; sides = snbuf[10]+1; rawsize = align_by(mem, 4096); rawdata = (u8*)VirtualAlloc(0, rawsize, MEM_COMMIT, PAGE_READWRITE); ptr = snbuf+0x10; u8 *dst = rawdata; for (c = 0; c < cyls; c++) { for (s = 0; s < sides; s++) { unsigned sz = *(u16*)(ptr+1); trklen[c][s] = sz; trkd[c][s] = dst; trki[c][s] = dst + sz; sz += sz/8 + ((sz & 7)? 1 : 0); memcpy(dst, ptr+3, sz); ptr += 3 + sz; dst += sz; } } if (snbuf[11] & 1) strcpy(dsc, (char*)ptr); return 1; }