/*
 * 16-bit mode stack frame layout
 *
 * Copyright 1995 Alexandre Julliard
 */

#ifndef __WINE_STACKFRAME_H
#define __WINE_STACKFRAME_H

#include <string.h>
#include "windows.h"
#include "ldt.h"

#pragma pack(1)

  /* 16-bit stack layout after CallFrom16() */
typedef struct
{
    DWORD   saved_ss_sp;    /* 00 saved previous 16-bit stack */
    DWORD   ebp;            /* 04 full 32-bit content of ebp */
    WORD    entry_ip;       /* 08 ip of entry point */
    WORD    ds;             /* 0a ds */
    WORD    entry_cs;       /* 0c cs of entry point */
    WORD    es;             /* 0e es */
    DWORD   entry_point;    /* 10 32-bit entry point to call */
    WORD    bp;             /* 14 16-bit bp */
    WORD    ip;             /* 16 return address */
    WORD    cs;             /* 18 */
} STACK16FRAME;

  /* 32-bit stack layout after CallTo16() */
typedef struct
{
    DWORD   edi;            /* 00 saved registers */
    DWORD   esi;            /* 04 */
    DWORD   edx;            /* 08 */
    DWORD   ecx;            /* 0c */
    DWORD   ebx;            /* 10 */
    DWORD   restore_addr;   /* 14 return address for restoring code selector */
    DWORD   codeselector;   /* 18 code selector to restore */
    DWORD   ebp;            /* 1c saved 32-bit frame pointer */
    DWORD   retaddr;        /* 20 actual return address */
    DWORD   args[1];        /* 24 arguments to 16-bit function */
} STACK32FRAME;

#pragma pack(4)

  /* Saved 16-bit stack for current process (Win16 only) */
extern DWORD IF1632_Saved16_ss_sp;

#define CURRENT_STACK16 ((STACK16FRAME *)PTR_SEG_TO_LIN(IF1632_Saved16_ss_sp))
#define CURRENT_DS      (CURRENT_STACK16->ds)

/* varargs lists on the 16-bit stack */

typedef void *VA_LIST16;

#define __VA_ROUNDED16(type) \
    ((sizeof(type) + sizeof(WORD) - 1) / sizeof(WORD) * sizeof(WORD))
#define VA_START16(list) ((list) = (VA_LIST16)(CURRENT_STACK16 + 1))
#define VA_ARG16(list,type) \
    (((list) = (VA_LIST16)((char *)(list) + __VA_ROUNDED16(type))), \
     *((type *)(void *)((char *)(list) - __VA_ROUNDED16(type))))
#define VA_END16(list) ((void)0)

/* Push bytes on the 16-bit stack; return a segptr to the first pushed byte */
#define STACK16_PUSH(size) \
 (memmove((char*)CURRENT_STACK16-(size),CURRENT_STACK16,sizeof(STACK16FRAME)),\
  IF1632_Saved16_ss_sp -= (size), \
  (SEGPTR)(IF1632_Saved16_ss_sp + sizeof(STACK16FRAME)))

/* Pop bytes from the 16-bit stack */
#define STACK16_POP(size) \
 (memmove((char*)CURRENT_STACK16+(size),CURRENT_STACK16,sizeof(STACK16FRAME)),\
  IF1632_Saved16_ss_sp += (size))

#endif /* __WINE_STACKFRAME_H */
