if ((ap = alookup(id)) != NULL) {
if (uaf && uf != ap->a_flag)
err('m');
- if (ap->a_flag & A_OVR) {
- ap->a_size = 0;
- ap->a_fuzz=0;
- }
} else {
ap = (struct area *) new (sizeof(struct area));
ap->a_ap = areap;
register struct area *oap;
oap = dot.s_area;
+ /* fprintf (stderr, "%s dot.s_area->a_size: %d dot.s_addr: %d\n",
+ oap->a_id, dot.s_area->a_size, dot.s_addr); */
oap->a_fuzz = fuzz;
- oap->a_size = dot.s_addr;
- fuzz = nap->a_fuzz;
+ if (oap->a_flag & A_OVR) {
+ // the size of an overlay is the biggest size encountered
+ if (oap->a_size < dot.s_addr) {
+ oap->a_size = dot.s_addr;
+ }
+ } else {
+ oap->a_size = dot.s_addr;
+ }
+ if (nap->a_flag & A_OVR) {
+ // a new overlay starts at 0, no fuzz
+ dot.s_addr = 0;
+ fuzz = 0;
+ } else {
+ dot.s_addr = nap->a_size;
+ fuzz = nap->a_fuzz;
+ }
dot.s_area = nap;
- dot.s_addr = nap->a_size;
outall();
}
if (elementsInSet (ovrset))
{
+#if 0
/* this dummy area is used to fool the assembler
otherwise the assembler will append each of these
declarations into one chunk and will not overlay
sad but true */
fprintf (afile, "\t.area _DUMMY\n");
+#else
+ /* not anymore since asmain.c:1.13 */
+#endif
/* output the area informtion */
fprintf (afile, "\t.area\t%s\n", port->mem.overlay_name); /* MOF */
}