]> git.sur5r.net Git - cc65/blob - src/sp65/asm.c
New attribute "base".
[cc65] / src / sp65 / asm.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                   asm.c                                   */
4 /*                                                                           */
5 /*          Assembler output for the sp65 sprite and bitmap utility          */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 2012,      Ullrich von Bassewitz                                      */
10 /*                Roemerstrasse 52                                           */
11 /*                D-70794 Filderstadt                                        */
12 /* EMail:         uz@cc65.org                                                */
13 /*                                                                           */
14 /*                                                                           */
15 /* This software is provided 'as-is', without any expressed or implied       */
16 /* warranty.  In no event will the authors be held liable for any damages    */
17 /* arising from the use of this software.                                    */
18 /*                                                                           */
19 /* Permission is granted to anyone to use this software for any purpose,     */
20 /* including commercial applications, and to alter it and redistribute it    */
21 /* freely, subject to the following restrictions:                            */
22 /*                                                                           */
23 /* 1. The origin of this software must not be misrepresented; you must not   */
24 /*    claim that you wrote the original software. If you use this software   */
25 /*    in a product, an acknowledgment in the product documentation would be  */
26 /*    appreciated but is not required.                                       */
27 /* 2. Altered source versions must be plainly marked as such, and must not   */
28 /*    be misrepresented as being the original software.                      */
29 /* 3. This notice may not be removed or altered from any source              */
30 /*    distribution.                                                          */
31 /*                                                                           */
32 /*****************************************************************************/
33
34
35
36 #include <errno.h>
37 #include <stdio.h>
38 #include <string.h>
39
40 /* common */
41 #include "check.h"
42 #include "cmdline.h"
43 #include "version.h"
44
45 /* sp65 */
46 #include "attr.h"
47 #include "bin.h"
48 #include "error.h"
49
50
51
52 /*****************************************************************************/
53 /*                                   Code                                    */
54 /*****************************************************************************/
55
56
57
58 void WriteAsmFile (const StrBuf* Data, const Collection* A)
59 /* Write the contents of Data to the given file in assembler (ca65) format */
60 {
61     FILE*       F;
62     const char* D;
63     unsigned    Size;
64     unsigned    Base = 16;
65     unsigned    BytesPerLine = 16;
66     char        C;
67
68
69     /* Get the file name */
70     const char* Name = NeedAttrVal (A, "name", "write");
71
72     /* Check for a bytesperline attribute */
73     const char* V = GetAttrVal (A, "bytesperline");
74     if ((V && sscanf (V, "%u%c", &BytesPerLine, &C) != 1) ||
75         (BytesPerLine < 1 || BytesPerLine > 64)) {
76         Error ("Invalid value for attribute `bytesperline'");
77     }
78
79     /* Check for a base attribute */
80     V = GetAttrVal (A, "base");
81     if ((V && sscanf (V, "%u%c", &Base, &C) != 1) ||
82         (Base != 2 && Base != 10 && Base != 16)) {
83         Error ("Invalid value for attribute `base'");
84     }
85
86     /* Open the output file */
87     F = fopen (Name, "w");
88     if (F == 0) {
89         Error ("Cannot open output file `%s': %s", Name, strerror (errno));
90     }
91
92     /* Write a readable header */
93     fprintf (F,
94              ";\n"
95              "; This file was generated by %s %s\n"
96              ";\n"
97              "\n",
98              ProgName,
99              GetVersionAsString ());
100
101     /* Write the data */
102     D    = SB_GetConstBuf (Data);
103     Size = SB_GetLen (Data);
104     while (Size) {
105
106         unsigned I;
107
108         /* Output one line */
109         unsigned Chunk = Size;
110         if (Chunk > BytesPerLine) {
111             Chunk = BytesPerLine;
112         }
113         fputs ("        .byte   ", F);
114         for (I = 0; I < Chunk; ++I) {
115             unsigned char V = *D++;
116             if (I > 0) {
117                 fputc (',', F);
118             }
119             switch (Base) {
120                 case 2:
121                     fprintf (F, "%%%u%u%u%u%u%u%u%u",
122                              (V >> 7) & 0x01, (V >> 6) & 0x01,
123                              (V >> 5) & 0x01, (V >> 4) & 0x01,
124                              (V >> 3) & 0x01, (V >> 2) & 0x01,
125                              (V >> 1) & 0x01, (V >> 0) & 0x01);
126                     break;
127
128                 case 10:
129                     fprintf (F, "%u", V);
130                     break;
131
132                 case 16:
133                     fprintf (F, "$%02X", V);
134                     break;
135
136             }
137         }
138         fputc ('\n', F);
139
140         /* Bump the counters */
141         Size -= Chunk;
142     }
143
144     /* Add an empty line at the end */
145     fputc ('\n', F);
146
147     /* Close the file */
148     if (fclose (F) != 0) {
149         Error ("Error closing output file `%s': %s", Name, strerror (errno));
150     }
151 }
152
153
154