/**************************************************************************** ** ** Name: STKCPU16.TXT ** ** Description: ** This file contains stack frames information for the CPU16. ** ** Status: PRELIMINARY ** ** $Log: S:/tbird/arcppc/stkservr/stkcpu16.txv $ Rev 1.0 17 Jan 1997 09:24:28 kevin Initial revision. Rev 1.0 03 Jun 1996 11:39:12 gene Initial revision. Rev 1.0 07 Sep 1995 11:14:20 gene Initial revision. Rev 1.0 04 Oct 1993 15:06:24 nghia Initial revision. ** ** $Header: S:/tbird/arcppc/stkservr/stkcpu16.txv 1.0 17 Jan 1997 09:24:28 kevin $ ** ** Copyright (C) 1991, 1993 Microtek International. All rights reserved. ** *****************************************************************************/ From: mindy (Mindy Beseler) Subject: HC16 stack frames stack frames types for the HC16 processor: frame type = 0: COSMIC - No arguments passed in register: +--------------------------+ | PARAMETERS... | +--------------------------+ | ... | +--------------------------+ | PC | +--------------------------+ | PK | +--------------------------+ | X register (FP) | +--------------------------+ | LOCAL AREA ... | +--------------------------+ FP ===> | ... | +--------------------------+ | | frame type = 1: COSMIC - 1st argument passed in D register: +--------------------------+ | PARAMETERS... | +--------------------------+ | ... | +--------------------------+ | PC | +--------------------------+ | PK | +--------------------------+ | D register (1st parm) | +--------------------------+ | X register (FP) | +--------------------------+ | LOCAL AREA ... | +--------------------------+ FP ===> | ... | +--------------------------+ | | frame type = 2: COSMIC - 1st argument passed in D/E register pair: +--------------------------+ | PARAMETERS... | +--------------------------+ | ... | +--------------------------+ | PC | +--------------------------+ | PK | +--------------------------+ | D register (1st parm) | +--------------------------+ | E register (1st parm) | +--------------------------+ | X register (FP) | +--------------------------+ | LOCAL AREA ... | +--------------------------+ FP ===> | ... | +--------------------------+ | | The formula for the previous three stack frames: stack addr. of return PC = local_stack_size + X register (FP) + (frame_type*2) frame type = 3: INTROL - 1st argument passed in D/E register pair: +--------------------------+ | PARAMETERS... | +--------------------------+ | ... | +--------------------------+ | PC | +--------------------------+ | PK | +--------------------------+ | Z register (FP) | +--------------------------+ | K register (FP) | +--------------------------+ | 1st Parameter (if any) | +--------------------------+ | LOCAL AREA ... | +--------------------------+ FP ===> | ... | +--------------------------+ | | local_stack_size for each routine includes the area for the 1st parameter thus the stack walker doesn't need to worry about whether there is a 1st parameter or not. frame_type = 4 - was never assigned! frame_type = 5 - NO frame routine. This routine has neither locals nor parameters thus no stack frame is generated. Return PC is found by going backwards through stack until an address is found that maps to a routine. Risky approach but we have no other way to know what all might be pushed on the stack - if parameters from a recent call are still allocated, etc. frame type = 6: HICROSS +--------------------------+ | PARAMETERS... | +--------------------------+ | ... | +--------------------------+ | PC | +--------------------------+ | PK | +--------------------------+ | LOCAL AREA ... | +--------------------------+ | ... | +--------------------------+ | Register'd parameters | +--------------------------+ FP ===> | Z register (FP) | +--------------------------+ | | does local_stack_size for each routine include the area for the registered parameters? /******************************** E O F ***********************************/