z80as: change object file format to fixed sized symbol records
authorAlan Cox <alan@linux.intel.com>
Sat, 28 Oct 2017 17:41:19 +0000 (18:41 +0100)
committerAlan Cox <alan@linux.intel.com>
Sat, 28 Oct 2017 17:41:19 +0000 (18:41 +0100)
This makes life a lot easier for the other tools

Applications/MWC/cmd/asz80/as4.c
Applications/MWC/cmd/asz80/nm.c
Applications/MWC/cmd/asz80/obj.h

index 340d0be..170f726 100644 (file)
@@ -141,15 +141,9 @@ static void putsymbol(SYM *s, FILE *ofp)
                flag |= s->s_segment;
        }
        putc(flag, ofp);
-       for (i = 0; i < 16; i++) {
-               putc(s->s_id[i], ofp);
-               if (!s->s_id[i])
-                       break;
-       }
-       if (!(flag & S_UNKNOWN)) {
-               putc(s->s_value, ofp);
-               putc(s->s_value >> 8, ofp);
-       }
+       fwrite(cs->s_id, 16, 1, ofp);
+       putc(s->s_value, ofp);
+       putc(s->s_value >> 8, ofp);
 }
 
 static void enumerate(SYM *s, FILE *dummy)
index 49d8be4..c96be53 100644 (file)
@@ -54,19 +54,14 @@ static int do_nm(FILE *fp, const char *name)
             return 0;
         type = (uint8_t)c;
         base++;
-        for (i = 0; i < 16; i++) {
-            c = fgetc(fp);
-            base++;
-            symname[i] = (char)c;
-            if (c == 0)
-                break;
-        }
+        fread(symname, 16, 1, fp);
+        base += 16;
         symname[16] = 0;
         /* Address if defined */
+        addr = fgetc(fp);
+        addr |= fgetc(fp) << 8;
+        base += 2;
         if (!(type & S_UNKNOWN)) {
-            addr = fgetc(fp);
-            addr |= fgetc(fp) << 8;
-            base += 2;
             c = segname[type & S_SEGMENT];
             /* Showing undefined only */
             if (show_undef)
index c441e00..003dd35 100644 (file)
@@ -42,12 +42,15 @@ struct objhdr
 
 /* symbols and debug are in the format 
     uint8_t flags
-    char name[1..16] (0 terminated if < 16)
-    uint16_t data      if not unknown */
+    char name[16] (0 terminated if < 16)
+    uint16_t data */
 
 #define        S_UNKNOWN       0x80
 #define S_PUBLIC       0x40            /* unknown is public .. */
 #define S_SEGMENT      0x0F            /* 00 means absolute */
 
+#define S_SIZE         19
+
+