-/*-------------------------------------------------------------------------*/
-/* stdarg.h - ANSI macros for variable parameter list */
-/*-------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------------*/
+/* stdarg.h - ANSI macros for variable parameter list */
+/*-----------------------------------------------------------------------------------*/
-#ifndef _STDARG_H
-#define _STDARG_H 1
+#ifndef __SDC51_STDARG_H
+#define __SDC51_STDARG_H 1
+
+#if defined(__z80) || defined(__gbz80) || defined(__hc08)
+
+typedef unsigned char * va_list;
+#define va_start(marker, last) { marker = (va_list)&last + sizeof(last); }
+#define va_arg(marker, type) *((type *)((marker += sizeof(type)) - sizeof(type)))
+
+#elif defined(__ds390) || defined(__ds400)
+
+typedef unsigned char * va_list;
+#define va_start(marker, first) { marker = (va_list)&first; }
+#define va_arg(marker, type) *((type *)(marker -= sizeof(type)))
-#if defined(SDCC_MODEL_LARGE) || defined(SDCC_MODEL_FLAT24)
-typedef unsigned char _xdata * va_list ;
#elif defined(SDCC_USE_XSTACK)
-typedef unsigned char _pdata * va_list ;
+
+typedef unsigned char __pdata * va_list;
+#define va_start(marker, first) { marker = (va_list)&first; }
+#define va_arg(marker, type) *((type __pdata *)(marker -= sizeof(type)))
+
#else
-typedef unsigned char _data * va_list ;
+
+typedef unsigned char __data * va_list;
+#define va_start(marker, first) { marker = (va_list)&first; }
+#define va_arg(marker, type) *((type __data * )(marker -= sizeof(type)))
+
#endif
-#define va_arg(valist,type) (*((type *)(valist -= sizeof(type))))
-#define va_start(valist,first) (valist = (va_list)&(first))
-#define va_end(valist) (valist = (va_list) 0)
+#define va_end(marker) marker = (va_list) 0;
#endif