/* ----------------------------------------------------------------------- *
 *
 *   Copyright 2002-2008 H. Peter Anvin - All Rights Reserved
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
 *   Boston MA 02111-1307, USA; either version 2 of the License, or
 *   (at your option) any later version; incorporated herein by reference.
 *
 * ----------------------------------------------------------------------- */

/*
 * hello2.c
 *
 * Simple COM32 image
 *
 * This version shows how to use the bounce buffer for data transfer
 * to the BIOS or COMBOOT system calls.
 */

#include <com32.h>

#define NULL ((void *)0)

static inline void memset(void *buf, int ch, unsigned int len)
{
  asm volatile("cld; rep; stosb"
	       : "+D" (buf), "+c" (len) : "a" (ch) : "memory");
}

static void strcpy(char *dst, const char *src)
{
  while ( *src )
    *dst++ = *src++;

  *dst = '\0';
}

static void writemsg(const char *msg)
{
  com32sys_t inreg;

  memset(&inreg, 0, sizeof inreg);

  strcpy(__com32.cs_bounce, msg);
  inreg.eax.w[0] = 0x0002;	/* Write string */
  inreg.ebx.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, NULL);
};

int __start(void)
{
  writemsg("Hello, World!\r\n"
	   "cmdline = ");
  writemsg(__com32.cs_cmdline);
  writemsg("\r\n");
  return 0;
}
