]> git.sur5r.net Git - cc65/commitdiff
Added text tables
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 16 Sep 2001 18:16:09 +0000 (18:16 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 16 Sep 2001 18:16:09 +0000 (18:16 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@941 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/da65/attrtab.h
src/da65/config.c
src/da65/data.c
src/da65/data.h
src/da65/main.c
src/da65/output.c
src/da65/scanner.h

index 94898d62ddd50b9c4ad79dd63263a09a0c8321ad..50d39b016ce2005048207e7187a0999f219c029e 100644 (file)
@@ -55,6 +55,7 @@ typedef enum attr_t {
     atDWordTab = 0x05,
     atAddrTab  = 0x06,
     atRtsTab   = 0x07,
+    atTextTab   = 0x08,
 
     /* Label flags */
     atNoLabel  = 0x00,         /* No label for this address */
index 7bbe4634090e078a27a94a79a88299bbae13c691..f6fefab7f9acf656f7e76ea309291aebb91da41e 100644 (file)
@@ -153,6 +153,7 @@ static void RangeSection (void)
        {   "DWORDTABLE",       CFGTOK_DWORDTAB },
        {   "ADDRTABLE",        CFGTOK_ADDRTAB  },
        {   "RTSTABLE",         CFGTOK_RTSTAB   },
+       {   "TEXTTABLE",        CFGTOK_TEXTTAB  },
     };
 
 
@@ -213,6 +214,7 @@ static void RangeSection (void)
                    case CFGTOK_DWORDTAB:       Type = atDWordTab;      break;
                    case CFGTOK_ADDRTAB:        Type = atAddrTab;       break;
                            case CFGTOK_RTSTAB:         Type = atRtsTab;        break;
+                   case CFGTOK_TEXTTAB:        Type = atTextTab;       break;
                }
                Needed |= tType;
                CfgNextTok ();
index 8e21fd6217eb413c54777883e39eebe6aba45292..81c628ae8385512082b49922cd77c25598c351b5 100644 (file)
@@ -263,3 +263,82 @@ unsigned RtsTable (void)
 
 
 
+unsigned TextTable (void)
+/* Output a table of text messages */
+{
+    /* Count how many bytes may be output. */
+    unsigned ByteCount = GetSpan (atTextTab);
+
+    /* Output as many data bytes lines as needed. */
+    unsigned BytesLeft = ByteCount;
+    while (BytesLeft > 0) {
+
+       unsigned I;
+
+       /* Count the number of characters that can be output as such */
+       unsigned Count = 0;
+       while (Count < BytesLeft && Count < BytesPerLine*4-1) {
+           unsigned char C = GetCodeByte (PC + Count);
+           if (C >= 0x20 && C <= 0x7E && C != '\"') {
+               ++Count;
+           } else {
+               break;
+           }
+       }
+
+       /* If we have text, output it */
+       if (Count > 0) {
+           unsigned CBytes;
+           Indent (MIndent);
+           Output (".text");
+           Indent (AIndent);
+           Output ("\"");
+           for (I = 0; I < Count; ++I) {
+               Output ("%c", GetCodeByte (PC+I));
+           }
+           Output ("\"");
+           CBytes = Count;
+           while (CBytes > 0) {
+               unsigned Chunk = CBytes;
+               if (Chunk > BytesPerLine) {
+                   Chunk = BytesPerLine;
+               }
+               LineComment (PC, Chunk);
+               LineFeed ();
+               CBytes -= Chunk;
+               PC += Chunk;
+           }
+           BytesLeft -= Count;
+       }
+
+       /* Count the number of bytes that must be output as bytes */
+       Count = 0;
+       while (Count < BytesLeft && Count < BytesPerLine) {
+           unsigned char C = GetCodeByte (PC + Count);
+                   if (C < 0x20 || C > 0x7E || C == '\"') {  
+               ++Count;
+           } else {
+               break;
+           }
+       }
+
+       /* If we have raw output bytes, print them */
+       if (Count > 0) {
+           DataByteLine (Count);
+           PC += Count;
+           BytesLeft -= Count;
+       }
+
+    }
+
+    /* If the next line is not a byte table line, add a separator */
+    if (CodeLeft() && GetStyleAttr (PC) != atTextTab) {
+       SeparatorLine ();
+    }
+
+    /* Return the number of bytes output */
+    return ByteCount;
+}
+
+
+
index 0594f8bbb110370d2852079201ff1e4525e8aad9..997c512836cc6dbe595dfc8ddef0dd963f82a2e9 100644 (file)
@@ -58,7 +58,10 @@ unsigned AddrTable (void);
 
 unsigned RtsTable (void);
 /* Output a table of RTS addresses (address - 1) */
-        
+
+unsigned TextTable (void);
+/* Output a table of text messages */
+
 
 
 /* End of data.h */
index 761b11eed346b311902faf0a13db3cb5370df41e..c321074f460543cd753eb047a0cc85006a9f0237 100644 (file)
@@ -267,6 +267,10 @@ static void OneOpcode (unsigned RemainingBytes)
            RtsTable ();
            break;
 
+       case atTextTab:
+           TextTable ();
+           break;
+
        default:
            DataByteLine (1);
            ++PC;
index df21f03a3232ce441567147fea7e7449d55925f9..24977cf40ef5bd75ddfb29785bba37bdd80dfdb8 100644 (file)
@@ -138,9 +138,9 @@ void Indent (unsigned N)
 void LineFeed (void)
 /* Add a linefeed to the output file */
 {
-    if (Pass == PassCount && PageLength > 0) {
+    if (Pass == PassCount) {
        fputc ('\n', F);
-       if (++Line >= PageLength) {
+               if (PageLength > 0 && ++Line >= PageLength) {
            if (FormFeeds) {
                fputc ('\f', F);
            }
index 71e4ea23af130a310970bb538581223614884b54..ec14e0973e0ec08e5da8bb8976b36aa9b735aada 100644 (file)
@@ -81,6 +81,7 @@ typedef enum token_t {
     CFGTOK_DWORDTAB,
     CFGTOK_ADDRTAB,
     CFGTOK_RTSTAB,
+    CFGTOK_TEXTTAB,
 
     /* Label section */
     CFGTOK_NAME,