runcom.c revision 677833bc953b6cb418c701facbdcf4aa18d6c44e
/*
* Simple example of use of vm86: launch a basic .com DOS executable
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
//#define SIGTEST
do { \
} while (0)
#define COM_BASE_ADDR 0x10100
void usage(void)
{
printf("runcom version 0.1 (c) 2003 Fabrice Bellard\n"
"usage: runcom file.com\n"
"VM86 Run simple .com DOS executables (linux vm86 test mode)\n");
exit(1);
}
{
}
{
}
{
}
{
"EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n"
"ESI=%08lx EDI=%08lx EBP=%08lx ESP=%08lx\n"
"EIP=%08lx EFL=%08lx\n"
"CS=%04x DS=%04x ES=%04x SS=%04x FS=%04x GS=%04x\n",
}
#ifdef SIGTEST
void alarm_handler(int sig)
{
alarm(1);
}
#endif
{
const char *filename;
struct vm86plus_struct ctx;
struct vm86_regs *r;
if (argc != 2)
usage();
if (vm86_mem == MAP_FAILED) {
perror("mmap");
exit(1);
}
#ifdef SIGTEST
{
alarm(1);
}
#endif
/* load the MSDOS .com executable */
if (fd < 0) {
exit(1);
}
if (ret < 0) {
perror("read");
exit(1);
}
/* init basic registers */
r->eip = 0x100;
r->esp = 0xfffe;
/* put return code */
/* the value of these registers seem to be assumed by pi_10.com */
r->esi = 0x100;
r->ecx = 0xff;
r->ebp = 0x0900;
r->edi = 0xfffe;
for(;;) {
case VM86_INTx:
{
if (int_num != 0x21)
goto unknown_int;
switch(ah) {
case 0x00: /* exit */
exit(0);
case 0x02: /* write char */
{
}
break;
case 0x09: /* write string */
{
uint8_t c;
for(;;) {
if (c == '$')
break;
}
}
break;
default:
// exit(1);
}
}
break;
case VM86_SIGNAL:
/* a signal came, we just ignore that */
break;
case VM86_STI:
break;
default:
exit(1);
}
}
}