void savemap(void) { FILE *handle; int c; enterfilename("SAVE MAP", mapname); if (!strlen(mapname)) return; handle = fopen(mapname, "wb"); if (!handle) return; /* Write map header */ fwrite(&map, sizeof(MAPHEADER), 1, handle); /* Write each layer */ for (c = 0; c < MAX_LAYERS; c++) { fwritele32(handle, layer[c].xsize); fwritele32(handle, layer[c].ysize); fwrite8(handle, layer[c].xdivisor); fwrite8(handle, layer[c].ydivisor); fwrite8(handle, layer[c].xwrap); fwrite8(handle, layer[c].ywrap); if ((layer[c].xsize) && (layer[c].ysize)) { int d; for (d = 0; d < layer[c].xsize * layer[c].ysize; d++) { fwritele16(handle, map_layerdataptr[c][d]); } } } fclose(handle); }
void tos_writerelocs(struct GlobalVars *gv,FILE *f, struct LinkedSection **sections) { const char *fn = "tos_writerelocs(): "; int i; struct Reloc *rel; struct RelocInsert *ri; unsigned long lastoffs = 0; for (i=0; i<3; i++) { if (sections[i]) { sort_relocs(§ions[i]->relocs); for (rel=(struct Reloc *)sections[i]->relocs.first; rel->n.next!=NULL; rel=(struct Reloc *)rel->n.next) { if (ri = rel->insert) { if (rel->rtype!=R_ABS || ri->bpos!=0 || ri->bsiz!=32) { error(32,fff_ataritos.tname,reloc_name[rel->rtype], (int)ri->bpos,(int)ri->bsiz,ri->mask, sections[i]->name,rel->offset); continue; } } else continue; if (!lastoffs) { /* first relocation offset is 32 bits, the rest are bytes! */ fwrite32be(f,sections[i]->base + rel->offset); } else { long diff = (sections[i]->base + rel->offset) - lastoffs; if (diff < 0) { ierror("%snegative offset difference: " "%s(0x%08lx)+0x%08lx - 0x%08lx",fn,sections[i]->name, sections[i]->base,rel->offset,lastoffs); } while (diff > 254) { fwrite8(f,1); diff -= 254; } fwrite8(f,(uint8_t)diff); } lastoffs = sections[i]->base + rel->offset; } } } if (!lastoffs) { /* not a single relocation written - write 0-word */ fwrite32be(f,0); } else fwrite8(f,0); }