1 /* This file is part of the program psim.
3 Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>
4 Copyright (C) 1997, Free Software Foundation
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #include "sim-utils.h"
29 #include "sim-options.h"
44 #define SIM_ADDR unsigned
47 sim_open (SIM_OPEN_KIND kind
,
48 host_callback
*callback
,
53 SIM_DESC sd
= sim_state_alloc (kind
, callback
);
55 if (sim_pre_argv_init (sd
, argv
[0]) != SIM_RC_OK
)
58 #define TIC80_MEM_START 0x2000000
59 #define TIC80_MEM_SIZE 0x100000
62 asprintf (&buf
, "memory region 0x%lx,0x%lx",
63 TIC80_MEM_START
, TIC80_MEM_SIZE
);
64 sim_do_command (sd
, buf
);
66 /* interrupt memory */
67 sim_do_command (sd
, "memory region 0x1010000,0x1000");
68 /* some memory at zero */
69 sim_do_command (sd
, "memory region 0,0x100000");
71 /* getopt will print the error message so we just have to exit if this fails.
72 FIXME: Hmmm... in the case of gdb we need getopt to call
74 if (sim_parse_args (sd
, argv
) != SIM_RC_OK
)
76 /* Uninstall the modules to avoid memory leaks,
77 file descriptor leaks, etc. */
78 sim_module_uninstall (sd
);
82 /* check for/establish the a reference program image */
83 if (sim_analyze_program (sd
,
84 (STATE_PROG_ARGV (sd
) != NULL
85 ? *STATE_PROG_ARGV (sd
)
89 sim_module_uninstall (sd
);
93 /* establish any remaining configuration options */
94 if (sim_config (sd
) != SIM_RC_OK
)
96 sim_module_uninstall (sd
);
100 if (sim_post_argv_init (sd
) != SIM_RC_OK
)
102 /* Uninstall the modules to avoid memory leaks,
103 file descriptor leaks, etc. */
104 sim_module_uninstall (sd
);
114 sim_close (SIM_DESC sd
, int quitting
)
116 /* Uninstall the modules to avoid memory leaks,
117 file descriptor leaks, etc. */
118 sim_module_uninstall (sd
);
122 /* FIXME - these magic numbers need to be moved elsewhere */
124 #define SP_REGNUM 1 /* Contains address of top of stack */
125 #define FP_REGNUM 31 /* Contains address of executing stack frame */
126 #define PC_REGNUM 32 /* Contains program counter (FIXME?) */
127 #define NPC_REGNUM 33 /* Contains the next program counter (FIXME?) */
128 #define A0_REGNUM 34 /* Accumulator register 0 */
129 #define A3_REGNUM 37 /* Accumulator register 1 */
131 #define R0_REGNUM 0 /* General Purpose Register 0 - for sim */
132 #define Rn_REGNUM 31 /* Last General Purpose Register - for sim */
133 #define An_REGNUM A3_REGNUM /* Last Accumulator register - for sim */
136 sim_fetch_register (SIM_DESC sd
, int regnr
, unsigned char *buf
)
138 if (regnr
== R0_REGNUM
)
139 memset (buf
, 0, sizeof (unsigned32
));
140 else if (regnr
> R0_REGNUM
&& regnr
<= Rn_REGNUM
)
141 *(unsigned32
*)buf
= H2T_4 (STATE_CPU (sd
, 0)->reg
[regnr
- R0_REGNUM
]);
142 else if (regnr
== PC_REGNUM
)
143 *(unsigned32
*)buf
= H2T_4 (STATE_CPU (sd
, 0)->cia
.ip
);
144 else if (regnr
== NPC_REGNUM
)
145 *(unsigned32
*)buf
= H2T_4 (STATE_CPU (sd
, 0)->cia
.dp
);
146 else if (regnr
>= A0_REGNUM
&& regnr
<= An_REGNUM
)
147 *(unsigned64
*)buf
= H2T_8 (STATE_CPU (sd
, 0)->acc
[regnr
- A0_REGNUM
]);
149 sim_io_error (sd
, "sim_fetch_register - unknown register nr %d", regnr
);
155 sim_store_register (SIM_DESC sd
, int regnr
, unsigned char *buf
)
157 if (regnr
>= R0_REGNUM
&& regnr
<= Rn_REGNUM
)
158 STATE_CPU (sd
, 0)->reg
[regnr
- R0_REGNUM
] = T2H_4 (*(unsigned32
*)buf
);
159 else if (regnr
== PC_REGNUM
)
160 STATE_CPU (sd
, 0)->cia
.ip
= T2H_4 (*(unsigned32
*)buf
);
161 else if (regnr
== NPC_REGNUM
)
162 STATE_CPU (sd
, 0)->cia
.dp
= T2H_4 (*(unsigned32
*)buf
);
163 else if (regnr
>= A0_REGNUM
&& regnr
<= An_REGNUM
)
164 STATE_CPU (sd
, 0)->acc
[regnr
- A0_REGNUM
] = T2H_8 (*(unsigned64
*)buf
);
166 sim_io_error (sd
, "sim_store_register - unknown register nr %d", regnr
);
172 sim_info (SIM_DESC sd
, int verbose
)
178 sim_create_inferior (SIM_DESC sd
,
183 /* clear all registers */
184 memset (&STATE_CPU (sd
, 0)->reg
, 0, sizeof (STATE_CPU (sd
, 0)->reg
));
185 memset (&STATE_CPU (sd
, 0)->acc
, 0, sizeof (STATE_CPU (sd
, 0)->acc
));
186 memset (&STATE_CPU (sd
, 0)->cr
, 0, sizeof (STATE_CPU (sd
, 0)->cr
));
187 STATE_CPU (sd
, 0)->is_user_mode
= 0;
188 memset (&STATE_CPU (sd
, 0)->cia
, 0, sizeof (STATE_CPU (sd
, 0)->cia
));
189 /* initialize any modules */
190 sim_module_init (sd
);
191 /* set the stack-pointer/program counter */
193 STATE_CPU (sd
, 0)->cia
.ip
= bfd_get_start_address (abfd
);
195 STATE_CPU (sd
, 0)->cia
.ip
= 0;
196 STATE_CPU (sd
, 0)->cia
.dp
= (STATE_CPU (sd
, 0)->cia
.ip
197 + sizeof (instruction_word
));
198 STATE_CPU (sd
, 0)->cr
[IE_CR
] |= IE_CR_IE
;
199 STATE_CPU (sd
, 0)->reg
[1] = TIC80_MEM_START
+ TIC80_MEM_SIZE
- 16;
205 sim_do_command (SIM_DESC sd
, char *cmd
)
207 if (sim_args_command (sd
, cmd
) != SIM_RC_OK
)
208 sim_io_eprintf (sd
, "Unknown command `%s'\n", cmd
);
This page took 0.038813 seconds and 4 git commands to generate.