core: Add current-output-port, open-output-file, set-current-output-port.
[mes.git] / module / mes / libc-i386.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; This file is part of Mes.
7 ;;;
8 ;;; Mes is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; Mes is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 ;;; Commentary:
22
23 ;;; libc-i386.mes defines C library routines
24
25 ;;; Code:
26
27 (define (i386:exit f g ta t d)
28   '(
29     #x5b                                ; pop    %ebx
30     #x5b                                ; pop    %ebx
31     #xb8 #x01 #x00 #x00 #x00            ; mov    $0x1,%eax
32     #xcd #x80                           ; int    $0x80
33     ))
34
35 (define (i386:read f g ta t d)
36   '(
37     #x55                                ; push   %ebp
38     #x89 #xe5                           ; mov    %esp,%ebp
39
40     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
41     #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
42     #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
43
44     #xb8 #x03 #x00 #x00 #x00            ; mov    $0x3,%eax
45     #xcd #x80                           ; int    $0x80
46
47     #xc9                                ; leave
48     #xc3                                ; ret
49     ))
50
51 (define (i386:write f g ta t d)
52   '(
53     #x55                                ; push   %ebp
54     #x89 #xe5                           ; mov    %esp,%ebp
55
56     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
57     #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
58     #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
59
60     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
61     #xcd #x80                           ; int    $0x80
62
63     #xc9                                ; leave
64     #xc3                                ; ret
65     ))
66
67 (define (i386:open f g ta t d)
68   '(
69     #x55                                ; push   %ebp
70     #x89 #xe5                           ; mov    %esp,%ebp
71
72     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
73     #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
74     #x8b #x55 #x10                      ; mov    0x10(%ebp),%edx
75
76     #xb8 #x05 #x00 #x00 #x00            ; mov    $0x5,%eax
77     #xcd #x80                           ; int    $0x80
78
79     #xc9                                ; leave
80     #xc3                                ; ret
81     ))
82
83 (define (i386:access f g ta t d)
84   '(
85     #x55                                ; push   %ebp
86     #x89 #xe5                           ; mov    %esp,%ebp
87
88     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
89     #x8b #x4d #x0c                      ; mov    0xc(%ebp),%ecx
90
91     #xb8 #x21 #x00 #x00 #x00            ; mov    $0x21,%eax
92     #xcd #x80                           ; int    $0x80
93
94     #xc9                                ; leave
95     #xc3                                ; ret
96     ))
97
98 (define (i386:brk f g ta t d)
99   '(
100     #x55                                ; push   %ebp
101     #x89 #xe5                           ; mov    %esp,%ebp
102
103     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
104     #xb8 #x2d #x00 #x00 #x00            ; mov    $0x2d,%eax
105     #xcd #x80                           ; int    $0x80
106
107     #xc9                                ; leave
108     #xc3                                ; ret
109     ))
110
111 (define (i386:fsync f g ta t d)
112   '(
113     #x55                                ; push   %ebp
114     #x89 #xe5                           ; mov    %esp,%ebp
115
116     #x8b #x5d #x08                      ; mov    0x8(%ebp),%ebx
117     #xb8 #x76 #x00 #x00 #x00            ; mov    $0x76,%eax
118     #xcd #x80                           ; int    $0x80
119
120     #xc9                                ; leave
121     #xc3                                ; ret
122     ))
123
124 (define (i386:_start)
125  (string-append ".byte"
126                 " 0x89 0xe8"      ; mov    %ebp,%eax
127                 " 0x83 0xc0 0x08" ; add    $0x8,%eax
128                 " 0x50"           ; push   %eax
129
130                 " 0x89 0xe8"      ; mov    %ebp,%eax
131                 " 0x83 0xc0 0x04" ; add    $0x4,%eax
132                 " 0x0f 0xb6 0x00" ; movzbl (%eax),%eax
133                 " 0x50"           ; push   %eax
134
135                 " 0x89 0xe8"            ; mov    %ebp,%eax
136                 " 0x83 0xc0 0x04"       ; add    $0x4,%eax
137                 " 0x0f 0xb6 0x00"       ; movzbl (%eax),%eax
138                 " 0x83 0xc0 0x03"       ; add    $0x3,%eax
139                 " 0xc1 0xe0 0x02"       ; shl    $0x2,%eax
140                 " 0x01 0xe8"            ; add    %ebp,%eax
141                 " 0x50"                 ; push   %eax
142                 ))
143
144 (define (i386:va-arg)
145   (string-append ".byte"
146                  " 0x8b 0x45 0xfc" ; mov    -<0x4>(%ebp),%eax :va_arg
147                  " 0xc1 0xe0 0x2"  ; shl    $0x2,%eax
148                  " 0x01 0xe8"      ; add    %ebp,%eax
149                  " 0x83 0xc0 0xc"  ; add    $0xc,%eax
150                  " 0x8b 0x00"      ; mov    (%eax),%eax
151                  " 0x89 0x45 0xf8" ; mov    %eax,-0x8(%ebp) :va
152                  " 0x50"           ; push   %eax
153                 ))
154
155 (define i386:libc
156   (list
157    (cons "exit" (list i386:exit))
158    (cons "read" (list i386:read))
159    (cons "write" (list i386:write))
160    (cons "open" (list i386:open))
161    (cons "access" (list i386:access))
162    (cons "brk" (list i386:brk))
163    (cons "fsync" (list i386:fsync))))