1 | /*
|
---|
2 | * TOPPERS/JSP Kernel
|
---|
3 | * Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
4 | * Just Standard Profile Kernel
|
---|
5 | *
|
---|
6 | * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
|
---|
7 | * Toyohashi Univ. of Technology, JAPAN
|
---|
8 | * Copyright (C) 2003-2004 by Ryosuke Takeuchi
|
---|
9 | * Platform Development Center RIOCH COMPANY,LTD. JAPAN
|
---|
10 | * Copyright (C) 2007, 2010 by Naoki Saito
|
---|
11 | * Nagoya Municipal Industrial Research Institute, JAPAN
|
---|
12 | *
|
---|
13 | * ä¸è¨è使¨©è
|
---|
14 | ã¯ï¼Free Software Foundation ã«ãã£ã¦å
|
---|
15 | ¬è¡¨ããã¦ãã
|
---|
16 | * GNU General Public License ã® Version 2 ã«è¨è¿°ããã¦ããæ¡ä»¶ãï¼ä»¥
|
---|
17 | * ä¸ã®(1)ã(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§
|
---|
18 | * ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé
|
---|
19 | å¸ï¼ä»¥ä¸ï¼
|
---|
20 | * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼
|
---|
21 | * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½
|
---|
22 | * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼
|
---|
23 | * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼
|
---|
24 | * (2) æ¬ã½ããã¦ã§ã¢ãåå©ç¨å¯è½ãªãã¤ããªã³ã¼ãï¼ãªãã±ã¼ã¿ãã«ãªã
|
---|
25 | * ã¸ã§ã¯ããã¡ã¤ã«ãã©ã¤ãã©ãªãªã©ï¼ã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼å©ç¨
|
---|
26 | * ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è
|
---|
27 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è使¨©è¡¨ç¤ºï¼
|
---|
28 | * ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
29 | * (3) æ¬ã½ããã¦ã§ã¢ãåå©ç¨ä¸å¯è½ãªãã¤ããªã³ã¼ãã®å½¢ã¾ãã¯æ©å¨ã«çµ
|
---|
30 | * ã¿è¾¼ãã å½¢ã§å©ç¨ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºãããã¨ï¼
|
---|
31 | * (a) å©ç¨ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è
|
---|
32 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½
|
---|
33 | * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
34 | * (b) å©ç¨ã®å½¢æ
|
---|
35 | ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼ä¸è¨è使¨©è
|
---|
36 | ã«å ±åãã
|
---|
37 | * ãã¨ï¼
|
---|
38 | * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ
|
---|
39 | * 害ãããï¼ä¸è¨è使¨©è
|
---|
40 | ãå
|
---|
41 | 責ãããã¨ï¼
|
---|
42 | *
|
---|
43 | * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨è使¨©è
|
---|
44 | ã¯ï¼
|
---|
45 | * æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ã
|
---|
46 | * ãªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çããã
|
---|
47 | * ããªãæå®³ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼
|
---|
48 | *
|
---|
49 | * @(#) $Id: m16coffset.cpp,v 1.2 2007/03/23 07:12:10 honda Exp $
|
---|
50 | */
|
---|
51 | // m16coffset.c : ã³ã³ã½ã¼ã« ã¢ããªã±ã¼ã·ã§ã³ç¨ã®ã¨ã³ã㪠ãã¤ã³ãã®å®ç¾©
|
---|
52 | // 2010/12/28 夿´ç¹ï¼ ãã¡ã¤ã«æ¡å¼µåã .cpp ãã .c ã¨ããï¼
|
---|
53 | // bool åãæ±ããã stdbool.h ãã¤ã³ã¯ã«ã¼ãããï¼
|
---|
54 |
|
---|
55 | #include <stdio.h>
|
---|
56 | #include <stdlib.h>
|
---|
57 | #include <string.h>
|
---|
58 | #include <ctype.h>
|
---|
59 | #include <stdbool.h>
|
---|
60 |
|
---|
61 | #define BUF_SIZE 512
|
---|
62 | #define STR_SIZE 128
|
---|
63 |
|
---|
64 | #define NORMAL_STATE 0
|
---|
65 | #define CHECK_STATE 1
|
---|
66 |
|
---|
67 | struct OFF {
|
---|
68 | int bit;
|
---|
69 | int offset;
|
---|
70 | int check_type; /* OFF=0 or BIT=1 */
|
---|
71 | char label[STR_SIZE];
|
---|
72 | char mask[STR_SIZE];
|
---|
73 | };
|
---|
74 |
|
---|
75 | static char const version[] = "02.00";
|
---|
76 | static char const default_input_file[] = "makeoffset.a30";
|
---|
77 | static char const default_output_file[] = "offset.inc";
|
---|
78 |
|
---|
79 | static char input_file[STR_SIZE];
|
---|
80 | static char output_file[STR_SIZE];
|
---|
81 | static int num_offset = 0;
|
---|
82 | static int offset_state = NORMAL_STATE;
|
---|
83 | static struct OFF off_table[20];
|
---|
84 |
|
---|
85 | static bool test_string(char** s, char const * t);
|
---|
86 | static bool skip_space(char** s);
|
---|
87 |
|
---|
88 | int main(int argc, char* argv[])
|
---|
89 | {
|
---|
90 | FILE* pfo;
|
---|
91 | FILE* pfi;
|
---|
92 | struct OFF *v = NULL;
|
---|
93 | char* s;
|
---|
94 | char* p;
|
---|
95 | char buf[BUF_SIZE];
|
---|
96 | char c;
|
---|
97 | int i;
|
---|
98 | int val;
|
---|
99 | int ofs = 0;
|
---|
100 | char ct[4]; /* "BIT" or "OFF" */
|
---|
101 |
|
---|
102 | strcpy(input_file, default_input_file);
|
---|
103 | strcpy(output_file, default_output_file);
|
---|
104 |
|
---|
105 | for(i = 1 ; i < argc ; i++){
|
---|
106 | s = argv[i];
|
---|
107 | if(*s++ == '-'){
|
---|
108 | c = *s;
|
---|
109 | while(*s != 0){
|
---|
110 | if(*s == ':')
|
---|
111 | break;
|
---|
112 | s++;
|
---|
113 | }
|
---|
114 | if(*s++ == ':'){
|
---|
115 | switch(c){
|
---|
116 | case 'O': // ã¢ã¦ãããããã¡ã¤ã«ã®è¨å®
|
---|
117 | case 'o':
|
---|
118 | strcpy(output_file, s);
|
---|
119 | break;
|
---|
120 | case 'R': // ã¤ã³ããããã¡ã¤ã«ã®è¨å®
|
---|
121 | case 'r':
|
---|
122 | strcpy(input_file, s);
|
---|
123 | break;
|
---|
124 | default:
|
---|
125 | printf("m16coffset -R:input_file -O:output_file\n");
|
---|
126 | break;
|
---|
127 | }
|
---|
128 | }
|
---|
129 | }
|
---|
130 | }
|
---|
131 | printf("version = %s\n", version);
|
---|
132 | printf("input file = %s\n", input_file);
|
---|
133 | printf("output file = %s\n", output_file);
|
---|
134 |
|
---|
135 | if((pfi = fopen(input_file, "r")) == NULL){
|
---|
136 | fprintf(stderr, "can't open input file!");
|
---|
137 | exit(1);
|
---|
138 | }
|
---|
139 | if((pfo = fopen(output_file, "w")) == NULL){
|
---|
140 | fclose(pfi);
|
---|
141 | fprintf(stderr, "can't open output file!");
|
---|
142 | exit(1);
|
---|
143 | }
|
---|
144 |
|
---|
145 | /* ä¸è¡å
|
---|
146 | ¥å â è§£æ */
|
---|
147 | for(;;){
|
---|
148 | if((fgets(buf, BUF_SIZE, pfi)) == NULL) break;
|
---|
149 | s = buf;
|
---|
150 |
|
---|
151 | switch(offset_state){
|
---|
152 | case CHECK_STATE:
|
---|
153 | if(skip_space(&s)) /* è¡é ã®ç©ºç½ãé¤ã */
|
---|
154 | continue;
|
---|
155 |
|
---|
156 | /* ãªãã»ãã */
|
---|
157 | if(test_string(&s, ".word")){
|
---|
158 | ofs = 2;
|
---|
159 | }
|
---|
160 | else if(test_string(&s, ".lword")){
|
---|
161 | ofs = 4;
|
---|
162 | }
|
---|
163 | else if(test_string(&s, ".byte")){
|
---|
164 | ofs = 1;
|
---|
165 | }
|
---|
166 | else if(test_string(&s, ".addr")){
|
---|
167 | ofs = 3;
|
---|
168 | }
|
---|
169 | else {
|
---|
170 | continue;
|
---|
171 | }
|
---|
172 |
|
---|
173 | if(skip_space(&s))
|
---|
174 | continue;
|
---|
175 |
|
---|
176 | sscanf(s, "%x", &val);
|
---|
177 | if(val){
|
---|
178 | offset_state = NORMAL_STATE;
|
---|
179 | if(v->check_type) {
|
---|
180 | sprintf(v->mask, "%xH", val);
|
---|
181 | for(v->bit=0; val>1; v->bit++) {
|
---|
182 | val /= 2;
|
---|
183 | }
|
---|
184 | }
|
---|
185 | continue;
|
---|
186 | }
|
---|
187 | v->offset += ofs;
|
---|
188 | break;
|
---|
189 | default:
|
---|
190 | if(!test_string(&s, "_____BEGIN_")) {
|
---|
191 | continue;
|
---|
192 | }
|
---|
193 | v = &off_table[num_offset++];
|
---|
194 |
|
---|
195 | for(i = 0, p = ct; i < 4 && isalpha(*s) && *s != '_'; i++){
|
---|
196 | *p++ = *s++;
|
---|
197 | }
|
---|
198 | *p++ = 0, *s++;
|
---|
199 | if(strncmp(ct, "BIT", sizeof("BIT")) == 0) {
|
---|
200 | v->check_type = 1;
|
---|
201 | }
|
---|
202 |
|
---|
203 | p = v->label;
|
---|
204 | while(*s > ':')
|
---|
205 | *p++ = *s++;
|
---|
206 | *p++ = 0;
|
---|
207 | offset_state = CHECK_STATE;
|
---|
208 | break;
|
---|
209 | }
|
---|
210 | }
|
---|
211 |
|
---|
212 | /* åºå */
|
---|
213 | for(i = 0 ; i < num_offset ; i++){
|
---|
214 | v = &off_table[i];
|
---|
215 | fprintf(pfo, "%s\t.equ\t%d\n", v->label, v->offset);
|
---|
216 | printf("%s\t.equ\t%d\n", v->label, v->offset);
|
---|
217 | if(v->check_type) {
|
---|
218 | fprintf(pfo, "%s_bit\t.equ\t%d\n", v->label, v->bit);
|
---|
219 | fprintf(pfo, "%s_mask\t.equ\t%s\n", v->label, v->mask);
|
---|
220 | printf("%s_bit\t.equ\t%d\n", v->label, v->bit);
|
---|
221 | printf("%s_mask\t.equ\t%s\n", v->label, v->mask);
|
---|
222 | }
|
---|
223 | }
|
---|
224 | fclose(pfi);
|
---|
225 | fclose(pfo);
|
---|
226 |
|
---|
227 | return 0;
|
---|
228 | }
|
---|
229 |
|
---|
230 | /*
|
---|
231 | * æååãæ¯è¼ãã¦åä¸ãªãã°TURE
|
---|
232 | */
|
---|
233 | static bool test_string(char** s, char const *t)
|
---|
234 | {
|
---|
235 | char* p;
|
---|
236 | char c;
|
---|
237 |
|
---|
238 | p = *s;
|
---|
239 | while(*p <= ' '){
|
---|
240 | if(*p == 0)
|
---|
241 | return false;
|
---|
242 | p++;
|
---|
243 | }
|
---|
244 | while((c = *p++) != 0){
|
---|
245 | if(c != *t++)
|
---|
246 | break;
|
---|
247 | if(*t == 0){
|
---|
248 | *s = p;
|
---|
249 | return true;
|
---|
250 | }
|
---|
251 | }
|
---|
252 | return false;
|
---|
253 | }
|
---|
254 |
|
---|
255 | /*
|
---|
256 | * ã¹ãã¼ã¹ã¾ãã¯ã¿ããã¹ããããã
|
---|
257 | */
|
---|
258 | static bool skip_space(char** s)
|
---|
259 | {
|
---|
260 | char* p;
|
---|
261 |
|
---|
262 | p = *s;
|
---|
263 | while(*p <= ' '){
|
---|
264 | if(*p == 0)
|
---|
265 | break;
|
---|
266 | p++;
|
---|
267 | }
|
---|
268 | *s = p;
|
---|
269 | if(*p)
|
---|
270 | return false;
|
---|
271 | else
|
---|
272 | return true;
|
---|
273 | }
|
---|