]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/m68hc11-tdep.c
From 2000-06-25 Stephane Carrez <Stephane.Carrez@worldnet.fr>:
[thirdparty/binutils-gdb.git] / gdb / m68hc11-tdep.c
CommitLineData
78073dd8
AC
1/* Target-dependent code for Motorola 68HC11
2 Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Stephane Carrez, stcarrez@worldnet.fr
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#if 0
22/* FIXME: This is from tm-m68hc1.h */
23
24#define GDB_TARGET_IS_M6811
25
26/* Define the bit, byte, and word ordering of the machine. */
27
28#define TARGET_BYTE_ORDER BIG_ENDIAN
29
30/* Offset from address of function to start of its code.
31 Zero on most machines. */
32
33#define FUNCTION_START_OFFSET 0
34
35#ifdef __STDC__ /* Forward decls for prototypes */
36struct frame_info;
37struct frame_saved_regs;
38struct type;
39struct value;
40#endif
41
42/* Advance PC across any function entry prologue instructions
43 to reach some "real" code. */
44
45extern CORE_ADDR m68hc11_skip_prologue ();
46#define SKIP_PROLOGUE(ip) \
47 m68hc11_skip_prologue (ip)
48
49
50/* Stack grows downward. */
51
52#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
53
54/* For a breakpoint, use "test". This is also the breakpoint
55 instruction on the 68HC12. */
56#define BREAKPOINT {0x0}
57
58/* If your kernel resets the pc after the trap happens you may need to
59 define this before including this file. */
60#define DECR_PC_AFTER_BREAK 0
61
62extern char *m68hc11_register_names[];
63#define REGISTER_NAME(i) m68hc11_register_names[i]
64
65#define REGISTER_SIZE 2
66
67/* Register numbers of various important registers.
68 Note that some of these values are "real" register numbers,
69 and correspond to the general registers of the machine,
70 and some are "phony" register numbers which are too large
71 to be actual register numbers as far as the user is concerned
72 but do serve to get the desired values when passed to read_register. */
73
74#define X_REGNUM 0
75#define D_REGNUM 1
76#define Y_REGNUM 2
77#define SP_REGNUM 3
78#define PC_REGNUM 4
79#define A_REGNUM 5
80#define B_REGNUM 6
81#define PSW_REGNUM 7
82#define Z_REGNUM 8
83#define FP_REGNUM 9
84#define TMP_REGNUM 10
85#define ZS_REGNUM 11
86#define XY_REGNUM 12
87#define ZD1_REGNUM 13
88#define ZD32_REGNUM (ZD1_REGNUM+31)
89
90#define NUM_REGS (ZD32_REGNUM+1)
91
92#include "opcode/m68hc11.h"
93
94/* Say how much memory is needed to store a copy of the register set */
95#define REGISTER_BYTES ((NUM_REGS)*2)
96
97/* Index within `registers' of the first byte of the space for
98 register N. */
99
100#define REGISTER_BYTE(N) ((N) * 2)
101
102/* Number of bytes of storage in the actual machine representation
103 for register N. */
104
105#define REGISTER_RAW_SIZE(N) (2)
106
107/* Number of bytes of storage in the program's representation
108 for register N. */
109
110#define REGISTER_VIRTUAL_SIZE(N) (2)
111
112/* Largest value REGISTER_RAW_SIZE can have. */
113
114#define MAX_REGISTER_RAW_SIZE 8
115
116/* Largest value REGISTER_VIRTUAL_SIZE can have. */
117
118#define MAX_REGISTER_VIRTUAL_SIZE 8
119
120/* Return the GDB type object for the "standard" data type
121 of data in register N. */
122
123#define REGISTER_VIRTUAL_TYPE(N) builtin_type_uint16
124
125/* Store the address of the place in which to copy the structure the
126 subroutine will return. This is called from call_function.
127
128 We store structs through a pointer passed in D */
129
130#define STORE_STRUCT_RETURN(ADDR, SP) \
131 { write_register (D_REGNUM, (ADDR)); }
132
133
134/* Write into appropriate registers a function return value
135 of type TYPE, given in virtual format.
136
137 Things always get returned in D/X */
138
139#define STORE_RETURN_VALUE(TYPE,VALBUF) \
140 write_register_bytes (REGISTER_BYTE (D_REGNUM), VALBUF, TYPE_LENGTH (TYPE))
141
142
143/* Extract from an array REGBUF containing the (raw) register state
144 the address in which a function should return its structure value,
145 as a CORE_ADDR (or an expression that can be used as one). */
146
147#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))
148\f
149
150/* Define other aspects of the stack frame.
151 we keep a copy of the worked out return pc lying around, since it
152 is a useful bit of info */
153
154#define EXTRA_FRAME_INFO \
155 int frame_reg; \
156 CORE_ADDR return_pc; \
157 CORE_ADDR dummy; \
158 int frameless; \
159 int size;
160
161/* There's a mess in stack frame creation. See comments in blockframe.c
162 near reference to INIT_FRAME_PC_FIRST. */
163
164#define INIT_FRAME_PC(fromleaf, prev) /* nada */
165
166#define INIT_FRAME_PC_FIRST(fromleaf, prev) \
167 (prev)->pc = ((fromleaf) ? SAVED_PC_AFTER_CALL ((prev)->next) : \
168 (prev)->next ? FRAME_SAVED_PC ((prev)->next) : read_pc ());
169
170#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
171 m68hc11_init_extra_frame_info (fromleaf, fi)
172
173extern void m68hc11_init_extra_frame_info (int fromleaf,
174 struct frame_info * fi);
175
176/* A macro that tells us whether the function invocation represented
177 by FI does not have a frame on the stack associated with it. If it
178 does not, FRAMELESS is set to 1, else 0. */
179
180#define FRAMELESS_FUNCTION_INVOCATION(FI) \
181 frameless_look_for_prologue (FI)
182
183#define FRAME_CHAIN(FRAME) m68hc11_frame_chain (FRAME)
184#define FRAME_CHAIN_VALID(chain,frame) \
185 ((chain) != 0 && (frame) != 0)
186#define FRAME_SAVED_PC(FRAME) ((FRAME)->return_pc)
187#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
188#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
189
190#define SAVED_PC_AFTER_CALL(frame) m68hc11_saved_pc_after_call (frame)
191
192/* Set VAL to the number of args passed to frame described by FI.
193 Can set VAL to -1, meaning no way to tell. */
194/* We can't tell how many args there are */
195
196#define FRAME_NUM_ARGS(fi) (-1)
197
198/* Return number of bytes at start of arglist that are not really args. */
199
200#define FRAME_ARGS_SKIP 0
201
202
203/* Put here the code to store, into a struct frame_saved_regs,
204 the addresses of the saved registers of frame described by FRAME_INFO.
205 This includes special registers such as pc and fp saved in special
206 ways in the stack frame. sp is even more special:
207 the address we return for it IS the sp for the next frame. */
208
209#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
210 m68hc11_frame_find_saved_regs (frame_info, &(frame_saved_regs))
211
212extern void m68hc11_frame_find_saved_regs (struct frame_info *,
213 struct frame_saved_regs *);
214
215#define CALL_DUMMY { 0 }
216#define PUSH_DUMMY_FRAME
217#define CALL_DUMMY_START_OFFSET 0
218#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
219
220extern CORE_ADDR m68hc11_call_dummy_address (void);
221#define CALL_DUMMY_ADDRESS() m68hc11_call_dummy_address ()
222
223#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
224sp = m68hc11_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
225
226extern CORE_ADDR m68hc11_fix_call_dummy (char *, CORE_ADDR, CORE_ADDR,
227 int, struct value **,
228 struct type *, int);
229#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
230 sp = m68hc11_push_arguments ((nargs), (args), (sp), \
231 (struct_return), (struct_addr))
232extern CORE_ADDR m68hc11_push_arguments (int, struct value **,
233 CORE_ADDR, int, CORE_ADDR);
234
235
236/* Extract from an array REGBUF containing the (raw) register state
237 a function return value of type TYPE, and copy that, in virtual format,
238 into VALBUF. */
239
240#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
241m68hc11_extract_return_value(TYPE, REGBUF, VALBUF)
242extern void m68hc11_extract_return_value (struct type *, char *, char *);
243
244
245/* Discard from the stack the innermost frame,
246 restoring all saved registers. */
247#define POP_FRAME m68hc11_pop_frame();
248extern void m68hc11_pop_frame (void);
249
250
251/* Number of bits in the appropriate type. */
252
253#define TARGET_INT_BIT (2 * TARGET_CHAR_BIT)
254#define TARGET_PTR_BIT (2 * TARGET_CHAR_BIT)
255#define TARGET_DOUBLE_BIT (4 * TARGET_CHAR_BIT)
256#define TARGET_LONG_DOUBLE_BIT (8 * TARGET_CHAR_BIT)
257
258#endif
259
260#include "defs.h"
261#include "frame.h"
262#include "obstack.h"
263#include "symtab.h"
264#include "gdbtypes.h"
265#include "gdbcmd.h"
266#include "gdbcore.h"
267#include "gdb_string.h"
268#include "value.h"
269#include "inferior.h"
270#include "dis-asm.h"
271#include "symfile.h"
272#include "objfiles.h"
273
274/* NOTE: This port is not finished. Several operations are not implemented
275 and will raise an error. Most of these functions concern the calling
276 of a function by GDB itself (command 'call') and retrieving data pushed
277 on the stack. */
278
279void m68hc11_frame_find_saved_regs (struct frame_info *fi,
280 struct frame_saved_regs *fsr);
281static void m68hc11_pop_dummy_frame (struct frame_info *fi);
282
283/* Table of registers for 68HC11. This includes the hard registers
284 and the pseudo hard registers used by GCC. */
285char*
286m68hc11_register_names[] =
287{
288 "x", "d", "y", "sp", "pc", "a", "b",
289 "ccr", "z", "frame","tmp", "zs", "xy",
290 "ZD1", "ZD2", "ZD3", "ZD4", "ZD5", "ZD6", "ZD7",
291 "ZD8", "ZD9", "ZD10", "ZD11", "ZD12", "ZD13", "ZD14",
292 "ZD15", "ZD16", "ZD17", "ZD18", "ZD19", "ZD20", "ZD21",
293 "ZD22", "ZD23", "ZD24", "ZD25", "ZD26", "ZD27", "ZD28",
294 "ZD29", "ZD30", "ZD31", "ZD32"
295};
296
297static int reg_last = 32 * 2 + 6;
298static int frame_index = 6;
299
300/* Raise an error for operations which are not yet provided. */
301static void
302m68hc11_not_yet (const char *operation)
303{
304 error ("Operation '%s' is not yet implemented\n", operation);
305}
306
307/* Immediately after a function call, return the saved pc before the frame
308 is setup. For sun3's, we check for the common case of being inside of a
309 system call, and if so, we know that Sun pushes the call # on the stack
310 prior to doing the trap. */
311
312CORE_ADDR
313m68hc11_saved_pc_after_call (struct frame_info *frame)
314{
315 unsigned addr = frame->frame + 1 + 2;
316
317 addr = read_register (SP_REGNUM) + 1;
318 addr &= 0x0ffff;
319 return read_memory_integer (addr, 2) & 0x0FFFF;
320}
321
322/* Discard from the stack the innermost frame, restoring all saved
323 registers. */
324
325void
326m68hc11_pop_frame ()
327{
328 m68hc11_not_yet ("m68hc11_pop_frame");
329}
330
331/* Analyze the function prologue to find some information
332 about the function:
333 - the PC of the first line (for m68hc11_skip_prologue)
334 - the offset of the previous frame saved address (from current frame)
335 - the soft registers which are pushed. */
336static void
337m68hc11_guess_from_prologue (CORE_ADDR pc, CORE_ADDR* first_line,
338 int* frame_offset, int* pushed_regs)
339{
340 CORE_ADDR func_end;
341 unsigned char op0, op1, op2;
342 int add_sp_mode;
343 int sp_adjust;
344 int size;
345 int found_frame_point;
346 int found_load;
347 CORE_ADDR first_pc;
348 int reg_saved;
349
350 first_pc = get_pc_function_start (pc);
351 size = 0;
352
353 if (first_pc == 0)
354 {
355 *frame_offset = 0;
356 *pushed_regs = 0;
357 *first_line = pc;
358 return;
359 }
360
361#define OP_PAGE2 (0x18)
362#define OP_LDX (0xde)
363#define OP_LDY (0xde)
364#define OP_PSHX (0x3c)
365#define OP_PSHY (0x3c)
366#define OP_STS (0x9f)
367#define OP_TSX (0x30)
368#define OP_TSY (0x30)
369#define OP_XGDX (0x8f)
370#define OP_XGDY (0x8f)
371#define OP_ADDD (0xc3)
372#define OP_TXS (0x35)
373#define OP_TYS (0x35)
374
375 /* The 68hc11 stack is as follows:
376
377
378 | |
379 +-----------+
380 | |
381 | args |
382 | |
383 +-----------+
384 | PC-return |
385 +-----------+
386 | Old frame |
387 +-----------+
388 | |
389 | Locals |
390 | |
391 +-----------+ <--- current frame
392 | |
393
394 With most processors (like 68K) the previous frame can be computed
395 easily because it is always at a fixed offset (see link/unlink).
396 That is, locals are accessed with negative offsets, arguments are
397 accessed with positive ones. Since 68hc11 only supports offsets
398 in the range [0..255], the frame is defined at the bottom of
399 locals (see picture).
400
401 The purpose of the analysis made here is to find out the size
402 of locals in this function. An alternative to this is to use
403 DWARF2 info. This would be better but I don't know how to
404 access dwarf2 debug from this function.
405
406 Walk from the function entry point to the point where we save
407 the frame. While walking instructions, compute the size of bytes
408 which are pushed. This gives us the index to access the previous
409 frame.
410
411 We limit the search to 128 bytes so that the algorithm is bounded
412 in case of random and wrong code. We also stop and abort if
413 we find an instruction which is not supposed to appear in the
414 prologue (as generated by gcc 2.95, 2.96).
415 */
416 pc = first_pc;
417 func_end = pc + 128;
418 add_sp_mode = 0;
419 found_frame_point = 0;
420 while (pc + 2 < func_end)
421 {
422 op0 = read_memory_unsigned_integer (pc, 1);
423 op1 = read_memory_unsigned_integer (pc + 1, 1);
424 op2 = read_memory_unsigned_integer (pc + 2, 1);
425
426 /* ldx *frame */
427 if (op0 == OP_LDX && op1 == frame_index)
428 {
429 pc += 2;
430 }
431
432 /* ldy *frame */
433 else if (op0 == OP_PAGE2 && op1 == OP_LDY && op2 == frame_index)
434 {
435 pc += 3;
436 }
437
438 /* pshx */
439 else if (op0 == OP_PSHX)
440 {
441 pc += 1;
442 size += 2;
443 }
444
445 /* pshy */
446 else if (op0 == OP_PAGE2 && op1 == OP_PSHX)
447 {
448 pc += 2;
449 size += 2;
450 }
451
452 /* sts *frame */
453 else if (op0 == OP_STS && op1 == frame_index)
454 {
455 found_frame_point = 1;
456 pc += 2;
457 break;
458 }
459 else if (op0 == OP_TSX && op1 == OP_XGDX)
460 {
461 add_sp_mode = 1;
462 pc += 2;
463 }
464 else if (op0 == OP_PAGE2 && op1 == OP_TSY && op2 == OP_PAGE2)
465 {
466 op0 = read_memory_unsigned_integer (pc + 3, 1);
467 if (op0 != OP_XGDY)
468 break;
469
470 add_sp_mode = 2;
471 pc += 4;
472 }
473 else if (add_sp_mode && op0 == OP_ADDD)
474 {
475 sp_adjust = read_memory_unsigned_integer (pc + 1, 2);
476 if (sp_adjust & 0x8000)
477 sp_adjust |= 0xffff0000L;
478
479 sp_adjust = -sp_adjust;
480 add_sp_mode |= 4;
481 pc += 3;
482 }
483 else if (add_sp_mode == (1 | 4) && op0 == OP_XGDX
484 && op1 == OP_TXS)
485 {
486 size += sp_adjust;
487 pc += 2;
488 add_sp_mode = 0;
489 }
490 else if (add_sp_mode == (2 | 4) && op0 == OP_PAGE2
491 && op1 == OP_XGDY && op2 == OP_PAGE2)
492 {
493 op0 = read_memory_unsigned_integer (pc + 3, 1);
494 if (op0 != OP_TYS)
495 break;
496
497 size += sp_adjust;
498 pc += 4;
499 add_sp_mode = 0;
500 }
501 else
502 {
503 break;
504 }
505 }
506
507 if (found_frame_point == 0)
508 {
509 *frame_offset = 0;
510 }
511 else
512 {
513 *frame_offset = size;
514 }
515
516 /* Now, look forward to see how many registers are pushed on the stack.
517 We look only for soft registers so there must be a first LDX *REG
518 before a PSHX. */
519 reg_saved = 0;
520 found_load = 0;
521 while (pc + 2 < func_end)
522 {
523 op0 = read_memory_unsigned_integer (pc, 1);
524 op1 = read_memory_unsigned_integer (pc + 1, 1);
525 op2 = read_memory_unsigned_integer (pc + 2, 1);
526 if (op0 == OP_LDX && op1 > frame_index && op1 <= reg_last)
527 {
528 found_load = 1;
529 pc += 2;
530 }
531 else if (op0 == OP_PAGE2 && op1 == OP_LDY
532 && op2 > frame_index && op2 < reg_last)
533 {
534 found_load = 1;
535 pc += 3;
536 }
537 else if (op0 == OP_PSHX)
538 {
539 /* If there was no load, this is a push for a function call. */
540 if (found_load == 0)
541 break;
542
543 reg_saved += 2;
544 pc += 1;
545 found_load = 0;
546 }
547 else if (op0 == OP_PAGE2 && op1 == OP_PSHY)
548 {
549 if (found_load == 0)
550 break;
551
552 reg_saved += 2;
553 pc += 2;
554 found_load = 0;
555 }
556 else
557 {
558 break;
559 }
560 }
561 *pushed_regs = reg_saved;
562 *first_line = pc;
563}
564
565
566CORE_ADDR
567m68hc11_skip_prologue (CORE_ADDR pc)
568{
569 CORE_ADDR func_addr, func_end;
570 struct symtab_and_line sal;
571 int frame_offset;
572 int pushed_args;
573
574 /* If we have line debugging information, then the end of the. */
575 /* prologue should be the first assembly instruction of the
576 first source line. */
577 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
578 {
579 sal = find_pc_line (func_addr, 0);
580 if (sal.end && sal.end < func_end)
581 return sal.end;
582 }
583
584 m68hc11_guess_from_prologue (pc, &pc, &frame_offset, &pushed_args);
585 return pc;
586}
587
588/* Given a GDB frame, determine the address of the calling function's frame.
589 This will be used to create a new GDB frame struct, and then
590 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
591*/
592
593CORE_ADDR
594m68hc11_frame_chain (struct frame_info *frame)
595{
596 unsigned addr;
597
598 if (frame->return_pc == 0 || inside_entry_file(frame->return_pc))
599 return (CORE_ADDR)0;
600
601 if (frame->frame == 0)
602 {
603 return (CORE_ADDR) 0;
604 }
605
606 addr = frame->frame + frame->size + 1 - 2;
607 addr = read_memory_unsigned_integer (addr, 2) & 0x0FFFF;
608 if (addr == 0)
609 {
610 return (CORE_ADDR)0;
611 }
612
613 return addr;
614}
615
616/* Put here the code to store, into a struct frame_saved_regs, the
617 addresses of the saved registers of frame described by FRAME_INFO.
618 This includes special registers such as pc and fp saved in special
619 ways in the stack frame. sp is even more special: the address we
620 return for it IS the sp for the next frame. */
621void
622m68hc11_frame_find_saved_regs (struct frame_info *fi,
623 struct frame_saved_regs *fsr)
624{
625 CORE_ADDR pc;
626 int saved;
627
628 pc = fi->pc;
629 memset (fsr, 0, sizeof (*fsr));
630 m68hc11_guess_from_prologue (pc, &pc, &fi->size, &saved);
631}
632
633void
634m68hc11_init_extra_frame_info (int fromleaf, struct frame_info *fi)
635{
636 unsigned addr;
637 struct frame_saved_regs dummy;
638
639 m68hc11_frame_find_saved_regs (fi, &dummy);
640
641 if (fromleaf)
642 {
643 fi->return_pc = m68hc11_saved_pc_after_call (fi);
644 }
645 else
646 {
647 addr = fi->frame + fi->size + 1;
648 fi->return_pc = read_memory_unsigned_integer (addr, 2) & 0x0ffff;
649
650#if 0
651 printf ("Pc@0x%04x, FR 0x%04x, size %d, read ret @0x%04x -> 0x%04x\n",
652 fi->pc,
653 fi->frame, fi->size,
654 addr & 0x0ffff,
655 fi->return_pc);
656#endif
657 }
658}
659
660/* Same as 'info reg' but prints the registers in a different way. */
661static void
662show_regs (char *args, int from_tty)
663{
664 int ccr = read_register (PSW_REGNUM);
665 int i;
666
667 printf_filtered ("PC=%04x SP=%04x FP=%04x CCR=%02x %c%c%c%c%c%c%c%c\n",
668 read_register (PC_REGNUM),
669 read_register (SP_REGNUM),
670 read_register (FP_REGNUM),
671 ccr,
672 ccr & M6811_S_BIT ? 'S' : '-',
673 ccr & M6811_X_BIT ? 'X' : '-',
674 ccr & M6811_H_BIT ? 'H' : '-',
675 ccr & M6811_I_BIT ? 'I' : '-',
676 ccr & M6811_N_BIT ? 'N' : '-',
677 ccr & M6811_Z_BIT ? 'Z' : '-',
678 ccr & M6811_V_BIT ? 'V' : '-',
679 ccr & M6811_C_BIT ? 'C' : '-');
680
681 printf_filtered ("D=%04x IX=%04x IY=%04x\n",
682 read_register (D_REGNUM),
683 read_register (X_REGNUM),
684 read_register (Y_REGNUM));
685 for (i = ZD1_REGNUM; i <= ZD32_REGNUM; i++)
686 {
687 printf_filtered ("ZD%d=%04x",
688 i - ZD1_REGNUM + 1,
689 read_register (i));
690 if (((i - ZD1_REGNUM) % 8) == 7)
691 printf_filtered ("\n");
692 else
693 printf_filtered (" ");
694 }
695}
696
697CORE_ADDR
698m68hc11_fix_call_dummy (char *dummyname,
699 CORE_ADDR start_sp,
700 CORE_ADDR fun,
701 int nargs,
702 value_ptr *args,
703 struct type *type,
704 int gcc_p)
705{
706 m68hc11_not_yet ("m68hc11_fix_call_dummy");
707 return 0;
708}
709
710static void
711m68hc11_pop_dummy_frame (struct frame_info *fi)
712{
713 m68hc11_not_yet ("m68hc11_pop_dummy_frame");
714}
715
716
717CORE_ADDR
718m68hc11_push_arguments (int nargs,
719 value_ptr *args,
720 CORE_ADDR sp,
721 int struct_return,
722 CORE_ADDR struct_addr)
723{
724 m68hc11_not_yet ("m68hc11_push_arguments");
725 return 0;
726}
727
728
729CORE_ADDR
730m68hc11_call_dummy_address ()
731{
732 m68hc11_not_yet ("m68hc11_call_dummy_address");
733 return 0;
734}
735
736/* Given a return value in `regbuf' with a type `valtype',
737 extract and copy its value into `valbuf'. */
738
739void
740m68hc11_extract_return_value (struct type *valtype,
741 char *regbuf,
742 char *valbuf)
743{
744 m68hc11_not_yet ("m68hc11_extract_return_value");
745}
746
747void
748_initialize_m68hc11_tdep ()
749{
750 tm_print_insn = print_insn_m68hc11;
751
752 add_com ("regs", class_vars, show_regs, "Print all registers");
753}
754