-### Mes --- Maxwell Equations of Software
-### Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+### GNU Mes --- Maxwell Equations of Software
+### Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
###
-### This file is part of Mes.
+### This file is part of GNU Mes.
###
### Mes 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# either version 3 of the License, or (at
### your option) any later version.
###
-### Mes is distributed in the hope that it will be useful, but
+### GNU Mes is distributed in the hope that it will be useful, but
### WITHOUT ANY WARRANTY# without even the implied warranty of
### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
### GNU General Public License for more details.
###
### You should have received a copy of the GNU General Public License
-### along with Mes. If not, see <http://www.gnu.org/licenses/>.
+### along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
+# reduced instruction set: eax, ebx (some ecx for shift, edx for mul, div)
+# 185 instructions
DEFINE add____$i32,%eax 05
-DEFINE add____$i32,%ecx 81c1
-DEFINE add____$i32,%edx 81c2
+DEFINE add____$i32,%ebx 81c3
DEFINE add____$i32,(%eax) 8100
+DEFINE add____$i32,(%ebx) 8103
DEFINE add____$i32,0x32(%eax) 8180
DEFINE add____$i32,0x32(%ebp) 8185
DEFINE add____$i8,%eax 83c0
-DEFINE add____$i8,%edx 83c2
+DEFINE add____$i8,%ebx 83c3
DEFINE add____$i8,%esp 83c4
DEFINE add____$i8,(%eax) 8300
+DEFINE add____$i8,(%ebx) 8303
DEFINE add____$i8,0x32 8305
DEFINE add____$i8,0x32(%eax) 8380
-DEFINE add____$i8,0x32(%eax) 8380
DEFINE add____$i8,0x32(%ebp) 8385
DEFINE add____$i8,0x8(%eax) 8340
DEFINE add____$i8,0x8(%ebp) 8345
DEFINE add____%eax,%eax 01c0
DEFINE add____%ebp,%eax 01e8
-DEFINE add____%edx,%eax 01d0
-DEFINE add____%edx,%eax 01d0
+DEFINE add____%ebx,%eax 01d8
+DEFINE add____%ebx,%ebx 01db
+DEFINE addb___$i8,(%eax) 8000
+DEFINE addb___$i8,(%ebx) 8003
+DEFINE addw___$i8,(%eax) 668100
+DEFINE addw___$i8,(%ebx) 668103
DEFINE and____$i32,%eax 25
-DEFINE and____%edx,%eax 21d0
-DEFINE and____(%edx),%eax 2302
+DEFINE and____$i32,%ebx 81e3
+DEFINE and____%ebx,%eax 21d8
DEFINE call32 e8
DEFINE call___*%eax ffd0
+DEFINE call___*%ebx ffd3
+DEFINE cltd 99
DEFINE cmp____$0x32,%eax 3d
DEFINE cmp____$i32,%eax 3d
-DEFINE cmp____$i32,0x32(%ebp) 81bd
-DEFINE cmp____$i32,0x8(%ebp) 817d
DEFINE cmp____$i8,%eax 83f8
-DEFINE cmp____$i8,0x32(%ebp) 83bd
-DEFINE cmp____$i8,0x8(%ebp) 837d
-DEFINE cmp____%al,%dl 38c2
-DEFINE cmp____%edx,%eax 39d0
DEFINE hlt f4
DEFINE idiv___%ebx f7fb
DEFINE int cd
DEFINE jne32 0f85
DEFINE lahf 9f
DEFINE lea____0x32(%ebp),%eax 8d85
-DEFINE lea____0x32(%ebp),%edx 8d95
DEFINE lea____0x8(%ebp),%eax 8d45
-DEFINE lea____0x8(%ebp),%edx 8d55
DEFINE leave c9
DEFINE mov____$i32,%eax b8
DEFINE mov____$i32,%ebx bb
-DEFINE mov____$i32,%ecx b9
-DEFINE mov____$i32,%edx ba
DEFINE mov____$i32,(%eax) c700
DEFINE mov____$i32,0x32 c705
DEFINE mov____$i32,0x8(%eax) c740
DEFINE mov____$i32,0x8(%ebp) c745
-DEFINE mov____%al,(%edx) 8802
-DEFINE mov____%al,0x8(%edx) 8842
-DEFINE mov____%ax,(%edx) 668902
-DEFINE mov____%ax,0x32(%edx) 668982
-DEFINE mov____%ax,0x8(%edx) 668942
+DEFINE mov____%al,(%ebx) 8803
+DEFINE mov____%al,0x8(%ebp) 8845
+DEFINE mov____%ax,(%ebx) 668903
+DEFINE mov____%ax,0x8(%ebp) 668945
DEFINE mov____%dl,(%eax) 8810
DEFINE mov____%dl,0x8(%eax) 8850
DEFINE mov____%eax,%ebx 89c3
-DEFINE mov____%eax,%edx 89c2
-DEFINE mov____%eax,(%ecx) 8901
-DEFINE mov____%eax,(%edx) 8902
+DEFINE mov____%eax,%ecx 89c1
+DEFINE mov____%eax,(%ebx) 8903
DEFINE mov____%eax,0x32 a3
DEFINE mov____%eax,0x32(%ebp) 8985
-DEFINE mov____%eax,0x32(%edx) 8982
DEFINE mov____%eax,0x8(%ebp) 8945
-DEFINE mov____%eax,0x8(%edx) 8942
DEFINE mov____%ebp,%eax 89e8
-DEFINE mov____%ebp,%ecx 89e9
-DEFINE mov____%ebp,%edx 89ea
+DEFINE mov____%ebp,%ebx 89eb
+DEFINE mov____%ebx,%eax 89d8
+DEFINE mov____%ebx,%ecx 89d9
DEFINE mov____%ebx,0x32 891d
DEFINE mov____%ebx,0x32(%ebp) 899d
DEFINE mov____%ebx,0x8(%ebp) 895d
-DEFINE mov____%ebx,0x8(%edx) 895a
-DEFINE mov____%ecx,(%eax) 8908
-DEFINE mov____%ecx,(%edx) 890a
-DEFINE mov____%ecx,0x32(%ebp) 898d
-DEFINE mov____%ecx,0x8(%ebp) 894d
+DEFINE mov____%ecx,(%ebx) 890b
DEFINE mov____%edx,%eax 89d0
DEFINE mov____%edx,%ebx 89d3
-DEFINE mov____%edx,%ecx 89d1
-DEFINE mov____%edx,(%eax) 8910
-DEFINE mov____%edx,0x32(%ebp) 8995
-DEFINE mov____%edx,0x8(%ebp) 8955
DEFINE mov____%esp,%ebp 89e5
DEFINE mov____(%eax),%eax 8b00
DEFINE mov____(%eax),%ecx 8b08
-DEFINE mov____(%edx),%eax 8b02
-DEFINE mov____(%edx),%ecx 8b0a
-DEFINE mov____(%edx),%edx 8b12
+DEFINE mov____(%ebx),%ebx 8b1b
DEFINE mov____0x32(%eax),%eax 8b80
DEFINE mov____0x32(%eax),%ebx 8b98
-DEFINE mov____0x32(%eax),%ecx 8b88
-DEFINE mov____0x32(%ebp),%eax 8b85
DEFINE mov____0x32(%ebp),%eax 8b85
DEFINE mov____0x32(%ebp),%ebx 8b9d
-DEFINE mov____0x32(%ebp),%ecx 8b8d
-DEFINE mov____0x32(%ebp),%edx 8b95
-DEFINE mov____0x32(%ebp),%edx 8b95
DEFINE mov____0x32,%eax a1
-DEFINE mov____0x32,%edx 8b15
+DEFINE mov____0x32,%ebx 8b1d
DEFINE mov____0x8(%eax),%eax 8b40
DEFINE mov____0x8(%eax),%ebx 8b58
-DEFINE mov____0x8(%eax),%ecx 8b48
DEFINE mov____0x8(%ebp),%eax 8b45
DEFINE mov____0x8(%ebp),%ebp 8b6d
DEFINE mov____0x8(%ebp),%ebx 8b5d
DEFINE mov____0x8(%ebp),%ecx 8b4d
+DEFINE mov____0x8(%ebp),%edi 8b7d
DEFINE mov____0x8(%ebp),%edx 8b55
+DEFINE mov____0x8(%ebp),%esi 8b75
DEFINE mov____0x8(%ebp),%esp 8b65
+DEFINE movb___%al,0x32 a2
DEFINE movsbl_%al,%eax 0fbec0
+DEFINE movsbl_%bl,%ebx 0fbedb
DEFINE movswl_%ax,%eax 0fbfc0
+DEFINE movswl_%bx,%ebx 0fbfdb
+DEFINE movw___%ax,0x32 66a3
DEFINE movzbl_%al,%eax 0fb6c0
-DEFINE movzbl_%al,%eax 0fb6c0
-DEFINE movzbl_%dl,%edx 0fb6d2
+DEFINE movzbl_%bl,%ebx 0fb6db
+DEFINE movzbl_%bl,%ebx 0fb6db
DEFINE movzbl_(%eax),%eax 0fb600
-DEFINE movzbl_(%eax),%edx 0fb610
-DEFINE movzbl_(%edx),%edx 0fb612
+DEFINE movzbl_(%ebx),%ebx 0fb61b
DEFINE movzbl_0x32(%eax),%eax 0fb680
DEFINE movzbl_0x8(%eax),%eax 0fb640
DEFINE movzbl_0x8(%ebp),%eax 0fb645
DEFINE movzwl_%ax,%eax 0fb7c0
+DEFINE movzwl_%bx,%ebx 0fb7db
DEFINE movzwl_(%eax),%eax 0fb700
+DEFINE movzwl_(%ebx),%ebx 0fb71b
DEFINE movzwl_0x32(%eax),%eax 0fb780
DEFINE movzwl_0x32(%ebp),%eax 0fb785
DEFINE movzwl_0x8(%eax),%eax 0fb740
-DEFINE mul____%edx f7e2
+DEFINE mul____%ebx f7e3
+DEFINE mul_____%ebx f7e3
DEFINE nop 90
DEFINE not____%eax f7d0
-DEFINE or_____%edx,%eax 09d0
-DEFINE or_____(%edx),%eax 0b02
+DEFINE not____%ebx f7d3
+DEFINE or_____%ebx,%eax 09d8
DEFINE pop____%eax 58
+DEFINE pop____%ebx 5b
DEFINE pop____%edx 5a
DEFINE push___$i32 68
DEFINE push___%eax 50
DEFINE push___%ebp 55
+DEFINE push___%ebx 53
DEFINE push___%edx 52
DEFINE push___(%eax) ff30
DEFINE push___0x32(%ebp) ffb5
DEFINE ret c3
DEFINE sahf 9e
DEFINE seta___%al 0f97c0
+DEFINE seta___%bl 0f97c3
DEFINE setae__%al 0f93c0
+DEFINE setae__%bl 0f93c3
DEFINE setb___%al 0f92c0
+DEFINE setb___%bl 0f92c3
DEFINE setbe__%al 0f96c0
+DEFINE setbe__%bl 0f96c3
DEFINE sete___%al 0f94c0
+DEFINE sete___%bl 0f94c3
DEFINE setg___%al 0f9fc0
+DEFINE setg___%bl 0f9fc3
DEFINE setge__%al 0f9dc0
+DEFINE setge__%bl 0f9dc3
DEFINE setl___%al 0f9cc0
+DEFINE setl___%bl 0f9cc3
DEFINE setle__%al 0f9ec0
+DEFINE setle__%bl 0f9ec3
DEFINE setne__%al 0f95c0
+DEFINE setne__%bl 0f95c3
DEFINE shl____$i8,%eax c1e0
+DEFINE shl____$i8,%ebx c1e3
DEFINE shl____%cl,%eax d3e0
+DEFINE shl____%cl,%ebx d3e3
DEFINE shr____%cl,%eax d3e8
+DEFINE sub____$8,%esp 83ec
+DEFINE sub____$i32,%esp 81ec
DEFINE sub____%al,%dl 28d0
DEFINE sub____%dl,%al 28c2
-DEFINE sub____%eax,%edx 29c2
-DEFINE sub____%edx,%eax 29d0
-DEFINE sub____%edx,%eax 29d0
-DEFINE sub____%esp,$i32 81ec
-DEFINE sub____%esp,$i8 83ec
+DEFINE sub____%ebx,%eax 29d8
DEFINE test___%al,%al 84c0
DEFINE test___%eax,%eax 85c0
+DEFINE test___%ebx,%ebx 85db
+DEFINE xchg___%eax,%ebx 93
+DEFINE xchg___%eax,(%esp) 870424
DEFINE xchg___%eax,(%esp) 870424
+DEFINE xchg___%ebx,(%esp) 871c24
DEFINE xor____$i32,%eax 35
DEFINE xor____$i8,%ah 80f4
DEFINE xor____%eax,%eax 31c0
+DEFINE xor____%ebx,%eax 31d8
DEFINE xor____%ebx,%ebx 31db
-DEFINE xor____%ecx,%ecx 31c9
-DEFINE xor____%edx,%eax 31d0
DEFINE xor____%edx,%edx 31d2
-# Deprecated. Remove after 0.14 release.
-DEFINE mov____%al,0x32(%ebp) 8885
-DEFINE mov____%al,0x8(%ebp) 8845
-DEFINE mov____%ax,0x32(%ebp) 668985
-DEFINE mov____%ax,0x8(%ebp) 668945
-DEFINE movzbl_0x32(%ebp),%eax 0fb685
-DEFINE movzbl_0x8(%ebp),%edx 0fb655
-DEFINE movzwl_0x8(%ebp),%eax 0fb745
-DEFINE movzwl_0x8(%ebp),%eax 0fb745
+
+# Enough for all of Mes + Mes C Libray when using all registers, i.e.,
+# non-reduced instruction set
+#DEFINE add____$i32,%ecx 81c1
+#DEFINE add____$i32,%edx 81c2
+#DEFINE add____$i32,%esi 81c6
+#DEFINE add____$i8,%ecx 83c1
+#DEFINE add____$i8,%edx 83c2
+#DEFINE add____$i8,%esi 83c6
+#DEFINE add____$i8,(%ecx) 8301
+#DEFINE add____$i8,(%edx) 8302
+#DEFINE add____%ecx,%ebx 01cb
+#DEFINE add____%ecx,%ecx 01c9
+#DEFINE add____%edx,%eax 01d0
+#DEFINE add____%edx,%ecx 01d1
+#DEFINE add____%edx,%edx 01d2
+#DEFINE add____%esi,%edx 01f2
+#DEFINE and____$i32,%ecx 81e1
+#DEFINE and____$i32,%edx 81e2
+#DEFINE and____%edx,%eax 21d0
+#DEFINE and____(%edx),%eax 2302
+#DEFINE cmp____%edx,%eax 39d0
+#DEFINE idiv___%ecx f7f9
+#DEFINE lea____0x32(%ebp),%edx 8d95
+#DEFINE lea____0x8(%ebp),%edx 8d55
+#DEFINE mov____$i32,%ecx b9
+#DEFINE mov____$i32,%edx ba
+#DEFINE mov____$i32,%esi be
+#DEFINE mov____%al,(%edx) 8802
+#DEFINE mov____%al,0x8(%edx) 8842
+#DEFINE mov____%ax,(%edx) 668902
+#DEFINE mov____%ax,0x32(%edx) 668982
+#DEFINE mov____%ax,0x8(%edx) 668942
+#DEFINE mov____%bl,(%ecx) 8819
+#DEFINE mov____%eax,%edx 89c2
+#DEFINE mov____%eax,%esi 89c6
+#DEFINE mov____%eax,(%ecx) 8901
+#DEFINE mov____%eax,(%edx) 8902
+#DEFINE mov____%eax,0x32(%edx) 8982
+#DEFINE mov____%eax,0x8(%edx) 8942
+#DEFINE mov____%ebp,%ecx 89e9
+#DEFINE mov____%ebp,%edx 89ea
+#DEFINE mov____%ebp,%esi 89ee
+#DEFINE mov____%ebx,(%ecx) 8919
+#DEFINE mov____%ebx,0x8(%edx) 895a
+#DEFINE mov____%ecx,%eax 89c8
+#DEFINE mov____%ecx,%ecx 89c9
+#DEFINE mov____%ecx,%edx 89ca
+#DEFINE mov____%ecx,(%eax) 8908
+#DEFINE mov____%ecx,(%edx) 890a
+#DEFINE mov____%ecx,0x32(%ebp) 898d
+#DEFINE mov____%ecx,0x8(%ebp) 894d
+#DEFINE mov____%edi,%ebx 89fb
+#DEFINE mov____%edx,%ecx 89d1
+#DEFINE mov____%edx,(%eax) 8910
+#DEFINE mov____%edx,0x32(%ebp) 8995
+#DEFINE mov____%edx,0x8(%ebp) 8955
+#DEFINE mov____%esi,%eax 89f0
+#DEFINE mov____%esi,%ebx 89f3
+#DEFINE mov____(%ecx),%ecx 8b09
+#DEFINE mov____(%edx),%eax 8b02
+#DEFINE mov____(%edx),%ecx 8b0a
+#DEFINE mov____(%edx),%edx 8b12
+#DEFINE mov____0x32(%eax),%ecx 8b88
+#DEFINE mov____0x32(%ebp),%ecx 8b8d
+#DEFINE mov____0x32(%ebp),%edx 8b95
+#DEFINE mov____0x32,%ecx 8b0d
+#DEFINE mov____0x32,%edx 8b15
+#DEFINE mov____0x8(%eax),%ecx 8b48
+#DEFINE movsbl_%cl,%ecx 0fbec9
+#DEFINE movsbl_%dl,%edx 0fbed2
+#DEFINE movswl_%cx,%ecx 0fbfc9
+#DEFINE movzbl_%cl,%ecx 0fb6c9
+#DEFINE movzbl_%dl,%edx 0fb6d2
+#DEFINE movzbl_(%eax),%edx 0fb610
+#DEFINE movzbl_(%ecx),%ecx 0fb609
+#DEFINE movzbl_(%edx),%edx 0fb612
+#DEFINE movzwl_(%ecx),%ecx 0fb709
+#DEFINE mul____%ecx f7e1
+#DEFINE mul____%edi f7e7
+#DEFINE mul____%edx f7e2
+#DEFINE mul____%esi f7e6
+#DEFINE or_____%ecx,%ebx 09cb
+#DEFINE or_____%edx,%eax 09d0
+#DEFINE or_____(%edx),%eax 0b02
+#DEFINE pop____%ecx 59
+#DEFINE pop____%edi 5f
+#DEFINE push___%ecx 51
+#DEFINE push___%edi 57
+#DEFINE push___%esi 56
+#DEFINE shl____$i8,%ecx c1e1
+#DEFINE shl____$i8,%edx c1e2
+#DEFINE shl____%cl,%ecx d3e1
+#DEFINE sub____%eax,%edx 29c2
+#DEFINE sub____%ecx,%ebx 29cb
+#DEFINE sub____%edx,%eax 29d0
+#DEFINE sub____%edx,%ecx 29d1
+#DEFINE xchg___%ebx,%ecx 87d9
+#DEFINE xchg___%ecx,%edx 87ca
+#DEFINE xor____%ecx,%ecx 31c9
+#DEFINE xor____%edx,%eax 31d0
+
+
+# deprecated, remove after 0.18
+DEFINE sub____%esp,$i32 81ec
+DEFINE sub____%esp,$i8 83ec
DEFINE SYS_exit 01000000
DEFINE SYS_fork 02000000
DEFINE SYS_access 21000000
DEFINE SYS_brk 2d000000
DEFINE SYS_ioctl 36000000
+DEFINE SYS_stat 6a000000
DEFINE SYS_fsync 76000000
DEFINE SYS_getcwd b7000000