source: anotherchoice/tags/jsp-1.4.4-full-UTF8/utils/m16c-renesas/m16cvec.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 17.5 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2002 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) 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: m16cvec.cpp,v 1.3 2004/09/03 17:33:49 honda Exp $
50 */
51// m16cvec.c : コンソール アプリケーション用のエントリ ポイントの定義
52//
53//------------------------------------------------------------------------------
54// 変更履歴
55//version yyyy/mm/dd 概要
56//---------- -------------------------------------------------------------------
57// 01.00 2004/01/02 初版
58// 01.01 2004/08/06 FIX VECTOR が固定値で有ったのをパラメタにて変更可能とした
59// EXCINIB のé…
60åˆ—が0の場合の問題修正。
61// M30262F8FGの生成時、割り込みベクタが1行多い不å…
62·åˆä¿®æ­£ã€‚
63// M30620FCAFPのJSP1.3用ベクタ生成コードを条件コンパイル化。
64// 02.01 2010/12/28 C言語ファイルとした.
65// bool 型を扱うため stdbool.h をインクルードした.
66//-----------------------------------------------------------------------------
67
68//#include "stdafx.h"
69#include <stdio.h>
70#include <stdlib.h>
71#include <string.h>
72#include <stdbool.h>
73
74#define MAX_INCLUDE 8
75#define MAX_INT 64
76#define MAX_EXC 9
77#define MAX_VEC MAX_INT
78#define BUF_SIZE 512
79#define STR_SIZE 128
80
81#define INT_STATE 0
82#define EXC_STATE 1
83#define NORMAL_STATE 2
84
85struct VEC {
86 int no;
87 char no_name[STR_SIZE];
88 char no_label[STR_SIZE];
89};
90
91static char const version[] = "01.01";
92static char const default_input_file[] = "kernel_cfg.i";
93static char const default_output_file[] = "m16cvec.inc";
94static char const default_unused_int[] = "unused_interrupt";
95static char const in_portid[] = "serial_in_portid";
96static char const out_portid[] = "serial_out_portid";
97static char const in_handler[] = "serial_in_handler_xyzx";
98static char const out_handler[] = "serial_out_handler_xyzx";
99static char const comment[] = ";************************************************";
100static char const int_vec[] = ";* interrupt vectors *";
101static char const exc_vec[] = ";* exception vectors *";
102static char const func01[] = "\t.section bss_NE,DATA,ALIGN";
103static char const func02[] = "\t.blkw\t1";
104static char const func03[] = "\t.section program, code, align";
105static char const lf[] = "\n";
106static char const default_fvector[] = "0fffdch";
107
108static int board_mode = 0;
109static char input_file[STR_SIZE];
110static char output_file[STR_SIZE];
111static char include_file[MAX_INCLUDE][STR_SIZE];
112static int num_include = 0;
113static int num_vec[2] = {0, 0};
114static int max_int = 47;
115static int num_nodec = 0;
116static int vec_state = NORMAL_STATE;
117static struct VEC vec_table[2][MAX_VEC];
118static char unused_vec[2][STR_SIZE];
119
120static void set_M30620FCAFP(FILE* pfo, int no, int m);
121static void set_M30262F8FG(FILE* pfo, int no, int m);
122static void set_global(FILE* pfo, char const * t);
123static void set_comment(FILE* pfo, char const * t);
124static void set_org(FILE* pfo, char const * t);
125static void set_vector(FILE* pfo, int kind, int no);
126static void set_vector2(FILE* pfo, int kind, int no);
127static bool test_string(char** s, char const * t);
128static bool skip_space(char** s);
129static bool skip_char(char** s, char const c);
130static char fvector[STR_SIZE];
131
132int main(int argc, char* argv[])
133{
134 FILE* pfi;
135 FILE* pfo;
136 FILE* pfw;
137 char buf[BUF_SIZE];
138 struct VEC *v;
139 int i, j, k;
140 bool cnv, dec;
141 char* s;
142 char* p;
143 char* q;
144 char c;
145
146 strcpy(input_file, default_input_file);
147 strcpy(output_file, default_output_file);
148 strcpy(unused_vec[0], default_unused_int);
149 strcpy(unused_vec[1], default_unused_int);
150 strcpy(fvector,default_fvector);
151
152 for(i = 1 ; i < argc ; i++){
153 s = argv[i];
154 if(*s++ == '-'){
155 c = *s++;
156 skip_space(&s);
157 switch(c){
158 case 'I': // インクルードファイルの設定
159 case 'i':
160 if(num_include < MAX_INCLUDE){
161 strcpy(include_file[num_include], s);
162 num_include++;
163 }
164 break;
165 case 'F': // フィックスベクタの定義
166 case 'f':
167 strcpy(fvector, s);
168 break;
169 case 'O': // アウトプットファイルの設定
170 case 'o':
171 strcpy(output_file, s);
172 break;
173 case 'R': // インプットファイルの設定
174 case 'r':
175 strcpy(input_file, s);
176 break;
177 case 'M': // ボードモード
178 case 'm':
179 board_mode = atoi(s);
180 break;
181 default:
182 printf("m16cvec -R<input_file> -O<output_file> -I<include_file> -M<mode> -F<fixvector>\n");
183 break;
184 }
185 }
186 }
187 printf("version = %s\n", version);
188 printf("input file = %s\n", input_file);
189 printf("output file = %s\n", output_file);
190 printf("Fix Vector = %s\n", fvector);
191 printf("board mode = %d : ", board_mode);
192 if(board_mode == 1)
193 printf("M30262F8FG(OAKS16 MINI)\n");
194 else
195 printf("M30620FCAFP(OAKS16)\n");
196 if((pfi = fopen(input_file, "r")) == NULL){
197 fprintf(stderr, "can't open input file !");
198 exit(1);
199 }
200 if((pfo = fopen(output_file, "w")) == NULL){
201 fclose(pfi);
202 fprintf(stderr, "can't open output file !");
203 exit(1);
204 }
205 for(i = 0 ; i < num_include ; i++){
206 printf("include file = %s\n", include_file[i]);
207 }
208 for(;;){
209 if((fgets(buf, BUF_SIZE, pfi)) == NULL)
210 break;
211 s = buf;
212 switch(vec_state){
213 case INT_STATE:
214 case EXC_STATE:
215 if(test_string(&s, ";"))
216 vec_state = NORMAL_STATE;
217 else if(test_string(&s, "{")){
218 v = &vec_table[vec_state][num_vec[vec_state]];
219 p = &v->no_name[0];
220 if(skip_space(&s))
221 continue;
222 dec = true;
223 while(*s != ','){
224 if(*s == 0)
225 continue;
226 if(*s == '(' || *s == ')' || *s <= ' '){
227 s++;
228 continue;
229 }
230 if(*s < '0' || *s > '9')
231 dec = false;
232 *p++ = *s++;
233 }
234 s++;
235 *p++ = 0;
236 if(dec)
237 v->no = atoi(v->no_name);
238 else{
239 v->no = -1;
240 num_nodec++;
241 }
242 p = &v->no_label[0];
243 if(skip_char(&s, ','))
244 continue;
245 test_string(&s, "INT_ENTRY(");
246 test_string(&s, "EXC_ENTRY(");
247 test_string(&s, "CFG_INT_ENTRY(");
248 test_string(&s, "CFG_EXC_ENTRY(");
249 test_string(&s, "(FP)");
250 if(skip_space(&s))
251 continue;
252 while(*s != ')' && *s != ',' && *s > ' '){
253 *p++ = *s++;
254 }
255 *p++ = 0;
256 num_vec[vec_state]++;
257 }
258 else
259 continue;
260 break;
261 default:
262 if(!test_string(&s, "const"))
263 continue;
264 if(test_string(&s, "INHINIB"))
265 vec_state = INT_STATE;
266 else if(test_string(&s, "EXCINIB"))
267 vec_state = EXC_STATE;
268 break;
269 }
270 }
271 do{
272 cnv = false;
273 for(i = 0 ; i < num_include ; i++){
274 if((pfw = fopen(include_file[i], "r")) != NULL){
275 for(;;){
276 if((fgets(buf, BUF_SIZE, pfw)) == NULL)
277 break;
278 s = buf;
279 if(!test_string(&s, "#define"))
280 continue;
281 if(skip_space(&s))
282 continue;
283 for(k = 0 ; k < 2 ; k++){
284 for(j = 0 ; j < num_vec[k] ; j++){
285 v = &vec_table[k][j];
286 if(v->no < 0){
287 p = s;
288 dec = true;
289 if(test_string(&p, v->no_name)){
290 q = &v->no_name[0];
291 if(!skip_space(&p)){
292 while(*p > ' '){
293 if(*p == '(' || *p == ')'){
294 p++;
295 continue;
296 }
297 if(*p < '0' || *p > '9')
298 dec = false;
299 *q++ = *p++;
300 }
301 }
302 *q++ = 0;
303 }
304 else
305 dec = false;
306 if(dec){
307 v->no = atoi(v->no_name);
308 num_nodec--;
309 }
310 }
311 }
312 }
313 }
314 fclose(pfw);
315 }
316 else
317 printf("open error %s !!\n", include_file[i]);
318 }
319 }while(cnv);
320
321 for(i = 0 ; i < num_vec[EXC_STATE] ; i++){
322 v = &vec_table[EXC_STATE][i];
323 if(v->no >= 32 && v->no < MAX_INT){
324 vec_table[INT_STATE][num_vec[INT_STATE]] = vec_table[EXC_STATE][i];
325 num_vec[INT_STATE]++;
326 for(j = i ; j < (num_vec[EXC_STATE]-1) ; j++)
327 vec_table[EXC_STATE][j] = vec_table[EXC_STATE][j+1];
328 num_vec[EXC_STATE]--;
329 }
330 }
331 for(j = 0 ; j < num_vec[INT_STATE] ; j++){
332 v = &vec_table[INT_STATE][j];
333 if(v->no >= MAX_INT)
334 strcpy(unused_vec[INT_STATE], v->no_label);
335 else if(max_int < v->no)
336 max_int = v->no;
337 printf("int %d:%d,%s,%s\n", j, v->no, v->no_name, v->no_label);
338 }
339 for(j = 0 ; j < num_vec[EXC_STATE] ; j++){
340 v = &vec_table[EXC_STATE][j];
341 if((v->no >= MAX_EXC && v->no < 32) || v->no >= MAX_INT)
342 strcpy(unused_vec[EXC_STATE], v->no_label);
343 printf("exc %d:%d,%s,%s\n", j, v->no, v->no_name, v->no_label);
344 }
345 if(num_nodec > 0)
346 printf("%dのエクセプション番号を特定できません!\n", num_nodec);
347 else{
348 fputs(lf, pfo);
349 for(i = 0 ; i < 2 ; i++){
350 for(j = 0 ; j < num_vec[i] ; j++)
351 set_global(pfo, vec_table[i][j].no_label);
352 }
353 if(!strcmp(default_unused_int, unused_vec[0]))
354 set_global(pfo, unused_vec[0]);
355 else if(!strcmp(default_unused_int, unused_vec[1]))
356 set_global(pfo, unused_vec[1]);
357
358 switch(board_mode){
359 case 1: // M30262F8FG(OAKS16 MINI)
360 set_M30262F8FG(pfo, board_mode, max_int);
361 break;
362 default: // M30620FCAFP(OAKS16)
363 set_M30620FCAFP(pfo, board_mode, max_int);
364 break;
365 }
366
367 set_comment(pfo, exc_vec);
368 fputs("\t.section\tfvector", pfo);
369 fputs(lf, pfo);
370 set_org(pfo, fvector);
371
372 for(i = 0 ; i < (MAX_EXC-1) ; i++)
373 set_vector(pfo, EXC_STATE, i);
374 fputs("\t.lword\t_hardware_start\t\t\t; RESET", pfo);
375 fputs(lf, pfo);
376 }
377 fclose(pfi);
378 fclose(pfo);
379 return 0;
380}
381
382/*
383 * set_M30620FCAFP(OAKS16)用のベクトルを設定する
384 */
385static void set_M30620FCAFP(FILE* pfo, int no, int m)
386{
387#ifdef OAKS16_JSP13
388 struct VEC *v;
389 int x;
390#endif /* OAKS16_JSP13 */
391 int i;
392
393#ifdef OAKS16_JSP13
394 if(no == 2){
395 set_global(pfo, in_portid);
396 set_global(pfo, out_portid);
397 fputs(lf, pfo);
398 fputs(func01, pfo);
399 fputs(lf, pfo);
400 fputs("_", pfo);
401 fputs(in_portid, pfo);
402 fputs(":", pfo);
403 fputs(lf, pfo);
404 fputs(func02, pfo);
405 fputs(lf, pfo);
406 fputs("_", pfo);
407 fputs(out_portid, pfo);
408 fputs(":", pfo);
409 fputs(lf, pfo);
410 fputs(func02, pfo);
411 fputs(lf, pfo);
412 fputs(lf, pfo);
413 v = &vec_table[0][0];
414 for(i = x = 0 ; i < num_vec[0] ; i++, v++){
415 if(v->no >= 17 && v->no < 21){
416 x = 1;
417 break;
418 }
419 }
420 if(x){
421 fputs(func03, pfo);
422 fputs(lf, pfo);
423 v = &vec_table[0][0];
424 for(i = x = 0 ; i < num_vec[0] ; i++, v++){
425 if(v->no == 17 || v->no == 19){
426 fputs(out_handler, pfo);
427 fputs("1:", pfo);
428 fputs(lf, pfo);
429 fputs("\tmov.w\t#1, _", pfo);
430 fputs(out_portid, pfo);
431 fputs(lf, pfo);
432 fputs("\tjmp\t_", pfo);
433 fputs(v->no_label, pfo);
434 fputs(lf, pfo);
435 fputs(out_handler, pfo);
436 fputs("2:", pfo);
437 fputs(lf, pfo);
438 fputs("\tmov.w\t#2, _", pfo);
439 fputs(out_portid, pfo);
440 fputs(lf, pfo);
441 fputs("\tjmp\t_", pfo);
442 fputs(v->no_label, pfo);
443 fputs(lf, pfo);
444 break;
445 }
446 }
447 v = &vec_table[0][0];
448 for(i = x = 0 ; i < num_vec[0] ; i++, v++){
449 if(v->no == 18 || v->no == 20){
450 fputs(in_handler, pfo);
451 fputs("1:", pfo);
452 fputs(lf, pfo);
453 fputs("\tmov.w\t#1, _", pfo);
454 fputs(in_portid, pfo);
455 fputs(lf, pfo);
456 fputs("\tjmp\t_", pfo);
457 fputs(v->no_label, pfo);
458 fputs(lf, pfo);
459 fputs(in_handler, pfo);
460 fputs("2:", pfo);
461 fputs(lf, pfo);
462 fputs("\tmov.w\t#2, _", pfo);
463 fputs(in_portid, pfo);
464 fputs(lf, pfo);
465 fputs("\tjmp\t_", pfo);
466 fputs(v->no_label, pfo);
467 fputs(lf, pfo);
468 break;
469 }
470 }
471 }
472 }
473#endif /* OAKS16_JSP13 */
474
475 set_comment(pfo, int_vec);
476 fputs("\t.section\tvvector", pfo);
477 fputs(lf, pfo);
478 set_org(pfo, "VECTOR_ADR");
479 for(i = 0 ; i < MAX_INT ; i++){
480 if(no == 2){
481 if(i >= 17 && i < 21)
482 set_vector2(pfo, INT_STATE, i);
483 else
484 set_vector(pfo, INT_STATE, i);
485 }
486 else
487 set_vector(pfo, INT_STATE, i);
488 }
489}
490
491/*
492 * M30262F8FG(OAKS16 MINI)のベクトルを設定する
493 */
494static void set_M30262F8FG(FILE* pfo, int no, int m)
495{
496 int i;
497
498 set_comment(pfo, int_vec);
499 fputs("\t.section\tvector", pfo);
500 fputs(lf, pfo);
501 set_org(pfo, "VECTOR_ADR");
502 fputs(";", pfo);
503 fputs(lf, pfo);
504 set_vector(pfo, INT_STATE, 0);
505 set_org(pfo, "(VECTOR_ADR+44)");
506 fputs(lf, pfo);
507 for(i = 11 ; i < 15 ; i++)
508 set_vector(pfo, INT_STATE, i);
509 set_org(pfo, "(VECTOR_ADR+68)");
510 fputs(lf, pfo);
511 if(m < MAX_INT)
512 m = MAX_INT;
513 for(i = 17 ; i < m ; i++)
514 set_vector(pfo, INT_STATE, i);
515}
516
517/*
518 * グローバル宣言を設定する
519 */
520static void set_global(FILE* pfo, char const * t)
521{
522 fputs("\t.glb\t_", pfo);
523 fputs(t, pfo);
524 fputs(lf, pfo);
525}
526
527/*
528 * コメントを設定する
529 */
530static void set_comment(FILE* pfo, char const * t)
531{
532 fputs(";", pfo);
533 fputs(lf, pfo);
534 fputs(comment, pfo);
535 fputs(lf, pfo);
536 fputs(int_vec, pfo);
537 fputs(lf, pfo);
538 fputs(comment, pfo);
539 fputs(lf, pfo);
540 fputs(";", pfo);
541 fputs(lf, pfo);
542}
543
544/*
545 * オリジンを設定する
546 */
547static void set_org(FILE* pfo, char const * t)
548{
549 fputs("\t.org\t", pfo);
550 fputs(t, pfo);
551 fputs(lf, pfo);
552}
553
554/*
555 * ベクトルを設定する
556 */
557static void set_vector(FILE* pfo, int kind, int no)
558{
559 struct VEC* v = &vec_table[kind][0];
560 char s[6];
561 int i;
562
563 fputs("\t.lword\t_", pfo);
564 s[0] = '\t';
565 s[1] = ';';
566 s[2] = ' ';
567 s[3] = (no/10)+'0';
568 s[4] = (no%10)+'0';
569 s[5] = 0;
570 for(i = 0 ; i < num_vec[kind] ; i++, v++){
571 if(v->no == no){
572 fputs(v->no_label, pfo);
573 fputs(s, pfo);
574 fputs(lf, pfo);
575 return;
576 }
577 }
578 fputs(unused_vec[kind], pfo);
579 fputs(s, pfo);
580 fputs(lf, pfo);
581}
582
583/*
584 * ベクトルを設定する(特別版)
585 */
586static void set_vector2(FILE* pfo, int kind, int no)
587{
588 struct VEC* v = &vec_table[kind][0];
589 char s[8];
590 int i;
591
592 s[1] = '\t';
593 s[2] = ';';
594 s[3] = ' ';
595 s[4] = (no/10)+'0';
596 s[5] = (no%10)+'0';
597 s[6] = 0;
598 for(i = 0 ; i < num_vec[kind] ; i++, v++){
599 switch(no){
600 case 17:
601 s[0] = '1';
602 if(v->no == 17 || v->no == 19){
603 fputs("\t.lword\t", pfo);
604 fputs(out_handler, pfo);
605 fputs(s, pfo);
606 fputs(lf, pfo);
607 return;
608 }
609 break;
610 case 18:
611 s[0] = '1';
612 if(v->no == 18 || v->no == 20){
613 fputs("\t.lword\t", pfo);
614 fputs(in_handler, pfo);
615 fputs(s, pfo);
616 fputs(lf, pfo);
617 return;
618 }
619 break;
620 case 19:
621 s[0] = '2';
622 if(v->no == 17 || v->no == 19){
623 fputs("\t.lword\t", pfo);
624 fputs(out_handler, pfo);
625 fputs(s, pfo);
626 fputs(lf, pfo);
627 return;
628 }
629 break;
630 case 20:
631 s[0] = '2';
632 if(v->no == 18 || v->no == 20){
633 fputs("\t.lword\t", pfo);
634 fputs(in_handler, pfo);
635 fputs(s, pfo);
636 fputs(lf, pfo);
637 return;
638 }
639 break;
640 default:
641 break;
642 }
643 }
644 fputs("\t.lword\t_", pfo);
645 fputs(unused_vec[kind], pfo);
646 fputs(s, pfo);
647 fputs(lf, pfo);
648}
649
650/*
651 * 文字列を比較して同一ならばTURE
652 */
653static bool test_string(char** s, char const *t)
654{
655 char* p;
656 char c;
657
658 p = *s;
659 while(*p <= ' '){
660 if(*p == 0)
661 return false;
662 p++;
663 }
664 while((c = *p++) != 0){
665 if(c != *t++)
666 break;
667 if(*t == 0){
668 *s = p;
669 return true;
670 }
671 }
672 return false;
673}
674
675/*
676 * 指定のキャラクタまでスキップ
677 */
678static bool skip_char(char** s, char const c)
679{
680 char* p;
681
682 p = *s;
683 while(*p != c){
684 if(*p == 0)
685 break;
686 p++;
687 }
688 if(*p){
689 p++;
690 *s = p;
691 return false;
692 }
693 else{
694 *s = p;
695 return true;
696 }
697}
698
699/*
700 * スペースまたはタブをスキップする
701 */
702static bool skip_space(char** s)
703{
704 char* p;
705
706 p = *s;
707 while(*p <= ' '){
708 if(*p == 0)
709 break;
710 p++;
711 }
712 *s = p;
713 if(*p)
714 return false;
715 else
716 return true;
717}
Note: See TracBrowser for help on using the repository browser.