]> git.sur5r.net Git - cc65/commitdiff
First steps towards supporting Apple GEOS.
authorol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 27 Dec 2011 23:36:05 +0000 (23:36 +0000)
committerol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 27 Dec 2011 23:36:05 +0000 (23:36 +0000)
- The generated file is a "Apple GEOS Convert" format.
- VLIR support is yet to come.
- The "Apple GEOS UnConvert" tool is yet to come.

git-svn-id: svn://svn.cc65.org/cc65/trunk@5336 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/grc65/grc65.c
src/ld65/cfg/apple-geos.cfg [new file with mode: 0644]

index e685c59cf59b015d81b5cff4cd226e1b8197eb15..85ae16ffd0846edb85f57cee7fb4d17e46c9ad21 100644 (file)
@@ -369,15 +369,25 @@ void DoHeader(void) {
 
     a = findToken(hdrFTypes, token);
 
-    switch (a) {
-        case 0:
-            myHead.geostype = 6;
-            break;
-        case 1:
-            myHead.geostype = 14;
-            break;
-        default:
-            AbEnd("filetype '%s' is not supported yet\n", token);
+    if (apple == 1) {
+        switch (a) {
+            case 0:
+                myHead.geostype = 0x82;
+                break;
+            default:
+                AbEnd("filetype '%s' is not supported yet\n", token);
+        }
+    } else {
+        switch (a) {
+            case 0:
+                myHead.geostype = 6;
+                break;
+            case 1:
+                myHead.geostype = 14;
+                break;
+            default:
+                AbEnd("filetype '%s' is not supported yet\n", token);
+        }
     }
 
     myHead.dosname = nextPhrase();
@@ -389,7 +399,8 @@ void DoHeader(void) {
     /* put default values into myHead here */
     myHead.author = "cc65";
     myHead.info = "Program compiled with cc65 and GEOSLib.";
-    myHead.dostype = 128 + 3;
+    myHead.dostype = 128;
+    if (apple == 0) myHead.dostype += 3;
     myHead.structure = 0;
     myHead.mode = 0;
     myHead.icon = NULL;
@@ -433,7 +444,7 @@ void DoHeader(void) {
                         AbEnd("unknown dostype in header '%s'\n", myHead.dosname);
                         break;
                     default:
-                        myHead.dostype = b / 2 + 128 + 1;
+                        if (apple == 0) myHead.dostype = b / 2 + 128 + 1;
                         break;
                 }
                 break;
@@ -442,16 +453,16 @@ void DoHeader(void) {
                     case -1:
                         AbEnd("unknown mode in header '%s'\n", myHead.dosname);
                     case 0:
-                        myHead.mode = 0x40;
+                        if (apple == 0) myHead.mode = 0x40;
                         break;
                     case 1:
-                        myHead.mode = 0x00;
+                        if (apple == 0) myHead.mode = 0x00;
                         break;
                     case 2:
-                        myHead.mode = 0xc0;
+                        if (apple == 0) myHead.mode = 0xc0;
                         break;
                     case 3:
-                        myHead.mode = 0x80;
+                        if (apple == 0) myHead.mode = 0x80;
                         break;
                 }
                 break;
@@ -480,21 +491,51 @@ void DoHeader(void) {
 
     fprintf(outputSFile,
         "\n"
-        "\t\t.segment \"DIRENTRY\"\n\n"
-        "\t.byte %i\n"
-        "\t.word 0\n", myHead.dostype);
+        "\t\t.segment \"DIRENTRY\"\n\n");
 
-    fillOut(myHead.dosname, 16, "$a0");
+    if (apple == 1) {
 
-    fprintf(outputSFile,
-        "\t.word 0\n"
-        "\t.byte %i\n"
-        "\t.byte %i\n"
-        "\t.byte %i, %i, %i, %i, %i\n\n"
-        "\t.word 0\n"
-        "\t.byte \"PRG formatted GEOS file V1.0\"\n\n",
-        myHead.structure, myHead.geostype,
-        myHead.year, myHead.month, myHead.day, myHead.hour, myHead.min);
+        fprintf(outputSFile,
+            "\t.byte %i << 4 | %i\n",
+            myHead.structure + 2, strlen(myHead.dosname));
+
+        fillOut(myHead.dosname, 15, "0");
+
+        fprintf(outputSFile,
+            "\t.byte $%02x\n"
+            "\t.word 0\n"
+            "\t.word 0\n"
+            "\t.byte 0, 0, 0\n"
+            "\t.word %i << 9 | %i << 5 | %i, %i << 8 | %i\n"
+            "\t.byte 0\n"
+            "\t.byte 0\n"
+            "\t.byte 0\n"
+            "\t.word 0\n"
+            "\t.word %i << 9 | %i << 5 | %i, %i << 8 | %i\n"
+            "\t.word 0\n",
+            myHead.geostype,
+            myHead.year % 100, myHead.month, myHead.day, myHead.hour, myHead.min,
+            myHead.year % 100, myHead.month, myHead.day, myHead.hour, myHead.min);
+
+    } else {
+
+        fprintf(outputSFile,
+            "\t.byte %i\n"
+            "\t.word 0\n",
+            myHead.dostype);
+
+        fillOut(myHead.dosname, 16, "$a0");
+
+        fprintf(outputSFile,
+            "\t.word 0\n"
+            "\t.byte %i\n"
+            "\t.byte %i\n"
+            "\t.byte %i, %i, %i, %i, %i\n\n"
+            "\t.word 0\n"
+            "\t.byte \"PRG formatted GEOS file V1.0\"\n\n",
+            myHead.structure, myHead.geostype,
+            myHead.year, myHead.month, myHead.day, myHead.hour, myHead.min);
+    }
 
     fprintf(outputSFile,
         "\n"
@@ -525,7 +566,8 @@ void DoHeader(void) {
 
     fprintf(outputSFile,
         "\t.byte 0, 0, 0\n"
-        "\t.byte %i\n\n", myHead.mode);
+        "\t.byte %i\n\n",
+        myHead.mode);
 
     setLen(myHead.author, 62);
     fprintf(outputSFile,
@@ -537,7 +579,8 @@ void DoHeader(void) {
     setLen(myHead.info, 95);
     fprintf(outputSFile,
         "\t.byte \"%s\"\n"
-        "\t.byte 0\n\n", myHead.info);
+        "\t.byte 0\n\n",
+        myHead.info);
 
     if (fclose (outputSFile) != 0)
         AbEnd("error closing %s: %s\n", outputSName, strerror(errno));
@@ -745,10 +788,10 @@ int main(int argc, char *argv[]) {
                     break;
                 case 't':
                     switch (FindTarget(argv[++i])) {
-                        case TGT_GEOS: // todo: TGT_GEOS-CBM
+                        case TGT_GEOS: /* todo: TGT_GEOS-CBM */
                             apple = 0;
                             break;
-                        case TGT_COUNT: //todo: TGT_GEOS-APPLE
+                        case TGT_COUNT: /* todo: TGT_GEOS-APPLE */
                             apple = 1;
                             break;
                         default:
diff --git a/src/ld65/cfg/apple-geos.cfg b/src/ld65/cfg/apple-geos.cfg
new file mode 100644 (file)
index 0000000..abbfd22
--- /dev/null
@@ -0,0 +1,96 @@
+SYMBOLS {
+    __STACKSIZE__:   type = weak, value = $0400; # 1k stack
+    __OVERLAYADDR__: type = weak, value = $0C00;
+    __OVERLAYSIZE__: type = weak, value = $2000 - $0C00;
+}
+MEMORY {
+    CVT:    file = %O,    start = $0,              size = $20000;
+    ZP:     define = yes, start = $80,             size = $1A + $06;
+    VLIR0:  define = yes, start = $4000,           size = $A000 - $4000 - __STACKSIZE__;
+    VLIR1:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR2:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR3:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR4:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR5:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR6:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR7:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR8:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR9:  define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR10: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR11: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR12: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR13: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR14: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR15: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR16: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR17: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR18: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+    VLIR19: define = yes, start = __OVERLAYADDR__, size = __OVERLAYSIZE__;
+}
+SEGMENTS {
+    ZEROPAGE:  type = zp,  load = ZP;
+    EXTZP:     type = zp,  load = ZP;
+    FILEINFO:  type = ro,                 load = CVT, offset     = $002;
+    RECORDS:   type = ro,                 load = CVT, offset     = $100, optional = yes;
+    DIRENTRY:  type = ro,                 load = CVT, offset     = $180;
+    VLIRIDX0:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    STARTUP:   type = ro,  run  = VLIR0,  load = CVT, align_load = $200, define   = yes;
+    LOWCODE:   type = ro,  run  = VLIR0,  load = CVT,                    optional = yes;
+    INIT:      type = ro,  run  = VLIR0,  load = CVT, define     = yes,  optional = yes;
+    CODE:      type = ro,  run  = VLIR0,  load = CVT;
+    RODATA:    type = ro,  run  = VLIR0,  load = CVT;
+    DATA:      type = rw,  run  = VLIR0,  load = CVT;
+    BSS:       type = bss, load = VLIR0,              define     = yes;
+    VLIRIDX1:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY1:  type = ro,  run  = VLIR1,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX2:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY2:  type = ro,  run  = VLIR2,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX3:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY3:  type = ro,  run  = VLIR3,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX4:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY4:  type = ro,  run  = VLIR4,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX5:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY5:  type = ro,  run  = VLIR5,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX6:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY6:  type = ro,  run  = VLIR6,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX7:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY7:  type = ro,  run  = VLIR7,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX8:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY8:  type = ro,  run  = VLIR8,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX9:  type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY9:  type = ro,  run  = VLIR9,  load = CVT, align_load = $200, optional = yes;
+    VLIRIDX10: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY10: type = ro,  run  = VLIR10, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX11: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY11: type = ro,  run  = VLIR11, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX12: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY12: type = ro,  run  = VLIR12, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX13: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY13: type = ro,  run  = VLIR13, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX14: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY14: type = ro,  run  = VLIR14, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX15: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY15: type = ro,  run  = VLIR15, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX16: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY16: type = ro,  run  = VLIR16, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX17: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY17: type = ro,  run  = VLIR17, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX18: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY18: type = ro,  run  = VLIR18, load = CVT, align_load = $200, optional = yes;
+    VLIRIDX19: type = ro,                 load = CVT, align      = $200, optional = yes;
+    OVERLAY19: type = ro,  run  = VLIR19, load = CVT, align_load = $200, optional = yes;
+}
+FEATURES {
+    CONDES: segment = INIT,
+           type    = constructor,
+           label   = __CONSTRUCTOR_TABLE__,
+           count   = __CONSTRUCTOR_COUNT__;
+    CONDES: segment = RODATA,
+           type    = destructor,
+           label   = __DESTRUCTOR_TABLE__,
+           count   = __DESTRUCTOR_COUNT__;
+    CONDES: segment = RODATA,
+           type    = interruptor,
+           label   = __INTERRUPTOR_TABLE__,
+           count   = __INTERRUPTOR_COUNT__;
+}