f3c9731aba1e45a8cdf60658277366e1a0c9329b
[mes.git] / scaffold / micro-mes.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 #define MES_MINI 1
22
23 #if __GNUC__
24 #define  __NYACC__ 0
25 #define NYACC
26 #define NYACC2
27 #else
28 #define  __NYACC__ 1
29 #define NYACC nyacc
30 #define NYACC2 nyacc2
31 #endif
32
33 typedef long size_t;
34 void *malloc (size_t i);
35 int open (char const *s, int mode);
36 int read (int fd, int n);
37 void write (int fd, char const* s, int n);
38
39 #if __GNUC__
40 void
41 exit (int code)
42 {
43   asm (
44        "movl %0, %%ebx\n\t"
45        "movl $1,  %%eax\n\t"
46        "int  $0x80"
47        : // no outputs "=" (r)
48        : "" (code)
49        );
50   // not reached
51   exit (0);
52 }
53
54 int
55 open (char const *s, int mode)
56 {
57   //return syscall (SYS_open, s, mode);
58   return 0;
59 }
60
61 int
62 read (int fd, int n)
63 {
64   //syscall (SYS_read, 1, 1);
65   return 0;
66 }
67
68 void
69 write (int fd, char const* s, int n)
70 {
71   int r;
72   //syscall (SYS_write, fd, s, n));
73   asm (
74        "mov %0, %%ebx\n\t"
75        "mov %1, %%ecx\n\t"
76        "mov %2, %%edx\n\t"
77
78        "mov $0x4, %%eax\n\t"
79        "int $0x80\n\t"
80        : // no outputs "=" (r)
81        : "" (fd), "" (s), "" (n)
82        : "eax", "ebx", "ecx", "edx"
83        );
84 }
85
86 void *
87 malloc (size_t size)
88 {
89   int *n;
90   int len = size + sizeof (size);
91   //n = mmap (0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
92   *n = len;
93   return (void*)(n+1);
94 }
95
96 void
97 free (void *p)
98 {
99   int *n = (int*)p-1;
100   //munmap ((void*)p, *n);
101 }
102 #endif
103
104 #define EOF -1
105 #define STDIN 0
106 #define STDOUT 1
107 #define STDERR 2
108
109 //#include <stdio.h>
110 //#include <string.h>
111 //#include <stdlib.h>
112
113 int g_stdin;
114
115 #if __GNUC__
116 size_t
117 strlen (char const* s)
118 {
119   int i = 0;
120   while (s[i]) i++;
121   return i;
122 }
123
124 int
125 strcmp (char const* a, char const* b)
126 {
127   while (*a && *b && *a == *b) {*a++;b++;}
128   return *a == *b;
129 }
130
131 int
132 getc ()
133 {
134   return read (g_stdin, 1);
135 }
136
137 int
138 puts (char const* s)
139 {
140   write (STDOUT, s, strlen (s));
141   return 0;
142 }
143
144 int
145 eputs (char const* s)
146 {
147   write (STDERR, s, strlen (s));
148   return 0;
149 }
150
151 int g_a;
152 int g_b;
153
154 #if 0
155 void
156 eputs2 (char const* s, int a)
157 {
158   g_a = a;
159   write (STDERR, s, strlen (s));
160   //return 0;
161 }
162
163 void
164 eputs3 (char const* s, int a, int b)
165 {
166   g_a = a;
167   g_b = b;
168   write (STDERR, s, strlen (s));
169   //return 0;
170 }
171
172 char const*
173 itoa (int x)
174 {
175   static char buf[10];
176   char *p = buf+9;
177   *p-- = 0;
178
179   int sign = x < 0;
180   if (sign)
181     x = -x;
182   
183   do
184     {
185       *p-- = '0' + (x % 10);
186       x = x / 10;
187     } while (x);
188
189   if (sign)
190     *p-- = '-';
191
192   return p+1;
193 }
194 #endif
195
196 void
197 assert_fail (char* s)
198 {
199   eputs ("assert fail:");
200   eputs (s);
201   eputs ("\n");
202   *((int*)0) = 0;
203 }
204
205 #endif
206
207 #define assert(x) ((x) ? (void)0 : assert_fail(#x))
208 #define false 0
209 #define true 1
210 typedef int bool;
211
212 int
213 main (int argc, char *argv[])
214 {
215   puts ("Hello main!\n");
216   eputs ("Strlen...\n");
217   puts ("Bye micro\n");
218   int i = strlen ("02013");
219   return i;
220 }
221
222 #if __GNUC__
223 // int
224 // test1()
225 // {
226 //   return 9;
227 // }
228
229 // void
230 // test()
231 // {
232 //   int r;
233 //   r=7;
234 //   r=test1();
235 // }
236
237 void
238 _start ()
239 {
240   puts ("Hello micro-mes!\n");
241   int i;
242   i = main (0,0);
243   // asm (
244   //      "push $0\n\t"
245   //      "push $0\n\t"
246   //      "call main\n\t"
247   //      "movl %%eax,%0\n\t"
248   //      : "=r" (r)
249   //      : //no inputs "" (&main)
250   //      );
251   exit (i);
252 }
253 #endif