cb3f46a97541dcc9262cbe6604af91a235fe6d30
[mes.git] / module / mes / libc-i386.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016 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 (push-arg o)
28   `(#x68 ,@(int->bv32 o)))              ; push o
29
30 (define (i386:ret)
31   '(
32     #xc3                                ; ret
33     ))
34
35 (define (i386:call address . arguments)
36   (let ((pushes (append-map push-arg arguments)))
37    `(
38      ,@pushes                                         ; push args
39      #xe8 ,@(int->bv32 (- address 5 (length pushes))) ; call relative
40      )))
41   
42 (define (i386:eputs s t d)
43   `(
44     #x5f                                ; pop    %edi
45     #xba #x01 #x00 #x00 #x00            ; mov    0xa,%edx
46     #x59                                ; pop    %ecx
47     #x57                                ; push   %edi
48     #xbb #x02 #x00 #x00 #x00            ; mov    $0x1,%ebx
49     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
50     #xcd #x80                           ; int    $0x80
51     #xc3                                ; ret
52     ))
53
54 (define (i386:exit s t d)
55   `(
56     #x5f                                ; pop    %edi
57     #xb8 #x01 #x00 #x00 #x00            ; mov    $0x1,%eax
58     #xcd #x80                           ; int    $0x80
59     ))
60
61 (define (i386:puts s t d)
62   `(
63     #x5f                                ; pop    %edi
64     #xba #x0a #x00 #x00 #x00            ; mov    0xa,%edx
65     #x59                                ; pop    %ecx
66     #x57                                ; push   %edi
67     #xbb #x01 #x00 #x00 #x00            ; mov    $0x1,%ebx
68     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
69     #xcd #x80                           ; int    $0x80
70     #xc3                                ; ret
71     ))