c144a06afa7cac350fcd543308ee2e5dc041843c
[fw/altos] / ccdbg.c
1 /*
2  * Copyright © 2008 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #include "ccdbg.h"
20
21 #if 0
22 static uint8_t instructions[] = {
23         3, MOV_direct_data, 0xfe, 0x02,
24         3, MOV_direct_data, 0x90, 0xff,
25         0
26 };
27 #endif
28
29 #if 0
30 static uint8_t mem_instr[] = {
31         MOV_direct_data, 0xfe, 0x02,
32         MOV_Rn_data(0), 0x00,
33         MOV_Rn_data(1), 0x00,
34         MOV_direct_data, 0x90, 0xff,
35         MOV_Rn_data(2), 0x10,
36         DJNZ_Rn_rel(1), 0xfe,
37         DJNZ_Rn_rel(0), 0xfc,
38         DJNZ_Rn_rel(2), 0xfa,
39         MOV_direct_data, 0x90, 0xfd,
40         MOV_Rn_data(2), 0x10,
41         DJNZ_Rn_rel(1), 0xfe,
42         DJNZ_Rn_rel(0), 0xfc,
43         DJNZ_Rn_rel(2), 0xfa,
44         SJMP, 0xe7,
45 };
46 #endif
47
48 #if 0
49 static struct hex_image *
50 make_hex_image(uint16_t addr, uint8_t *data, uint16_t length)
51 {
52         struct hex_image        *image;
53
54         image = malloc(sizeof (struct hex_image) + length);
55         image->address = addr;
56         image->length = length;
57         memcpy(image->data, data, length);
58         return image;
59 }
60 #endif
61
62 int
63 main (int argc, char **argv)
64 {
65         struct ccdbg    *dbg;
66         uint8_t         status;
67         uint16_t        pc;
68         struct hex_file *hex;
69         struct hex_image *image;
70
71         dbg = ccdbg_open("/dev/ttyUSB0");
72         if (!dbg)
73                 exit (1);
74 #if 0
75         ccdbg_manual(dbg, stdin);
76 #endif
77 #if 1
78         hex = ccdbg_hex_file_read(stdin, "<stdin>");
79         if (!hex)
80                 exit (1);
81         image = ccdbg_hex_image_create(hex);
82         ccdbg_hex_file_free(hex);
83 #else
84         image = make_hex_image(0xf000, mem_instr, sizeof (mem_instr));
85 #endif
86         
87         ccdbg_debug_mode(dbg);
88         
89 #if 1
90         if (!image) {
91                 fprintf(stderr, "image create failed\n");
92                 exit (1);
93         }
94         if (image->address == 0xf000) {
95                 printf("Loading %d bytes to execute from RAM\n", image->length);
96                 ccdbg_write_hex_image(dbg, image, 0);
97         } else if (image->address == 0x0000) {
98                 printf("Loading code to execute from FLASH\n");
99                 ccdbg_flash_hex_image(dbg, image);
100         } else {
101                 printf("Cannot load code to 0x%04x\n",
102                        image->address);
103                 ccdbg_hex_image_free(image);
104                 ccdbg_close(dbg);
105                 exit(1);
106         }
107         ccdbg_set_pc(dbg, image->address);
108 #endif
109         ccdbg_resume(dbg);
110         ccdbg_close(dbg);
111         exit (0);
112 }