2e70a60a41d5f9e07918ecd4a027d3e00c0c6717
[mes.git] / scaffold / m.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 int g_stdin = 0;
22 typedef long size_t;
23
24 #if __GNUC__
25 void
26 exit (int code)
27 {
28   asm (
29        "movl %0,%%ebx\n\t"
30        "movl $1,%%eax\n\t"
31        "int  $0x80"
32        : // no outputs "=" (r)
33        : "" (code)
34        );
35   // not reached
36   exit (0);
37 }
38
39 int
40 read (int fd, void* buf, size_t n)
41 {
42   int r;
43   //syscall (SYS_write, fd, s, n));
44   asm (
45        "movl %1,%%ebx\n\t"
46        "movl %2,%%ecx\n\t"
47        "movl %3,%%edx\n\t"
48        "movl $0x3,%%eax\n\t"
49        "int  $0x80\n\t"
50        "mov %%eax,%0\n\t"
51        : "=r" (r)
52        : "" (fd), "" (buf), "" (n)
53        : "eax", "ebx", "ecx", "edx"
54        );
55   return r;
56 }
57
58 int
59 open (char const *s, int mode)
60 {
61   int r;
62   //syscall (SYS_open, mode));
63   asm (
64        "mov %1,%%ebx\n\t"
65        "mov %2,%%ecx\n\t"
66        "mov $0x5,%%eax\n\t"
67        "int $0x80\n\t"
68        "mov %%eax,%0\n\t"
69        : "=r" (r)
70        : "" (s), "" (mode)
71        : "eax", "ebx", "ecx"
72        );
73   return r;
74 }
75
76 int
77 getchar ()
78 {
79   char c;
80   int r = read (g_stdin, &c, 1);
81   if (r < 1) return -1;
82   return c;
83 }
84
85 void
86 write (int fd, char const* s, int n)
87 {
88   int r;
89   //syscall (SYS_write, fd, s, n));
90   asm (
91        "mov %0,%%ebx\n\t"
92        "mov %1,%%ecx\n\t"
93        "mov %2,%%edx\n\t"
94
95        "mov $0x4, %%eax\n\t"
96        "int $0x80\n\t"
97        : // no outputs "=" (r)
98        : "" (fd), "" (s), "" (n)
99        : "eax", "ebx", "ecx", "edx"
100        );
101 }
102
103 int
104 putchar (int c)
105 {
106   //write (STDOUT, s, strlen (s));
107   //int i = write (STDOUT, s, strlen (s));
108   write (1, (char*)&c, 1);
109   return 0;
110 }
111
112 size_t
113 strlen (char const* s)
114 {
115   int i = 0;
116   while (s[i]) i++;
117   return i;
118 }
119
120 int
121 puts (char const* s)
122 {
123   //write (STDOUT, s, strlen (s));
124   //int i = write (STDOUT, s, strlen (s));
125   int i = strlen (s);
126   write (1, s, i);
127   return 0;
128 }
129 #endif
130
131 int
132 main (int argc, char *argv[])
133 {
134   g_stdin = open ("mesmes", 0);
135   int c = getchar ();
136   while (c != -1) {
137     putchar (c);
138     c = getchar ();
139   }
140   return c;
141 }
142
143 #if __GNUC__
144 void
145 _start ()
146 {
147   int r;
148   asm (
149        "mov %%ebp,%%eax\n\t"
150        "addl $8,%%eax\n\t"
151        "push %%eax\n\t"
152
153        "mov %%ebp,%%eax\n\t"
154        "addl $4,%%eax\n\t"
155        "movzbl (%%eax),%%eax\n\t"
156        "push %%eax\n\t"
157
158        "call main\n\t"
159        "movl %%eax,%0\n\t"
160        : "=r" (r)
161        : //no inputs "" (&main)
162        );
163   exit (r);
164 }
165 #endif