aboutsummaryrefslogtreecommitdiffstats
path: root/sample/opentest.c
blob: 4ffb7a0e925be3b7c89de57888db30e5d5f7592f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#ident "$Id$"
/* ----------------------------------------------------------------------- *
 *
 *   Copyright 2002 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,
 *   Bostom MA 02111-1307, USA; either version 2 of the License, or
 *   (at your option) any later version; incorporated herein by reference.
 *
 * -----------------------------------------------------------------------
*/

/*
 * startup.c
 *
 * Simple COM32 image
 *
 * This program shows how to open and read a file by SYSLINUX API call
 */

#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 getversion(void)
{
  com32sys_t inreg;

  memset(&inreg, 0, sizeof inreg);

  inreg.eax.w[0] = 0x0001; // Get version
  __com32.cs_intcall(0x22, &inreg, NULL);
};


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);
};

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

  memset(&inreg, 0, sizeof inreg);

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


int __start(void)
{
  char data[512];
  int cx,ax,es,si,di,dx,t;

  com32sys_t inreg,outreg;
  memset(&inreg, 0, sizeof inreg);
  memset(&outreg, 0, sizeof outreg);
  strcpy(__com32.cs_bounce, "test.txt");
  inreg.eax.w[0] = 0x0006; // Open file
  inreg.esi.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, &outreg);

  si = outreg.esi.w[0];
  cx = outreg.ecx.b[0];
  ax = outreg.eax.b[0];
  if ((ax % cx) == 0)
  t = ax / cx;
  else
  t = (ax / cx) + 1;

  memset(&inreg, 0, sizeof inreg);
  memset(&outreg, 0, sizeof outreg);
  inreg.esi.w[0] = si;
  inreg.ecx.w[0] = t;
  inreg.eax.w[0] = 0x0007; //Read file
  inreg.ebx.w[0] = OFFS(__com32.cs_bounce);
  inreg.es       = SEG(__com32.cs_bounce);
  __com32.cs_intcall(0x22, &inreg, NULL);
/*
  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);
*/

  writemsg("\r\n");
  runcmd("bzImage initrd=root.gz");
  writemsg("\r\n");
  return 0;
}