diff --git a/programs/cpuid/no.sources b/programs/cpuid/no.sources deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/programs/3dcube2/trunk/3DCUBE2.ASM b/programs/demos/3dcube2/trunk/3DCUBE2.ASM similarity index 100% rename from programs/3dcube2/trunk/3DCUBE2.ASM rename to programs/demos/3dcube2/trunk/3DCUBE2.ASM diff --git a/programs/3dcube2/trunk/ascgl.inc b/programs/demos/3dcube2/trunk/ascgl.inc similarity index 100% rename from programs/3dcube2/trunk/ascgl.inc rename to programs/demos/3dcube2/trunk/ascgl.inc diff --git a/programs/3dcube2/trunk/ascl.inc b/programs/demos/3dcube2/trunk/ascl.inc similarity index 100% rename from programs/3dcube2/trunk/ascl.inc rename to programs/demos/3dcube2/trunk/ascl.inc diff --git a/programs/3dcube2/trunk/build_en.bat b/programs/demos/3dcube2/trunk/build_en.bat similarity index 100% rename from programs/3dcube2/trunk/build_en.bat rename to programs/demos/3dcube2/trunk/build_en.bat diff --git a/programs/3dcube2/trunk/build_ru.bat b/programs/demos/3dcube2/trunk/build_ru.bat similarity index 100% rename from programs/3dcube2/trunk/build_ru.bat rename to programs/demos/3dcube2/trunk/build_ru.bat diff --git a/programs/3dcube2/trunk/macros.inc b/programs/demos/3dcube2/trunk/macros.inc similarity index 100% rename from programs/3dcube2/trunk/macros.inc rename to programs/demos/3dcube2/trunk/macros.inc diff --git a/programs/3detx60b/trunk/3DETX60B.ASM b/programs/demos/3detx60b/trunk/3DETX60B.ASM similarity index 100% rename from programs/3detx60b/trunk/3DETX60B.ASM rename to programs/demos/3detx60b/trunk/3DETX60B.ASM diff --git a/programs/3detx60b/trunk/ascgl.inc b/programs/demos/3detx60b/trunk/ascgl.inc similarity index 100% rename from programs/3detx60b/trunk/ascgl.inc rename to programs/demos/3detx60b/trunk/ascgl.inc diff --git a/programs/3detx60b/trunk/ascl.inc b/programs/demos/3detx60b/trunk/ascl.inc similarity index 100% rename from programs/3detx60b/trunk/ascl.inc rename to programs/demos/3detx60b/trunk/ascl.inc diff --git a/programs/3detx60b/trunk/build_en.bat b/programs/demos/3detx60b/trunk/build_en.bat similarity index 100% rename from programs/3detx60b/trunk/build_en.bat rename to programs/demos/3detx60b/trunk/build_en.bat diff --git a/programs/3detx60b/trunk/build_ru.bat b/programs/demos/3detx60b/trunk/build_ru.bat similarity index 100% rename from programs/3detx60b/trunk/build_ru.bat rename to programs/demos/3detx60b/trunk/build_ru.bat diff --git a/programs/3detx60b/trunk/map.gif b/programs/demos/3detx60b/trunk/map.gif similarity index 100% rename from programs/3detx60b/trunk/map.gif rename to programs/demos/3detx60b/trunk/map.gif diff --git a/programs/3detx60b/trunk/texmap.bmp b/programs/demos/3detx60b/trunk/texmap.bmp similarity index 100% rename from programs/3detx60b/trunk/texmap.bmp rename to programs/demos/3detx60b/trunk/texmap.bmp diff --git a/programs/3detx60b/trunk/texpack.gif b/programs/demos/3detx60b/trunk/texpack.gif similarity index 100% rename from programs/3detx60b/trunk/texpack.gif rename to programs/demos/3detx60b/trunk/texpack.gif diff --git a/programs/3dtcub10/trunk/3DTCUB10.ASM b/programs/demos/3dtcub10/trunk/3DTCUB10.ASM similarity index 100% rename from programs/3dtcub10/trunk/3DTCUB10.ASM rename to programs/demos/3dtcub10/trunk/3DTCUB10.ASM diff --git a/programs/3dtcub10/trunk/build_en.bat b/programs/demos/3dtcub10/trunk/build_en.bat similarity index 100% rename from programs/3dtcub10/trunk/build_en.bat rename to programs/demos/3dtcub10/trunk/build_en.bat diff --git a/programs/3dtcub10/trunk/build_ru.bat b/programs/demos/3dtcub10/trunk/build_ru.bat similarity index 100% rename from programs/3dtcub10/trunk/build_ru.bat rename to programs/demos/3dtcub10/trunk/build_ru.bat diff --git a/programs/3dtcub10/trunk/texture.raw b/programs/demos/3dtcub10/trunk/texture.raw similarity index 100% rename from programs/3dtcub10/trunk/texture.raw rename to programs/demos/3dtcub10/trunk/texture.raw diff --git a/programs/aclock/trunk/Readme.txt b/programs/demos/aclock/trunk/Readme.txt similarity index 100% rename from programs/aclock/trunk/Readme.txt rename to programs/demos/aclock/trunk/Readme.txt diff --git a/programs/aclock/trunk/aclock.asm b/programs/demos/aclock/trunk/aclock.asm similarity index 100% rename from programs/aclock/trunk/aclock.asm rename to programs/demos/aclock/trunk/aclock.asm diff --git a/programs/aclock/trunk/aclock.bmp b/programs/demos/aclock/trunk/aclock.bmp similarity index 100% rename from programs/aclock/trunk/aclock.bmp rename to programs/demos/aclock/trunk/aclock.bmp diff --git a/programs/aclock/trunk/adjstwnd.inc b/programs/demos/aclock/trunk/adjstwnd.inc similarity index 100% rename from programs/aclock/trunk/adjstwnd.inc rename to programs/demos/aclock/trunk/adjstwnd.inc diff --git a/programs/aclock/trunk/cmdline.inc b/programs/demos/aclock/trunk/cmdline.inc similarity index 100% rename from programs/aclock/trunk/cmdline.inc rename to programs/demos/aclock/trunk/cmdline.inc diff --git a/programs/aclock/trunk/dbgboard.inc b/programs/demos/aclock/trunk/dbgboard.inc similarity index 100% rename from programs/aclock/trunk/dbgboard.inc rename to programs/demos/aclock/trunk/dbgboard.inc diff --git a/programs/aclock/trunk/draw.inc b/programs/demos/aclock/trunk/draw.inc similarity index 100% rename from programs/aclock/trunk/draw.inc rename to programs/demos/aclock/trunk/draw.inc diff --git a/programs/aclock/trunk/make.bat b/programs/demos/aclock/trunk/make.bat similarity index 100% rename from programs/aclock/trunk/make.bat rename to programs/demos/aclock/trunk/make.bat diff --git a/programs/aclock/trunk/mos.inc b/programs/demos/aclock/trunk/mos.inc similarity index 100% rename from programs/aclock/trunk/mos.inc rename to programs/demos/aclock/trunk/mos.inc diff --git a/programs/aclock/trunk/str2dwrd.inc b/programs/demos/aclock/trunk/str2dwrd.inc similarity index 100% rename from programs/aclock/trunk/str2dwrd.inc rename to programs/demos/aclock/trunk/str2dwrd.inc diff --git a/programs/aclock/trunk/strlen.inc b/programs/demos/aclock/trunk/strlen.inc similarity index 100% rename from programs/aclock/trunk/strlen.inc rename to programs/demos/aclock/trunk/strlen.inc diff --git a/programs/aclock/trunk/strtok.inc b/programs/demos/aclock/trunk/strtok.inc similarity index 100% rename from programs/aclock/trunk/strtok.inc rename to programs/demos/aclock/trunk/strtok.inc diff --git a/programs/bcdclk/bcdclk/bcdclk.asm b/programs/demos/bcdclk/bcdclk/bcdclk.asm similarity index 100% rename from programs/bcdclk/bcdclk/bcdclk.asm rename to programs/demos/bcdclk/bcdclk/bcdclk.asm diff --git a/programs/bcdclk/bcdclk/build_en.bat b/programs/demos/bcdclk/bcdclk/build_en.bat similarity index 100% rename from programs/bcdclk/bcdclk/build_en.bat rename to programs/demos/bcdclk/bcdclk/build_en.bat diff --git a/programs/bcdclk/bcdclk/build_ru.bat b/programs/demos/bcdclk/bcdclk/build_ru.bat similarity index 100% rename from programs/bcdclk/bcdclk/build_ru.bat rename to programs/demos/bcdclk/bcdclk/build_ru.bat diff --git a/programs/15/trunk/macros.inc b/programs/demos/bcdclk/bcdclk/macros.inc similarity index 100% rename from programs/15/trunk/macros.inc rename to programs/demos/bcdclk/bcdclk/macros.inc diff --git a/programs/bgitest/trunk/FONTS/EURO.CHR b/programs/demos/bgitest/trunk/FONTS/EURO.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/EURO.CHR rename to programs/demos/bgitest/trunk/FONTS/EURO.CHR diff --git a/programs/bgitest/trunk/FONTS/GOTH.CHR b/programs/demos/bgitest/trunk/FONTS/GOTH.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/GOTH.CHR rename to programs/demos/bgitest/trunk/FONTS/GOTH.CHR diff --git a/programs/bgitest/trunk/FONTS/LCOM.CHR b/programs/demos/bgitest/trunk/FONTS/LCOM.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/LCOM.CHR rename to programs/demos/bgitest/trunk/FONTS/LCOM.CHR diff --git a/programs/bgitest/trunk/FONTS/LITT.CHR b/programs/demos/bgitest/trunk/FONTS/LITT.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/LITT.CHR rename to programs/demos/bgitest/trunk/FONTS/LITT.CHR diff --git a/programs/bgitest/trunk/FONTS/SANS.CHR b/programs/demos/bgitest/trunk/FONTS/SANS.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/SANS.CHR rename to programs/demos/bgitest/trunk/FONTS/SANS.CHR diff --git a/programs/bgitest/trunk/FONTS/SCRI.CHR b/programs/demos/bgitest/trunk/FONTS/SCRI.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/SCRI.CHR rename to programs/demos/bgitest/trunk/FONTS/SCRI.CHR diff --git a/programs/bgitest/trunk/FONTS/SIMP.CHR b/programs/demos/bgitest/trunk/FONTS/SIMP.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/SIMP.CHR rename to programs/demos/bgitest/trunk/FONTS/SIMP.CHR diff --git a/programs/bgitest/trunk/FONTS/SMAL.CHR b/programs/demos/bgitest/trunk/FONTS/SMAL.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/SMAL.CHR rename to programs/demos/bgitest/trunk/FONTS/SMAL.CHR diff --git a/programs/bgitest/trunk/FONTS/TRIP.CHR b/programs/demos/bgitest/trunk/FONTS/TRIP.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/TRIP.CHR rename to programs/demos/bgitest/trunk/FONTS/TRIP.CHR diff --git a/programs/bgitest/trunk/FONTS/TSCR.CHR b/programs/demos/bgitest/trunk/FONTS/TSCR.CHR similarity index 100% rename from programs/bgitest/trunk/FONTS/TSCR.CHR rename to programs/demos/bgitest/trunk/FONTS/TSCR.CHR diff --git a/programs/bgitest/trunk/bgifont.inc b/programs/demos/bgitest/trunk/bgifont.inc similarity index 100% rename from programs/bgitest/trunk/bgifont.inc rename to programs/demos/bgitest/trunk/bgifont.inc diff --git a/programs/bgitest/trunk/bgitest.asm b/programs/demos/bgitest/trunk/bgitest.asm similarity index 100% rename from programs/bgitest/trunk/bgitest.asm rename to programs/demos/bgitest/trunk/bgitest.asm diff --git a/programs/bgitest/trunk/build_en.bat b/programs/demos/bgitest/trunk/build_en.bat similarity index 100% rename from programs/bgitest/trunk/build_en.bat rename to programs/demos/bgitest/trunk/build_en.bat diff --git a/programs/bgitest/trunk/build_ru.bat b/programs/demos/bgitest/trunk/build_ru.bat similarity index 100% rename from programs/bgitest/trunk/build_ru.bat rename to programs/demos/bgitest/trunk/build_ru.bat diff --git a/programs/bgitest/trunk/macros.inc b/programs/demos/bgitest/trunk/macros.inc similarity index 100% rename from programs/bgitest/trunk/macros.inc rename to programs/demos/bgitest/trunk/macros.inc diff --git a/programs/bgitest/trunk/read_eng.txt b/programs/demos/bgitest/trunk/read_eng.txt similarity index 100% rename from programs/bgitest/trunk/read_eng.txt rename to programs/demos/bgitest/trunk/read_eng.txt diff --git a/programs/bgitest/trunk/read_rus.txt b/programs/demos/bgitest/trunk/read_rus.txt similarity index 100% rename from programs/bgitest/trunk/read_rus.txt rename to programs/demos/bgitest/trunk/read_rus.txt diff --git a/programs/colorref/trunk/build_en.bat b/programs/demos/colorref/trunk/build_en.bat similarity index 100% rename from programs/colorref/trunk/build_en.bat rename to programs/demos/colorref/trunk/build_en.bat diff --git a/programs/colorref/trunk/build_ru.bat b/programs/demos/colorref/trunk/build_ru.bat similarity index 100% rename from programs/colorref/trunk/build_ru.bat rename to programs/demos/colorref/trunk/build_ru.bat diff --git a/programs/colorref/trunk/colorref.asm b/programs/demos/colorref/trunk/colorref.asm similarity index 100% rename from programs/colorref/trunk/colorref.asm rename to programs/demos/colorref/trunk/colorref.asm diff --git a/programs/colors/trunk/build_en.bat b/programs/demos/colors/trunk/build_en.bat similarity index 100% rename from programs/colors/trunk/build_en.bat rename to programs/demos/colors/trunk/build_en.bat diff --git a/programs/colors/trunk/build_ru.bat b/programs/demos/colors/trunk/build_ru.bat similarity index 100% rename from programs/colors/trunk/build_ru.bat rename to programs/demos/colors/trunk/build_ru.bat diff --git a/programs/colors/trunk/colors.asm b/programs/demos/colors/trunk/colors.asm similarity index 100% rename from programs/colors/trunk/colors.asm rename to programs/demos/colors/trunk/colors.asm diff --git a/programs/ac97wav/trunk/macros.inc b/programs/demos/colors/trunk/macros.inc similarity index 100% rename from programs/ac97wav/trunk/macros.inc rename to programs/demos/colors/trunk/macros.inc diff --git a/programs/crownscr/trunk/build_en.bat b/programs/demos/crownscr/trunk/build_en.bat similarity index 100% rename from programs/crownscr/trunk/build_en.bat rename to programs/demos/crownscr/trunk/build_en.bat diff --git a/programs/crownscr/trunk/build_ru.bat b/programs/demos/crownscr/trunk/build_ru.bat similarity index 100% rename from programs/crownscr/trunk/build_ru.bat rename to programs/demos/crownscr/trunk/build_ru.bat diff --git a/programs/crownscr/trunk/crownscr.asm b/programs/demos/crownscr/trunk/crownscr.asm similarity index 100% rename from programs/crownscr/trunk/crownscr.asm rename to programs/demos/crownscr/trunk/crownscr.asm diff --git a/programs/crownscr/trunk/figuresi.inc b/programs/demos/crownscr/trunk/figuresi.inc similarity index 100% rename from programs/crownscr/trunk/figuresi.inc rename to programs/demos/crownscr/trunk/figuresi.inc diff --git a/programs/cpu/trunk/macros.inc b/programs/demos/crownscr/trunk/macros.inc similarity index 100% rename from programs/cpu/trunk/macros.inc rename to programs/demos/crownscr/trunk/macros.inc diff --git a/programs/cslide/trunk/build_en.bat b/programs/demos/cslide/trunk/build_en.bat similarity index 100% rename from programs/cslide/trunk/build_en.bat rename to programs/demos/cslide/trunk/build_en.bat diff --git a/programs/cslide/trunk/build_ru.bat b/programs/demos/cslide/trunk/build_ru.bat similarity index 100% rename from programs/cslide/trunk/build_ru.bat rename to programs/demos/cslide/trunk/build_ru.bat diff --git a/programs/cslide/trunk/cslide.asm b/programs/demos/cslide/trunk/cslide.asm similarity index 100% rename from programs/cslide/trunk/cslide.asm rename to programs/demos/cslide/trunk/cslide.asm diff --git a/programs/eyes/trunk/build_en.bat b/programs/demos/eyes/trunk/build_en.bat similarity index 100% rename from programs/eyes/trunk/build_en.bat rename to programs/demos/eyes/trunk/build_en.bat diff --git a/programs/eyes/trunk/build_ru.bat b/programs/demos/eyes/trunk/build_ru.bat similarity index 100% rename from programs/eyes/trunk/build_ru.bat rename to programs/demos/eyes/trunk/build_ru.bat diff --git a/programs/eyes/trunk/eyes.asm b/programs/demos/eyes/trunk/eyes.asm similarity index 100% rename from programs/eyes/trunk/eyes.asm rename to programs/demos/eyes/trunk/eyes.asm diff --git a/programs/eyes/trunk/eyes.raw b/programs/demos/eyes/trunk/eyes.raw similarity index 100% rename from programs/eyes/trunk/eyes.raw rename to programs/demos/eyes/trunk/eyes.raw diff --git a/programs/bmpview/trunk/macros.inc b/programs/demos/eyes/trunk/macros.inc similarity index 100% rename from programs/bmpview/trunk/macros.inc rename to programs/demos/eyes/trunk/macros.inc diff --git a/programs/fire/trunk/build_en.bat b/programs/demos/fire/trunk/build_en.bat similarity index 100% rename from programs/fire/trunk/build_en.bat rename to programs/demos/fire/trunk/build_en.bat diff --git a/programs/fire/trunk/build_ru.bat b/programs/demos/fire/trunk/build_ru.bat similarity index 100% rename from programs/fire/trunk/build_ru.bat rename to programs/demos/fire/trunk/build_ru.bat diff --git a/programs/fire/trunk/fire.asm b/programs/demos/fire/trunk/fire.asm similarity index 100% rename from programs/fire/trunk/fire.asm rename to programs/demos/fire/trunk/fire.asm diff --git a/programs/board/trunk/macros.inc b/programs/demos/fire/trunk/macros.inc similarity index 100% rename from programs/board/trunk/macros.inc rename to programs/demos/fire/trunk/macros.inc diff --git a/programs/fire2/trunk/build_en.bat b/programs/demos/fire2/trunk/build_en.bat similarity index 100% rename from programs/fire2/trunk/build_en.bat rename to programs/demos/fire2/trunk/build_en.bat diff --git a/programs/fire2/trunk/build_ru.bat b/programs/demos/fire2/trunk/build_ru.bat similarity index 100% rename from programs/fire2/trunk/build_ru.bat rename to programs/demos/fire2/trunk/build_ru.bat diff --git a/programs/fire2/trunk/fire2.asm b/programs/demos/fire2/trunk/fire2.asm similarity index 100% rename from programs/fire2/trunk/fire2.asm rename to programs/demos/fire2/trunk/fire2.asm diff --git a/programs/free3d04/trunk/build_en.bat b/programs/demos/free3d04/trunk/build_en.bat similarity index 100% rename from programs/free3d04/trunk/build_en.bat rename to programs/demos/free3d04/trunk/build_en.bat diff --git a/programs/free3d04/trunk/build_ru.bat b/programs/demos/free3d04/trunk/build_ru.bat similarity index 100% rename from programs/free3d04/trunk/build_ru.bat rename to programs/demos/free3d04/trunk/build_ru.bat diff --git a/programs/free3d04/trunk/free3d04.asm b/programs/demos/free3d04/trunk/free3d04.asm similarity index 100% rename from programs/free3d04/trunk/free3d04.asm rename to programs/demos/free3d04/trunk/free3d04.asm diff --git a/programs/free3d04/trunk/gif.inc b/programs/demos/free3d04/trunk/gif.inc similarity index 100% rename from programs/free3d04/trunk/gif.inc rename to programs/demos/free3d04/trunk/gif.inc diff --git a/programs/free3d04/trunk/macros.inc b/programs/demos/free3d04/trunk/macros.inc similarity index 100% rename from programs/free3d04/trunk/macros.inc rename to programs/demos/free3d04/trunk/macros.inc diff --git a/programs/free3d04/trunk/readme.txt b/programs/demos/free3d04/trunk/readme.txt similarity index 100% rename from programs/free3d04/trunk/readme.txt rename to programs/demos/free3d04/trunk/readme.txt diff --git a/programs/free3d04/trunk/texture.gif b/programs/demos/free3d04/trunk/texture.gif similarity index 100% rename from programs/free3d04/trunk/texture.gif rename to programs/demos/free3d04/trunk/texture.gif diff --git a/programs/magnify/trunk/build_en.bat b/programs/demos/magnify/trunk/build_en.bat similarity index 100% rename from programs/magnify/trunk/build_en.bat rename to programs/demos/magnify/trunk/build_en.bat diff --git a/programs/magnify/trunk/build_ru.bat b/programs/demos/magnify/trunk/build_ru.bat similarity index 100% rename from programs/magnify/trunk/build_ru.bat rename to programs/demos/magnify/trunk/build_ru.bat diff --git a/programs/calc/trunk/macros.inc b/programs/demos/magnify/trunk/macros.inc similarity index 100% rename from programs/calc/trunk/macros.inc rename to programs/demos/magnify/trunk/macros.inc diff --git a/programs/magnify/trunk/magnify.asm b/programs/demos/magnify/trunk/magnify.asm similarity index 100% rename from programs/magnify/trunk/magnify.asm rename to programs/demos/magnify/trunk/magnify.asm diff --git a/programs/movback/trunk/build_en.bat b/programs/demos/movback/trunk/build_en.bat similarity index 100% rename from programs/movback/trunk/build_en.bat rename to programs/demos/movback/trunk/build_en.bat diff --git a/programs/movback/trunk/build_ru.bat b/programs/demos/movback/trunk/build_ru.bat similarity index 100% rename from programs/movback/trunk/build_ru.bat rename to programs/demos/movback/trunk/build_ru.bat diff --git a/programs/end/trunk/macros.inc b/programs/demos/movback/trunk/macros.inc similarity index 100% rename from programs/end/trunk/macros.inc rename to programs/demos/movback/trunk/macros.inc diff --git a/programs/movback/trunk/movback.asm b/programs/demos/movback/trunk/movback.asm similarity index 100% rename from programs/movback/trunk/movback.asm rename to programs/demos/movback/trunk/movback.asm diff --git a/programs/plasma/trunk/build_en.bat b/programs/demos/plasma/trunk/build_en.bat similarity index 100% rename from programs/plasma/trunk/build_en.bat rename to programs/demos/plasma/trunk/build_en.bat diff --git a/programs/plasma/trunk/build_ru.bat b/programs/demos/plasma/trunk/build_ru.bat similarity index 100% rename from programs/plasma/trunk/build_ru.bat rename to programs/demos/plasma/trunk/build_ru.bat diff --git a/programs/plasma/trunk/graph8.inc b/programs/demos/plasma/trunk/graph8.inc similarity index 100% rename from programs/plasma/trunk/graph8.inc rename to programs/demos/plasma/trunk/graph8.inc diff --git a/programs/airc/trunk/macros.inc b/programs/demos/plasma/trunk/macros.inc similarity index 100% rename from programs/airc/trunk/macros.inc rename to programs/demos/plasma/trunk/macros.inc diff --git a/programs/plasma/trunk/plasma.asm b/programs/demos/plasma/trunk/plasma.asm similarity index 100% rename from programs/plasma/trunk/plasma.asm rename to programs/demos/plasma/trunk/plasma.asm diff --git a/programs/ss/trunk/@SS.ASM b/programs/demos/ss/trunk/@SS.ASM similarity index 100% rename from programs/ss/trunk/@SS.ASM rename to programs/demos/ss/trunk/@SS.ASM diff --git a/programs/ss/trunk/build_en.bat b/programs/demos/ss/trunk/build_en.bat similarity index 100% rename from programs/ss/trunk/build_en.bat rename to programs/demos/ss/trunk/build_en.bat diff --git a/programs/ss/trunk/build_ru.bat b/programs/demos/ss/trunk/build_ru.bat similarity index 100% rename from programs/ss/trunk/build_ru.bat rename to programs/demos/ss/trunk/build_ru.bat diff --git a/programs/ethstat/trunk/macros.inc b/programs/demos/ss/trunk/macros.inc similarity index 100% rename from programs/ethstat/trunk/macros.inc rename to programs/demos/ss/trunk/macros.inc diff --git a/programs/timer/trunk/build_en.bat b/programs/demos/timer/trunk/build_en.bat similarity index 100% rename from programs/timer/trunk/build_en.bat rename to programs/demos/timer/trunk/build_en.bat diff --git a/programs/timer/trunk/build_ru.bat b/programs/demos/timer/trunk/build_ru.bat similarity index 100% rename from programs/timer/trunk/build_ru.bat rename to programs/demos/timer/trunk/build_ru.bat diff --git a/programs/sysxtree/trunk/macros.inc b/programs/demos/timer/trunk/macros.inc similarity index 100% rename from programs/sysxtree/trunk/macros.inc rename to programs/demos/timer/trunk/macros.inc diff --git a/programs/timer/trunk/timer.asm b/programs/demos/timer/trunk/timer.asm similarity index 100% rename from programs/timer/trunk/timer.asm rename to programs/demos/timer/trunk/timer.asm diff --git a/programs/tinyfrac/trunk/build_en.bat b/programs/demos/tinyfrac/trunk/build_en.bat similarity index 100% rename from programs/tinyfrac/trunk/build_en.bat rename to programs/demos/tinyfrac/trunk/build_en.bat diff --git a/programs/tinyfrac/trunk/build_ru.bat b/programs/demos/tinyfrac/trunk/build_ru.bat similarity index 100% rename from programs/tinyfrac/trunk/build_ru.bat rename to programs/demos/tinyfrac/trunk/build_ru.bat diff --git a/programs/telnet/trunk/macros.inc b/programs/demos/tinyfrac/trunk/macros.inc similarity index 100% rename from programs/telnet/trunk/macros.inc rename to programs/demos/tinyfrac/trunk/macros.inc diff --git a/programs/tinyfrac/trunk/tinyfrac.asm b/programs/demos/tinyfrac/trunk/tinyfrac.asm similarity index 100% rename from programs/tinyfrac/trunk/tinyfrac.asm rename to programs/demos/tinyfrac/trunk/tinyfrac.asm diff --git a/programs/transp/trunk/build_en.bat b/programs/demos/transp/trunk/build_en.bat similarity index 100% rename from programs/transp/trunk/build_en.bat rename to programs/demos/transp/trunk/build_en.bat diff --git a/programs/transp/trunk/build_ru.bat b/programs/demos/transp/trunk/build_ru.bat similarity index 100% rename from programs/transp/trunk/build_ru.bat rename to programs/demos/transp/trunk/build_ru.bat diff --git a/programs/template/trunk/macros.inc b/programs/demos/transp/trunk/macros.inc similarity index 100% rename from programs/template/trunk/macros.inc rename to programs/demos/transp/trunk/macros.inc diff --git a/programs/transp/trunk/transp.asm b/programs/demos/transp/trunk/transp.asm similarity index 100% rename from programs/transp/trunk/transp.asm rename to programs/demos/transp/trunk/transp.asm diff --git a/programs/phenix/trunk/ascgl.inc b/programs/demos/trantest/trunk/ascgl.inc similarity index 100% rename from programs/phenix/trunk/ascgl.inc rename to programs/demos/trantest/trunk/ascgl.inc diff --git a/programs/sysxtree/trunk/ascl.inc b/programs/demos/trantest/trunk/ascl.inc similarity index 100% rename from programs/sysxtree/trunk/ascl.inc rename to programs/demos/trantest/trunk/ascl.inc diff --git a/programs/trantest/trunk/build_en.bat b/programs/demos/trantest/trunk/build_en.bat similarity index 100% rename from programs/trantest/trunk/build_en.bat rename to programs/demos/trantest/trunk/build_en.bat diff --git a/programs/trantest/trunk/build_ru.bat b/programs/demos/trantest/trunk/build_ru.bat similarity index 100% rename from programs/trantest/trunk/build_ru.bat rename to programs/demos/trantest/trunk/build_ru.bat diff --git a/programs/trantest/trunk/trantest.asm b/programs/demos/trantest/trunk/trantest.asm similarity index 100% rename from programs/trantest/trunk/trantest.asm rename to programs/demos/trantest/trunk/trantest.asm diff --git a/programs/tube/trunk/build_en.bat b/programs/demos/tube/trunk/build_en.bat similarity index 100% rename from programs/tube/trunk/build_en.bat rename to programs/demos/tube/trunk/build_en.bat diff --git a/programs/tube/trunk/build_ru.bat b/programs/demos/tube/trunk/build_ru.bat similarity index 100% rename from programs/tube/trunk/build_ru.bat rename to programs/demos/tube/trunk/build_ru.bat diff --git a/programs/terminal/trunk/macros.inc b/programs/demos/tube/trunk/macros.inc similarity index 100% rename from programs/terminal/trunk/macros.inc rename to programs/demos/tube/trunk/macros.inc diff --git a/programs/tube/trunk/tube.asm b/programs/demos/tube/trunk/tube.asm similarity index 100% rename from programs/tube/trunk/tube.asm rename to programs/demos/tube/trunk/tube.asm diff --git a/programs/archer/trunk/@RCHER.ASM b/programs/develop/archer/trunk/@RCHER.ASM similarity index 100% rename from programs/archer/trunk/@RCHER.ASM rename to programs/develop/archer/trunk/@RCHER.ASM diff --git a/programs/archer/trunk/archer.txt b/programs/develop/archer/trunk/archer.txt similarity index 100% rename from programs/archer/trunk/archer.txt rename to programs/develop/archer/trunk/archer.txt diff --git a/programs/archer/trunk/arcmacro.inc b/programs/develop/archer/trunk/arcmacro.inc similarity index 100% rename from programs/archer/trunk/arcmacro.inc rename to programs/develop/archer/trunk/arcmacro.inc diff --git a/programs/archer/trunk/build_en.bat b/programs/develop/archer/trunk/build_en.bat similarity index 100% rename from programs/archer/trunk/build_en.bat rename to programs/develop/archer/trunk/build_en.bat diff --git a/programs/archer/trunk/build_ru.bat b/programs/develop/archer/trunk/build_ru.bat similarity index 100% rename from programs/archer/trunk/build_ru.bat rename to programs/develop/archer/trunk/build_ru.bat diff --git a/programs/archer/trunk/data.inc b/programs/develop/archer/trunk/data.inc similarity index 100% rename from programs/archer/trunk/data.inc rename to programs/develop/archer/trunk/data.inc diff --git a/programs/ac97wav/trunk/debug.inc b/programs/develop/archer/trunk/debug.inc similarity index 100% rename from programs/ac97wav/trunk/debug.inc rename to programs/develop/archer/trunk/debug.inc diff --git a/programs/archer/trunk/deflate.inc b/programs/develop/archer/trunk/deflate.inc similarity index 100% rename from programs/archer/trunk/deflate.inc rename to programs/develop/archer/trunk/deflate.inc diff --git a/programs/archer/trunk/macros.inc b/programs/develop/archer/trunk/macros.inc similarity index 100% rename from programs/archer/trunk/macros.inc rename to programs/develop/archer/trunk/macros.inc diff --git a/programs/archer/trunk/parser.inc b/programs/develop/archer/trunk/parser.inc similarity index 100% rename from programs/archer/trunk/parser.inc rename to programs/develop/archer/trunk/parser.inc diff --git a/programs/archer/trunk/sys.inc b/programs/develop/archer/trunk/sys.inc similarity index 100% rename from programs/archer/trunk/sys.inc rename to programs/develop/archer/trunk/sys.inc diff --git a/programs/cmd/trunk/build_en.bat b/programs/develop/cmd/trunk/build_en.bat similarity index 100% rename from programs/cmd/trunk/build_en.bat rename to programs/develop/cmd/trunk/build_en.bat diff --git a/programs/cmd/trunk/build_ru.bat b/programs/develop/cmd/trunk/build_ru.bat similarity index 100% rename from programs/cmd/trunk/build_ru.bat rename to programs/develop/cmd/trunk/build_ru.bat diff --git a/programs/cmd/trunk/cmd.asm b/programs/develop/cmd/trunk/cmd.asm similarity index 100% rename from programs/cmd/trunk/cmd.asm rename to programs/develop/cmd/trunk/cmd.asm diff --git a/programs/cmd/trunk/cmdipc.inc b/programs/develop/cmd/trunk/cmdipc.inc similarity index 100% rename from programs/cmd/trunk/cmdipc.inc rename to programs/develop/cmd/trunk/cmdipc.inc diff --git a/programs/arpstat/trunk/macros.inc b/programs/develop/cmd/trunk/macros.inc similarity index 100% rename from programs/arpstat/trunk/macros.inc rename to programs/develop/cmd/trunk/macros.inc diff --git a/programs/cmd/trunk/readme.txt b/programs/develop/cmd/trunk/readme.txt similarity index 100% rename from programs/cmd/trunk/readme.txt rename to programs/develop/cmd/trunk/readme.txt diff --git a/programs/circle/trunk/build_en.bat b/programs/develop/examples/circle/trunk/build_en.bat similarity index 100% rename from programs/circle/trunk/build_en.bat rename to programs/develop/examples/circle/trunk/build_en.bat diff --git a/programs/circle/trunk/build_ru.bat b/programs/develop/examples/circle/trunk/build_ru.bat similarity index 100% rename from programs/circle/trunk/build_ru.bat rename to programs/develop/examples/circle/trunk/build_ru.bat diff --git a/programs/circle/trunk/circle.asm b/programs/develop/examples/circle/trunk/circle.asm similarity index 100% rename from programs/circle/trunk/circle.asm rename to programs/develop/examples/circle/trunk/circle.asm diff --git a/programs/bcdclk/bcdclk/macros.inc b/programs/develop/examples/circle/trunk/macros.inc similarity index 100% rename from programs/bcdclk/bcdclk/macros.inc rename to programs/develop/examples/circle/trunk/macros.inc diff --git a/programs/example/trunk/build_en.bat b/programs/develop/examples/example/trunk/build_en.bat similarity index 100% rename from programs/example/trunk/build_en.bat rename to programs/develop/examples/example/trunk/build_en.bat diff --git a/programs/example/trunk/build_ru.bat b/programs/develop/examples/example/trunk/build_ru.bat similarity index 100% rename from programs/example/trunk/build_ru.bat rename to programs/develop/examples/example/trunk/build_ru.bat diff --git a/programs/example/trunk/example.asm b/programs/develop/examples/example/trunk/example.asm similarity index 100% rename from programs/example/trunk/example.asm rename to programs/develop/examples/example/trunk/example.asm diff --git a/programs/example/trunk/macros.inc b/programs/develop/examples/example/trunk/macros.inc similarity index 100% rename from programs/example/trunk/macros.inc rename to programs/develop/examples/example/trunk/macros.inc diff --git a/programs/example2/trunk/build_en.bat b/programs/develop/examples/example2/trunk/build_en.bat similarity index 100% rename from programs/example2/trunk/build_en.bat rename to programs/develop/examples/example2/trunk/build_en.bat diff --git a/programs/example2/trunk/build_ru.bat b/programs/develop/examples/example2/trunk/build_ru.bat similarity index 100% rename from programs/example2/trunk/build_ru.bat rename to programs/develop/examples/example2/trunk/build_ru.bat diff --git a/programs/example2/trunk/dialogs1.inc b/programs/develop/examples/example2/trunk/dialogs1.inc similarity index 100% rename from programs/example2/trunk/dialogs1.inc rename to programs/develop/examples/example2/trunk/dialogs1.inc diff --git a/programs/example2/trunk/example2.asm b/programs/develop/examples/example2/trunk/example2.asm similarity index 100% rename from programs/example2/trunk/example2.asm rename to programs/develop/examples/example2/trunk/example2.asm diff --git a/programs/example2/trunk/macros.inc b/programs/develop/examples/example2/trunk/macros.inc similarity index 100% rename from programs/example2/trunk/macros.inc rename to programs/develop/examples/example2/trunk/macros.inc diff --git a/programs/example3/trunk/build_en.bat b/programs/develop/examples/example3/trunk/build_en.bat similarity index 100% rename from programs/example3/trunk/build_en.bat rename to programs/develop/examples/example3/trunk/build_en.bat diff --git a/programs/example3/trunk/build_ru.bat b/programs/develop/examples/example3/trunk/build_ru.bat similarity index 100% rename from programs/example3/trunk/build_ru.bat rename to programs/develop/examples/example3/trunk/build_ru.bat diff --git a/programs/example3/trunk/example3.asm b/programs/develop/examples/example3/trunk/example3.asm similarity index 100% rename from programs/example3/trunk/example3.asm rename to programs/develop/examples/example3/trunk/example3.asm diff --git a/programs/example3/trunk/macros.inc b/programs/develop/examples/example3/trunk/macros.inc similarity index 100% rename from programs/example3/trunk/macros.inc rename to programs/develop/examples/example3/trunk/macros.inc diff --git a/programs/hello/trunk/build_en.bat b/programs/develop/examples/hello/trunk/build_en.bat similarity index 100% rename from programs/hello/trunk/build_en.bat rename to programs/develop/examples/hello/trunk/build_en.bat diff --git a/programs/hello/trunk/build_ru.bat b/programs/develop/examples/hello/trunk/build_ru.bat similarity index 100% rename from programs/hello/trunk/build_ru.bat rename to programs/develop/examples/hello/trunk/build_ru.bat diff --git a/programs/hello/trunk/cmdipc.inc b/programs/develop/examples/hello/trunk/cmdipc.inc similarity index 100% rename from programs/hello/trunk/cmdipc.inc rename to programs/develop/examples/hello/trunk/cmdipc.inc diff --git a/programs/hello/trunk/hello.asm b/programs/develop/examples/hello/trunk/hello.asm similarity index 100% rename from programs/hello/trunk/hello.asm rename to programs/develop/examples/hello/trunk/hello.asm diff --git a/programs/gifview/trunk/macros.inc b/programs/develop/examples/hello/trunk/macros.inc similarity index 100% rename from programs/gifview/trunk/macros.inc rename to programs/develop/examples/hello/trunk/macros.inc diff --git a/programs/template/trunk/build_en.bat b/programs/develop/examples/template/trunk/build_en.bat similarity index 100% rename from programs/template/trunk/build_en.bat rename to programs/develop/examples/template/trunk/build_en.bat diff --git a/programs/template/trunk/build_ru.bat b/programs/develop/examples/template/trunk/build_ru.bat similarity index 100% rename from programs/template/trunk/build_ru.bat rename to programs/develop/examples/template/trunk/build_ru.bat diff --git a/programs/tftpa/trunk/macros.inc b/programs/develop/examples/template/trunk/macros.inc similarity index 100% rename from programs/tftpa/trunk/macros.inc rename to programs/develop/examples/template/trunk/macros.inc diff --git a/programs/template/trunk/template.asm b/programs/develop/examples/template/trunk/template.asm similarity index 100% rename from programs/template/trunk/template.asm rename to programs/develop/examples/template/trunk/template.asm diff --git a/programs/thread/trunk/build_en.bat b/programs/develop/examples/thread/trunk/build_en.bat similarity index 100% rename from programs/thread/trunk/build_en.bat rename to programs/develop/examples/thread/trunk/build_en.bat diff --git a/programs/thread/trunk/build_ru.bat b/programs/develop/examples/thread/trunk/build_ru.bat similarity index 100% rename from programs/thread/trunk/build_ru.bat rename to programs/develop/examples/thread/trunk/build_ru.bat diff --git a/programs/tftpc/trunk/macros.inc b/programs/develop/examples/thread/trunk/macros.inc similarity index 100% rename from programs/tftpc/trunk/macros.inc rename to programs/develop/examples/thread/trunk/macros.inc diff --git a/programs/thread/trunk/thread.asm b/programs/develop/examples/thread/trunk/thread.asm similarity index 100% rename from programs/thread/trunk/thread.asm rename to programs/develop/examples/thread/trunk/thread.asm diff --git a/programs/develop/fasm/trunk/TABLES.INC b/programs/develop/fasm/trunk/TABLES.INC new file mode 100644 index 0000000000..d207e98501 --- /dev/null +++ b/programs/develop/fasm/trunk/TABLES.INC @@ -0,0 +1,1828 @@ + +; flat assembler core +; Copyright (c) 1999-2006, Tomasz Grysztar. +; All rights reserved. + +include_variable db 'INCLUDE',0 + +symbol_characters db 27 + db 9,0Ah,0Dh,1Ah,20h,'+-/*=<>()[]{}:,|&~#`;\' + +preprocessor_directives: + db 6,'define' + dw define_symbolic_constant-preprocessor + db 7,'include' + dw include_file-preprocessor + db 3,'irp' + dw irp_directive-preprocessor + db 4,'irps' + dw irps_directive-preprocessor + db 5,'macro' + dw define_macro-preprocessor + db 5,'match' + dw match_directive-preprocessor + db 5,'purge' + dw purge_macro-preprocessor + db 4,'rept' + dw rept_directive-preprocessor + db 7,'restore' + dw restore_equ_constant-preprocessor + db 7,'restruc' + dw purge_struc-preprocessor + db 5,'struc' + dw define_struc-preprocessor + db 0 + +macro_directives: + db 6,'common' + dw common_block-preprocessor + db 7,'forward' + dw forward_block-preprocessor + db 5,'local' + dw local_symbols-preprocessor + db 7,'reverse' + dw reverse_block-preprocessor + db 0 + +operators: + db 1,'+',80h + db 1,'-',81h + db 1,'*',90h + db 1,'/',91h + db 3,'mod',0A0h + db 3,'and',0B0h + db 2,'or',0B1h + db 3,'xor',0B2h + db 3,'shl',0C0h + db 3,'shr',0C1h + db 0 + +single_operand_operators: + db 1,'+',0 + db 1,'-',083h + db 3,'not',0D0h + db 3,'rva',0E0h + db 0 + +directive_operators: + db 2,'as',86h + db 2,'at',80h + db 7,'defined',88h + db 3,'dup',81h + db 2,'eq',0F0h + db 6,'eqtype',0F7h + db 4,'from',82h + db 2,'in',0F6h + db 2,'on',84h + db 3,'ptr',85h + db 4,'used',89h + db 0 + +address_registers: + db 2,'bp',25h + db 2,'bx',23h + db 2,'di',27h + db 3,'eax',40h + db 3,'ebp',45h + db 3,'ebx',43h + db 3,'ecx',41h + db 3,'edi',47h + db 3,'edx',42h + db 3,'esi',46h + db 3,'esp',44h + db 3,'r10',8Ah + db 4,'r10d',4Ah + db 3,'r11',8Bh + db 4,'r11d',4Bh + db 3,'r12',8Ch + db 4,'r12d',4Ch + db 3,'r13',8Dh + db 4,'r13d',4Dh + db 3,'r14',8Eh + db 4,'r14d',4Eh + db 3,'r15',8Fh + db 4,'r15d',4Fh + db 2,'r8',88h + db 3,'r8d',48h + db 2,'r9',89h + db 3,'r9d',49h + db 3,'rax',80h + db 3,'rbp',85h + db 3,'rbx',83h + db 3,'rcx',81h + db 3,'rdi',87h + db 3,'rdx',82h + db 3,'rip',0F0h + db 3,'rsi',86h + db 3,'rsp',84h + db 2,'si',26h + db 0 + +address_sizes: + db 4,'byte',1 + db 5,'dword',4 + db 5,'qword',8 + db 4,'word',2 + db 0 + +symbols: + dw symbols_2-symbols,(symbols_3-symbols_2)/(2+2) + dw symbols_3-symbols,(symbols_4-symbols_3)/(3+2) + dw symbols_4-symbols,(symbols_5-symbols_4)/(4+2) + dw symbols_5-symbols,(symbols_6-symbols_5)/(5+2) + dw symbols_6-symbols,(symbols_7-symbols_6)/(6+2) + dw symbols_7-symbols,(symbols_8-symbols_7)/(7+2) + dw symbols_8-symbols,(symbols_9-symbols_8)/(8+2) + dw symbols_9-symbols,(symbols_10-symbols_9)/(9+2) + dw symbols_10-symbols,(symbols_11-symbols_10)/(10+2) + dw symbols_11-symbols,(symbols_end-symbols_11)/(11+2) + +symbols_2: + db 'ah',10h,04h + db 'al',10h,10h + db 'ax',10h,20h + db 'bh',10h,07h + db 'bl',10h,13h + db 'bp',10h,25h + db 'bx',10h,23h + db 'ch',10h,05h + db 'cl',10h,11h + db 'cs',10h,62h + db 'cx',10h,21h + db 'dh',10h,06h + db 'di',10h,27h + db 'dl',10h,12h + db 'ds',10h,64h + db 'dx',10h,22h + db 'es',10h,61h + db 'fs',10h,65h + db 'gs',10h,66h + db 'ms',17h,41h + db 'mz',18h,20h + db 'pe',18h,30h + db 'r8',10h,88h + db 'r9',10h,89h + db 'si',10h,26h + db 'sp',10h,24h + db 'ss',10h,63h + db 'st',10h,0A0h +symbols_3: + db 'bpl',10h,15h + db 'cr0',10h,50h + db 'cr1',10h,51h + db 'cr2',10h,52h + db 'cr3',10h,53h + db 'cr4',10h,54h + db 'cr5',10h,55h + db 'cr6',10h,56h + db 'cr7',10h,57h + db 'cr8',10h,58h + db 'cr9',10h,59h + db 'dil',10h,17h + db 'dll',1Bh,80h + db 'dr0',10h,70h + db 'dr1',10h,71h + db 'dr2',10h,72h + db 'dr3',10h,73h + db 'dr4',10h,74h + db 'dr5',10h,75h + db 'dr6',10h,76h + db 'dr7',10h,77h + db 'dr8',10h,78h + db 'dr9',10h,79h + db 'eax',10h,40h + db 'ebp',10h,45h + db 'ebx',10h,43h + db 'ecx',10h,41h + db 'edi',10h,47h + db 'edx',10h,42h + db 'elf',18h,50h + db 'esi',10h,46h + db 'esp',10h,44h + db 'far',12h,3 + db 'gui',1Bh,2 + db 'mm0',10h,0B0h + db 'mm1',10h,0B1h + db 'mm2',10h,0B2h + db 'mm3',10h,0B3h + db 'mm4',10h,0B4h + db 'mm5',10h,0B5h + db 'mm6',10h,0B6h + db 'mm7',10h,0B7h + db 'r10',10h,8Ah + db 'r11',10h,8Bh + db 'r12',10h,8Ch + db 'r13',10h,8Dh + db 'r14',10h,8Eh + db 'r15',10h,8Fh + db 'r8b',10h,18h + db 'r8d',10h,48h + db 'r8l',10h,18h + db 'r8w',10h,28h + db 'r9b',10h,19h + db 'r9d',10h,49h + db 'r9l',10h,19h + db 'r9w',10h,29h + db 'rax',10h,80h + db 'rbp',10h,85h + db 'rbx',10h,83h + db 'rcx',10h,81h + db 'rdi',10h,87h + db 'rdx',10h,82h + db 'rsi',10h,86h + db 'rsp',10h,84h + db 'sil',10h,16h + db 'spl',10h,14h + db 'st0',10h,0A0h + db 'st1',10h,0A1h + db 'st2',10h,0A2h + db 'st3',10h,0A3h + db 'st4',10h,0A4h + db 'st5',10h,0A5h + db 'st6',10h,0A6h + db 'st7',10h,0A7h + db 'tr0',10h,90h + db 'tr1',10h,91h + db 'tr2',10h,92h + db 'tr3',10h,93h + db 'tr4',10h,94h + db 'tr5',10h,95h + db 'tr6',10h,96h + db 'tr7',10h,97h + db 'wdm',1Bh,81h +symbols_4: + db 'byte',11h,1 + db 'code',19h,5 + db 'coff',18h,40h + db 'cr10',10h,5Ah + db 'cr11',10h,5Bh + db 'cr12',10h,5Ch + db 'cr13',10h,5Dh + db 'cr14',10h,5Eh + db 'cr15',10h,5Fh + db 'data',19h,6 + db 'dr10',10h,7Ah + db 'dr11',10h,7Bh + db 'dr12',10h,7Ch + db 'dr13',10h,7Dh + db 'dr14',10h,7Eh + db 'dr15',10h,7Fh + db 'ms64',17h,49h + db 'near',12h,2 + db 'pe64',18h,38h + db 'r10b',10h,1Ah + db 'r10d',10h,4Ah + db 'r10l',10h,1Ah + db 'r10w',10h,2Ah + db 'r11b',10h,1Bh + db 'r11d',10h,4Bh + db 'r11l',10h,1Bh + db 'r11w',10h,2Bh + db 'r12b',10h,1Ch + db 'r12d',10h,4Ch + db 'r12l',10h,1Ch + db 'r12w',10h,2Ch + db 'r13b',10h,1Dh + db 'r13d',10h,4Dh + db 'r13l',10h,1Dh + db 'r13w',10h,2Dh + db 'r14b',10h,1Eh + db 'r14d',10h,4Eh + db 'r14l',10h,1Eh + db 'r14w',10h,2Eh + db 'r15b',10h,1Fh + db 'r15d',10h,4Fh + db 'r15l',10h,1Fh + db 'r15w',10h,2Fh + db 'word',11h,2 + db 'xmm0',10h,0C0h + db 'xmm1',10h,0C1h + db 'xmm2',10h,0C2h + db 'xmm3',10h,0C3h + db 'xmm4',10h,0C4h + db 'xmm5',10h,0C5h + db 'xmm6',10h,0C6h + db 'xmm7',10h,0C7h + db 'xmm8',10h,0C8h + db 'xmm9',10h,0C9h +symbols_5: + db 'align',1Ch,0 + db 'dword',11h,4 + db 'elf64',18h,58h + db 'fword',11h,6 + db 'pword',11h,6 + db 'qword',11h,8 + db 'short',12h,1 + db 'tbyte',11h,0Ah + db 'tword',11h,0Ah + db 'use16',13h,16 + db 'use32',13h,32 + db 'use64',13h,64 + db 'xmm10',10h,0CAh + db 'xmm11',10h,0CBh + db 'xmm12',10h,0CCh + db 'xmm13',10h,0CDh + db 'xmm14',10h,0CEh + db 'xmm15',10h,0CFh +symbols_6: + db 'binary',18h,10h + db 'dqword',11h,16 + db 'export',1Ah,0 + db 'fixups',1Ah,5 + db 'import',1Ah,1 + db 'native',1Bh,1 +symbols_7: + db 'console',1Bh,3 +symbols_8: + db 'linkinfo',19h,9 + db 'readable',19h,30 + db 'resource',1Ah,2 + db 'writable',19h,31 +symbols_9: + db 'shareable',19h,28 + db 'writeable',19h,31 +symbols_10: + db 'executable',19h,29 + db 'linkremove',19h,11 +symbols_11: + db 'discardable',19h,25 + db 'notpageable',19h,27 +symbols_end: + +instructions: + dw instructions_2-instructions,(instructions_3-instructions_2)/(2+3) + dw instructions_3-instructions,(instructions_4-instructions_3)/(3+3) + dw instructions_4-instructions,(instructions_5-instructions_4)/(4+3) + dw instructions_5-instructions,(instructions_6-instructions_5)/(5+3) + dw instructions_6-instructions,(instructions_7-instructions_6)/(6+3) + dw instructions_7-instructions,(instructions_8-instructions_7)/(7+3) + dw instructions_8-instructions,(instructions_9-instructions_8)/(8+3) + dw instructions_9-instructions,(instructions_10-instructions_9)/(9+3) + dw instructions_10-instructions,(instructions_11-instructions_10)/(10+3) + dw instructions_11-instructions,(instructions_end-instructions_11)/(11+3) + +instructions_2: + db 'bt',4 + dw bt_instruction-assembler + db 'if',0 + dw if_directive-assembler + db 'in',0 + dw in_instruction-assembler + db 'ja',77h + dw conditional_jump-assembler + db 'jb',72h + dw conditional_jump-assembler + db 'jc',72h + dw conditional_jump-assembler + db 'je',74h + dw conditional_jump-assembler + db 'jg',7Fh + dw conditional_jump-assembler + db 'jl',7Ch + dw conditional_jump-assembler + db 'jo',70h + dw conditional_jump-assembler + db 'jp',7Ah + dw conditional_jump-assembler + db 'js',78h + dw conditional_jump-assembler + db 'jz',74h + dw conditional_jump-assembler + db 'or',08h + dw basic_instruction-assembler +instructions_3: + db 'aaa',37h + dw simple_instruction_except64-assembler + db 'aad',0D5h + dw aa_instruction-assembler + db 'aam',0D4h + dw aa_instruction-assembler + db 'aas',3Fh + dw simple_instruction_except64-assembler + db 'adc',10h + dw basic_instruction-assembler + db 'add',00h + dw basic_instruction-assembler + db 'and',20h + dw basic_instruction-assembler + db 'bsf',0BCh + dw bs_instruction-assembler + db 'bsr',0BDh + dw bs_instruction-assembler + db 'btc',7 + dw bt_instruction-assembler + db 'btr',6 + dw bt_instruction-assembler + db 'bts',5 + dw bt_instruction-assembler + db 'cbw',98h + dw simple_instruction_16bit-assembler + db 'cdq',99h + dw simple_instruction_32bit-assembler + db 'clc',0F8h + dw simple_instruction-assembler + db 'cld',0FCh + dw simple_instruction-assembler + db 'cli',0FAh + dw simple_instruction-assembler + db 'cmc',0F5h + dw simple_instruction-assembler + db 'cmp',38h + dw basic_instruction-assembler + db 'cqo',99h + dw simple_instruction_64bit-assembler + db 'cwd',99h + dw simple_instruction_16bit-assembler + db 'daa',27h + dw simple_instruction_except64-assembler + db 'das',2Fh + dw simple_instruction_except64-assembler + db 'dec',1 + dw inc_instruction-assembler + db 'div',6 + dw single_operand_instruction-assembler + db 'end',0 + dw end_directive-assembler + db 'fld',0 + dw fld_instruction-assembler + db 'fst',2 + dw fld_instruction-assembler + db 'hlt',0F4h + dw simple_instruction-assembler + db 'inc',0 + dw inc_instruction-assembler + db 'ins',6Ch + dw ins_instruction-assembler + db 'int',0CDh + dw int_instruction-assembler + db 'jae',73h + dw conditional_jump-assembler + db 'jbe',76h + dw conditional_jump-assembler + db 'jge',7Dh + dw conditional_jump-assembler + db 'jle',7Eh + dw conditional_jump-assembler + db 'jmp',0 + dw jmp_instruction-assembler + db 'jna',76h + dw conditional_jump-assembler + db 'jnb',73h + dw conditional_jump-assembler + db 'jnc',73h + dw conditional_jump-assembler + db 'jne',75h + dw conditional_jump-assembler + db 'jng',7Eh + dw conditional_jump-assembler + db 'jnl',7Dh + dw conditional_jump-assembler + db 'jno',71h + dw conditional_jump-assembler + db 'jnp',7Bh + dw conditional_jump-assembler + db 'jns',79h + dw conditional_jump-assembler + db 'jnz',75h + dw conditional_jump-assembler + db 'jpe',7Ah + dw conditional_jump-assembler + db 'jpo',7Bh + dw conditional_jump-assembler + db 'lar',2 + dw lar_instruction-assembler + db 'lds',3 + dw ls_instruction-assembler + db 'lea',0 + dw lea_instruction-assembler + db 'les',0 + dw ls_instruction-assembler + db 'lfs',4 + dw ls_instruction-assembler + db 'lgs',5 + dw ls_instruction-assembler + db 'lsl',3 + dw lar_instruction-assembler + db 'lss',2 + dw ls_instruction-assembler + db 'ltr',3 + dw pm_word_instruction-assembler + db 'mov',0 + dw mov_instruction-assembler + db 'mul',4 + dw single_operand_instruction-assembler + db 'neg',3 + dw single_operand_instruction-assembler + db 'nop',90h + dw simple_instruction-assembler + db 'not',2 + dw single_operand_instruction-assembler + db 'org',0 + dw org_directive-assembler + db 'out',0 + dw out_instruction-assembler + db 'pop',0 + dw pop_instruction-assembler + db 'por',0EBh + dw mmx_instruction-assembler + db 'rcl',2 + dw sh_instruction-assembler + db 'rcr',3 + dw sh_instruction-assembler + db 'rep',0F3h + dw prefix_instruction-assembler + db 'ret',0C2h + dw ret_instruction-assembler + db 'rol',0 + dw sh_instruction-assembler + db 'ror',1 + dw sh_instruction-assembler + db 'rsm',0AAh + dw simple_extended_instruction-assembler + db 'sal',4 + dw sh_instruction-assembler + db 'sar',7 + dw sh_instruction-assembler + db 'sbb',18h + dw basic_instruction-assembler + db 'shl',4 + dw sh_instruction-assembler + db 'shr',5 + dw sh_instruction-assembler + db 'stc',0F9h + dw simple_instruction-assembler + db 'std',0FDh + dw simple_instruction-assembler + db 'sti',0FBh + dw simple_instruction-assembler + db 'str',1 + dw pm_store_word_instruction-assembler + db 'sub',28h + dw basic_instruction-assembler + db 'ud2',0Bh + dw simple_extended_instruction-assembler + db 'xor',30h + dw basic_instruction-assembler +instructions_4: + db 'arpl',0 + dw arpl_instruction-assembler + db 'call',0 + dw call_instruction-assembler + db 'cdqe',98h + dw simple_instruction_64bit-assembler + db 'clgi',0DDh + dw simple_vmx_instruction-assembler + db 'clts',6 + dw simple_extended_instruction-assembler + db 'cmps',0A6h + dw cmps_instruction-assembler + db 'cwde',98h + dw simple_instruction_32bit-assembler + db 'data',0 + dw data_directive-assembler + db 'else',0 + dw else_directive-assembler + db 'emms',77h + dw simple_extended_instruction-assembler + db 'fabs',100001b + dw simple_fpu_instruction-assembler + db 'fadd',0 + dw basic_fpu_instruction-assembler + db 'fbld',4 + dw fbld_instruction-assembler + db 'fchs',100000b + dw simple_fpu_instruction-assembler + db 'fcom',2 + dw basic_fpu_instruction-assembler + db 'fcos',111111b + dw simple_fpu_instruction-assembler + db 'fdiv',6 + dw basic_fpu_instruction-assembler + db 'feni',0E0h + dw finit_instruction-assembler + db 'fild',0 + dw fild_instruction-assembler + db 'fist',2 + dw fild_instruction-assembler + db 'fld1',101000b + dw simple_fpu_instruction-assembler + db 'fldz',101110b + dw simple_fpu_instruction-assembler + db 'fmul',1 + dw basic_fpu_instruction-assembler + db 'fnop',010000b + dw simple_fpu_instruction-assembler + db 'fsin',111110b + dw simple_fpu_instruction-assembler + db 'fstp',3 + dw fld_instruction-assembler + db 'fsub',4 + dw basic_fpu_instruction-assembler + db 'ftst',100100b + dw simple_fpu_instruction-assembler + db 'fxam',100101b + dw simple_fpu_instruction-assembler + db 'fxch',0 + dw fxch_instruction-assembler + db 'heap',0 + dw heap_directive-assembler + db 'idiv',7 + dw single_operand_instruction-assembler + db 'imul',0 + dw imul_instruction-assembler + db 'insb',6Ch + dw simple_instruction-assembler + db 'insd',6Dh + dw simple_instruction_32bit-assembler + db 'insw',6Dh + dw simple_instruction_16bit-assembler + db 'int1',0F1h + dw simple_instruction-assembler + db 'int3',0CCh + dw simple_instruction-assembler + db 'into',0CEh + dw simple_instruction_except64-assembler + db 'invd',8 + dw simple_extended_instruction-assembler + db 'iret',0CFh + dw iret_instruction-assembler + db 'jcxz',0E3h + dw loop_instruction_16bit-assembler + db 'jnae',72h + dw conditional_jump-assembler + db 'jnbe',77h + dw conditional_jump-assembler + db 'jnge',7Ch + dw conditional_jump-assembler + db 'jnle',7Fh + dw conditional_jump-assembler + db 'lahf',9Fh + dw simple_instruction-assembler + db 'lgdt',2 + dw lgdt_instruction-assembler + db 'lidt',3 + dw lgdt_instruction-assembler + db 'lldt',2 + dw pm_word_instruction-assembler + db 'lmsw',16h + dw pm_word_instruction-assembler + db 'load',0 + dw load_directive-assembler + db 'lock',0F0h + dw prefix_instruction-assembler + db 'lods',0ACh + dw lods_instruction-assembler + db 'loop',0E2h + dw loop_instruction-assembler + db 'movd',0 + dw movd_instruction-assembler + db 'movq',0 + dw movq_instruction-assembler + db 'movs',0A4h + dw movs_instruction-assembler + db 'orpd',56h + dw sse_pd_instruction-assembler + db 'orps',56h + dw sse_ps_instruction-assembler + db 'outs',6Eh + dw outs_instruction-assembler + db 'pand',0DBh + dw mmx_instruction-assembler + db 'popa',61h + dw simple_instruction_except64-assembler + db 'popd',4 + dw pop_instruction-assembler + db 'popf',9Dh + dw simple_instruction-assembler + db 'popq',8 + dw pop_instruction-assembler + db 'popw',2 + dw pop_instruction-assembler + db 'push',0 + dw push_instruction-assembler + db 'pxor',0EFh + dw mmx_instruction-assembler + db 'repe',0F3h + dw prefix_instruction-assembler + db 'repz',0F3h + dw prefix_instruction-assembler + db 'retd',0C2h + dw ret_instruction_32bit_except64-assembler + db 'retf',0CAh + dw retf_instruction-assembler + db 'retn',0C2h + dw ret_instruction-assembler + db 'retq',0C2h + dw ret_instruction_only64-assembler + db 'retw',0C2h + dw ret_instruction_16bit-assembler + db 'sahf',9Eh + dw simple_instruction-assembler + db 'salc',0D6h + dw simple_instruction_except64-assembler + db 'scas',0AEh + dw stos_instruction-assembler + db 'seta',97h + dw set_instruction-assembler + db 'setb',92h + dw set_instruction-assembler + db 'setc',92h + dw set_instruction-assembler + db 'sete',94h + dw set_instruction-assembler + db 'setg',9Fh + dw set_instruction-assembler + db 'setl',9Ch + dw set_instruction-assembler + db 'seto',90h + dw set_instruction-assembler + db 'setp',9Ah + dw set_instruction-assembler + db 'sets',98h + dw set_instruction-assembler + db 'setz',94h + dw set_instruction-assembler + db 'sgdt',0 + dw lgdt_instruction-assembler + db 'shld',0A4h + dw shd_instruction-assembler + db 'shrd',0ACh + dw shd_instruction-assembler + db 'sidt',1 + dw lgdt_instruction-assembler + db 'sldt',0 + dw pm_store_word_instruction-assembler + db 'smsw',14h + dw pm_store_word_instruction-assembler + db 'stgi',0DCh + dw simple_vmx_instruction-assembler + db 'stos',0AAh + dw stos_instruction-assembler + db 'test',0 + dw test_instruction-assembler + db 'verr',4 + dw pm_word_instruction-assembler + db 'verw',5 + dw pm_word_instruction-assembler + db 'wait',9Bh + dw simple_instruction-assembler + db 'xadd',0C0h + dw basic_486_instruction-assembler + db 'xchg',0 + dw xchg_instruction-assembler + db 'xlat',0D7h + dw xlat_instruction-assembler +instructions_5: + db 'addpd',58h + dw sse_pd_instruction-assembler + db 'addps',58h + dw sse_ps_instruction-assembler + db 'addsd',58h + dw sse_sd_instruction-assembler + db 'addss',58h + dw sse_ss_instruction-assembler + db 'align',0 + dw align_directive-assembler + db 'andpd',54h + dw sse_pd_instruction-assembler + db 'andps',54h + dw sse_ps_instruction-assembler + db 'bound',0 + dw bound_instruction-assembler + db 'break',0 + dw break_directive-assembler + db 'bswap',0 + dw bswap_instruction-assembler + db 'cmova',47h + dw cmov_instruction-assembler + db 'cmovb',42h + dw cmov_instruction-assembler + db 'cmovc',42h + dw cmov_instruction-assembler + db 'cmove',44h + dw cmov_instruction-assembler + db 'cmovg',4Fh + dw cmov_instruction-assembler + db 'cmovl',4Ch + dw cmov_instruction-assembler + db 'cmovo',40h + dw cmov_instruction-assembler + db 'cmovp',4Ah + dw cmov_instruction-assembler + db 'cmovs',48h + dw cmov_instruction-assembler + db 'cmovz',44h + dw cmov_instruction-assembler + db 'cmppd',0 + dw cmppd_instruction-assembler + db 'cmpps',0 + dw cmpps_instruction-assembler + db 'cmpsb',0A6h + dw simple_instruction-assembler + db 'cmpsd',0 + dw cmpsd_instruction-assembler + db 'cmpsq',0A7h + dw simple_instruction_64bit-assembler + db 'cmpss',0 + dw cmpss_instruction-assembler + db 'cmpsw',0A7h + dw simple_instruction_16bit-assembler + db 'cpuid',0A2h + dw simple_extended_instruction-assembler + db 'divpd',5Eh + dw sse_pd_instruction-assembler + db 'divps',5Eh + dw sse_ps_instruction-assembler + db 'divsd',5Eh + dw sse_sd_instruction-assembler + db 'divss',5Eh + dw sse_ss_instruction-assembler + db 'enter',0 + dw enter_instruction-assembler + db 'entry',0 + dw entry_directive-assembler + db 'extrn',0 + dw extrn_directive-assembler + db 'f2xm1',110000b + dw simple_fpu_instruction-assembler + db 'faddp',0 + dw faddp_instruction-assembler + db 'fbstp',6 + dw fbld_instruction-assembler + db 'fclex',0E2h + dw finit_instruction-assembler + db 'fcomi',0F0h + dw fcomi_instruction-assembler + db 'fcomp',3 + dw basic_fpu_instruction-assembler + db 'fdisi',0E1h + dw finit_instruction-assembler + db 'fdivp',7 + dw faddp_instruction-assembler + db 'fdivr',7 + dw basic_fpu_instruction-assembler + db 'femms',0Eh + dw simple_extended_instruction-assembler + db 'ffree',0 + dw ffree_instruction-assembler + db 'fiadd',0 + dw fi_instruction-assembler + db 'ficom',2 + dw fi_instruction-assembler + db 'fidiv',6 + dw fi_instruction-assembler + db 'fimul',1 + dw fi_instruction-assembler + db 'finit',0E3h + dw finit_instruction-assembler + db 'fistp',3 + dw fild_instruction-assembler + db 'fisub',4 + dw fi_instruction-assembler + db 'fldcw',5 + dw fldcw_instruction-assembler + db 'fldpi',101011b + dw simple_fpu_instruction-assembler + db 'fmulp',1 + dw faddp_instruction-assembler + db 'fneni',0E0h + dw fninit_instruction-assembler + db 'fprem',111000b + dw simple_fpu_instruction-assembler + db 'fptan',110010b + dw simple_fpu_instruction-assembler + db 'fsave',6 + dw fsave_instruction-assembler + db 'fsqrt',111010b + dw simple_fpu_instruction-assembler + db 'fstcw',7 + dw fstcw_instruction-assembler + db 'fstsw',0 + dw fstsw_instruction-assembler + db 'fsubp',5 + dw faddp_instruction-assembler + db 'fsubr',5 + dw basic_fpu_instruction-assembler + db 'fucom',4 + dw ffree_instruction-assembler + db 'fwait',9Bh + dw simple_instruction-assembler + db 'fyl2x',110001b + dw simple_fpu_instruction-assembler + db 'icebp',0F1h + dw simple_instruction-assembler + db 'iretd',0CFh + dw simple_instruction_32bit-assembler + db 'iretq',0CFh + dw simple_instruction_64bit-assembler + db 'iretw',0CFh + dw simple_instruction_16bit-assembler + db 'jecxz',0E3h + dw loop_instruction_32bit-assembler + db 'jrcxz',0E3h + dw loop_instruction_64bit-assembler + db 'label',0 + dw label_directive-assembler + db 'lddqu',0 + dw lddqu_instruction-assembler + db 'leave',0C9h + dw simple_instruction-assembler + db 'lodsb',0ACh + dw simple_instruction-assembler + db 'lodsd',0ADh + dw simple_instruction_32bit-assembler + db 'lodsq',0ADh + dw simple_instruction_64bit-assembler + db 'lodsw',0ADh + dw simple_instruction_16bit-assembler + db 'loopd',0E2h + dw loop_instruction_32bit-assembler + db 'loope',0E1h + dw loop_instruction-assembler + db 'loopq',0E2h + dw loop_instruction_64bit-assembler + db 'loopw',0E2h + dw loop_instruction_16bit-assembler + db 'loopz',0E1h + dw loop_instruction-assembler + db 'maxpd',5Fh + dw sse_pd_instruction-assembler + db 'maxps',5Fh + dw sse_ps_instruction-assembler + db 'maxsd',5Fh + dw sse_sd_instruction-assembler + db 'maxss',5Fh + dw sse_ss_instruction-assembler + db 'minpd',5Dh + dw sse_pd_instruction-assembler + db 'minps',5Dh + dw sse_ps_instruction-assembler + db 'minsd',5Dh + dw sse_sd_instruction-assembler + db 'minss',5Dh + dw sse_ss_instruction-assembler + db 'movsb',0A4h + dw simple_instruction-assembler + db 'movsd',0 + dw movsd_instruction-assembler + db 'movsq',0A5h + dw simple_instruction_64bit-assembler + db 'movss',0 + dw movss_instruction-assembler + db 'movsw',0A5h + dw simple_instruction_16bit-assembler + db 'movsx',0BEh + dw movx_instruction-assembler + db 'movzx',0B6h + dw movx_instruction-assembler + db 'mulpd',59h + dw sse_pd_instruction-assembler + db 'mulps',59h + dw sse_ps_instruction-assembler + db 'mulsd',59h + dw sse_sd_instruction-assembler + db 'mulss',59h + dw sse_ss_instruction-assembler + db 'mwait',0C9h + dw monitor_instruction-assembler + db 'outsb',6Eh + dw simple_instruction-assembler + db 'outsd',6Fh + dw simple_instruction_32bit-assembler + db 'outsw',6Fh + dw simple_instruction_16bit-assembler + db 'paddb',0FCh + dw mmx_instruction-assembler + db 'paddd',0FEh + dw mmx_instruction-assembler + db 'paddq',0D4h + dw mmx_instruction-assembler + db 'paddw',0FDh + dw mmx_instruction-assembler + db 'pandn',0DFh + dw mmx_instruction-assembler + db 'pause',0 + dw pause_instruction-assembler + db 'pavgb',0E0h + dw mmx_instruction-assembler + db 'pavgw',0E3h + dw mmx_instruction-assembler + db 'pf2id',1Dh + dw amd3dnow_instruction-assembler + db 'pf2iw',1Ch + dw amd3dnow_instruction-assembler + db 'pfacc',0AEh + dw amd3dnow_instruction-assembler + db 'pfadd',9Eh + dw amd3dnow_instruction-assembler + db 'pfmax',0A4h + dw amd3dnow_instruction-assembler + db 'pfmin',94h + dw amd3dnow_instruction-assembler + db 'pfmul',0B4h + dw amd3dnow_instruction-assembler + db 'pfrcp',96h + dw amd3dnow_instruction-assembler + db 'pfsub',9Ah + dw amd3dnow_instruction-assembler + db 'pi2fd',0Dh + dw amd3dnow_instruction-assembler + db 'pi2fw',0Ch + dw amd3dnow_instruction-assembler + db 'popad',61h + dw simple_instruction_32bit_except64-assembler + db 'popaw',61h + dw simple_instruction_16bit_except64-assembler + db 'popfd',9Dh + dw simple_instruction_32bit_except64-assembler + db 'popfq',9Dh + dw simple_instruction_only64-assembler + db 'popfw',9Dh + dw simple_instruction_16bit-assembler + db 'pslld',0F2h + dw mmx_ps_instruction-assembler + db 'psllq',0F3h + dw mmx_ps_instruction-assembler + db 'psllw',0F1h + dw mmx_ps_instruction-assembler + db 'psrad',0E2h + dw mmx_ps_instruction-assembler + db 'psraw',0E1h + dw mmx_ps_instruction-assembler + db 'psrld',0D2h + dw mmx_ps_instruction-assembler + db 'psrlq',0D3h + dw mmx_ps_instruction-assembler + db 'psrlw',0D1h + dw mmx_ps_instruction-assembler + db 'psubb',0F8h + dw mmx_instruction-assembler + db 'psubd',0FAh + dw mmx_instruction-assembler + db 'psubq',0FBh + dw mmx_instruction-assembler + db 'psubw',0F9h + dw mmx_instruction-assembler + db 'pusha',60h + dw simple_instruction_except64-assembler + db 'pushd',4 + dw push_instruction-assembler + db 'pushf',9Ch + dw simple_instruction-assembler + db 'pushq',8 + dw push_instruction-assembler + db 'pushw',2 + dw push_instruction-assembler + db 'rcpps',53h + dw sse_ps_instruction-assembler + db 'rcpss',53h + dw sse_ss_instruction-assembler + db 'rdmsr',32h + dw simple_extended_instruction-assembler + db 'rdpmc',33h + dw simple_extended_instruction-assembler + db 'rdtsc',31h + dw simple_extended_instruction-assembler + db 'repne',0F2h + dw prefix_instruction-assembler + db 'repnz',0F2h + dw prefix_instruction-assembler + db 'retfd',0CAh + dw ret_instruction_32bit-assembler + db 'retfq',0CAh + dw ret_instruction_64bit-assembler + db 'retfw',0CAh + dw ret_instruction_16bit-assembler + db 'retnd',0C2h + dw ret_instruction_32bit_except64-assembler + db 'retnq',0C2h + dw ret_instruction_only64-assembler + db 'retnw',0C2h + dw ret_instruction_16bit-assembler + db 'scasb',0AEh + dw simple_instruction-assembler + db 'scasd',0AFh + dw simple_instruction_32bit-assembler + db 'scasq',0AFh + dw simple_instruction_64bit-assembler + db 'scasw',0AFh + dw simple_instruction_16bit-assembler + db 'setae',93h + dw set_instruction-assembler + db 'setbe',96h + dw set_instruction-assembler + db 'setge',9Dh + dw set_instruction-assembler + db 'setle',9Eh + dw set_instruction-assembler + db 'setna',96h + dw set_instruction-assembler + db 'setnb',93h + dw set_instruction-assembler + db 'setnc',93h + dw set_instruction-assembler + db 'setne',95h + dw set_instruction-assembler + db 'setng',9Eh + dw set_instruction-assembler + db 'setnl',9Dh + dw set_instruction-assembler + db 'setno',91h + dw set_instruction-assembler + db 'setnp',9Bh + dw set_instruction-assembler + db 'setns',99h + dw set_instruction-assembler + db 'setnz',95h + dw set_instruction-assembler + db 'setpe',9Ah + dw set_instruction-assembler + db 'setpo',9Bh + dw set_instruction-assembler + db 'stack',0 + dw stack_directive-assembler + db 'store',0 + dw store_directive-assembler + db 'stosb',0AAh + dw simple_instruction-assembler + db 'stosd',0ABh + dw simple_instruction_32bit-assembler + db 'stosq',0ABh + dw simple_instruction_64bit-assembler + db 'stosw',0ABh + dw simple_instruction_16bit-assembler + db 'subpd',5Ch + dw sse_pd_instruction-assembler + db 'subps',5Ch + dw sse_ps_instruction-assembler + db 'subsd',5Ch + dw sse_sd_instruction-assembler + db 'subss',5Ch + dw sse_ss_instruction-assembler + db 'times',0 + dw times_directive-assembler + db 'vmrun',0D8h + dw simple_svm_instruction-assembler + db 'vmxon',6 + dw vmxon_instruction-assembler + db 'while',0 + dw while_directive-assembler + db 'wrmsr',30h + dw simple_extended_instruction-assembler + db 'xlatb',0D7h + dw simple_instruction-assembler + db 'xorpd',57h + dw sse_pd_instruction-assembler + db 'xorps',57h + dw sse_ps_instruction-assembler +instructions_6: + db 'andnpd',55h + dw sse_pd_instruction-assembler + db 'andnps',55h + dw sse_ps_instruction-assembler + db 'cmovae',43h + dw cmov_instruction-assembler + db 'cmovbe',46h + dw cmov_instruction-assembler + db 'cmovge',4Dh + dw cmov_instruction-assembler + db 'cmovle',4Eh + dw cmov_instruction-assembler + db 'cmovna',46h + dw cmov_instruction-assembler + db 'cmovnb',43h + dw cmov_instruction-assembler + db 'cmovnc',43h + dw cmov_instruction-assembler + db 'cmovne',45h + dw cmov_instruction-assembler + db 'cmovng',4Eh + dw cmov_instruction-assembler + db 'cmovnl',4Dh + dw cmov_instruction-assembler + db 'cmovno',41h + dw cmov_instruction-assembler + db 'cmovnp',4Bh + dw cmov_instruction-assembler + db 'cmovns',49h + dw cmov_instruction-assembler + db 'cmovnz',45h + dw cmov_instruction-assembler + db 'cmovpe',4Ah + dw cmov_instruction-assembler + db 'cmovpo',4Bh + dw cmov_instruction-assembler + db 'comisd',2Fh + dw comisd_instruction-assembler + db 'comiss',2Fh + dw comiss_instruction-assembler + db 'fcmovb',0C0h + dw fcmov_instruction-assembler + db 'fcmove',0C8h + dw fcmov_instruction-assembler + db 'fcmovu',0D8h + dw fcmov_instruction-assembler + db 'fcomip',0F0h + dw fcomip_instruction-assembler + db 'fcompp',0 + dw fcompp_instruction-assembler + db 'fdivrp',6 + dw faddp_instruction-assembler + db 'ffreep',0 + dw ffreep_instruction-assembler + db 'ficomp',3 + dw fi_instruction-assembler + db 'fidivr',7 + dw fi_instruction-assembler + db 'fisttp',1 + dw fild_instruction-assembler + db 'fisubr',5 + dw fi_instruction-assembler + db 'fldenv',4 + dw fldenv_instruction-assembler + db 'fldl2e',101010b + dw simple_fpu_instruction-assembler + db 'fldl2t',101001b + dw simple_fpu_instruction-assembler + db 'fldlg2',101100b + dw simple_fpu_instruction-assembler + db 'fldln2',101101b + dw simple_fpu_instruction-assembler + db 'fnclex',0E2h + dw fninit_instruction-assembler + db 'fndisi',0E1h + dw fninit_instruction-assembler + db 'fninit',0E3h + dw fninit_instruction-assembler + db 'fnsave',6 + dw fnsave_instruction-assembler + db 'fnstcw',7 + dw fldcw_instruction-assembler + db 'fnstsw',0 + dw fnstsw_instruction-assembler + db 'format',0 + dw format_directive-assembler + db 'fpatan',110011b + dw simple_fpu_instruction-assembler + db 'fprem1',110101b + dw simple_fpu_instruction-assembler + db 'frstor',4 + dw fnsave_instruction-assembler + db 'frstpm',0E5h + dw fninit_instruction-assembler + db 'fscale',111101b + dw simple_fpu_instruction-assembler + db 'fsetpm',0E4h + dw fninit_instruction-assembler + db 'fstenv',6 + dw fstenv_instruction-assembler + db 'fsubrp',4 + dw faddp_instruction-assembler + db 'fucomi',0E8h + dw fcomi_instruction-assembler + db 'fucomp',5 + dw ffree_instruction-assembler + db 'fxsave',0 + dw fxsave_instruction-assembler + db 'haddpd',07Ch + dw sse_pd_instruction-assembler + db 'haddps',07Ch + dw cvtpd2dq_instruction-assembler + db 'hsubpd',07Dh + dw sse_pd_instruction-assembler + db 'hsubps',07Dh + dw cvtpd2dq_instruction-assembler + db 'invlpg',0 + dw invlpg_instruction-assembler + db 'lfence',0E8h + dw fence_instruction-assembler + db 'looped',0E1h + dw loop_instruction_32bit-assembler + db 'loopeq',0E1h + dw loop_instruction_64bit-assembler + db 'loopew',0E1h + dw loop_instruction_16bit-assembler + db 'loopne',0E0h + dw loop_instruction-assembler + db 'loopnz',0E0h + dw loop_instruction-assembler + db 'loopzd',0E1h + dw loop_instruction_32bit-assembler + db 'loopzq',0E1h + dw loop_instruction_64bit-assembler + db 'loopzw',0E1h + dw loop_instruction_16bit-assembler + db 'mfence',0F0h + dw fence_instruction-assembler + db 'movapd',28h + dw movpd_instruction-assembler + db 'movaps',28h + dw movps_instruction-assembler + db 'movdqa',66h + dw movdq_instruction-assembler + db 'movdqu',0F3h + dw movdq_instruction-assembler + db 'movhpd',16h + dw movlpd_instruction-assembler + db 'movhps',16h + dw movlps_instruction-assembler + db 'movlpd',12h + dw movlpd_instruction-assembler + db 'movlps',12h + dw movlps_instruction-assembler + db 'movnti',0C3h + dw movnti_instruction-assembler + db 'movntq',0E7h + dw movntq_instruction-assembler + db 'movsxd',63h + dw movsxd_instruction-assembler + db 'movupd',10h + dw movpd_instruction-assembler + db 'movups',10h + dw movps_instruction-assembler + db 'paddsb',0ECh + dw mmx_instruction-assembler + db 'paddsw',0EDh + dw mmx_instruction-assembler + db 'pextrw',0C5h + dw pextrw_instruction-assembler + db 'pfnacc',8Ah + dw amd3dnow_instruction-assembler + db 'pfsubr',0AAh + dw amd3dnow_instruction-assembler + db 'pinsrw',0C4h + dw pinsrw_instruction-assembler + db 'pmaxsw',0EEh + dw mmx_instruction-assembler + db 'pmaxub',0DEh + dw mmx_instruction-assembler + db 'pminsw',0EAh + dw mmx_instruction-assembler + db 'pminub',0DAh + dw mmx_instruction-assembler + db 'pmulhw',0E5h + dw mmx_instruction-assembler + db 'pmullw',0D5h + dw mmx_instruction-assembler + db 'psadbw',0F6h + dw mmx_instruction-assembler + db 'pshufd',66h + dw pshufd_instruction-assembler + db 'pshufw',0 + dw pshufw_instruction-assembler + db 'pslldq',111b + dw ps_dq_instruction-assembler + db 'psrldq',011b + dw ps_dq_instruction-assembler + db 'psubsb',0E8h + dw mmx_instruction-assembler + db 'psubsw',0E9h + dw mmx_instruction-assembler + db 'pswapd',0BBh + dw amd3dnow_instruction-assembler + db 'public',0 + dw public_directive-assembler + db 'pushad',60h + dw simple_instruction_32bit_except64-assembler + db 'pushaw',60h + dw simple_instruction_16bit_except64-assembler + db 'pushfd',9Ch + dw simple_instruction_32bit_except64-assembler + db 'pushfq',9Ch + dw simple_instruction_only64-assembler + db 'pushfw',9Ch + dw simple_instruction_16bit-assembler + db 'rdtscp',1 + dw swapgs_instruction-assembler + db 'repeat',0 + dw repeat_directive-assembler + db 'setalc',0D6h + dw simple_instruction_except64-assembler + db 'setnae',92h + dw set_instruction-assembler + db 'setnbe',97h + dw set_instruction-assembler + db 'setnge',9Ch + dw set_instruction-assembler + db 'setnle',9Fh + dw set_instruction-assembler + db 'sfence',0F8h + dw fence_instruction-assembler + db 'shufpd',0C6h + dw sse_pd_instruction-assembler + db 'shufps',0C6h + dw sse_ps_instruction-assembler + db 'skinit',0 + dw skinit_instruction-assembler + db 'sqrtpd',51h + dw sse_pd_instruction-assembler + db 'sqrtps',51h + dw sse_ps_instruction-assembler + db 'sqrtsd',51h + dw sse_sd_instruction-assembler + db 'sqrtss',51h + dw sse_ss_instruction-assembler + db 'swapgs',0 + dw swapgs_instruction-assembler + db 'sysret',07h + dw simple_extended_instruction-assembler + db 'vmcall',0C1h + dw simple_vmx_instruction-assembler + db 'vmload',0DAh + dw simple_svm_instruction-assembler + db 'vmread',0 + dw vmread_instruction-assembler + db 'vmsave',0DBh + dw simple_svm_instruction-assembler + db 'vmxoff',0C4h + dw simple_vmx_instruction-assembler + db 'wbinvd',9 + dw simple_extended_instruction-assembler +instructions_7: + db 'clflush',111b + dw fxsave_instruction-assembler + db 'cmovnae',42h + dw cmov_instruction-assembler + db 'cmovnbe',47h + dw cmov_instruction-assembler + db 'cmovnge',4Ch + dw cmov_instruction-assembler + db 'cmovnle',4Fh + dw cmov_instruction-assembler + db 'cmpeqpd',0 + dw cmp_pd_instruction-assembler + db 'cmpeqps',0 + dw cmp_ps_instruction-assembler + db 'cmpeqsd',0 + dw cmp_sd_instruction-assembler + db 'cmpeqss',0 + dw cmp_ss_instruction-assembler + db 'cmplepd',2 + dw cmp_pd_instruction-assembler + db 'cmpleps',2 + dw cmp_ps_instruction-assembler + db 'cmplesd',2 + dw cmp_sd_instruction-assembler + db 'cmpless',2 + dw cmp_ss_instruction-assembler + db 'cmpltpd',1 + dw cmp_pd_instruction-assembler + db 'cmpltps',1 + dw cmp_ps_instruction-assembler + db 'cmpltsd',1 + dw cmp_sd_instruction-assembler + db 'cmpltss',1 + dw cmp_ss_instruction-assembler + db 'cmpxchg',0B0h + dw basic_486_instruction-assembler + db 'display',0 + dw display_directive-assembler + db 'fcmovbe',0D0h + dw fcmov_instruction-assembler + db 'fcmovnb',0C0h + dw fcomi_instruction-assembler + db 'fcmovne',0C8h + dw fcomi_instruction-assembler + db 'fcmovnu',0D8h + dw fcomi_instruction-assembler + db 'fdecstp',110110b + dw simple_fpu_instruction-assembler + db 'fincstp',110111b + dw simple_fpu_instruction-assembler + db 'fnstenv',6 + dw fldenv_instruction-assembler + db 'frndint',111100b + dw simple_fpu_instruction-assembler + db 'fsincos',111011b + dw simple_fpu_instruction-assembler + db 'fucomip',0E8h + dw fcomip_instruction-assembler + db 'fucompp',0 + dw fucompp_instruction-assembler + db 'fxrstor',1 + dw fxsave_instruction-assembler + db 'fxtract',110100b + dw simple_fpu_instruction-assembler + db 'fyl2xp1',111001b + dw simple_fpu_instruction-assembler + db 'invlpga',0DFh + dw invlpga_instruction-assembler + db 'ldmxcsr',10b + dw fxsave_instruction-assembler + db 'loopned',0E0h + dw loop_instruction_32bit-assembler + db 'loopneq',0E0h + dw loop_instruction_64bit-assembler + db 'loopnew',0E0h + dw loop_instruction_16bit-assembler + db 'loopnzd',0E0h + dw loop_instruction_32bit-assembler + db 'loopnzq',0E0h + dw loop_instruction_64bit-assembler + db 'loopnzw',0E0h + dw loop_instruction_16bit-assembler + db 'monitor',0C8h + dw monitor_instruction-assembler + db 'movddup',12h + dw sse_sd_instruction-assembler + db 'movdq2q',0 + dw movdq2q_instruction-assembler + db 'movhlps',12h + dw movhlps_instruction-assembler + db 'movlhps',16h + dw movhlps_instruction-assembler + db 'movntdq',0E7h + dw movntdq_instruction-assembler + db 'movntpd',2Bh + dw movntdq_instruction-assembler + db 'movntps',2Bh + dw movntps_instruction-assembler + db 'movq2dq',0 + dw movq2dq_instruction-assembler + db 'paddusb',0DCh + dw mmx_instruction-assembler + db 'paddusw',0DDh + dw mmx_instruction-assembler + db 'pavgusb',0BFh + dw amd3dnow_instruction-assembler + db 'pcmpeqb',74h + dw mmx_instruction-assembler + db 'pcmpeqd',76h + dw mmx_instruction-assembler + db 'pcmpeqw',75h + dw mmx_instruction-assembler + db 'pcmpgtb',64h + dw mmx_instruction-assembler + db 'pcmpgtd',66h + dw mmx_instruction-assembler + db 'pcmpgtw',65h + dw mmx_instruction-assembler + db 'pfcmpeq',0B0h + dw amd3dnow_instruction-assembler + db 'pfcmpge',90h + dw amd3dnow_instruction-assembler + db 'pfcmpgt',0A0h + dw amd3dnow_instruction-assembler + db 'pfpnacc',8Eh + dw amd3dnow_instruction-assembler + db 'pfrsqrt',97h + dw amd3dnow_instruction-assembler + db 'pmaddwd',0F5h + dw mmx_instruction-assembler + db 'pmulhrw',0B7h + dw amd3dnow_instruction-assembler + db 'pmulhuw',0E4h + dw mmx_instruction-assembler + db 'pmuludq',0F4h + dw mmx_instruction-assembler + db 'pshufhw',0F3h + dw pshufd_instruction-assembler + db 'pshuflw',0F2h + dw pshufd_instruction-assembler + db 'psubusb',0D8h + dw mmx_instruction-assembler + db 'psubusw',0D9h + dw mmx_instruction-assembler + db 'rsqrtps',52h + dw sse_ps_instruction-assembler + db 'rsqrtss',52h + dw sse_ss_instruction-assembler + db 'section',0 + dw section_directive-assembler + db 'segment',0 + dw segment_directive-assembler + db 'stmxcsr',11b + dw fxsave_instruction-assembler + db 'syscall',05h + dw simple_extended_instruction-assembler + db 'sysexit',35h + dw simple_extended_instruction-assembler + db 'ucomisd',2Eh + dw comisd_instruction-assembler + db 'ucomiss',2Eh + dw comiss_instruction-assembler + db 'virtual',0 + dw virtual_directive-assembler + db 'vmclear',6 + dw vmclear_instruction-assembler + db 'vmmcall',0D9h + dw simple_vmx_instruction-assembler + db 'vmptrld',6 + dw vmx_instruction-assembler + db 'vmptrst',7 + dw vmx_instruction-assembler + db 'vmwrite',0 + dw vmwrite_instruction-assembler +instructions_8: + db 'addsubpd',0D0h + dw sse_pd_instruction-assembler + db 'addsubps',0D0h + dw cvtpd2dq_instruction-assembler + db 'cmpneqpd',4 + dw cmp_pd_instruction-assembler + db 'cmpneqps',4 + dw cmp_ps_instruction-assembler + db 'cmpneqsd',4 + dw cmp_sd_instruction-assembler + db 'cmpneqss',4 + dw cmp_ss_instruction-assembler + db 'cmpnlepd',6 + dw cmp_pd_instruction-assembler + db 'cmpnleps',6 + dw cmp_ps_instruction-assembler + db 'cmpnlesd',6 + dw cmp_sd_instruction-assembler + db 'cmpnless',6 + dw cmp_ss_instruction-assembler + db 'cmpnltpd',5 + dw cmp_pd_instruction-assembler + db 'cmpnltps',5 + dw cmp_ps_instruction-assembler + db 'cmpnltsd',5 + dw cmp_sd_instruction-assembler + db 'cmpnltss',5 + dw cmp_ss_instruction-assembler + db 'cmpordpd',7 + dw cmp_pd_instruction-assembler + db 'cmpordps',7 + dw cmp_ps_instruction-assembler + db 'cmpordsd',7 + dw cmp_sd_instruction-assembler + db 'cmpordss',7 + dw cmp_ss_instruction-assembler + db 'cvtdq2pd',0E6h + dw cvtdq2pd_instruction-assembler + db 'cvtdq2ps',5Bh + dw sse_ps_instruction-assembler + db 'cvtpd2dq',0E6h + dw cvtpd2dq_instruction-assembler + db 'cvtpd2pi',2Dh + dw cvtpd2pi_instruction-assembler + db 'cvtpd2ps',5Ah + dw sse_pd_instruction-assembler + db 'cvtpi2pd',2Ah + dw cvtpi2pd_instruction-assembler + db 'cvtpi2ps',2Ah + dw cvtpi2ps_instruction-assembler + db 'cvtps2dq',5Bh + dw sse_pd_instruction-assembler + db 'cvtps2pd',5Ah + dw cvtps2pd_instruction-assembler + db 'cvtps2pi',2Dh + dw cvtps2pi_instruction-assembler + db 'cvtsd2si',2Dh + dw cvtsd2si_instruction-assembler + db 'cvtsd2ss',5Ah + dw sse_sd_instruction-assembler + db 'cvtsi2sd',2Ah + dw cvtsi2sd_instruction-assembler + db 'cvtsi2ss',2Ah + dw cvtsi2ss_instruction-assembler + db 'cvtss2sd',5Ah + dw sse_ss_instruction-assembler + db 'cvtss2si',2Dh + dw cvtss2si_instruction-assembler + db 'fcmovnbe',0D0h + dw fcomi_instruction-assembler + db 'maskmovq',0 + dw maskmovq_instruction-assembler + db 'movmskpd',0 + dw movmskpd_instruction-assembler + db 'movmskps',0 + dw movmskps_instruction-assembler + db 'movshdup',16h + dw cvtdq2pd_instruction-assembler + db 'movsldup',12h + dw cvtdq2pd_instruction-assembler + db 'packssdw',6Bh + dw mmx_instruction-assembler + db 'packsswb',63h + dw mmx_instruction-assembler + db 'packuswb',67h + dw mmx_instruction-assembler + db 'pfrcpit1',0A6h + dw amd3dnow_instruction-assembler + db 'pfrcpit2',0B6h + dw amd3dnow_instruction-assembler + db 'pfrsqit1',0A7h + dw amd3dnow_instruction-assembler + db 'pmovmskb',0D7h + dw pextrw_instruction-assembler + db 'prefetch',0 + dw amd_prefetch_instruction-assembler + db 'sysenter',34h + dw simple_extended_instruction-assembler + db 'unpckhpd',15h + dw sse_pd_instruction-assembler + db 'unpckhps',15h + dw sse_ps_instruction-assembler + db 'unpcklpd',14h + dw sse_pd_instruction-assembler + db 'unpcklps',14h + dw sse_ps_instruction-assembler + db 'vmlaunch',0C2h + dw simple_vmx_instruction-assembler + db 'vmresume',0C3h + dw simple_vmx_instruction-assembler +instructions_9: + db 'cmpxchg8b',8 + dw cmpxchgx_instruction-assembler + db 'cvttpd2dq',0E6h + dw sse_pd_instruction-assembler + db 'cvttpd2pi',2Ch + dw cvtpd2pi_instruction-assembler + db 'cvttps2dq',5Bh + dw cvtdq2pd_instruction-assembler + db 'cvttps2pi',2Ch + dw cvtps2pi_instruction-assembler + db 'cvttsd2si',2Ch + dw cvtsd2si_instruction-assembler + db 'cvttss2si',2Ch + dw cvtss2si_instruction-assembler + db 'prefetchw',1 + dw amd_prefetch_instruction-assembler + db 'punpckhbw',68h + dw mmx_instruction-assembler + db 'punpckhdq',6Ah + dw mmx_instruction-assembler + db 'punpckhwd',69h + dw mmx_instruction-assembler + db 'punpcklbw',60h + dw mmx_instruction-assembler + db 'punpckldq',62h + dw mmx_instruction-assembler + db 'punpcklwd',61h + dw mmx_instruction-assembler +instructions_10: + db 'cmpunordpd',3 + dw cmp_pd_instruction-assembler + db 'cmpunordps',3 + dw cmp_ps_instruction-assembler + db 'cmpunordsd',3 + dw cmp_sd_instruction-assembler + db 'cmpunordss',3 + dw cmp_ss_instruction-assembler + db 'cmpxchg16b',16 + dw cmpxchgx_instruction-assembler + db 'loadall286',5 + dw simple_extended_instruction-assembler + db 'loadall386',7 + dw simple_extended_instruction-assembler + db 'maskmovdqu',0 + dw maskmovdqu_instruction-assembler + db 'prefetcht0',1 + dw prefetch_instruction-assembler + db 'prefetcht1',2 + dw prefetch_instruction-assembler + db 'prefetcht2',3 + dw prefetch_instruction-assembler + db 'punpckhqdq',6Dh + dw sse_pd_instruction-assembler + db 'punpcklqdq',6Ch + dw sse_pd_instruction-assembler +instructions_11: + db 'prefetchnta',0 + dw prefetch_instruction-assembler +instructions_end: + +data_directives: + dw data_directives_2-data_directives,(data_directives_3-data_directives_2)/(2+3) + dw data_directives_3-data_directives,(data_directives_4-data_directives_3)/(3+3) + dw data_directives_4-data_directives,(data_directives_end-data_directives_4)/(4+3) + +data_directives_2: + db 'db',1 + dw data_bytes-assembler + db 'dd',4 + dw data_dwords-assembler + db 'df',6 + dw data_pwords-assembler + db 'dp',6 + dw data_pwords-assembler + db 'dq',8 + dw data_qwords-assembler + db 'dt',10 + dw data_twords-assembler + db 'du',2 + dw data_unicode-assembler + db 'dw',2 + dw data_words-assembler + db 'rb',1 + dw reserve_bytes-assembler + db 'rd',4 + dw reserve_dwords-assembler + db 'rf',6 + dw reserve_pwords-assembler + db 'rp',6 + dw reserve_pwords-assembler + db 'rq',8 + dw reserve_qwords-assembler + db 'rt',10 + dw reserve_twords-assembler + db 'rw',2 + dw reserve_words-assembler +data_directives_3: +data_directives_4: + db 'file',1 + dw data_file-assembler +data_directives_end: diff --git a/programs/develop/fasm/trunk/assemble.inc b/programs/develop/fasm/trunk/assemble.inc new file mode 100644 index 0000000000..e53309c7a1 --- /dev/null +++ b/programs/develop/fasm/trunk/assemble.inc @@ -0,0 +1,1951 @@ + +; flat assembler core +; Copyright (c) 1999-2006, Tomasz Grysztar. +; All rights reserved. + +assembler: + xor eax,eax + mov [stub_size],eax + mov [number_of_sections],eax + mov [current_pass],ax + mov [resolver_flags],eax + assembler_loop: + mov eax,[labels_list] + mov [display_buffer],eax + mov eax,[additional_memory] + mov [free_additional_memory],eax + mov eax,[additional_memory_end] + mov [structures_buffer],eax + mov esi,[source_start] + mov edi,[code_start] + xor eax,eax + mov dword [adjustment],eax + mov dword [adjustment+4],eax + mov dword [org_origin],edi + mov dword [org_origin+4],eax + mov [org_start],edi + mov [org_registers],eax + mov [org_symbol],eax + mov [error_line],eax + mov [counter],eax + mov [format_flags],eax + mov [number_of_relocations],eax + mov [undefined_data_end],eax + mov [next_pass_needed],al + mov [output_format],al + mov [labels_type],al + mov [virtual_data],al + mov [code_type],16 + pass_loop: + call assemble_line + jnc pass_loop + mov eax,[additional_memory_end] + cmp eax,[structures_buffer] + je pass_done + sub eax,20h + mov eax,[eax+4] + mov [current_line],eax + jmp missing_end_directive + pass_done: + call close_pass + mov eax,[labels_list] + check_symbols: + cmp eax,[memory_end] + jae symbols_checked + test byte [eax+8],8 + jz symbol_defined_ok + mov cx,[current_pass] + cmp cx,[eax+18] + jne symbol_defined_ok + test byte [eax+8],1 + jz symbol_defined_ok + sub cx,[eax+16] + cmp cx,1 + jne symbol_defined_ok + and byte [eax+8],not 1 + or [next_pass_needed],-1 + symbol_defined_ok: + test byte [eax+8],10h + jz use_prediction_ok + mov cx,[current_pass] + and byte [eax+8],not 10h + test byte [eax+8],20h + jnz check_use_prediction + cmp cx,[eax+18] + jne use_prediction_ok + test byte [eax+8],8 + jz use_prediction_ok + jmp use_misprediction + check_use_prediction: + test byte [eax+8],8 + jz use_misprediction + cmp cx,[eax+18] + je use_prediction_ok + use_misprediction: + or [next_pass_needed],-1 + use_prediction_ok: + test byte [eax+8],40h + jz check_next_symbol + and byte [eax+8],not 40h + test byte [eax+8],4 + jnz define_misprediction + mov cx,[current_pass] + test byte [eax+8],80h + jnz check_define_prediction + cmp cx,[eax+16] + jne check_next_symbol + test byte [eax+8],1 + jz check_next_symbol + jmp define_misprediction + check_define_prediction: + test byte [eax+8],1 + jz define_misprediction + cmp cx,[eax+16] + je check_next_symbol + define_misprediction: + or [next_pass_needed],-1 + check_next_symbol: + add eax,LABEL_STRUCTURE_SIZE + jmp check_symbols + symbols_checked: + cmp [next_pass_needed],0 + jne next_pass + mov eax,[error_line] + or eax,eax + jz assemble_ok + mov [current_line],eax + jmp near [error] + next_pass: + inc [current_pass] + mov ax,[current_pass] + cmp ax,[passes_limit] + je code_cannot_be_generated + jmp assembler_loop + assemble_ok: + ret + +assemble_line: + mov eax,[display_buffer] + sub eax,100h + cmp edi,eax + ja out_of_memory + lods byte [esi] + cmp al,1 + je assemble_instruction + jb source_end + cmp al,3 + jb define_label + je define_constant + cmp al,0Fh + je new_line + cmp al,13h + je code_type_setting + cmp al,10h + jne illegal_instruction + lods byte [esi] + jmp segment_prefix + code_type_setting: + lods byte [esi] + mov [code_type],al + jmp line_assembled + new_line: + lods dword [esi] + mov [current_line],eax + mov [prefixed_instruction],0 + continue_line: + cmp byte [esi],0Fh + je line_assembled + jmp assemble_line + define_label: + lods dword [esi] + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + mov ebx,eax + lods byte [esi] + mov cl,al + mov eax,edi + xor edx,edx + sub eax,dword [org_origin] + sbb edx,dword [org_origin+4] + mov ch,[labels_type] + cmp [virtual_data],0 + jne make_virtual_label + or byte [ebx+9],1 + xchg eax,[ebx] + xchg edx,[ebx+4] + sub eax,[ebx] + sbb edx,[ebx+4] + mov dword [adjustment],eax + mov dword [adjustment+4],edx + or eax,edx + setnz ah + jmp finish_label_symbol + make_virtual_label: + and byte [ebx+9],not 1 + cmp eax,[ebx] + mov [ebx],eax + setne ah + cmp edx,[ebx+4] + mov [ebx+4],edx + setne al + or ah,al + finish_label_symbol: + cmp cl,[ebx+10] + mov [ebx+10],cl + setne al + or ah,al + cmp ch,[ebx+11] + mov [ebx+11],ch + setne al + or ah,al + mov edx,[org_registers] + cmp edx,[ebx+12] + mov [ebx+12],edx + setne al + or ah,al + or ch,ch + jz label_symbol_ok + mov edx,[org_symbol] + cmp edx,[ebx+20] + mov [ebx+20],edx + setne al + or ah,al + label_symbol_ok: + mov cx,[current_pass] + xchg [ebx+16],cx + mov edx,[current_line] + mov [ebx+28],edx + and byte [ebx+8],not 2 + test byte [ebx+8],1 + jz new_label + cmp cx,[ebx+16] + je symbol_already_defined + inc cx + sub cx,[ebx+16] + setnz al + or ah,al + jz continue_line + test byte [ebx+8],8 + jz continue_line + mov cx,[current_pass] + cmp cx,[ebx+18] + jne continue_line + or [next_pass_needed],-1 + jmp continue_line + new_label: + or byte [ebx+8],1 + jmp continue_line + define_constant: + lods dword [esi] + inc esi + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + mov edx,[eax+8] + push edx + cmp [current_pass],0 + je get_constant_value + test dl,4 + jnz get_constant_value + mov cx,[current_pass] + cmp cx,[eax+16] + je get_constant_value + and dl,not 1 + mov [eax+8],dl + get_constant_value: + push eax + mov al,byte [esi-1] + push eax + call get_value + pop ebx + mov ch,bl + pop ebx + pop dword [ebx+8] + cmp ebx,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + xor cl,cl + mov ch,[value_type] + cmp ch,3 + je invalid_use_of_symbol + make_constant: + and byte [ebx+9],not 1 + cmp eax,[ebx] + mov [ebx],eax + setne ah + cmp edx,[ebx+4] + mov [ebx+4],edx + setne al + or ah,al + cmp cl,[ebx+10] + mov [ebx+10],cl + setne al + or ah,al + cmp ch,[ebx+11] + mov [ebx+11],ch + setne al + or ah,al + xor edx,edx + cmp edx,[ebx+12] + mov [ebx+12],edx + setne al + or ah,al + or ch,ch + jz constant_symbol_ok + mov edx,[symbol_identifier] + cmp edx,[ebx+20] + mov [ebx+20],edx + setne al + or ah,al + constant_symbol_ok: + mov cx,[current_pass] + xchg [ebx+16],cx + mov edx,[current_line] + mov [ebx+28],edx + test byte [ebx+8],1 + jz new_constant + cmp cx,[ebx+16] + jne redeclare_constant + test byte [ebx+8],2 + jz symbol_already_defined + or byte [ebx+8],4 + jmp instruction_assembled + redeclare_constant: + inc cx + sub cx,[ebx+16] + setnz al + or ah,al + jz instruction_assembled + test byte [ebx+8],4 + jnz instruction_assembled + test byte [ebx+8],8 + jz instruction_assembled + mov cx,[current_pass] + cmp cx,[ebx+18] + jne instruction_assembled + or [next_pass_needed],-1 + jmp instruction_assembled + new_constant: + or byte [ebx+8],1+2 + jmp instruction_assembled + assemble_instruction: + mov [operand_size],0 + mov [size_override],0 + mov [operand_prefix],0 + mov [rex_prefix],0 + mov [immediate_size],0 + movzx ebx,word [esi] + mov al,[esi+2] + add ebx,assembler + add esi,3 + jmp near ebx + instruction_assembled: + mov al,[esi] + cmp al,0Fh + je line_assembled + or al,al + jnz extra_characters_on_line + line_assembled: + clc + ret + source_end: + dec esi + stc + ret +skip_line: + call skip_symbol + jnc skip_line + ret +skip_symbol: + lods byte [esi] + or al,al + jz nothing_to_skip + cmp al,0Fh + je nothing_to_skip + cmp al,1 + je skip_instruction + cmp al,2 + je skip_label + cmp al,3 + je skip_label + cmp al,20h + jb skip_assembler_symbol + cmp al,'(' + je skip_expression + cmp al,'[' + je skip_address + skip_done: + clc + ret + skip_label: + add esi,2 + skip_instruction: + add esi,2 + skip_assembler_symbol: + inc esi + jmp skip_done + skip_address: + mov al,[esi] + and al,11110000b + cmp al,60h + jb skip_expression + cmp al,70h + ja skip_expression + inc esi + jmp skip_address + skip_expression: + lods byte [esi] + or al,al + jz skip_string + cmp al,'.' + je skip_fp_value + cmp al,')' + je skip_done + cmp al,']' + je skip_done + cmp al,'!' + je skip_expression + cmp al,0Fh + je skip_expression + cmp al,10h + je skip_register + cmp al,11h + je skip_label_value + cmp al,80h + jae skip_expression + movzx eax,al + add esi,eax + jmp skip_expression + skip_label_value: + add esi,3 + skip_register: + inc esi + jmp skip_expression + skip_fp_value: + add esi,12 + jmp skip_done + skip_string: + lods dword [esi] + add esi,eax + inc esi + jmp skip_done + nothing_to_skip: + dec esi + stc + ret + +org_directive: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_qword_value + mov cl,[value_type] + test cl,1 + jnz invalid_use_of_symbol + mov [labels_type],cl + mov ecx,edi + sub ecx,eax + adc edx,0 + neg edx + mov dword [org_origin],ecx + mov dword [org_origin+4],edx + mov [org_registers],0 + mov [org_start],edi + mov edx,[symbol_identifier] + mov [org_symbol],edx + cmp [output_format],1 + ja instruction_assembled + cmp edi,[code_start] + jne instruction_assembled + cmp eax,100h + jne instruction_assembled + bts [format_flags],0 + jmp instruction_assembled +label_directive: + lods byte [esi] + cmp al,2 + jne invalid_argument + lods dword [esi] + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + inc esi + mov ebx,eax + xor cl,cl + lods byte [esi] + cmp al,':' + je get_label_size + dec esi + cmp al,11h + jne label_size_ok + get_label_size: + lods word [esi] + cmp al,11h + jne invalid_argument + mov cl,ah + label_size_ok: + mov eax,edi + xor edx,edx + sub eax,dword [org_origin] + sbb edx,dword [org_origin+4] + mov ebp,[org_registers] + cmp byte [esi],80h + je get_free_label_value + mov ch,[labels_type] + push [org_symbol] + pop [address_symbol] + cmp [virtual_data],0 + jne make_free_label + or byte [ebx+9],1 + xchg eax,[ebx] + xchg edx,[ebx+4] + sub eax,[ebx] + sbb edx,[ebx+4] + mov dword [adjustment],eax + mov dword [adjustment+4],edx + or eax,edx + setne ah + jmp finish_label + get_free_label_value: + inc esi + lods byte [esi] + cmp al,'(' + jne invalid_argument + push dword [ebx+8] + push ebx ecx + and byte [ebx+8],not 1 + cmp byte [esi],'.' + je invalid_value + call get_address_value + or bh,bh + setnz ch + xchg ch,cl + mov bp,cx + shl ebp,16 + xchg bl,bh + mov bp,bx + pop ecx ebx + pop dword [ebx+8] + mov ch,[value_type] + or ch,ch + jz make_free_label + cmp ch,4 + je make_free_label + cmp ch,2 + jne invalid_use_of_symbol + make_free_label: + and byte [ebx+9],not 1 + cmp eax,[ebx] + mov [ebx],eax + setne ah + cmp edx,[ebx+4] + mov [ebx+4],edx + setne al + or ah,al + jmp finish_label + finish_label: + cmp cl,[ebx+10] + mov [ebx+10],cl + setne al + or ah,al + cmp ch,[ebx+11] + mov [ebx+11],ch + setne al + or ah,al + cmp ebp,[ebx+12] + mov [ebx+12],ebp + setne al + or ah,al + or ch,ch + jz free_label_symbol_ok + mov edx,[address_symbol] + cmp edx,[ebx+20] + mov [ebx+20],edx + setne al + or ah,al + free_label_symbol_ok: + mov cx,[current_pass] + xchg [ebx+16],cx + mov edx,[current_line] + mov [ebx+28],edx + and byte [ebx+8],not 2 + test byte [ebx+8],1 + jz new_free_label + cmp cx,[ebx+16] + je symbol_already_defined + inc cx + sub cx,[ebx+16] + setnz al + or ah,al + jz instruction_assembled + test byte [ebx+8],8 + jz instruction_assembled + mov cx,[current_pass] + cmp cx,[ebx+18] + jne instruction_assembled + or [next_pass_needed],-1 + jmp instruction_assembled + new_free_label: + or byte [ebx+8],1 + jmp instruction_assembled +load_directive: + lods byte [esi] + cmp al,2 + jne invalid_argument + lods dword [esi] + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + inc esi + push eax + mov al,1 + cmp byte [esi],11h + jne load_size_ok + lods byte [esi] + lods byte [esi] + load_size_ok: + cmp al,8 + ja invalid_value + mov [operand_size],al + mov dword [value],0 + mov dword [value+4],0 + lods word [esi] + cmp ax,82h+'(' shl 8 + jne invalid_argument + load_from_code: + cmp byte [esi],'.' + je invalid_value + call get_relative_offset + neg eax + cmp [next_pass_needed],0 + jne load_address_ok + cmp [value_type],0 + jne invalid_use_of_symbol + load_address_ok: + push esi edi + mov esi,edi + sub esi,eax + jc bad_load_address + cmp esi,[org_start] + jb bad_load_address + mov edi,value + movzx ecx,[operand_size] + cmp ecx,eax + ja bad_load_address + rep movs byte [edi],[esi] + jmp value_loaded + bad_load_address: + cmp [error_line],0 + jne value_loaded + mov eax,[current_line] + mov [error_line],eax + mov [error],value_out_of_range + value_loaded: + pop edi esi + mov eax,dword [value] + mov edx,dword [value+4] + pop ebx + xor cx,cx + jmp make_constant +store_directive: + cmp byte [esi],11h + je sized_store + lods byte [esi] + cmp al,'(' + jne invalid_argument + call get_byte_value + xor edx,edx + movzx eax,al + mov [operand_size],1 + jmp store_value_ok + sized_store: + call get_value + store_value_ok: + cmp [value_type],0 + jne invalid_use_of_symbol + mov dword [value],eax + mov dword [value+4],edx + lods word [esi] + cmp ax,80h+'(' shl 8 + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_relative_offset + neg eax + cmp [next_pass_needed],0 + jne store_address_ok + cmp [value_type],0 + jne invalid_use_of_symbol + store_address_ok: + push esi edi + sub edi,eax + jc bad_store_address + cmp edi,[org_start] + jb bad_store_address + mov esi,value + movzx ecx,[operand_size] + cmp ecx,eax + ja bad_store_address + rep movs byte [edi],[esi] + mov eax,edi + pop edi esi + cmp edi,[undefined_data_end] + jne instruction_assembled + cmp eax,[undefined_data_start] + jbe instruction_assembled + mov [undefined_data_start],eax + jmp instruction_assembled + bad_store_address: + pop edi esi + cmp [error_line],0 + jne instruction_assembled + mov eax,[current_line] + mov [error_line],eax + mov [error],value_out_of_range + jmp instruction_assembled + +display_directive: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],0 + jne display_byte + inc esi + lods dword [esi] + mov ecx,eax + push edi + mov edi,[display_buffer] + sub edi,4 + sub edi,eax + mov [display_buffer],edi + rep movs byte [edi],[esi] + stos dword [edi] + pop edi + inc esi + jmp display_next + display_byte: + call get_byte_value + push edi + mov edi,[display_buffer] + sub edi,4+1 + mov [display_buffer],edi + stos byte [edi] + mov eax,1 + stos dword [edi] + pop edi + display_next: + cmp edi,[display_buffer] + ja out_of_memory + lods byte [esi] + cmp al,',' + je display_directive + dec esi + jmp instruction_assembled +flush_display_buffer: + mov eax,[display_buffer] + or eax,eax + jz display_done + mov esi,[labels_list] + cmp esi,eax + je display_done + display_messages: + sub esi,4 + mov ecx,[esi] + sub esi,ecx + push esi + call display_block + pop esi + cmp esi,[display_buffer] + jne display_messages + mov eax,[labels_list] + mov [display_buffer],eax + display_done: + ret +times_directive: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne times_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + times_value_ok: + cmp eax,0 + je zero_times + jl negative_times + cmp byte [esi],':' + jne times_argument_ok + inc esi + times_argument_ok: + push [counter] + push [counter_limit] + mov [counter_limit],eax + mov [counter],1 + times_loop: + mov eax,esp + sub eax,100h + jc stack_overflow + cmp eax,[stack_limit] + jb stack_overflow + push esi + or [prefixed_instruction],-1 + call continue_line + mov eax,[counter_limit] + cmp [counter],eax + je times_done + inc [counter] + pop esi + jmp times_loop + times_done: + pop eax + pop [counter_limit] + pop [counter] + jmp instruction_assembled + negative_times: + cmp [error_line],0 + jne zero_times + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_value + zero_times: + call skip_line + jmp instruction_assembled + +virtual_directive: + lods byte [esi] + cmp al,80h + jne virtual_at_current + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_address_value + mov ebp,[address_symbol] + xor ch,ch + or bh,bh + jz set_virtual + mov ch,1 + jmp set_virtual + virtual_at_current: + dec esi + mov al,[labels_type] + mov [value_type],al + mov ebp,[org_symbol] + mov eax,edi + xor edx,edx + sub eax,dword [org_origin] + sbb edx,dword [org_origin+4] + mov bx,word [org_registers] + mov cx,word [org_registers+2] + xchg bh,bl + xchg ch,cl + set_virtual: + push [org_registers] + mov byte [org_registers],bh + mov byte [org_registers+1],bl + mov byte [org_registers+2],ch + mov byte [org_registers+3],cl + call allocate_structure_data + mov word [ebx],virtual_directive-assembler + not eax + not edx + add eax,1 + adc edx,0 + add eax,edi + adc edx,0 + xchg dword [org_origin],eax + xchg dword [org_origin+4],edx + mov [ebx+10h],eax + mov [ebx+14h],edx + pop eax + mov [ebx+18h],eax + mov al,[virtual_data] + mov [ebx+2],al + mov al,[labels_type] + mov [ebx+3],al + mov eax,edi + xchg eax,[org_start] + mov [ebx+0Ch],eax + xchg ebp,[org_symbol] + mov [ebx+1Ch],ebp + mov [ebx+8],edi + mov eax,[current_line] + mov [ebx+4],eax + or [virtual_data],-1 + mov al,[value_type] + test al,1 + jnz invalid_use_of_symbol + mov [labels_type],al + jmp instruction_assembled + allocate_structure_data: + mov ebx,[structures_buffer] + sub ebx,20h + cmp ebx,[free_additional_memory] + jb out_of_memory + mov [structures_buffer],ebx + ret + find_structure_data: + mov ebx,[structures_buffer] + scan_structures: + cmp ebx,[additional_memory_end] + je no_such_structure + cmp ax,[ebx] + je structure_data_found + add ebx,20h + jmp scan_structures + structure_data_found: + ret + no_such_structure: + stc + ret + end_virtual: + call find_structure_data + jc unexpected_instruction + mov al,[ebx+2] + mov [virtual_data],al + mov al,[ebx+3] + mov [labels_type],al + mov eax,[ebx+10h] + mov dword [org_origin],eax + mov eax,[ebx+14h] + mov dword [org_origin+4],eax + mov eax,[ebx+18h] + mov [org_registers],eax + mov eax,[ebx+0Ch] + mov [org_start],eax + mov eax,[ebx+1Ch] + mov [org_symbol],eax + mov edi,[ebx+8] + remove_structure_data: + push esi edi + mov esi,[structures_buffer] + mov ecx,ebx + sub ecx,esi + lea edi,[esi+20h] + mov [structures_buffer],edi + shr ecx,2 + rep movs dword [edi],[esi] + pop edi esi + ret +repeat_directive: + cmp [prefixed_instruction],0 + jne unexpected_instruction + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne repeat_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + repeat_value_ok: + cmp eax,0 + je zero_repeat + jl negative_repeat + call allocate_structure_data + mov word [ebx],repeat_directive-assembler + xchg eax,[counter_limit] + mov [ebx+10h],eax + mov eax,1 + xchg eax,[counter] + mov [ebx+14h],eax + mov [ebx+8],esi + mov eax,[current_line] + mov [ebx+4],eax + jmp instruction_assembled + end_repeat: + cmp [prefixed_instruction],0 + jne unexpected_instruction + call find_structure_data + jc unexpected_instruction + mov eax,[counter_limit] + inc [counter] + cmp [counter],eax + jbe continue_repeating + stop_repeat: + mov eax,[ebx+10h] + mov [counter_limit],eax + mov eax,[ebx+14h] + mov [counter],eax + call remove_structure_data + jmp instruction_assembled + continue_repeating: + mov esi,[ebx+8] + jmp instruction_assembled + negative_repeat: + cmp [error_line],0 + jne zero_repeat + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_value + zero_repeat: + mov al,[esi] + or al,al + jz missing_end_directive + cmp al,0Fh + jne extra_characters_on_line + call find_end_repeat + jmp instruction_assembled + find_end_repeat: + call find_structure_end + cmp ax,repeat_directive-assembler + jne unexpected_instruction + ret +while_directive: + cmp [prefixed_instruction],0 + jne unexpected_instruction + call allocate_structure_data + mov word [ebx],while_directive-assembler + mov eax,1 + xchg eax,[counter] + mov [ebx+10h],eax + mov [ebx+8],esi + mov eax,[current_line] + mov [ebx+4],eax + do_while: + push ebx + call calculate_logical_expression + or al,al + jnz while_true + mov al,[esi] + or al,al + jz missing_end_directive + cmp al,0Fh + jne extra_characters_on_line + stop_while: + call find_end_while + pop ebx + mov eax,[ebx+10h] + mov [counter],eax + call remove_structure_data + jmp instruction_assembled + while_true: + pop ebx + jmp instruction_assembled + end_while: + cmp [prefixed_instruction],0 + jne unexpected_instruction + call find_structure_data + jc unexpected_instruction + mov eax,[ebx+4] + mov [current_line],eax + inc [counter] + jz too_many_repeats + mov esi,[ebx+8] + jmp do_while + find_end_while: + call find_structure_end + cmp ax,while_directive-assembler + jne unexpected_instruction + ret +if_directive: + cmp [prefixed_instruction],0 + jne unexpected_instruction + call calculate_logical_expression + mov dl,al + mov al,[esi] + or al,al + jz missing_end_directive + cmp al,0Fh + jne extra_characters_on_line + or dl,dl + jnz if_true + call find_else + jc instruction_assembled + mov al,[esi] + cmp al,1 + jne else_true + cmp word [esi+1],if_directive-assembler + jne else_true + add esi,4 + jmp if_directive + if_true: + xor al,al + make_if_structure: + call allocate_structure_data + mov word [ebx],if_directive-assembler + mov byte [ebx+2],al + mov eax,[current_line] + mov [ebx+4],eax + jmp instruction_assembled + else_true: + or al,al + jz missing_end_directive + cmp al,0Fh + jne extra_characters_on_line + or al,-1 + jmp make_if_structure + else_directive: + cmp [prefixed_instruction],0 + jne unexpected_instruction + mov ax,if_directive-assembler + call find_structure_data + jc unexpected_instruction + cmp byte [ebx+2],0 + jne unexpected_instruction + found_else: + mov al,[esi] + cmp al,1 + jne skip_else + cmp word [esi+1],if_directive-assembler + jne skip_else + add esi,4 + call find_else + jnc found_else + call remove_structure_data + jmp instruction_assembled + skip_else: + or al,al + jz missing_end_directive + cmp al,0Fh + jne extra_characters_on_line + call find_end_if + call remove_structure_data + jmp instruction_assembled + end_if: + cmp [prefixed_instruction],0 + jne unexpected_instruction + call find_structure_data + jc unexpected_instruction + call remove_structure_data + jmp instruction_assembled + find_else: + call find_structure_end + cmp ax,else_directive-assembler + je else_found + cmp ax,if_directive-assembler + jne unexpected_instruction + stc + ret + else_found: + clc + ret + find_end_if: + call find_structure_end + cmp ax,if_directive-assembler + jne unexpected_instruction + ret + find_structure_end: + push [error_line] + mov eax,[current_line] + mov [error_line],eax + find_end_directive: + call skip_line + lods byte [esi] + cmp al,0Fh + jne no_end_directive + lods dword [esi] + mov [current_line],eax + skip_labels: + cmp byte [esi],2 + jne labels_ok + add esi,6 + jmp skip_labels + labels_ok: + cmp byte [esi],1 + jne find_end_directive + mov ax,[esi+1] + cmp ax,prefix_instruction-assembler + je find_end_directive + add esi,4 + cmp ax,repeat_directive-assembler + je skip_repeat + cmp ax,while_directive-assembler + je skip_while + cmp ax,if_directive-assembler + je skip_if + cmp ax,else_directive-assembler + je structure_end + cmp ax,end_directive-assembler + jne find_end_directive + cmp byte [esi],1 + jne find_end_directive + mov ax,[esi+1] + add esi,4 + cmp ax,repeat_directive-assembler + je structure_end + cmp ax,while_directive-assembler + je structure_end + cmp ax,if_directive-assembler + jne find_end_directive + structure_end: + pop [error_line] + ret + no_end_directive: + mov eax,[error_line] + mov [current_line],eax + jmp missing_end_directive + skip_repeat: + call find_end_repeat + jmp find_end_directive + skip_while: + call find_end_while + jmp find_end_directive + skip_if: + call skip_if_block + jmp find_end_directive + skip_if_block: + call find_else + jc if_block_skipped + cmp byte [esi],1 + jne skip_after_else + cmp word [esi+1],if_directive-assembler + jne skip_after_else + add esi,4 + jmp skip_if_block + skip_after_else: + call find_end_if + if_block_skipped: + ret +end_directive: + lods byte [esi] + cmp al,1 + jne invalid_argument + lods word [esi] + inc esi + cmp ax,virtual_directive-assembler + je end_virtual + cmp ax,repeat_directive-assembler + je end_repeat + cmp ax,while_directive-assembler + je end_while + cmp ax,if_directive-assembler + je end_if + cmp ax,data_directive-assembler + je end_data + jmp invalid_argument +break_directive: + mov ebx,[structures_buffer] + mov al,[esi] + or al,al + jz find_breakable_structure + cmp al,0Fh + jne extra_characters_on_line + find_breakable_structure: + cmp ebx,[additional_memory_end] + je unexpected_instruction + mov ax,[ebx] + cmp ax,repeat_directive-assembler + je break_repeat + cmp ax,while_directive-assembler + je break_while + cmp ax,if_directive-assembler + je break_if + add ebx,20h + jmp find_breakable_structure + break_if: + push [current_line] + mov eax,[ebx+4] + mov [current_line],eax + call remove_structure_data + call skip_if_block + pop [current_line] + mov ebx,[structures_buffer] + jmp find_breakable_structure + break_repeat: + push ebx + call find_end_repeat + pop ebx + jmp stop_repeat + break_while: + push ebx + jmp stop_while + +data_bytes: + call define_data + lods byte [esi] + cmp al,'(' + je get_byte + cmp al,'?' + jne invalid_argument + mov eax,edi + mov byte [edi],0 + inc edi + jmp undefined_data + get_byte: + cmp byte [esi],0 + je get_string + call get_byte_value + stos byte [edi] + ret + get_string: + inc esi + lods dword [esi] + mov ecx,eax + lea eax,[edi+ecx] + cmp eax,[display_buffer] + ja out_of_memory + rep movs byte [edi],[esi] + inc esi + ret + undefined_data: + cmp [virtual_data],0 + je mark_undefined_data + ret + mark_undefined_data: + cmp eax,[undefined_data_end] + je undefined_data_ok + mov [undefined_data_start],eax + undefined_data_ok: + mov [undefined_data_end],edi + ret + define_data: + cmp edi,[display_buffer] + jae out_of_memory + cmp byte [esi],'(' + jne simple_data_value + mov ebx,esi + inc esi + call skip_expression + xchg esi,ebx + cmp byte [ebx],81h + jne simple_data_value + inc esi + call get_dword_value + cmp [next_pass_needed],0 + jne dup_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + dup_value_ok: + inc esi + cmp eax,0 + jg dup_positive + cmp [error_line],0 + jne dup_invalid + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_value + dup_invalid: + mov eax,1 + dup_positive: + cmp byte [esi],'{' + jne duplicate_single_data_value + inc esi + duplicate_data: + push eax esi + duplicated_values: + cmp edi,[display_buffer] + jae out_of_memory + call near dword [esp+8] + lods byte [esi] + cmp al,',' + je duplicated_values + cmp al,'}' + jne invalid_argument + pop ebx eax + dec eax + jz data_defined + mov esi,ebx + jmp duplicate_data + duplicate_single_data_value: + cmp edi,[display_buffer] + jae out_of_memory + push eax esi + call near dword [esp+8] + pop ebx eax + dec eax + jz data_defined + mov esi,ebx + jmp duplicate_single_data_value + simple_data_value: + cmp edi,[display_buffer] + jae out_of_memory + call near dword [esp] + data_defined: + lods byte [esi] + cmp al,',' + je define_data + dec esi + add esp,4 + jmp instruction_assembled +data_unicode: + or [base_code],-1 + jmp define_words +data_words: + mov [base_code],0 + define_words: + call define_data + lods byte [esi] + cmp al,'(' + je get_word + cmp al,'?' + jne invalid_argument + mov eax,edi + mov word [edi],0 + scas word [edi] + jmp undefined_data + ret + get_word: + cmp [base_code],0 + je word_data_value + cmp byte [esi],0 + je word_string + word_data_value: + call get_word_value + call mark_relocation + stos word [edi] + ret + word_string: + inc esi + lods dword [esi] + mov ecx,eax + jecxz word_string_ok + lea eax,[edi+ecx*2] + cmp eax,[display_buffer] + ja out_of_memory + xor ah,ah + copy_word_string: + lods byte [esi] + stos word [edi] + loop copy_word_string + word_string_ok: + inc esi + ret +data_dwords: + call define_data + lods byte [esi] + cmp al,'(' + je get_dword + cmp al,'?' + jne invalid_argument + mov eax,edi + mov dword [edi],0 + scas dword [edi] + jmp undefined_data + get_dword: + push esi + call get_dword_value + pop ebx + cmp byte [esi],':' + je complex_dword + call mark_relocation + stos dword [edi] + ret + complex_dword: + mov esi,ebx + cmp byte [esi],'.' + je invalid_value + call get_word_value + push eax + inc esi + lods byte [esi] + cmp al,'(' + jne invalid_operand + mov al,[value_type] + push eax + cmp byte [esi],'.' + je invalid_value + call get_word_value + call mark_relocation + stos word [edi] + pop eax + mov [value_type],al + pop eax + call mark_relocation + stos word [edi] + ret +data_pwords: + call define_data + lods byte [esi] + cmp al,'(' + je get_pword + cmp al,'?' + jne invalid_argument + mov eax,edi + mov dword [edi],0 + scas dword [edi] + mov word [edi],0 + scas word [edi] + jmp undefined_data + get_pword: + push esi + call get_pword_value + pop ebx + cmp byte [esi],':' + je complex_pword + call mark_relocation + stos dword [edi] + mov ax,dx + stos word [edi] + ret + complex_pword: + mov esi,ebx + cmp byte [esi],'.' + je invalid_value + call get_word_value + push eax + inc esi + lods byte [esi] + cmp al,'(' + jne invalid_operand + mov al,[value_type] + push eax + cmp byte [esi],'.' + je invalid_value + call get_dword_value + call mark_relocation + stos dword [edi] + pop eax + mov [value_type],al + pop eax + call mark_relocation + stos word [edi] + ret +data_qwords: + call define_data + lods byte [esi] + cmp al,'(' + je get_qword + cmp al,'?' + jne invalid_argument + mov eax,edi + mov dword [edi],0 + scas dword [edi] + mov dword [edi],0 + scas dword [edi] + jmp undefined_data + get_qword: + call get_qword_value + call mark_relocation + stos dword [edi] + mov eax,edx + stos dword [edi] + ret +data_twords: + call define_data + lods byte [esi] + cmp al,'(' + je get_tword + cmp al,'?' + jne invalid_argument + mov eax,edi + mov dword [edi],0 + scas dword [edi] + mov dword [edi],0 + scas dword [edi] + mov word [edi],0 + scas word [edi] + jmp undefined_data + get_tword: + cmp byte [esi],'.' + jne complex_tword + inc esi + cmp word [esi+8],8000h + je fp_zero_tword + mov eax,[esi] + stos dword [edi] + mov eax,[esi+4] + stos dword [edi] + mov ax,[esi+8] + add ax,3FFFh + cmp ax,8000h + jae value_out_of_range + mov bl,[esi+11] + shl bx,15 + or ax,bx + stos word [edi] + add esi,13 + ret + fp_zero_tword: + xor eax,eax + stos dword [edi] + stos dword [edi] + mov al,[esi+11] + shl ax,15 + stos word [edi] + add esi,13 + ret + complex_tword: + call get_word_value + push eax + inc esi + lods byte [esi] + cmp al,'(' + jne invalid_operand + mov al,[value_type] + push eax + cmp byte [esi],'.' + je invalid_value + call get_qword_value + call mark_relocation + stos dword [edi] + mov eax,edx + stos dword [edi] + pop eax + mov [value_type],al + pop eax + call mark_relocation + stos word [edi] + ret +data_file: + lods word [esi] + cmp ax,'(' + jne invalid_argument + add esi,4 + call open_binary_file + mov eax,[esi-4] + lea esi,[esi+eax+1] + mov al,2 + xor edx,edx + call lseek + push eax + xor edx,edx + cmp byte [esi],':' + jne position_ok + inc esi + cmp byte [esi],'(' + jne invalid_argument + inc esi + cmp byte [esi],'.' + je invalid_value + push ebx + call get_dword_value + pop ebx + mov edx,eax + sub [esp],edx + position_ok: + cmp byte [esi],',' + jne size_ok + inc esi + cmp byte [esi],'(' + jne invalid_argument + inc esi + cmp byte [esi],'.' + je invalid_value + push ebx edx + call get_dword_value + pop edx ebx + mov [esp],eax + size_ok: + xor al,al + call lseek + pop ecx + mov edx,edi + add edi,ecx + jc out_of_memory + cmp edi,[display_buffer] + ja out_of_memory + call read + jc error_reading_file + call close + lods byte [esi] + cmp al,',' + je data_file + dec esi + jmp instruction_assembled + open_binary_file: + push esi + push edi + mov esi,[current_line] + mov esi,[esi] + get_current_path: + lodsb + stosb + or al,al + jnz get_current_path + cut_current_path: + cmp edi,[esp] + je current_path_ok + cmp byte [edi-1],'\' + je current_path_ok + cmp byte [edi-1],'/' + je current_path_ok + dec edi + jmp cut_current_path + current_path_ok: + mov esi,[esp+4] + call preprocess_path + pop edx + mov esi,edx + call open + jnc file_opened + mov edi,esi + mov esi,[esp] + push edi + call preprocess_path + pop edx + mov esi,edx + call open + jc file_not_found + file_opened: + mov edi,esi + pop esi + ret +reserve_bytes: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne rb_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + rb_value_ok: + cmp eax,0 + jl reserve_negative + mov ecx,eax + mov edx,ecx + add edx,edi + jc out_of_memory + cmp edx,[display_buffer] + ja out_of_memory + push edi + cmp [next_pass_needed],0 + je zero_bytes + add edi,ecx + jmp reserved_data + zero_bytes: + xor eax,eax + shr ecx,1 + jnc bytes_stosb_ok + stos byte [edi] + bytes_stosb_ok: + shr ecx,1 + jnc bytes_stosw_ok + stos word [edi] + bytes_stosw_ok: + rep stos dword [edi] + reserved_data: + pop eax + call undefined_data + jmp instruction_assembled + reserve_negative: + cmp [error_line],0 + jne instruction_assembled + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_value + jmp instruction_assembled +reserve_words: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne rw_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + rw_value_ok: + cmp eax,0 + jl reserve_negative + mov ecx,eax + mov edx,ecx + shl edx,1 + jc out_of_memory + add edx,edi + jc out_of_memory + cmp edx,[display_buffer] + ja out_of_memory + push edi + cmp [next_pass_needed],0 + je zero_words + lea edi,[edi+ecx*2] + jmp reserved_data + zero_words: + xor eax,eax + shr ecx,1 + jnc words_stosw_ok + stos word [edi] + words_stosw_ok: + rep stos dword [edi] + jmp reserved_data +reserve_dwords: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne rd_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + rd_value_ok: + cmp eax,0 + jl reserve_negative + mov ecx,eax + mov edx,ecx + shl edx,1 + jc out_of_memory + shl edx,1 + jc out_of_memory + add edx,edi + jc out_of_memory + cmp edx,[display_buffer] + ja out_of_memory + push edi + cmp [next_pass_needed],0 + je zero_dwords + lea edi,[edi+ecx*4] + jmp reserved_data + zero_dwords: + xor eax,eax + rep stos dword [edi] + jmp reserved_data +reserve_pwords: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne rp_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + rp_value_ok: + cmp eax,0 + jl reserve_negative + mov ecx,eax + shl ecx,1 + jc out_of_memory + add ecx,eax + mov edx,ecx + shl edx,1 + jc out_of_memory + add edx,edi + jc out_of_memory + cmp edx,[display_buffer] + ja out_of_memory + push edi + cmp [next_pass_needed],0 + je zero_words + lea edi,[edi+ecx*2] + jmp reserved_data +reserve_qwords: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne rq_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + rq_value_ok: + cmp eax,0 + jl reserve_negative + mov ecx,eax + shl ecx,1 + jc out_of_memory + mov edx,ecx + shl edx,1 + jc out_of_memory + shl edx,1 + jc out_of_memory + add edx,edi + jc out_of_memory + cmp edx,[display_buffer] + ja out_of_memory + push edi + cmp [next_pass_needed],0 + je zero_dwords + lea edi,[edi+ecx*4] + jmp reserved_data +reserve_twords: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [next_pass_needed],0 + jne rt_value_ok + cmp [value_type],0 + jne invalid_use_of_symbol + rt_value_ok: + cmp eax,0 + jl reserve_negative + mov ecx,eax + shl ecx,2 + jc out_of_memory + add ecx,eax + mov edx,ecx + shl edx,1 + jc out_of_memory + add edx,edi + jc out_of_memory + cmp edx,[display_buffer] + ja out_of_memory + push edi + cmp [next_pass_needed],0 + je zero_words + lea edi,[edi+ecx*2] + jmp reserved_data +align_directive: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,eax + dec edx + test eax,edx + jnz negative_times + or eax,eax + jz negative_times + cmp eax,1 + je instruction_assembled + mov ecx,edi + sub ecx,dword [org_origin] + cmp [org_registers],0 + jne section_not_aligned_enough + cmp [labels_type],0 + je make_alignment + cmp [output_format],3 + je pe_alignment + mov ebx,[org_symbol] + cmp byte [ebx],0 + jne section_not_aligned_enough + cmp eax,[ebx+10h] + jbe make_alignment + jmp section_not_aligned_enough + pe_alignment: + cmp eax,1000h + ja section_not_aligned_enough + make_alignment: + dec eax + and ecx,eax + jz instruction_assembled + neg ecx + add ecx,eax + inc ecx + mov edx,ecx + add edx,edi + jc out_of_memory + cmp edx,[display_buffer] + ja out_of_memory + push edi + cmp [next_pass_needed],0 + je nops + add edi,ecx + jmp reserved_data + nops: + mov eax,90909090h + shr ecx,1 + jnc nops_stosb_ok + stos byte [edi] + nops_stosb_ok: + shr ecx,1 + jnc nops_stosw_ok + stos word [edi] + nops_stosw_ok: + rep stos dword [edi] + jmp reserved_data diff --git a/programs/fasm/trunk/build_en.bat b/programs/develop/fasm/trunk/build_en.bat similarity index 100% rename from programs/fasm/trunk/build_en.bat rename to programs/develop/fasm/trunk/build_en.bat diff --git a/programs/fasm/trunk/build_ru.bat b/programs/develop/fasm/trunk/build_ru.bat similarity index 100% rename from programs/fasm/trunk/build_ru.bat rename to programs/develop/fasm/trunk/build_ru.bat diff --git a/programs/fasm/trunk/errors.inc b/programs/develop/fasm/trunk/errors.inc similarity index 98% rename from programs/fasm/trunk/errors.inc rename to programs/develop/fasm/trunk/errors.inc index 8fe197bd60..f2241743f7 100644 --- a/programs/fasm/trunk/errors.inc +++ b/programs/develop/fasm/trunk/errors.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2005, Tomasz Grysztar. +; Copyright (c) 1999-2006, Tomasz Grysztar. ; All rights reserved. out_of_memory: diff --git a/programs/develop/fasm/trunk/expressi.inc b/programs/develop/fasm/trunk/expressi.inc new file mode 100644 index 0000000000..7d6d3e26c2 --- /dev/null +++ b/programs/develop/fasm/trunk/expressi.inc @@ -0,0 +1,2688 @@ + +; flat assembler core +; Copyright (c) 1999-2006, Tomasz Grysztar. +; All rights reserved. + +convert_expression: + push ebp + call get_fp_value + jnc fp_expression + mov [current_offset],esp + expression_loop: + push edi + mov edi,single_operand_operators + call get_operator + pop edi + or al,al + jz expression_element + push eax + jmp expression_loop + expression_element: + mov al,[esi] + cmp al,1Ah + je expression_number + cmp al,22h + je expression_number + cmp al,'(' + je expression_number + mov al,'!' + stos byte [edi] + jmp expression_operator + expression_number: + call convert_number + expression_operator: + push edi + mov edi,operators + call get_operator + pop edi + or al,al + jz expression_end + operators_loop: + cmp esp,[current_offset] + je push_operator + mov bl,al + and bl,0F0h + mov bh,byte [esp] + and bh,0F0h + cmp bl,bh + ja push_operator + pop ebx + mov byte [edi],bl + inc edi + jmp operators_loop + push_operator: + push eax + jmp expression_loop + expression_end: + cmp esp,[current_offset] + je expression_converted + pop eax + stos byte [edi] + jmp expression_end + expression_converted: + pop ebp + ret + fp_expression: + mov al,'.' + stos byte [edi] + mov eax,[fp_value] + stos dword [edi] + mov eax,[fp_value+4] + stos dword [edi] + mov eax,[fp_value+8] + stos dword [edi] + pop ebp + ret + +convert_number: + lea eax,[edi-10h] + cmp eax,[labels_list] + jae out_of_memory + cmp byte [esi],'(' + je expression_value + inc edi + call get_number + jc symbol_value + or ebp,ebp + jz valid_number + mov byte [edi-1],0Fh + ret + valid_number: + cmp dword [edi+4],0 + jne qword_number + cmp word [edi+2],0 + jne dword_number + cmp byte [edi+1],0 + jne word_number + byte_number: + mov byte [edi-1],1 + inc edi + ret + qword_number: + mov byte [edi-1],8 + add edi,8 + ret + dword_number: + mov byte [edi-1],4 + scas dword [edi] + ret + word_number: + mov byte [edi-1],2 + scas word [edi] + ret + expression_value: + mov eax,esp + sub eax,100h + jc stack_overflow + cmp eax,[stack_limit] + jb stack_overflow + inc esi + push [current_offset] + call convert_expression + pop [current_offset] + lods byte [esi] + cmp al,')' + jne invalid_expression + ret + symbol_value: + push edi + mov edi,address_registers + call get_operator + or al,al + jnz register_value + mov edi,directive_operators + call get_operator + pop edi + or al,al + jnz broken_value + lods byte [esi] + cmp al,1Ah + jne invalid_value + lods byte [esi] + movzx ecx,al + call get_label_id + store_label_value: + mov byte [edi-1],11h + stos dword [edi] + ret + broken_value: + mov eax,0Fh + jmp store_label_value + register_value: + pop edi + mov byte [edi-1],10h + stos byte [edi] + ret + +get_number: + xor ebp,ebp + lods byte [esi] + cmp al,22h + je get_text_number + cmp al,1Ah + jne not_number + lods byte [esi] + movzx ecx,al + mov [number_start],esi + mov al,[esi] + cmp al,'$' + je number_begin + sub al,30h + cmp al,9 + ja invalid_number + number_begin: + mov ebx,esi + add esi,ecx + push esi + dec esi + mov dword [edi],0 + mov dword [edi+4],0 + cmp byte [ebx],'$' + je pascal_hex_number + cmp word [ebx],'0x' + je get_hex_number + mov al,[esi] + dec esi + cmp al,'h' + je get_hex_number + cmp al,'b' + je get_bin_number + cmp al,'d' + je get_dec_number + cmp al,'o' + je get_oct_number + cmp al,'H' + je get_hex_number + cmp al,'B' + je get_bin_number + cmp al,'D' + je get_dec_number + cmp al,'O' + je get_oct_number + inc esi + get_dec_number: + mov ebx,esi + mov esi,[number_start] + get_dec_digit: + cmp esi,ebx + ja number_ok + xor edx,edx + mov eax,[edi] + shld edx,eax,2 + shl eax,2 + add eax,[edi] + adc edx,0 + add eax,eax + adc edx,edx + mov [edi],eax + mov eax,[edi+4] + add eax,eax + jc dec_out_of_range + add eax,eax + jc dec_out_of_range + add eax,[edi+4] + jc dec_out_of_range + add eax,eax + jc dec_out_of_range + add eax,edx + jc dec_out_of_range + mov [edi+4],eax + movzx eax,byte [esi] + sub al,30h + cmp al,9 + ja bad_number + add [edi],eax + adc dword [edi+4],0 + jc dec_out_of_range + inc esi + jmp get_dec_digit + dec_out_of_range: + or ebp,-1 + inc esi + jmp get_dec_digit + bad_number: + pop eax + invalid_number: + mov esi,[number_start] + dec esi + not_number: + dec esi + stc + ret + get_bin_number: + xor bl,bl + get_bin_digit: + cmp esi,[number_start] + jb number_ok + movzx eax,byte [esi] + sub al,30h + cmp al,1 + ja bad_number + xor edx,edx + mov cl,bl + dec esi + cmp bl,64 + je bin_out_of_range + inc bl + cmp cl,32 + jae bin_digit_high + shl eax,cl + or dword [edi],eax + jmp get_bin_digit + bin_digit_high: + sub cl,32 + shl eax,cl + or dword [edi+4],eax + jmp get_bin_digit + bin_out_of_range: + or al,al + jz get_bin_digit + or ebp,-1 + jmp get_bin_digit + pascal_hex_number: + cmp cl,1 + je bad_number + get_hex_number: + xor bl,bl + get_hex_digit: + cmp esi,[number_start] + jb number_ok + movzx eax,byte [esi] + cmp al,'x' + je hex_number_ok + cmp al,'$' + je pascal_hex_ok + sub al,30h + cmp al,9 + jbe hex_digit_ok + sub al,7 + cmp al,15 + jbe hex_letter_digit_ok + sub al,20h + cmp al,15 + ja bad_number + hex_letter_digit_ok: + cmp al,10 + jb bad_number + hex_digit_ok: + xor edx,edx + mov cl,bl + dec esi + cmp bl,64 + je hex_out_of_range + add bl,4 + cmp cl,32 + jae hex_digit_high + shl eax,cl + or dword [edi],eax + jmp get_hex_digit + hex_digit_high: + sub cl,32 + shl eax,cl + or dword [edi+4],eax + jmp get_hex_digit + hex_out_of_range: + or al,al + jz get_hex_digit + or ebp,-1 + jmp get_hex_digit + get_oct_number: + xor bl,bl + get_oct_digit: + cmp esi,[number_start] + jb number_ok + movzx eax,byte [esi] + sub al,30h + cmp al,7 + ja bad_number + oct_digit_ok: + xor edx,edx + mov cl,bl + dec esi + cmp bl,64 + jae oct_out_of_range + add bl,3 + cmp cl,30 + je oct_digit_wrap + ja oct_digit_high + shl eax,cl + or dword [edi],eax + jmp get_oct_digit + oct_digit_wrap: + shl eax,cl + adc dword [edi+4],0 + or dword [edi],eax + jmp get_oct_digit + oct_digit_high: + sub cl,32 + shl eax,cl + or dword [edi+4],eax + jmp get_oct_digit + oct_out_of_range: + or al,al + jz get_oct_digit + or ebp,-1 + jmp get_oct_digit + hex_number_ok: + dec esi + pascal_hex_ok: + cmp esi,[number_start] + jne bad_number + number_ok: + pop esi + number_done: + clc + ret + get_text_number: + lods dword [esi] + mov edx,eax + xor bl,bl + mov dword [edi],0 + mov dword [edi+4],0 + get_text_character: + sub edx,1 + jc number_done + movzx eax,byte [esi] + inc esi + mov cl,bl + cmp bl,64 + je text_out_of_range + add bl,8 + cmp cl,32 + jae text_character_high + shl eax,cl + or dword [edi],eax + jmp get_text_character + text_character_high: + sub cl,32 + shl eax,cl + or dword [edi+4],eax + jmp get_text_character + text_out_of_range: + or ebp,-1 + jmp get_text_character + +get_fp_value: + push edi esi + lods byte [esi] + cmp al,1Ah + je fp_value_start + cmp al,'-' + je fp_sign_ok + cmp al,'+' + jne not_fp_value + fp_sign_ok: + lods byte [esi] + cmp al,1Ah + jne not_fp_value + fp_value_start: + lods byte [esi] + movzx ecx,al + cmp cl,1 + jbe not_fp_value + lea edx,[esi+1] + xor ah,ah + check_fp_value: + lods byte [esi] + cmp al,'.' + je fp_character_dot + cmp al,'E' + je fp_character_exp + cmp al,'e' + je fp_character_exp + cmp al,'F' + je fp_last_character + cmp al,'f' + je fp_last_character + digit_expected: + cmp al,'0' + jb not_fp_value + cmp al,'9' + ja not_fp_value + jmp fp_character_ok + fp_character_dot: + cmp esi,edx + je not_fp_value + or ah,ah + jnz not_fp_value + or ah,1 + lods byte [esi] + loop digit_expected + not_fp_value: + pop esi edi + stc + ret + fp_last_character: + cmp cl,1 + jne not_fp_value + or ah,4 + jmp fp_character_ok + fp_character_exp: + cmp esi,edx + je not_fp_value + cmp ah,1 + ja not_fp_value + or ah,2 + cmp ecx,1 + jne fp_character_ok + cmp byte [esi],'+' + je fp_exp_sign + cmp byte [esi],'-' + jne fp_character_ok + fp_exp_sign: + inc esi + cmp byte [esi],1Ah + jne not_fp_value + inc esi + lods byte [esi] + movzx ecx,al + inc ecx + fp_character_ok: + dec ecx + jnz check_fp_value + or ah,ah + jz not_fp_value + pop esi + lods byte [esi] + mov [fp_sign],0 + cmp al,1Ah + je fp_get + inc esi + cmp al,'+' + je fp_get + mov [fp_sign],1 + fp_get: + lods byte [esi] + movzx ecx,al + xor edx,edx + mov edi,fp_value + mov [edi],edx + mov [edi+4],edx + mov [edi+12],edx + call fp_optimize + mov [fp_format],0 + mov al,[esi] + fp_before_dot: + lods byte [esi] + cmp al,'.' + je fp_dot + cmp al,'E' + je fp_exponent + cmp al,'e' + je fp_exponent + cmp al,'F' + je fp_done + cmp al,'f' + je fp_done + sub al,30h + mov edi,fp_value+16 + xor edx,edx + mov dword [edi+12],edx + mov dword [edi],edx + mov dword [edi+4],edx + mov [edi+7],al + mov dl,7 + mov dword [edi+8],edx + call fp_optimize + mov edi,fp_value + push ecx + mov ecx,10 + call fp_mul + pop ecx + mov ebx,fp_value+16 + call fp_add + loop fp_before_dot + fp_dot: + mov edi,fp_value+16 + xor edx,edx + mov [edi],edx + mov [edi+4],edx + mov byte [edi+7],80h + mov [edi+8],edx + mov dword [edi+12],edx + dec ecx + jz fp_done + fp_after_dot: + lods byte [esi] + cmp al,'E' + je fp_exponent + cmp al,'e' + je fp_exponent + cmp al,'F' + je fp_done + cmp al,'f' + je fp_done + inc [fp_format] + cmp [fp_format],80h + jne fp_counter_ok + mov [fp_format],7Fh + fp_counter_ok: + dec esi + mov edi,fp_value+16 + push ecx + mov ecx,10 + call fp_div + push dword [edi] + push dword [edi+4] + push dword [edi+8] + push dword [edi+12] + lods byte [esi] + sub al,30h + movzx ecx,al + call fp_mul + mov ebx,edi + mov edi,fp_value + call fp_add + mov edi,fp_value+16 + pop dword [edi+12] + pop dword [edi+8] + pop dword [edi+4] + pop dword [edi] + pop ecx + loop fp_after_dot + jmp fp_done + fp_exponent: + or [fp_format],80h + xor edx,edx + xor ebp,ebp + dec ecx + jnz get_exponent + cmp byte [esi],'+' + je fp_exponent_sign + cmp byte [esi],'-' + jne fp_done + not ebp + fp_exponent_sign: + add esi,2 + lods byte [esi] + movzx ecx,al + get_exponent: + movzx eax,byte [esi] + inc esi + sub al,30h + cmp al,10 + jae exponent_ok + imul edx,10 + cmp edx,8000h + jae value_out_of_range + add edx,eax + loop get_exponent + exponent_ok: + mov edi,fp_value + or edx,edx + jz fp_done + mov ecx,edx + or ebp,ebp + jnz fp_negative_power + fp_power: + push ecx + mov ecx,10 + call fp_mul + pop ecx + loop fp_power + jmp fp_done + fp_negative_power: + push ecx + mov ecx,10 + call fp_div + pop ecx + loop fp_negative_power + fp_done: + mov edi,fp_value + mov al,[fp_format] + mov [edi+10],al + mov al,[fp_sign] + mov [edi+11],al + test byte [edi+15],80h + jz fp_ok + add dword [edi],1 + adc dword [edi+4],0 + jnc fp_ok + mov eax,[edi+4] + shrd [edi],eax,1 + shr eax,1 + or eax,80000000h + mov [edi+4],eax + inc word [edi+8] + fp_ok: + pop edi + clc + ret + fp_mul: + or ecx,ecx + jz fp_zero + mov eax,[edi+12] + mul ecx + mov [edi+12],eax + mov ebx,edx + mov eax,[edi] + mul ecx + add eax,ebx + adc edx,0 + mov [edi],eax + mov ebx,edx + mov eax,[edi+4] + mul ecx + add eax,ebx + adc edx,0 + mov [edi+4],eax + .loop: + or edx,edx + jz .done + mov eax,[edi] + shrd [edi+12],eax,1 + mov eax,[edi+4] + shrd [edi],eax,1 + shrd eax,edx,1 + mov [edi+4],eax + shr edx,1 + inc dword [edi+8] + cmp dword [edi+8],8000h + jge value_out_of_range + jmp .loop + .done: + ret + fp_div: + mov eax,[edi+4] + xor edx,edx + div ecx + mov [edi+4],eax + mov eax,[edi] + div ecx + mov [edi],eax + mov eax,[edi+12] + div ecx + mov [edi+12],eax + mov ebx,eax + or ebx,[edi] + or ebx,[edi+4] + jz fp_zero + .loop: + test byte [edi+7],80h + jnz .exp_ok + mov eax,[edi] + shld [edi+4],eax,1 + mov eax,[edi+12] + shld [edi],eax,1 + add eax,eax + mov [edi+12],eax + dec dword [edi+8] + add edx,edx + jmp .loop + .exp_ok: + mov eax,edx + xor edx,edx + div ecx + add [edi+12],eax + adc dword [edi],0 + adc dword [edi+4],0 + jnc .done + mov eax,[edi+4] + mov ebx,[edi] + shrd [edi],eax,1 + shrd [edi+12],ebx,1 + shr eax,1 + or eax,80000000h + mov [edi+4],eax + inc dword [edi+8] + .done: + ret + fp_add: + cmp dword [ebx+8],8000h + je .done + cmp dword [edi+8],8000h + je .copy + mov eax,[ebx+8] + cmp eax,[edi+8] + jge .exp_ok + mov eax,[edi+8] + .exp_ok: + call .change_exp + xchg ebx,edi + call .change_exp + xchg ebx,edi + mov edx,[ebx+12] + mov eax,[ebx] + mov ebx,[ebx+4] + add [edi+12],edx + adc [edi],eax + adc [edi+4],ebx + jnc .done + mov eax,[edi] + shrd [edi+12],eax,1 + mov eax,[edi+4] + shrd [edi],eax,1 + shr eax,1 + or eax,80000000h + mov [edi+4],eax + inc dword [edi+8] + .done: + ret + .copy: + mov eax,[ebx] + mov [edi],eax + mov eax,[ebx+4] + mov [edi+4],eax + mov eax,[ebx+8] + mov [edi+8],eax + mov eax,[ebx+12] + mov [edi+12],eax + ret + .change_exp: + push ecx + mov ecx,eax + sub ecx,[ebx+8] + mov edx,[ebx+4] + jecxz .exp_done + .exp_loop: + mov ebp,[ebx] + shrd [ebx+12],ebp,1 + shrd [ebx],edx,1 + shr edx,1 + inc dword [ebx+8] + loop .exp_loop + .exp_done: + mov [ebx+4],edx + pop ecx + ret + fp_optimize: + mov eax,[edi] + mov ebp,[edi+4] + or ebp,[edi] + or ebp,[edi+12] + jz fp_zero + .loop: + test byte [edi+7],80h + jnz .done + shld [edi+4],eax,1 + mov ebp,[edi+12] + shld eax,ebp,1 + mov [edi],eax + shl dword [edi+12],1 + dec dword [edi+8] + jmp .loop + .done: + ret + fp_zero: + mov dword [edi+8],8000h + ret + +calculate_expression: + mov [current_offset],edi + mov [value_undefined],0 + cmp byte [esi],0 + je get_string_value + cmp byte [esi],'.' + je convert_fp + calculation_loop: + lods byte [esi] + cmp al,1 + je get_byte_number + cmp al,2 + je get_word_number + cmp al,4 + je get_dword_number + cmp al,8 + je get_qword_number + cmp al,0Fh + je value_out_of_range + cmp al,10h + je get_register + cmp al,11h + je get_label + cmp al,')' + je expression_calculated + cmp al,']' + je expression_calculated + cmp al,'!' + je invalid_expression + sub edi,14h + mov ebx,edi + sub ebx,14h + cmp al,0E0h + je calculate_rva + cmp al,0D0h + je calculate_not + cmp al,083h + je calculate_neg + mov dx,[ebx+8] + or dx,[edi+8] + cmp al,80h + je calculate_add + cmp al,81h + je calculate_sub + mov ah,[ebx+12] + or ah,[edi+12] + jz absolute_values_calculation + cmp [error_line],0 + jne absolute_values_calculation + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + absolute_values_calculation: + cmp al,90h + je calculate_mul + cmp al,91h + je calculate_div + or dx,dx + jnz invalid_expression + cmp al,0A0h + je calculate_mod + cmp al,0B0h + je calculate_and + cmp al,0B1h + je calculate_or + cmp al,0B2h + je calculate_xor + cmp al,0C0h + je calculate_shl + cmp al,0C1h + je calculate_shr + jmp invalid_expression + expression_calculated: + sub edi,14h + cmp [value_undefined],0 + je expression_value_ok + xor eax,eax + mov [edi],eax + mov [edi+4],eax + mov [edi+12],al + expression_value_ok: + ret + get_byte_number: + mov word [edi+8],0 + mov byte [edi+12],0 + xor eax,eax + lods byte [esi] + stos dword [edi] + xor al,al + stos dword [edi] + add edi,0Ch + jmp calculation_loop + get_word_number: + mov word [edi+8],0 + mov byte [edi+12],0 + xor eax,eax + lods word [esi] + stos dword [edi] + xor ax,ax + stos dword [edi] + add edi,0Ch + jmp calculation_loop + get_dword_number: + mov word [edi+8],0 + mov byte [edi+12],0 + movs dword [edi],[esi] + xor eax,eax + stos dword [edi] + add edi,0Ch + jmp calculation_loop + get_qword_number: + mov word [edi+8],0 + mov byte [edi+12],0 + movs dword [edi],[esi] + movs dword [edi],[esi] + add edi,0Ch + jmp calculation_loop + get_register: + mov byte [edi+9],0 + mov byte [edi+12],0 + lods byte [esi] + mov [edi+8],al + mov byte [edi+10],1 + xor eax,eax + stos dword [edi] + stos dword [edi] + add edi,0Ch + jmp calculation_loop + get_label: + xor eax,eax + mov [edi+8],eax + mov [edi+12],al + mov [edi+20],eax + lods dword [esi] + cmp eax,0Fh + jb predefined_label + je reserved_word_used_as_symbol + mov ebx,eax + mov ax,[current_pass] + mov [ebx+18],ax + or byte [ebx+8],8 + test byte [ebx+8],1 + jz label_undefined + cmp ax,[ebx+16] + je label_defined + test byte [ebx+8],4 + jnz label_undefined + test byte [ebx+9],1 + jz label_defined + mov eax,[ebx] + sub eax,dword [adjustment] + stos dword [edi] + mov eax,[ebx+4] + sbb eax,dword [adjustment+4] + stos dword [edi] + mov eax,dword [adjustment] + or eax,dword [adjustment+4] + jz got_label + or [next_pass_needed],-1 + jmp got_label + label_defined: + mov eax,[ebx] + stos dword [edi] + mov eax,[ebx+4] + stos dword [edi] + got_label: + mov al,[ebx+11] + mov [edi-8+12],al + mov eax,[ebx+12] + mov [edi-8+8],eax + mov eax,[ebx+20] + mov [edi-8+16],eax + add edi,0Ch + mov al,[ebx+10] + or al,al + jz calculation_loop + cmp [size_override],-1 + je calculation_loop + cmp [size_override],0 + je check_size + cmp [operand_size],0 + jne calculation_loop + mov [operand_size],al + jmp calculation_loop + check_size: + xchg [operand_size],al + or al,al + jz calculation_loop + cmp al,[operand_size] + jne operand_sizes_do_not_match + jmp calculation_loop + current_offset_label: + mov al,[labels_type] + mov [edi+12],al + mov eax,[org_symbol] + mov [edi+16],eax + mov eax,[current_offset] + xor edx,edx + sub eax,dword [org_origin] + sbb edx,dword [org_origin+4] + stos dword [edi] + mov eax,edx + stos dword [edi] + mov eax,[org_registers] + stos dword [edi] + add edi,8 + jmp calculation_loop + org_origin_label: + mov al,[labels_type] + mov [edi+12],al + mov eax,[org_symbol] + mov [edi+16],eax + mov eax,[org_start] + xor edx,edx + sub eax,dword [org_origin] + sbb edx,dword [org_origin+4] + stos dword [edi] + mov eax,edx + stos dword [edi] + mov eax,[org_registers] + stos dword [edi] + add edi,8 + jmp calculation_loop + counter_label: + mov eax,[counter] + make_dword_label_value: + stos dword [edi] + xor eax,eax + stos dword [edi] + add edi,0Ch + jmp calculation_loop + timestamp_label: + call make_timestamp + jmp make_dword_label_value + predefined_label: + or eax,eax + jz current_offset_label + cmp eax,1 + je counter_label + cmp eax,2 + je timestamp_label + cmp eax,3 + je org_origin_label + label_undefined: + cmp [current_pass],1 + ja undefined_value + force_next_pass: + or [next_pass_needed],-1 + undefined_value: + mov byte [edi+12],0 + or [value_undefined],-1 + xor eax,eax + stos dword [edi] + stos dword [edi] + add edi,0Ch + cmp [error_line],0 + jne calculation_loop + mov eax,[current_line] + mov [error_line],eax + mov [error],undefined_symbol + jmp calculation_loop + calculate_add: + mov ecx,[ebx+16] + cmp byte [edi+12],0 + je add_values + mov ecx,[edi+16] + cmp byte [ebx+12],0 + je add_values + cmp [error_line],0 + jne add_values + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + add_values: + mov al,[edi+12] + or [ebx+12],al + mov [ebx+16],ecx + mov eax,[edi] + add [ebx],eax + mov eax,[edi+4] + adc [ebx+4],eax + or dx,dx + jz calculation_loop + push esi + mov esi,ebx + lea ebx,[edi+10] + mov cl,[edi+8] + call add_register + lea ebx,[edi+11] + mov cl,[edi+9] + call add_register + pop esi + jmp calculation_loop + add_register: + or cl,cl + jz add_register_done + add_register_start: + cmp [esi+8],cl + jne add_in_second_slot + mov al,[ebx] + add [esi+10],al + jnz add_register_done + mov byte [esi+8],0 + ret + add_in_second_slot: + cmp [esi+9],cl + jne create_in_first_slot + mov al,[ebx] + add [esi+11],al + jnz add_register_done + mov byte [esi+9],0 + ret + create_in_first_slot: + cmp byte [esi+8],0 + jne create_in_second_slot + mov [esi+8],cl + mov al,[ebx] + mov [esi+10],al + ret + create_in_second_slot: + cmp byte [esi+9],0 + jne invalid_expression + mov [esi+9],cl + mov al,[ebx] + mov [esi+11],al + add_register_done: + ret + calculate_sub: + xor ah,ah + mov ah,[ebx+12] + mov al,[edi+12] + or al,al + jz sub_values + cmp al,ah + jne invalid_sub + xor ah,ah + mov ecx,[edi+16] + cmp ecx,[ebx+16] + je sub_values + cmp ecx,[org_symbol] + jne invalid_sub + test byte [ebx+12],1 + jnz invalid_sub + mov ah,3 + sub_values: + mov [ebx+12],ah + mov eax,[edi] + sub [ebx],eax + mov eax,[edi+4] + sbb [ebx+4],eax + or dx,dx + jz calculation_loop + push esi + mov esi,ebx + lea ebx,[edi+10] + mov cl,[edi+8] + call sub_register + lea ebx,[edi+11] + mov cl,[edi+9] + call sub_register + pop esi + jmp calculation_loop + invalid_sub: + cmp [error_line],0 + jne sub_values + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + jmp sub_values + sub_register: + or cl,cl + jz add_register_done + neg byte [ebx] + jmp add_register_start + calculate_mul: + or dx,dx + jz mul_start + cmp word [ebx+8],0 + jne mul_start + mov eax,[ebx] + xchg eax,[edi] + mov [ebx],eax + mov eax,[ebx+4] + xchg eax,[edi+4] + mov [ebx+4],eax + mov eax,[ebx+8] + xchg eax,[edi+8] + mov [ebx+8],eax + mov eax,[ebx+12] + xchg eax,[edi+12] + mov [ebx+12],eax + mul_start: + push esi edx + mov esi,ebx + xor bl,bl + bt dword [esi+4],31 + jnc mul_first_sign_ok + not dword [esi] + not dword [esi+4] + add dword [esi],1 + adc dword [esi+4],0 + not bl + mul_first_sign_ok: + bt dword [edi+4],31 + jnc mul_second_sign_ok + not dword [edi] + not dword [edi+4] + add dword [edi],1 + adc dword [edi+4],0 + not bl + mul_second_sign_ok: + cmp dword [esi+4],0 + jz mul_numbers + cmp dword [edi+4],0 + jnz value_out_of_range + mul_numbers: + mov eax,[esi+4] + mul dword [edi] + or edx,edx + jnz value_out_of_range + mov ecx,eax + mov eax,[esi] + mul dword [edi+4] + or edx,edx + jnz value_out_of_range + add ecx,eax + jc value_out_of_range + mov eax,[esi] + mul dword [edi] + add edx,ecx + jc value_out_of_range + test edx,1 shl 31 + jnz value_out_of_range + mov [esi],eax + mov [esi+4],edx + or bl,bl + jz mul_ok + not dword [esi] + not dword [esi+4] + add dword [esi],1 + adc dword [esi+4],0 + mul_ok: + pop edx + or dx,dx + jz mul_calculated + cmp word [edi+8],0 + jne invalid_value + cmp byte [esi+8],0 + je mul_first_register_ok + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + imul byte [esi+10] + mov dl,ah + cbw + cmp ah,dl + jne value_out_of_range + mov [esi+10],al + mul_first_register_ok: + cmp byte [esi+9],0 + je mul_calculated + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + imul byte [esi+11] + mov dl,ah + cbw + cmp ah,dl + jne value_out_of_range + mov [esi+11],al + mul_calculated: + pop esi + jmp calculation_loop + calculate_div: + push esi edx + mov esi,ebx + call div_64 + pop edx + or dx,dx + jz div_calculated + cmp byte [esi+8],0 + je div_first_register_ok + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + or al,al + jz value_out_of_range + mov al,[esi+10] + cbw + idiv byte [edi] + or ah,ah + jnz invalid_use_of_symbol + mov [esi+10],al + div_first_register_ok: + cmp byte [esi+9],0 + je div_calculated + mov al,[edi] + cbw + cwde + cdq + cmp edx,[edi+4] + jne value_out_of_range + cmp eax,[edi] + jne value_out_of_range + or al,al + jz value_out_of_range + mov al,[esi+11] + cbw + idiv byte [edi] + or ah,ah + jnz invalid_use_of_symbol + mov [esi+11],al + div_calculated: + pop esi + jmp calculation_loop + calculate_mod: + push esi + mov esi,ebx + call div_64 + mov [esi],eax + mov [esi+4],edx + pop esi + jmp calculation_loop + calculate_and: + mov eax,[edi] + and [ebx],eax + mov eax,[edi+4] + and [ebx+4],eax + jmp calculation_loop + calculate_or: + mov eax,[edi] + or [ebx],eax + mov eax,[edi+4] + or [ebx+4],eax + jmp calculation_loop + calculate_xor: + mov eax,[edi] + xor [ebx],eax + mov eax,[edi+4] + xor [ebx+4],eax + jmp calculation_loop + shr_negative: + not dword [edi] + not dword [edi+4] + add dword [edi],1 + adc dword [edi+4],0 + calculate_shl: + mov eax,dword [edi+4] + bt eax,31 + jc shl_negative + or eax,eax + jnz zero_value + mov ecx,[edi] + cmp ecx,64 + jae zero_value + cmp ecx,32 + jae shl_high + mov edx,[ebx+4] + mov eax,[ebx] + shld edx,eax,cl + shl eax,cl + mov [ebx],eax + mov [ebx+4],edx + jmp calculation_loop + shl_high: + sub cl,32 + mov eax,[ebx] + shl eax,cl + mov [ebx+4],eax + mov dword [ebx],0 + jmp calculation_loop + shl_negative: + not dword [edi] + not dword [edi+4] + add dword [edi],1 + adc dword [edi+4],0 + calculate_shr: + mov eax,dword [edi+4] + bt eax,31 + jc shr_negative + or eax,eax + jnz zero_value + mov ecx,[edi] + cmp ecx,64 + jae zero_value + cmp ecx,32 + jae shr_high + mov edx,[ebx+4] + mov eax,[ebx] + shrd eax,edx,cl + shr edx,cl + mov [ebx],eax + mov [ebx+4],edx + jmp calculation_loop + shr_high: + sub cl,32 + mov eax,[ebx+4] + shr eax,cl + mov [ebx],eax + mov dword [ebx+4],0 + jmp calculation_loop + zero_value: + mov dword [ebx],0 + mov dword [ebx+4],0 + jmp calculation_loop + calculate_not: + cmp word [edi+8],0 + jne invalid_expression + cmp byte [edi+12],0 + je not_ok + cmp [error_line],0 + jne not_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + not_ok: + cmp [value_size],1 + je not_byte + cmp [value_size],2 + je not_word + cmp [value_size],4 + je not_dword + cmp [value_size],6 + je not_pword + not_qword: + not dword [edi] + not dword [edi+4] + add edi,14h + jmp calculation_loop + not_byte: + cmp dword [edi+4],0 + jne not_qword + cmp word [edi+2],0 + jne not_qword + cmp byte [edi+1],0 + jne not_qword + not byte [edi] + add edi,14h + jmp calculation_loop + not_word: + cmp dword [edi+4],0 + jne not_qword + cmp word [edi+2],0 + jne not_qword + not word [edi] + add edi,14h + jmp calculation_loop + not_dword: + cmp dword [edi+4],0 + jne not_qword + not dword [edi] + add edi,14h + jmp calculation_loop + not_pword: + cmp word [edi+6],0 + jne not_qword + not dword [edi] + not word [edi+4] + add edi,14h + jmp calculation_loop + calculate_neg: + cmp word [edi+8],0 + jne invalid_expression + cmp byte [edi+12],0 + je neg_ok + cmp [error_line],0 + jne neg_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + neg_ok: + mov eax,[edi] + mov edx,[edi+4] + mov dword [edi],0 + mov dword [edi+4],0 + sub [edi],eax + sbb [edi+4],edx + add edi,14h + jmp calculation_loop + calculate_rva: + cmp word [edi+8],0 + jne invalid_expression + cmp [output_format],5 + je calculate_gotoff + cmp [output_format],3 + jne invalid_expression + test [format_flags],8 + jnz pe64_rva + mov al,2 + bt [resolver_flags],0 + jc rva_type_ok + xor al,al + rva_type_ok: + cmp byte [edi+12],al + je rva_ok + cmp [error_line],0 + jne rva_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + rva_ok: + mov byte [edi+12],0 + mov eax,[code_start] + mov eax,[eax+34h] + cdq + sub [edi],eax + sbb [edi+4],edx + add edi,14h + jmp calculation_loop + pe64_rva: + mov al,4 + bt [resolver_flags],0 + jc pe64_rva_type_ok + xor al,al + pe64_rva_type_ok: + cmp byte [edi+12],al + je pe64_rva_ok + cmp [error_line],0 + jne pe64_rva_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + pe64_rva_ok: + mov byte [edi+12],0 + mov eax,[code_start] + mov edx,[eax+34h] + mov eax,[eax+30h] + sub [edi],eax + sbb [edi+4],edx + add edi,14h + jmp calculation_loop + calculate_gotoff: + test [format_flags],8+1 + jnz invalid_expression + cmp byte [edi+12],2 + je gotoff_ok + cmp [error_line],0 + jne pe64_rva_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + gotoff_ok: + mov byte [edi+12],5 + add edi,14h + jmp calculation_loop + div_64: + xor ebx,ebx + cmp dword [edi],0 + jne divider_ok + cmp dword [edi+4],0 + jne divider_ok + cmp [next_pass_needed],0 + je value_out_of_range + jmp div_done + divider_ok: + bt dword [esi+4],31 + jnc div_first_sign_ok + not dword [esi] + not dword [esi+4] + add dword [esi],1 + adc dword [esi+4],0 + not bx + div_first_sign_ok: + bt dword [edi+4],31 + jnc div_second_sign_ok + not dword [edi] + not dword [edi+4] + add dword [edi],1 + adc dword [edi+4],0 + not bl + div_second_sign_ok: + cmp dword [edi+4],0 + jne div_high + mov ecx,[edi] + mov eax,[esi+4] + xor edx,edx + div ecx + mov [esi+4],eax + mov eax,[esi] + div ecx + mov [esi],eax + mov eax,edx + xor edx,edx + jmp div_done + div_high: + mov eax,[esi+4] + xor edx,edx + div dword [edi+4] + mov ebx,[esi] + mov [esi],eax + mov dword [esi+4],0 + mov ecx,edx + mul dword [edi] + div_high_loop: + cmp ecx,edx + ja div_high_done + jb div_high_large_correction + cmp ebx,eax + jae div_high_done + div_high_correction: + dec dword [esi] + sub eax,[edi] + sbb edx,[edi+4] + jnc div_high_loop + div_high_done: + sub ebx,eax + sbb ecx,edx + mov edx,ecx + mov eax,ebx + ret + div_high_large_correction: + push eax edx + mov eax,edx + sub eax,ecx + xor edx,edx + div dword [edi+4] + shr eax,1 + jz div_high_small_correction + sub [esi],eax + push eax + mul dword [edi+4] + sub dword [esp+4],eax + pop eax + mul dword [edi] + sub dword [esp+4],eax + sbb dword [esp],edx + pop edx eax + jmp div_high_loop + div_high_small_correction: + pop edx eax + jmp div_high_correction + div_done: + or bh,bh + jz remainder_ok + not eax + not edx + add eax,1 + adc edx,0 + remainder_ok: + or bl,bl + jz div_ok + not dword [esi] + not dword [esi+4] + add dword [esi],1 + adc dword [esi+4],0 + div_ok: + ret + convert_fp: + inc esi + mov word [edi+8],0 + mov byte [edi+12],0 + mov al,[value_size] + cmp al,4 + je convert_fp_dword + cmp al,8 + je convert_fp_qword + jmp invalid_value + convert_fp_dword: + xor eax,eax + cmp word [esi+8],8000h + je fp_dword_store + mov bx,[esi+8] + mov eax,[esi+4] + shl eax,1 + shr eax,9 + jnc fp_dword_ok + inc eax + bt eax,23 + jnc fp_dword_ok + and eax,1 shl 23 - 1 + inc bx + shr eax,1 + fp_dword_ok: + add bx,7Fh + cmp bx,100h + jae value_out_of_range + shl ebx,23 + or eax,ebx + fp_dword_store: + mov bl,[esi+11] + shl ebx,31 + or eax,ebx + mov [edi],eax + xor eax,eax + mov [edi+4],eax + add esi,13 + ret + convert_fp_qword: + xor eax,eax + xor edx,edx + cmp word [esi+8],8000h + je fp_qword_store + mov bx,[esi+8] + mov eax,[esi] + mov edx,[esi+4] + add eax,eax + adc edx,edx + mov ecx,edx + shr edx,12 + shrd eax,ecx,12 + jnc fp_qword_ok + add eax,1 + adc edx,0 + bt edx,20 + jnc fp_qword_ok + and edx,1 shl 20 - 1 + inc bx + shr edx,1 + rcr eax,1 + fp_qword_ok: + add bx,3FFh + cmp bx,800h + jae value_out_of_range + shl ebx,20 + or edx,ebx + fp_qword_store: + mov bl,[esi+11] + shl ebx,31 + or edx,ebx + mov [edi],eax + mov [edi+4],edx + add esi,13 + ret + get_string_value: + inc esi + lods dword [esi] + mov ecx,eax + cmp ecx,8 + ja value_out_of_range + mov edx,edi + xor eax,eax + stos dword [edi] + stos dword [edi] + mov edi,edx + rep movs byte [edi],[esi] + mov edi,edx + inc esi + mov word [edi+8],0 + mov byte [edi+12],0 + ret + +get_byte_value: + mov [value_size],1 + mov [size_override],-1 + call calculate_expression + mov eax,[edi+16] + mov [symbol_identifier],eax + mov [value_type],0 + cmp word [edi+8],0 + jne invalid_value + cmp byte [edi+12],0 + je check_byte_value + cmp [error_line],0 + jne check_byte_value + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + check_byte_value: + mov eax,[edi] + mov edx,[edi+4] + or edx,edx + jz byte_positive + cmp edx,-1 + jne range_exceeded + cmp eax,-80h + jb range_exceeded + ret + byte_positive: + cmp eax,100h + jae range_exceeded + return_byte_value: + ret + range_exceeded: + xor eax,eax + xor edx,edx + cmp [error_line],0 + jne return_byte_value + mov ecx,[current_line] + mov [error_line],ecx + mov [error],value_out_of_range + ret +get_word_value: + mov [value_size],2 + mov [size_override],-1 + call calculate_expression + mov eax,[edi+16] + mov [symbol_identifier],eax + cmp word [edi+8],0 + jne invalid_value + mov al,[edi+12] + mov [value_type],al + cmp al,2 + jb check_word_value + cmp [error_line],0 + jne check_word_value + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + check_word_value: + mov eax,[edi] + mov edx,[edi+4] + or edx,edx + jz word_positive + cmp edx,-1 + jne range_exceeded + cmp eax,-8000h + jb range_exceeded + ret + word_positive: + cmp eax,10000h + jae range_exceeded + ret +get_dword_value: + mov [value_size],4 + mov [size_override],-1 + call calculate_expression + mov eax,[edi+16] + mov [symbol_identifier],eax + cmp word [edi+8],0 + jne invalid_value + mov al,[edi+12] + mov [value_type],al + cmp al,4 + jne check_dword_value + mov [value_type],2 + mov eax,[edi] + cdq + cmp edx,[edi+4] + jne range_exceeded + ret + check_dword_value: + mov eax,[edi] + mov edx,[edi+4] + or edx,edx + jz dword_positive + cmp edx,-1 + jne range_exceeded + bt eax,31 + jnc range_exceeded + dword_positive: + ret +get_pword_value: + mov [value_size],6 + mov [size_override],-1 + call calculate_expression + mov eax,[edi+16] + mov [symbol_identifier],eax + cmp word [edi+8],0 + jne invalid_value + mov al,[edi+12] + mov [value_type],al + cmp al,4 + jne check_pword_value + cmp [error_line],0 + jne check_pword_value + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + check_pword_value: + mov eax,[edi] + mov edx,[edi+4] + cmp edx,10000h + jge range_exceeded + cmp edx,-8000h + jl range_exceeded + ret +get_qword_value: + mov [value_size],8 + mov [size_override],-1 + call calculate_expression + mov eax,[edi+16] + mov [symbol_identifier],eax + cmp word [edi+8],0 + jne invalid_value + mov al,[edi+12] + mov [value_type],al + check_qword_value: + mov eax,[edi] + mov edx,[edi+4] + ret +get_value: + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,'(' + jne invalid_value + mov al,[operand_size] + cmp al,1 + je value_byte + cmp al,2 + je value_word + cmp al,4 + je value_dword + cmp al,6 + je value_pword + cmp al,8 + je value_qword + or al,al + jnz invalid_value + value_qword: + call get_qword_value + ret + value_pword: + call get_pword_value + movzx edx,dx + ret + value_dword: + call get_dword_value + xor edx,edx + ret + value_word: + call get_word_value + xor edx,edx + movzx eax,ax + ret + value_byte: + call get_byte_value + xor edx,edx + movzx eax,al + ret +get_address_value: + mov [address_size],0 + mov [value_size],8 + calculate_address: + cmp byte [esi],'.' + je invalid_address + call calculate_expression + mov eax,[edi+16] + mov [address_symbol],eax + mov al,[edi+12] + mov [value_type],al + cmp al,5 + je gotoff_address + test al,1 + jnz invalid_use_of_symbol + or al,al + jz address_size_ok + shl al,5 + jmp address_symbol_ok + gotoff_address: + mov al,40h + address_symbol_ok: + mov ah,[address_size] + or [address_size],al + shr al,4 + or ah,ah + jz address_size_ok + cmp al,ah + je address_size_ok + cmp ax,0408h + jne address_sizes_do_not_agree + mov [value_type],2 + mov eax,[edi] + cdq + cmp edx,[edi+4] + je address_size_ok + cmp [error_line],0 + jne address_size_ok + mov ecx,[current_line] + mov [error_line],ecx + mov [error],value_out_of_range + address_size_ok: + xor bx,bx + xor cl,cl + mov ch,[address_size] + cmp word [edi+8],0 + je check_immediate_address + mov al,[edi+8] + mov dl,[edi+10] + call get_address_register + mov al,[edi+9] + mov dl,[edi+11] + call get_address_register + mov ax,bx + shr ah,4 + shr al,4 + or bh,bh + jz check_address_registers + or bl,bl + jz check_address_registers + cmp al,ah + jne invalid_address + check_address_registers: + or al,ah + cmp al,4 + je sib_allowed + cmp al,8 + je sib_allowed + or cl,cl + jz check_word_value + cmp cl,1 + je check_word_value + jmp invalid_address + get_address_register: + or al,al + jz address_register_ok + cmp dl,1 + jne scaled_register + or bh,bh + jnz scaled_register + mov bh,al + address_register_ok: + ret + scaled_register: + or bl,bl + jnz invalid_address + mov bl,al + mov cl,dl + jmp address_register_ok + sib_allowed: + or bh,bh + jnz check_index_scale + cmp cl,2 + je special_index_scale + cmp cl,3 + je special_index_scale + cmp cl,5 + je special_index_scale + cmp cl,9 + je special_index_scale + check_index_scale: + or cl,cl + jz address_registers_ok + cmp cl,1 + je address_registers_ok + cmp cl,2 + je address_registers_ok + cmp cl,4 + je address_registers_ok + cmp cl,8 + je address_registers_ok + jmp invalid_address + special_index_scale: + mov bh,bl + dec cl + address_registers_ok: + jmp check_dword_value + check_immediate_address: + cmp [code_type],64 + jne check_dword_value + cmp [address_size],4 + je check_dword_value + jmp check_qword_value +get_relative_offset: + mov [value_size],4 + mov [size_override],-1 + call calculate_expression + calculate_relative_offset: + push esi + add edi,14h + mov esi,[display_buffer] + sub esi,7 + lea eax,[esi-14h] + cmp eax,edi + jb out_of_memory + mov byte [esi],11h + xor eax,eax + mov dword [esi+1],eax + mov word [esi+5],')' shl 8 + 81h + call calculation_loop + pop esi + cmp word [edi+8],0 + jne invalid_value + mov al,[edi+12] + mov [value_type],al + mov eax,[edi+16] + mov [symbol_identifier],eax + mov eax,[edi] + mov edx,[edi+4] + or edx,edx + jz offset_positive + cmp edx,-1 + jne range_exceeded + bt eax,31 + jnc range_exceeded + ret + offset_positive: + bt eax,31 + jc range_exceeded + ret + +preevaluate_logical_expression: + push edi + call preevaluate_logical_value + preevaluation_loop: + cmp al,0FFh + je invalid_logical_expression + mov dl,[esi] + inc esi + cmp dl,'|' + je preevaluate_or + cmp dl,'&' + je preevaluate_and + cmp dl,'}' + je preevaluation_done + or dl,dl + jnz invalid_logical_expression + preevaluation_done: + pop edx + dec esi + ret + preevaluate_or: + cmp al,'1' + je quick_true + cmp al,'0' + je leave_only_following + push edi + mov al,dl + stos byte [edi] + call preevaluate_logical_value + pop ebx + cmp al,'0' + je leave_only_preceding + cmp al,'1' + jne preevaluation_loop + stos byte [edi] + xor al,al + jmp preevaluation_loop + preevaluate_and: + cmp al,'0' + je quick_false + cmp al,'1' + je leave_only_following + push edi + mov al,dl + stos byte [edi] + call preevaluate_logical_value + pop ebx + cmp al,'1' + je leave_only_preceding + cmp al,'0' + jne preevaluation_loop + stos byte [edi] + xor al,al + jmp preevaluation_loop + leave_only_following: + mov edi,[esp] + call preevaluate_logical_value + jmp preevaluation_loop + leave_only_preceding: + mov edi,ebx + xor al,al + jmp preevaluation_loop + quick_true: + call skip_logical_value + jc invalid_logical_expression + mov edi,[esp] + mov al,'1' + jmp preevaluation_loop + quick_false: + call skip_logical_value + jc invalid_logical_expression + mov edi,[esp] + mov al,'0' + jmp preevaluation_loop + invalid_logical_expression: + pop edi + mov esi,edi + mov al,0FFh + stos byte [edi] + ret +skip_logical_value: + cmp byte [esi],'~' + jne negation_skipped + inc esi + jmp skip_logical_value + negation_skipped: + cmp byte [esi],'{' + jne skip_simple_logical_value + inc esi + skip_logical_expression: + call skip_logical_value + lods byte [esi] + or al,al + jz wrongly_structured_logical_expression + cmp al,0Fh + je wrongly_structured_logical_expression + cmp al,'|' + je skip_logical_expression + cmp al,'&' + je skip_logical_expression + cmp al,'}' + je logical_value_skipped + wrongly_structured_logical_expression: + stc + ret + skip_simple_logical_value: + mov al,[esi] + or al,al + jz logical_value_skipped + cmp al,0Fh + je logical_value_skipped + cmp al,'}' + je logical_value_skipped + cmp al,'|' + je logical_value_skipped + cmp al,'&' + je logical_value_skipped + call skip_symbol + jmp skip_simple_logical_value + logical_value_skipped: + clc + ret + +preevaluate_logical_value: + mov ebp,edi + preevaluate_negation: + cmp byte [esi],'~' + jne preevaluate_negation_ok + movs byte [edi],[esi] + jmp preevaluate_negation + preevaluate_negation_ok: + mov ebx,esi + xor edx,edx + cmp byte [esi],'{' + jne find_logical_value_boundaries + movs byte [edi],[esi] + push ebp + call preevaluate_logical_expression + pop ebp + cmp al,0FFh + je invalid_logical_value + cmp byte [esi],'}' + jne invalid_logical_value + or al,al + jnz preevaluated_expression_value + movs byte [edi],[esi] + ret + preevaluated_expression_value: + inc esi + lea edx,[edi-1] + sub edx,ebp + test edx,1 + jz expression_negation_ok + xor al,1 + expression_negation_ok: + mov edi,ebp + ret + invalid_logical_value: + mov edi,ebp + mov al,0FFh + ret + find_logical_value_boundaries: + mov al,[esi] + or al,al + jz logical_value_boundaries_found + cmp al,'}' + je logical_value_boundaries_found + cmp al,'|' + je logical_value_boundaries_found + cmp al,'&' + je logical_value_boundaries_found + or edx,edx + jnz next_symbol_in_logical_value + cmp al,0F0h + je preevaluable_logical_operator + cmp al,0F7h + je preevaluable_logical_operator + cmp al,0F6h + jne next_symbol_in_logical_value + preevaluable_logical_operator: + mov edx,esi + next_symbol_in_logical_value: + call skip_symbol + jmp find_logical_value_boundaries + logical_value_boundaries_found: + or edx,edx + jz non_preevaluable_logical_value + mov al,[edx] + cmp al,0F0h + je compare_symbols + cmp al,0F7h + je compare_symbol_types + cmp al,0F6h + je scan_symbols_list + non_preevaluable_logical_value: + mov ecx,esi + mov esi,ebx + sub ecx,esi + jz invalid_logical_value + cmp esi,edi + je leave_logical_value_intact + rep movs byte [edi],[esi] + xor al,al + ret + leave_logical_value_intact: + add edi,ecx + add esi,ecx + xor al,al + ret + compare_symbols: + lea ecx,[esi-1] + sub ecx,edx + mov eax,edx + sub eax,ebx + cmp ecx,eax + jne preevaluated_false + push esi edi + mov esi,ebx + lea edi,[edx+1] + repe cmps byte [esi],[edi] + pop edi esi + je preevaluated_true + preevaluated_false: + mov eax,edi + sub eax,ebp + test eax,1 + jnz store_true + store_false: + mov edi,ebp + mov al,'0' + ret + preevaluated_true: + mov eax,edi + sub eax,ebp + test eax,1 + jnz store_false + store_true: + mov edi,ebp + mov al,'1' + ret + compare_symbol_types: + push esi + lea esi,[edx+1] + type_comparison: + cmp esi,[esp] + je types_compared + mov al,[esi] + cmp al,[ebx] + jne different_type + cmp al,'(' + jne equal_type + mov al,[esi+1] + mov ah,[ebx+1] + cmp al,ah + je equal_type + or al,al + jz different_type + or ah,ah + jz different_type + cmp al,'.' + je different_type + cmp ah,'.' + je different_type + equal_type: + call skip_symbol + xchg esi,ebx + call skip_symbol + xchg esi,ebx + jmp type_comparison + types_compared: + pop esi + cmp byte [ebx],0F7h + jne preevaluated_false + jmp preevaluated_true + different_type: + pop esi + jmp preevaluated_false + scan_symbols_list: + push edi esi + lea esi,[edx+1] + sub edx,ebx + lods byte [esi] + cmp al,'<' + jne invalid_symbols_list + get_next_from_list: + mov edi,esi + get_from_list: + cmp byte [esi],',' + je compare_in_list + cmp byte [esi],'>' + je compare_in_list + cmp esi,[esp] + jae invalid_symbols_list + call skip_symbol + jmp get_from_list + compare_in_list: + mov ecx,esi + sub ecx,edi + cmp ecx,edx + jne not_equal_length_in_list + mov esi,ebx + repe cmps byte [esi],[edi] + mov esi,edi + jne not_equal_in_list + skip_rest_of_list: + cmp byte [esi],'>' + je check_list_end + cmp esi,[esp] + jae invalid_symbols_list + call skip_symbol + jmp skip_rest_of_list + check_list_end: + inc esi + cmp esi,[esp] + jne invalid_symbols_list + pop esi edi + jmp preevaluated_true + not_equal_in_list: + add esi,ecx + not_equal_length_in_list: + lods byte [esi] + cmp al,',' + je get_next_from_list + cmp esi,[esp] + jne invalid_symbols_list + pop esi edi + jmp preevaluated_false + invalid_symbols_list: + pop esi edi + jmp invalid_logical_value + +calculate_logical_expression: + call get_logical_value + logical_loop: + cmp byte [esi],'|' + je logical_or + cmp byte [esi],'&' + je logical_and + ret + logical_or: + inc esi + or al,al + jnz logical_value_already_determined + push eax + call get_logical_value + pop ebx + or al,bl + jmp logical_loop + logical_and: + inc esi + or al,al + jz logical_value_already_determined + push eax + call get_logical_value + pop ebx + and al,bl + jmp logical_loop + logical_value_already_determined: + push eax + call skip_logical_value + jc invalid_expression + pop eax + jmp logical_loop +get_logical_value: + xor al,al + check_for_negation: + cmp byte [esi],'~' + jne negation_ok + inc esi + xor al,-1 + jmp check_for_negation + negation_ok: + push eax + mov al,[esi] + cmp al,'{' + je logical_expression + cmp al,0FFh + je invalid_expression + cmp al,88h + je check_for_defined + cmp al,89h + je check_for_used + cmp al,'0' + je given_false + cmp al,'1' + je given_true + call get_value + mov bl,[value_type] + push eax edx ebx + mov al,[esi] + or al,al + jz logical_number + cmp al,0Fh + je logical_number + cmp al,'}' + je logical_number + cmp al,'&' + je logical_number + cmp al,'|' + je logical_number + inc esi + mov [compare_type],al + call get_value + pop ebx + cmp [next_pass_needed],0 + jne values_ok + cmp bl,[value_type] + jne invalid_use_of_symbol + values_ok: + pop ecx ebx + cmp [compare_type],'=' + je check_equal + cmp [compare_type],'>' + je check_greater + cmp [compare_type],'<' + je check_less + cmp [compare_type],0F1h + je check_not_equal + cmp [compare_type],0F2h + je check_not_less + cmp [compare_type],0F3h + je check_not_greater + jmp invalid_expression + check_equal: + cmp eax,ebx + jne return_false + cmp edx,ecx + jne return_false + jmp return_true + check_greater: + cmp edx,ecx + jl return_true + jg return_false + cmp eax,ebx + jb return_true + jae return_false + check_less: + cmp edx,ecx + jl return_false + jg return_true + cmp eax,ebx + jbe return_false + ja return_true + check_not_less: + cmp edx,ecx + jl return_true + jg return_false + cmp eax,ebx + jbe return_true + ja return_false + check_not_greater: + cmp edx,ecx + jl return_false + jg return_true + cmp eax,ebx + jb return_false + jae return_true + check_not_equal: + cmp eax,ebx + jne return_true + cmp edx,ecx + jne return_true + jmp return_false + logical_number: + pop ebx edx eax + or bl,bl + jnz invalid_expression + or eax,edx + jnz return_true + jmp return_false + check_for_defined: + or bl,-1 + lods word [esi] + cmp ah,'(' + jne invalid_expression + check_expression: + lods byte [esi] + or al,al + jz defined_string + cmp al,'.' + je defined_fp_value + cmp al,')' + je expression_checked + cmp al,0Fh + je check_expression + cmp al,10h + je defined_register + cmp al,11h + je check_if_symbol_defined + cmp al,80h + jae check_expression + movzx eax,al + add esi,eax + jmp check_expression + defined_register: + inc esi + jmp check_expression + defined_fp_value: + add esi,12 + jmp expression_checked + defined_string: + lods dword [esi] + add esi,eax + inc esi + jmp expression_checked + check_if_symbol_defined: + lods dword [esi] + cmp eax,-1 + je invalid_expression + cmp eax,0Fh + jb check_expression + je reserved_word_used_as_symbol + test byte [eax+8],4 + jnz no_prediction + test byte [eax+8],1 + jz symbol_predicted_undefined + mov cx,[current_pass] + sub cx,[eax+16] + jz check_expression + cmp cx,1 + ja symbol_predicted_undefined + or byte [eax+8],40h+80h + jmp check_expression + no_prediction: + test byte [eax+8],1 + jz symbol_undefined + mov cx,[current_pass] + sub cx,[eax+16] + jz check_expression + jmp symbol_undefined + symbol_predicted_undefined: + or byte [eax+8],40h + and byte [eax+8],not 80h + symbol_undefined: + xor bl,bl + jmp check_expression + expression_checked: + mov al,bl + jmp logical_value_ok + check_for_used: + lods word [esi] + cmp ah,2 + jne invalid_expression + lods dword [esi] + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + inc esi + test byte [eax+8],8 + jz not_used + mov cx,[current_pass] + sub cx,[eax+18] + jz return_true + cmp cx,1 + ja not_used + or byte [eax+8],10h+20h + jmp return_true + not_used: + or byte [eax+8],10h + and byte [eax+8],not 20h + jmp return_false + given_false: + inc esi + return_false: + xor al,al + jmp logical_value_ok + given_true: + inc esi + return_true: + or al,-1 + jmp logical_value_ok + logical_expression: + inc esi + call calculate_logical_expression + push eax + lods byte [esi] + cmp al,'}' + jne invalid_expression + pop eax + logical_value_ok: + pop ebx + xor al,bl + ret diff --git a/programs/fasm/trunk/fasm.asm b/programs/develop/fasm/trunk/fasm.asm similarity index 85% rename from programs/fasm/trunk/fasm.asm rename to programs/develop/fasm/trunk/fasm.asm index b9be181039..1d7ad939ae 100644 --- a/programs/fasm/trunk/fasm.asm +++ b/programs/develop/fasm/trunk/fasm.asm @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; flat assembler source ;; -;; Copyright (c) 1999-2004, Tomasz Grysztar ;; +;; Copyright (c) 1999-2006, Tomasz Grysztar ;; ;; All rights reserved. ;; ;; ;; ;; Menuet port by VT ;; @@ -11,10 +11,10 @@ NORMAL_MODE = 8 CONSOLE_MODE = 32 -MAGIC1 = 6*(text.line_size-1)+6*2+2 -MAGIC2 = 14 -MAGIC3 = 1 -MAGIC4 = 7 +MAGIC1 = 6*(text.line_size-1)+6*2+2 +MAGIC2 = 14 +MAGIC3 = 1 +MAGIC4 = 7 OUTPUTXY = (5+MAGIC4) shl 16 + MAGIC2*3+MAGIC3+MAGIC4+1+2 MAX_PATH = 100 @@ -30,57 +30,56 @@ use32 dd START ; program start dd program_end ; program image size dd APP_MEMORY ; required amount of memory - dd 0xDFFF0 ; stack + dd 0xDFFF0 ; stack dd params,0x0 ; parameters,icon include 'lang.inc' include 'fasm.inc' -;include 'debug2.inc' center fix true -START: ; Start of execution +START: ; Start of execution - cmp [params],0 - jz noparams + cmp [params],0 + jz noparams - mov ecx,10 - mov al,' ' - mov edi,infile + mov ecx,10 + mov al,' ' + mov edi,infile push ecx cld - rep stosd - mov ecx,[esp] - mov edi,outfile - rep stosd - pop ecx - mov edi,path - rep stosd + rep stosd + mov ecx,[esp] + mov edi,outfile + rep stosd + pop ecx + mov edi,path + rep stosd - mov esi,params + mov esi,params ; DEBUGF "params: %s\n",esi - mov edi,infile + mov edi,infile call mov_param_str ; mov edi,infile ; DEBUGF " input: %s\n",edi - inc esi - mov edi,outfile + inc esi + mov edi,outfile call mov_param_str ; mov edi,outfile ; DEBUGF "output: %s\n",edi - inc esi - mov edi,path + inc esi + mov edi,path call mov_param_str ; mov edi,path ; DEBUGF " path: %s\n",edi - cmp [esi], dword ',run' - jne @f - mov [_run_outfile],1 + cmp [esi], dword ',run' + jne @f + mov [_run_outfile],1 @@: - mov [_mode],CONSOLE_MODE - jmp start + mov [_mode],CONSOLE_MODE + jmp start noparams: @@ -88,32 +87,32 @@ START: ; Start of execution still: - mcall 10 ; Wait here for event + mcall 10 ; Wait here for event - dec eax ; Redraw request - jz red - dec eax ; Key in buffer - jz key - dec eax ; Button in buffer - jz button + dec eax ; Redraw request + jz red + dec eax ; Key in buffer + jz key + dec eax ; Button in buffer + jz button jmp still -red: ; Redraw +red: ; Redraw call draw_window jmp still -key: ; Key - mcall 2 ; Read it and ignore +key: ; Key + mcall 2 ; Read it and ignore jmp still button: ; Button in Window mcall 17 - cmp ah,2 ; Start compiling - je start - cmp ah,3 ; Start compiled file + cmp ah,2 ; Start compiling + je start + cmp ah,3 ; Start compiled file jnz norunout mov edx,outfile @@ -127,12 +126,12 @@ button: ; Button in Window add ecx,MAGIC3+MAGIC2/2-3 mov [ya],ecx - cmp ah,11 ; Infile - je f1 - cmp ah,12 ; Outfile - je f2 - cmp ah,13 ; Path - je f3 + cmp ah,11 ; Infile + je f1 + cmp ah,12 ; Outfile + je f2 + cmp ah,13 ; Path + je f3 dec ah ; Close application jnz still @@ -151,7 +150,7 @@ draw_window: mcall 0,<50,280>,<50,250>,[sc.work] ; Draw Window - draw_caption header,header.size ; Draw Window Label Text + draw_caption header,header.size ; Draw Window Label Text mov ecx,[skinh-2] mov cx,word[skinh] @@ -325,11 +324,11 @@ f11:mcall 10 mcall; 2 shr eax,8 cmp al,13 - je read_done + je read_done cmp al,8 jne nobs cmp edi,[addr] - je f11 + je f11 sub edi,1 mov byte[edi],$1C ; '_' call print_text @@ -396,13 +395,13 @@ text: db 'x' s_compile db 'COMPILE' -s_run db ' RUN ' +s_run db ' RUN ' -infile db 'EXAMPLE.ASM' +infile db 'EXAMPLE.ASM' times MAX_PATH+$-infile db 0 outfile db 'EXAMPLE' times MAX_PATH+$-outfile db 0 -path db '/RD/1/' +path db '/RD/1/' times MAX_PATH+$-path db 0 lf db 13,10,0 @@ -415,9 +414,9 @@ mov_param_str: @@: mov al,[esi] cmp al,',' - je @f + je @f cmp al,0 - je @f + je @f mov [edi],al inc esi inc edi @@ -466,8 +465,8 @@ start: xor edx,edx mov ebx,100 div ebx - or eax,eax - jz display_bytes_count + or eax,eax + jz display_bytes_count xor edx,edx mov ebx,10 div ebx @@ -487,7 +486,7 @@ start: xor al,al cmp [_run_outfile],0 - je @f + je @f mov edx,outfile call make_fullpaths mov eax,58 @@ -508,6 +507,7 @@ include 'parser.inc' include 'assemble.inc' include 'formats.inc' include 'x86_64.inc' +include 'tables.inc' _logo db 'flat assembler version ',VERSION_STRING,13,10,0 @@ -519,7 +519,7 @@ _include db 'INCLUDE',0 _counter db 4,'0000' -_mode dd NORMAL_MODE +_mode dd NORMAL_MODE _run_outfile dd 0 sub_table: diff --git a/programs/fasm/trunk/fasm.inc b/programs/develop/fasm/trunk/fasm.inc similarity index 100% rename from programs/fasm/trunk/fasm.inc rename to programs/develop/fasm/trunk/fasm.inc diff --git a/programs/develop/fasm/trunk/formats.inc b/programs/develop/fasm/trunk/formats.inc new file mode 100644 index 0000000000..82a93478e0 --- /dev/null +++ b/programs/develop/fasm/trunk/formats.inc @@ -0,0 +1,3836 @@ + +; flat assembler core +; Copyright (c) 1999-2006, Tomasz Grysztar. +; All rights reserved. + +formatter: + cmp [output_file],0 + jne output_path_ok + push edi + mov esi,[input_file] + mov edi,[free_additional_memory] + copy_output_path: + lods byte [esi] + cmp edi,[structures_buffer] + jae out_of_memory + stos byte [edi] + or al,al + jnz copy_output_path + dec edi + mov eax,edi + find_extension: + dec eax + cmp eax,[free_additional_memory] + jb extension_found + cmp byte [eax],'\' + je extension_found + cmp byte [eax],'/' + je extension_found + cmp byte [eax],'.' + jne find_extension + mov edi,eax + extension_found: + lea eax,[edi+9] + cmp eax,[structures_buffer] + jae out_of_memory + cmp [output_format],2 + je exe_extension + jb bin_extension + cmp [output_format],4 + je obj_extension + cmp [output_format],5 + je o_extension + cmp [output_format],3 + jne no_extension + cmp [subsystem],1 + je sys_extension + bt [format_flags],8 + jnc exe_extension + mov eax,'.dll' + jmp make_extension + sys_extension: + mov eax,'.sys' + jmp make_extension + bin_extension: + mov eax,'.bin' + bt [format_flags],0 + jnc make_extension + mov eax,'.com' + jmp make_extension + obj_extension: + mov eax,'.obj' + jmp make_extension + o_extension: + mov eax,'.o' + bt [format_flags],0 + jnc make_extension + no_extension: + xor eax,eax + jmp make_extension + exe_extension: + mov eax,'.exe' + make_extension: + xchg eax,[edi] + scas dword [edi] + mov byte [edi],0 + scas byte [edi] + mov esi,edi + stos dword [edi] + sub edi,9 + xor eax,eax + mov ebx,characters + adapt_case: + mov al,[esi] + or al,al + jz adapt_next + xlat byte [ebx] + cmp al,[esi] + je adapt_ok + sub byte [edi],20h + adapt_ok: + inc esi + adapt_next: + inc edi + cmp byte [edi],0 + jne adapt_case + mov esi,edi + lea ecx,[esi+1] + sub ecx,[free_additional_memory] + mov edi,[structures_buffer] + dec edi + std + rep movs byte [edi],[esi] + cld + inc edi + mov [structures_buffer],edi + mov [output_file],edi + pop edi + output_path_ok: + cmp [output_format],4 + je coff_formatter + cmp [output_format],5 + jne common_formatter + bt [format_flags],0 + jnc elf_formatter + common_formatter: + mov eax,edi + sub eax,[code_start] + mov [real_code_size],eax + cmp edi,[undefined_data_end] + jne calculate_code_size + mov edi,[undefined_data_start] + calculate_code_size: + sub edi,[code_start] + mov [code_size],edi + mov [written_size],0 + mov edx,[output_file] + call create + jc write_failed + cmp [output_format],3 + jne stub_written + mov edx,[code_start] + mov ecx,[stub_size] + sub edx,ecx + add [written_size],ecx + call write + stub_written: + cmp [output_format],2 + jne write_output + call write_mz_header + write_output: + call write_code + output_written: + call close + ret + write_code: + mov eax,[written_size] + mov [headers_size],eax + mov edx,[code_start] + mov ecx,[code_size] + add [written_size],ecx + call write + jc write_failed + ret +format_directive: + cmp edi,[code_start] + jne unexpected_instruction + cmp [virtual_data],0 + jne unexpected_instruction + cmp [output_format],0 + jne unexpected_instruction + lods byte [esi] + cmp al,17h + je format_prefix + cmp al,18h + jne invalid_argument + lods byte [esi] + select_format: + mov dl,al + shr al,4 + mov [output_format],al + and edx,0Fh + or [format_flags],edx + cmp al,2 + je format_mz + cmp al,3 + je format_pe + cmp al,4 + je format_coff + cmp al,5 + je format_elf + jmp instruction_assembled + format_prefix: + lods byte [esi] + mov ah,al + lods byte [esi] + cmp al,18h + jne invalid_argument + lods byte [esi] + mov edx,eax + shr dl,4 + shr dh,4 + cmp dl,dh + jne invalid_argument + or al,ah + jmp select_format +entry_directive: + bts [format_flags],10h + jc setting_already_specified + mov al,[output_format] + cmp al,2 + je mz_entry + cmp al,3 + je pe_entry + cmp al,5 + jne illegal_instruction + bt [format_flags],0 + jc elf_entry + jmp illegal_instruction +stack_directive: + bts [format_flags],11h + jc setting_already_specified + mov al,[output_format] + cmp al,2 + je mz_stack + cmp al,3 + je pe_stack + jmp illegal_instruction +heap_directive: + bts [format_flags],12h + jc setting_already_specified + mov al,[output_format] + cmp al,2 + je mz_heap + cmp al,3 + je pe_heap + jmp illegal_instruction +segment_directive: + cmp [virtual_data],0 + jne illegal_instruction + mov al,[output_format] + cmp al,2 + je mz_segment + cmp al,5 + je elf_segment + jmp illegal_instruction +section_directive: + cmp [virtual_data],0 + jne illegal_instruction + mov al,[output_format] + cmp al,3 + je pe_section + cmp al,4 + je coff_section + cmp al,5 + je elf_section + jmp illegal_instruction +public_directive: + mov al,[output_format] + cmp al,4 + je public_allowed + cmp al,5 + jne illegal_instruction + bt [format_flags],0 + jc illegal_instruction + public_allowed: + lods byte [esi] + cmp al,2 + jne invalid_argument + lods dword [esi] + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + mov dx,[current_pass] + mov [eax+18],dx + or byte [eax+8],8 + inc esi + mov ebx,[free_additional_memory] + lea edx,[ebx+10h] + cmp edx,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],edx + mov [ebx+8],eax + mov eax,[current_line] + mov [ebx+0Ch],eax + lods byte [esi] + cmp al,86h + jne invalid_argument + lods word [esi] + cmp ax,'(' + jne invalid_argument + mov [ebx+4],esi + lods dword [esi] + lea esi,[esi+eax+1] + mov byte [ebx],80h + jmp instruction_assembled +extrn_directive: + mov al,[output_format] + cmp al,4 + je extrn_allowed + cmp al,5 + jne illegal_instruction + bt [format_flags],0 + jc illegal_instruction + extrn_allowed: + lods word [esi] + cmp ax,'(' + jne invalid_argument + mov ebx,esi + lods dword [esi] + lea esi,[esi+eax+1] + mov edx,[free_additional_memory] + lea eax,[edx+0Ch] + cmp eax,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],eax + mov byte [edx],81h + mov [edx+4],ebx + lods byte [esi] + cmp al,86h + jne invalid_argument + lods byte [esi] + cmp al,2 + jne invalid_argument + lods dword [esi] + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + inc esi + mov ebx,eax + xor ah,ah + lods byte [esi] + cmp al,':' + je get_extrn_size + dec esi + cmp al,11h + jne extrn_size_ok + get_extrn_size: + lods word [esi] + cmp al,11h + jne invalid_argument + extrn_size_ok: + mov [address_symbol],edx + movzx ecx,ah + mov [edx+8],ecx + xor eax,eax + xor edx,edx + xor ebp,ebp + mov ch,2 + test [format_flags],8 + jz make_free_label + mov ch,4 + jmp make_free_label +mark_relocation: + cmp [value_type],0 + je relocation_ok + cmp [virtual_data],0 + jne relocation_ok + cmp [output_format],2 + je mark_mz_relocation + cmp [output_format],3 + je mark_pe_relocation + cmp [output_format],4 + je mark_coff_relocation + cmp [output_format],5 + je mark_elf_relocation + relocation_ok: + ret +close_pass: + mov al,[output_format] + cmp al,3 + je close_pe + cmp al,4 + je close_coff + cmp al,5 + je close_elf + ret + +format_mz: + mov edx,[additional_memory] + push edi + mov edi,edx + mov ecx,1Ch shr 2 + xor eax,eax + rep stos dword [edi] + mov [free_additional_memory],edi + pop edi + mov word [edx+0Ch],0FFFFh + mov word [edx+10h],1000h + mov [code_type],16 + jmp instruction_assembled +mark_mz_relocation: + push eax ebx + inc [number_of_relocations] + mov ebx,[free_additional_memory] + mov eax,edi + sub eax,[code_start] + mov [ebx],ax + shr eax,16 + shl ax,12 + mov [ebx+2],ax + cmp word [ebx],0FFFFh + jne mz_relocation_ok + inc word [ebx+2] + sub word [ebx],10h + mz_relocation_ok: + add ebx,4 + cmp ebx,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],ebx + pop ebx eax + ret +mz_segment: + lods byte [esi] + cmp al,2 + jne invalid_argument + lods dword [esi] + cmp eax,0Fh + jb invalid_use_of_symbol + je reserved_word_used_as_symbol + inc esi + mov ebx,eax + mov eax,edi + sub eax,[code_start] + mov ecx,0Fh + add eax,0Fh + and eax,1111b + sub ecx,eax + mov edx,edi + xor al,al + rep stos byte [edi] + mov dword [org_origin],edi + mov dword [org_origin+4],0 + mov [org_registers],0 + mov [org_start],edi + mov eax,edx + call undefined_data + mov eax,edi + sub eax,[code_start] + shr eax,4 + cmp eax,10000h + jae value_out_of_range + mov edx,eax + mov al,16 + cmp byte [esi],13h + jne segment_type_ok + inc esi + lods byte [esi] + segment_type_ok: + mov [code_type],al + mov eax,edx + mov cx,0100h + xor edx,edx + xor ebp,ebp + mov [address_symbol],edx + jmp make_free_label +mz_entry: + lods byte [esi] + cmp al,'(' + jne invalid_argument + call get_word_value + cmp [value_type],1 + je initial_cs_ok + cmp [error_line],0 + jne initial_cs_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_address + initial_cs_ok: + mov edx,[additional_memory] + mov [edx+16h],ax + lods byte [esi] + cmp al,':' + jne invalid_argument + lods byte [esi] + cmp al,'(' + jne invalid_argument + ja invalid_address + call get_word_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[additional_memory] + mov [edx+14h],ax + jmp instruction_assembled +mz_stack: + lods byte [esi] + cmp al,'(' + jne invalid_argument + call get_word_value + cmp byte [esi],':' + je stack_pointer + cmp ax,10h + jb invalid_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[additional_memory] + mov [edx+10h],ax + jmp instruction_assembled + stack_pointer: + cmp [value_type],1 + je initial_ss_ok + cmp [error_line],0 + jne initial_ss_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_address + initial_ss_ok: + mov edx,[additional_memory] + mov [edx+0Eh],ax + lods byte [esi] + cmp al,':' + jne invalid_argument + lods byte [esi] + cmp al,'(' + jne invalid_argument + call get_word_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[additional_memory] + mov [edx+10h],ax + bts [format_flags],4 + jmp instruction_assembled +mz_heap: + cmp [output_format],2 + jne illegal_instruction + lods byte [esi] + call get_size_operator + cmp ah,1 + je invalid_value + cmp ah,2 + ja invalid_value + cmp al,'(' + jne invalid_argument + call get_word_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[additional_memory] + mov [edx+0Ch],ax + jmp instruction_assembled +write_mz_header: + mov edx,[additional_memory] + bt [format_flags],4 + jc mz_stack_ok + mov eax,[real_code_size] + dec eax + shr eax,4 + inc eax + mov [edx+0Eh],ax + shl eax,4 + movzx ecx,word [edx+10h] + add eax,ecx + mov [real_code_size],eax + mz_stack_ok: + mov edi,[free_additional_memory] + mov eax,[number_of_relocations] + shl eax,2 + add eax,1Ch + sub edi,eax + xchg edi,[free_additional_memory] + mov ecx,0Fh + add eax,0Fh + and eax,1111b + sub ecx,eax + xor al,al + rep stos byte [edi] + sub edi,[free_additional_memory] + mov ecx,edi + shr edi,4 + mov word [edx],'MZ' ; signature + mov [edx+8],di ; header size in paragraphs + mov eax,[number_of_relocations] + mov [edx+6],ax ; number of relocation entries + mov eax,[code_size] + add eax,ecx + mov esi,eax + shr esi,9 + and eax,1FFh + inc si + or ax,ax + jnz mz_size_ok + mov ax,200h + dec si + mz_size_ok: + mov [edx+2],ax ; number of bytes in last page + mov [edx+4],si ; number of pages + mov eax,[real_code_size] + dec eax + shr eax,4 + inc eax + mov esi,[code_size] + dec esi + shr esi,4 + inc esi + sub eax,esi + mov [edx+0Ah],ax ; minimum memory in addition to code + add [edx+0Ch],ax ; maximum memory in addition to code + salc + mov ah,al + or [edx+0Ch],ax + mov word [edx+18h],1Ch ; offset of relocation table + add [written_size],ecx + call write + jc write_failed + ret + +make_stub: + mov [stub_file],edx + or edx,edx + jnz stub_from_file + push esi + mov edx,edi + xor eax,eax + mov ecx,20h + rep stos dword [edi] + mov eax,40h+default_stub_end-default_stub + mov cx,100h+default_stub_end-default_stub + mov word [edx],'MZ' + mov word [edx+4],1 + mov word [edx+2],ax + mov word [edx+8],4 + mov word [edx+0Ah],10h + mov word [edx+0Ch],0FFFFh + mov word [edx+10h],cx + mov word [edx+3Ch],ax + mov word [edx+18h],40h + lea edi,[edx+40h] + mov esi,default_stub + mov ecx,default_stub_end-default_stub + rep movs byte [edi],[esi] + pop esi + jmp stub_ok + default_stub: + use16 + push cs + pop ds + mov dx,stub_message-default_stub + mov ah,9 + int 21h + mov ax,4C01h + int 21h + stub_message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h + rq 1 + default_stub_end: + use32 + stub_from_file: + push esi + mov esi,edx + call open_binary_file + mov edx,edi + mov ecx,1Ch + mov esi,edx + call read + jc binary_stub + cmp word [esi],'MZ' + jne binary_stub + add edi,1Ch + movzx ecx,word [esi+6] + add ecx,11b + and ecx,not 11b + add ecx,(40h-1Ch) shr 2 + lea eax,[edi+ecx*4] + cmp edi,[display_buffer] + jae out_of_memory + xor eax,eax + rep stos dword [edi] + mov edx,40h + xchg dx,[esi+18h] + xor al,al + call lseek + movzx ecx,word [esi+6] + shl ecx,2 + lea edx,[esi+40h] + call read + mov edx,edi + sub edx,esi + shr edx,4 + xchg dx,[esi+8] + shl edx,4 + xor al,al + call lseek + movzx ecx,word [esi+4] + dec ecx + shl ecx,9 + movzx edx,word [esi+2] + add ecx,edx + mov edx,edi + sub ecx,eax + je read_stub_code + jb stub_code_ok + push ecx + dec ecx + shr ecx,3 + inc ecx + shl ecx,1 + lea eax,[edi+ecx*4] + cmp eax,[display_buffer] + jae out_of_memory + xor eax,eax + rep stos dword [edi] + pop ecx + read_stub_code: + call read + stub_code_ok: + call close + mov edx,edi + sub edx,esi + mov ax,dx + and ax,1FFh + mov [esi+2],ax + dec edx + shr edx,9 + inc edx + mov [esi+4],dx + mov eax,edi + sub eax,esi + mov [esi+3Ch],eax + pop esi + stub_ok: + ret + binary_stub: + mov esi,edi + mov ecx,40h shr 2 + xor eax,eax + rep stos dword [edi] + mov al,2 + xor edx,edx + call lseek + push eax + xor al,al + xor edx,edx + call lseek + mov ecx,[esp] + add ecx,40h+111b + and ecx,not 111b + mov ax,cx + and ax,1FFh + mov [esi+2],ax + lea eax,[ecx+1FFh] + shr eax,9 + mov [esi+4],ax + mov [esi+3Ch],ecx + sub ecx,40h + mov eax,10000h + sub eax,ecx + jbe binary_heap_ok + shr eax,4 + mov [esi+0Ah],ax + binary_heap_ok: + mov word [esi],'MZ' + mov word [esi+8],4 + mov ax,0FFFFh + mov [esi+0Ch],ax + dec ax + mov [esi+10h],ax + sub ax,0Eh + mov [esi+0Eh],ax + mov [esi+16h],ax + mov word [esi+14h],100h + mov word [esi+18h],40h + mov eax,[display_buffer] + sub eax,ecx + cmp edi,eax + jae out_of_memory + mov edx,edi + shr ecx,2 + xor eax,eax + rep stos dword [edi] + pop ecx + call read + call close + pop esi + ret + +format_pe: + xor edx,edx + mov [machine],14Ch + mov [subsystem],3 + mov [subsystem_version],3 + 10 shl 16 + mov [image_base],400000h + test [format_flags],8 + jz pe_settings + mov [machine],8664h + mov [subsystem_version],5 + 0 shl 16 + mov [image_base_high],0 + pe_settings: + cmp byte [esi],84h + je get_stub_name + cmp byte [esi],80h + je get_pe_base + cmp byte [esi],1Bh + jne pe_settings_ok + lods byte [esi] + lods byte [esi] + test al,80h+40h + jz subsystem_setting + cmp al,80h + je dll_flag + cmp al,81h + je wdm_flag + jmp pe_settings + dll_flag: + bts [format_flags],8 + jc setting_already_specified + jmp pe_settings + wdm_flag: + bts [format_flags],9 + jc setting_already_specified + jmp pe_settings + subsystem_setting: + bts [format_flags],7 + jc setting_already_specified + and ax,3Fh + mov [subsystem],ax + cmp byte [esi],'(' + jne pe_settings + inc esi + cmp byte [esi],'.' + jne invalid_value + inc esi + push edx + cmp byte [esi+11],0 + jne invalid_value + cmp byte [esi+10],2 + ja invalid_value + mov dx,[esi+8] + cmp dx,8000h + je zero_version + mov eax,[esi+4] + cmp dx,7 + jg invalid_value + mov cx,7 + sub cx,dx + mov eax,[esi+4] + shr eax,cl + mov ebx,eax + shr ebx,24 + cmp bl,100 + jae invalid_value + and eax,0FFFFFFh + mov ecx,100 + mul ecx + shrd eax,edx,24 + jnc version_value_ok + inc eax + version_value_ok: + shl eax,16 + mov ax,bx + jmp subsystem_version_ok + zero_version: + xor eax,eax + subsystem_version_ok: + pop edx + add esi,13 + mov [subsystem_version],eax + jmp pe_settings + get_pe_base: + bts [format_flags],10 + jc setting_already_specified + lods word [esi] + cmp ah,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + push edx edi + add edi,[stub_size] + test [format_flags],8 + jnz get_pe64_base + call get_dword_value + mov [image_base],eax + jmp pe_base_ok + get_pe64_base: + call get_qword_value + mov [image_base],eax + mov [image_base_high],edx + pe_base_ok: + pop edi edx + cmp [value_type],0 + jne invalid_use_of_symbol + cmp byte [esi],84h + jne pe_settings_ok + get_stub_name: + lods byte [esi] + lods word [esi] + cmp ax,'(' + jne invalid_argument + lods dword [esi] + mov edx,esi + add esi,eax + inc esi + pe_settings_ok: + mov ebp,[stub_size] + or ebp,ebp + jz make_pe_stub + cmp edx,[stub_file] + je pe_stub_ok + sub edi,[stub_size] + mov [code_start],edi + make_pe_stub: + call make_stub + mov eax,edi + sub eax,[code_start] + mov [stub_size],eax + mov [code_start],edi + mov ebp,eax + pe_stub_ok: + mov edx,edi + mov ecx,18h+0E0h + test [format_flags],8 + jz zero_pe_header + add ecx,10h + zero_pe_header: + add ebp,ecx + shr ecx,2 + xor eax,eax + rep stos dword [edi] + mov word [edx],'PE' ; signature + mov ax,[machine] + mov word [edx+4],ax + mov dword [edx+38h],1000h ; section alignment + mov dword [edx+3Ch],200h ; file alignment + mov word [edx+40h],1 ; OS version + mov eax,[subsystem_version] + mov [edx+48h],eax + mov ax,[subsystem] + mov [edx+5Ch],ax + cmp ax,1 + jne pe_alignment_ok + mov eax,20h + mov dword [edx+38h],eax + mov dword [edx+3Ch],eax + pe_alignment_ok: + mov word [edx+1Ah],VERSION_MAJOR + VERSION_MINOR shl 8 + test [format_flags],8 + jnz init_pe64_specific + mov dword [edx+14h],0E0h ; size of optional header + mov dword [edx+16h],10B010Eh; flags and magic value + mov eax,[image_base] + mov dword [edx+34h],eax + mov dword [edx+60h],1000h ; stack reserve + mov dword [edx+64h],1000h ; stack commit + mov dword [edx+68h],10000h ; heap reserve + mov dword [edx+6Ch],0 ; heap commit + mov dword [edx+74h],16 ; number of directories + jmp pe_header_ok + init_pe64_specific: + mov dword [edx+14h],0F0h ; size of optional header + mov dword [edx+16h],20B002Eh; flags and magic value + mov eax,[image_base] + mov dword [edx+30h],eax + mov eax,[image_base_high] + mov dword [edx+34h],eax + mov dword [edx+60h],1000h ; stack reserve + mov dword [edx+68h],1000h ; stack commit + mov dword [edx+70h],10000h ; heap reserve + mov dword [edx+78h],0 ; heap commit + mov dword [edx+84h],16 ; number of directories + pe_header_ok: + bsf ecx,[edx+3Ch] + imul ebx,[number_of_sections],28h + or ebx,ebx + jnz reserve_space_for_section_headers + mov ebx,28h + reserve_space_for_section_headers: + add ebx,ebp + dec ebx + shr ebx,cl + inc ebx + shl ebx,cl + sub ebx,ebp + mov ecx,ebx + mov eax,[display_buffer] + sub eax,ecx + cmp edi,eax + jae out_of_memory + shr ecx,2 + xor eax,eax + rep stos dword [edi] + mov eax,edi + sub eax,[code_start] + add eax,[stub_size] + mov [edx+54h],eax ; size of headers + mov ecx,[edx+38h] + dec ecx + add eax,ecx + not ecx + and eax,ecx + bt [format_flags],8 + jc pe_entry_init_ok + mov [edx+28h],eax ; entry point rva + pe_entry_init_ok: + mov [number_of_sections],0 + movzx ebx,word [edx+14h] + lea ebx,[edx+18h+ebx] + mov [current_section],ebx + mov dword [ebx],'.fla' + mov dword [ebx+4],'t' + mov [ebx+14h],edi + mov [ebx+0Ch],eax + mov dword [ebx+24h],0E0000060h + xor ecx,ecx + not eax + not ecx + add eax,1 + adc ecx,0 + add eax,edi + adc ecx,0 + test [format_flags],8 + jnz pe64_org + sub eax,[edx+34h] + sbb ecx,0 + mov bl,2 + mov [code_type],32 + jmp pe_org_ok + pe64_org: + sub eax,[edx+30h] + sbb ecx,[edx+34h] + mov bl,4 + mov [code_type],64 + pe_org_ok: + bt [resolver_flags],0 + jc pe_labels_type_ok + xor bl,bl + pe_labels_type_ok: + mov [labels_type],bl + mov dword [org_origin],eax + mov dword [org_origin+4],ecx + mov [org_registers],0 + mov [org_start],edi + bt [format_flags],8 + jnc dll_flag_ok + or dword [edx+16h],2000h + dll_flag_ok: + bt [format_flags],9 + jnc wdm_flag_ok + or word [edx+5Eh],2000h + wdm_flag_ok: + jmp instruction_assembled +pe_section: + call close_pe_section + bts [format_flags],5 + lea ecx,[ebx+28h] + add edx,[edx+54h] + sub edx,[stub_size] + cmp ecx,edx + jbe new_section + lea ebx,[edx-28h] + or [next_pass_needed],-1 + push edi + mov edi,ebx + mov ecx,28h shr 4 + xor eax,eax + rep stos dword [edi] + pop edi + new_section: + mov [ebx+0Ch],eax + lods word [esi] + cmp ax,'(' + jne invalid_argument + lea edx,[esi+4] + mov ecx,[esi] + lea esi,[esi+4+ecx+1] + cmp ecx,8 + ja name_too_long + xor eax,eax + mov [ebx],eax + mov [ebx+4],eax + push esi edi + mov edi,ebx + mov esi,edx + rep movs byte [edi],[esi] + pop edi esi + mov dword [ebx+24h],0 + mov [ebx+14h],edi + mov edx,[code_start] + mov eax,edi + xor ecx,ecx + sub eax,[ebx+0Ch] + sbb ecx,0 + test [format_flags],8 + jnz pe64_section_org + sub eax,[edx+34h] + sbb ecx,0 + mov [labels_type],2 + mov [code_type],32 + bt [resolver_flags],0 + jc pe_section_org_ok + mov [labels_type],0 + jmp pe_section_org_ok + pe64_section_org: + sub eax,[edx+30h] + sbb ecx,[edx+34h] + mov [labels_type],4 + mov [code_type],64 + bt [resolver_flags],0 + jc pe_section_org_ok + mov [labels_type],0 + pe_section_org_ok: + mov dword [org_origin],eax + mov dword [org_origin+4],ecx + mov [org_registers],0 + mov [org_start],edi + get_section_flags: + lods byte [esi] + cmp al,1Ah + je set_directory + cmp al,19h + je section_flag + dec esi + jmp instruction_assembled + set_directory: + movzx eax,byte [esi] + inc esi + mov ecx,ebx + test [format_flags],8 + jnz pe64_directory + xchg ecx,[edx+78h+eax*8] + mov dword [edx+78h+eax*8+4],-1 + jmp pe_directory_set + pe64_directory: + xchg ecx,[edx+88h+eax*8] + mov dword [edx+88h+eax*8+4],-1 + pe_directory_set: + or ecx,ecx + jnz data_already_defined + push ebx edx + call generate_pe_data + pop edx ebx + jmp get_section_flags + section_flag: + lods byte [esi] + cmp al,9 + je invalid_argument + cmp al,11 + je invalid_argument + mov cl,al + mov eax,1 + shl eax,cl + test dword [ebx+24h],eax + jnz setting_already_specified + or dword [ebx+24h],eax + jmp get_section_flags + close_pe_section: + mov ebx,[current_section] + mov edx,[code_start] + mov eax,edi + sub eax,[ebx+14h] + jnz finish_section + bt [format_flags],5 + jc finish_section + mov eax,[ebx+0Ch] + ret + finish_section: + mov [ebx+8],eax + cmp edi,[undefined_data_end] + jne align_section + cmp dword [edx+38h],1000h + jb align_section + mov edi,[undefined_data_start] + align_section: + mov [undefined_data_end],0 + mov ebp,edi + sub ebp,[ebx+14h] + mov ecx,[edx+3Ch] + dec ecx + lea eax,[ebp+ecx] + not ecx + and eax,ecx + mov [ebx+10h],eax + sub eax,ebp + mov ecx,eax + xor al,al + rep stos byte [edi] + mov eax,[code_start] + sub eax,[stub_size] + sub [ebx+14h],eax + mov eax,[ebx+8] + or eax,eax + jz udata_ok + cmp dword [ebx+10h],0 + jne udata_ok + or byte [ebx+24h],80h + udata_ok: + mov ecx,[edx+38h] + dec ecx + add eax,ecx + not ecx + and eax,ecx + add eax,[ebx+0Ch] + add ebx,28h + mov [current_section],ebx + inc word [number_of_sections] + jz format_limitations_exceeded + ret +data_directive: + cmp [output_format],3 + jne illegal_instruction + lods byte [esi] + cmp al,1Ah + je predefined_data_type + cmp al,'(' + jne invalid_argument + call get_byte_value + cmp al,16 + jb data_type_ok + jmp invalid_value + predefined_data_type: + movzx eax,byte [esi] + inc esi + data_type_ok: + mov ebx,[current_section] + mov ecx,edi + sub ecx,[ebx+14h] + add ecx,[ebx+0Ch] + mov edx,[code_start] + test [format_flags],8 + jnz pe64_data + xchg ecx,[edx+78h+eax*8] + jmp init_pe_data + pe64_data: + xchg ecx,[edx+88h+eax*8] + init_pe_data: + or ecx,ecx + jnz data_already_defined + call allocate_structure_data + mov word [ebx],data_directive-assembler + mov [ebx+2],al + mov edx,[current_line] + mov [ebx+4],edx + call generate_pe_data + jmp instruction_assembled + end_data: + cmp [output_format],3 + jne illegal_instruction + call find_structure_data + jc unexpected_instruction + movzx eax,byte [ebx+2] + mov edx,[current_section] + mov ecx,edi + sub ecx,[edx+14h] + add ecx,[edx+0Ch] + mov edx,[code_start] + test [format_flags],8 + jnz end_pe64_data + sub ecx,[edx+78h+eax*8] + mov [edx+78h+eax*8+4],ecx + jmp remove_structure_data + end_pe64_data: + sub ecx,[edx+88h+eax*8] + mov [edx+88h+eax*8+4],ecx + jmp remove_structure_data +pe_entry: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + test [format_flags],8 + jnz pe64_entry + call get_dword_value + mov bl,2 + bt [resolver_flags],0 + jc check_pe_entry_label_type + xor bl,bl + check_pe_entry_label_type: + cmp [value_type],bl + je pe_entry_ok + cmp [error_line],0 + jne pe_entry_ok + mov edx,[current_line] + mov [error_line],edx + mov [error],invalid_address + pe_entry_ok: + mov edx,[code_start] + sub eax,[edx+34h] + mov [edx+28h],eax + jmp instruction_assembled + pe64_entry: + call get_qword_value + mov bl,4 + bt [resolver_flags],0 + jc check_pe64_entry_label_type + xor bl,bl + check_pe64_entry_label_type: + cmp [value_type],bl + je pe64_entry_type_ok + cmp [error_line],0 + jne pe64_entry_type_ok + mov edx,[current_line] + mov [error_line],edx + mov [error],invalid_address + pe64_entry_type_ok: + mov ecx,[code_start] + sub eax,[ecx+30h] + sbb edx,[ecx+34h] + jz pe64_entry_range_ok + mov edx,[current_line] + mov [error_line],edx + mov [error],value_out_of_range + pe64_entry_range_ok: + mov [ecx+28h],eax + jmp instruction_assembled +pe_stack: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + test [format_flags],8 + jnz pe64_stack + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[code_start] + mov [edx+60h],eax + cmp byte [esi],',' + jne default_stack_commit + lods byte [esi] + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[code_start] + mov [edx+64h],eax + cmp eax,[edx+60h] + ja value_out_of_range + jmp instruction_assembled + default_stack_commit: + mov dword [edx+64h],1000h + mov eax,[edx+60h] + cmp eax,1000h + ja instruction_assembled + mov dword [edx+64h],eax + jmp instruction_assembled + pe64_stack: + call get_qword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov ecx,[code_start] + mov [ecx+60h],eax + mov [ecx+64h],edx + cmp byte [esi],',' + jne default_pe64_stack_commit + lods byte [esi] + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_qword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov ecx,[code_start] + mov [ecx+68h],eax + mov [ecx+6Ch],edx + cmp edx,[ecx+64h] + ja value_out_of_range + jb instruction_assembled + cmp eax,[edx+60h] + ja value_out_of_range + jmp instruction_assembled + default_pe64_stack_commit: + mov dword [edx+68h],1000h + cmp dword [edx+64h],0 + jne instruction_assembled + mov eax,[edx+60h] + cmp eax,1000h + ja instruction_assembled + mov dword [edx+68h],eax + jmp instruction_assembled +pe_heap: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + test [format_flags],8 + jnz pe64_heap + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[code_start] + mov [edx+68h],eax + cmp byte [esi],',' + jne instruction_assembled + lods byte [esi] + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[code_start] + mov [edx+6Ch],eax + cmp eax,[edx+68h] + ja value_out_of_range + jmp instruction_assembled + pe64_heap: + call get_qword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov ecx,[code_start] + mov [ecx+70h],eax + mov [ecx+74h],edx + cmp byte [esi],',' + jne instruction_assembled + lods byte [esi] + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + call get_qword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov ecx,[code_start] + mov [ecx+78h],eax + mov [ecx+7Ch],edx + cmp edx,[ecx+74h] + ja value_out_of_range + jb instruction_assembled + cmp eax,[edx+70h] + ja value_out_of_range + jmp instruction_assembled +mark_pe_relocation: + push eax ebx + mov al,2 + test [format_flags],8 + jz check_pe_relocation_type + mov al,4 + check_pe_relocation_type: + cmp [value_type],al + je pe_relocation_type_ok + cmp [error_line],0 + jne pe_relocation_type_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + pe_relocation_type_ok: + mov ebx,[current_section] + mov eax,edi + sub eax,[ebx+14h] + add eax,[ebx+0Ch] + mov ebx,[free_additional_memory] + inc [number_of_relocations] + jz invalid_use_of_symbol + mov [ebx],eax + add ebx,4 + cmp ebx,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],ebx + pop ebx eax + ret +generate_pe_data: + cmp al,2 + je make_pe_resource + cmp al,5 + je make_pe_fixups + ret +make_pe_resource: + cmp byte [esi],82h + jne resource_done + inc esi + lods word [esi] + cmp ax,'(' + jne invalid_argument + lods dword [esi] + mov edx,esi + lea esi,[esi+eax+1] + cmp [next_pass_needed],0 + je resource_from_file + cmp [current_pass],0 + jne reserve_space_for_resource + mov [resource_size],0 + reserve_space_for_resource: + add edi,[resource_size] + cmp edi,[display_buffer] + ja out_of_memory + jmp resource_done + resource_from_file: + push esi + mov esi,edx + call open_binary_file + push ebx + mov esi,[free_additional_memory] + lea eax,[esi+20h] + cmp eax,[structures_buffer] + ja out_of_memory + mov edx,esi + mov ecx,20h + call read + jc invalid_file_format + xor eax,eax + cmp [esi],eax + jne invalid_file_format + mov ax,0FFFFh + cmp [esi+8],eax + jne invalid_file_format + cmp [esi+12],eax + jne invalid_file_format + mov eax,20h + cmp [esi+4],eax + jne invalid_file_format + read_resource_headers: + test eax,11b + jz resource_file_alignment_ok + mov edx,4 + and eax,11b + sub edx,eax + mov al,1 + call lseek + resource_file_alignment_ok: + mov [esi],eax + lea edx,[esi+12] + mov ecx,8 + call read + jc resource_headers_ok + mov ecx,[esi+16] + add [esi],ecx + lea edx,[esi+20] + sub ecx,8 + mov [esi+16],ecx + lea eax,[edx+ecx] + cmp eax,[structures_buffer] + ja out_of_memory + call read + jc invalid_file_format + mov edx,[esi] + add edx,[esi+12] + mov eax,[esi+16] + lea ecx,[esi+20] + lea esi,[ecx+eax] + add ecx,2 + cmp word [ecx-2],0FFFFh + je resource_header_type_ok + check_resource_header_type: + cmp ecx,esi + jae invalid_file_format + cmp word [ecx],0 + je resource_header_type_ok + add ecx,2 + jmp check_resource_header_type + resource_header_type_ok: + add ecx,2 + cmp word [ecx],0FFFFh + je resource_header_name_ok + check_resource_header_name: + cmp ecx,esi + jae invalid_file_format + cmp word [ecx],0 + je resource_header_name_ok + add ecx,2 + jmp check_resource_header_name + resource_header_name_ok: + xor al,al + call lseek + jmp read_resource_headers + resource_headers_ok: + xor eax,eax + mov [esi],eax + mov [resource_data],edi + lea eax,[edi+16] + cmp eax,[display_buffer] + jae out_of_memory + xor eax,eax + stos dword [edi] + call make_timestamp + stos dword [edi] + xor eax,eax + stos dword [edi] + stos dword [edi] + xor ebx,ebx + make_type_name_directory: + mov esi,[free_additional_memory] + xor edx,edx + find_type_name: + cmp dword [esi],0 + je type_name_ok + add esi,20 + cmp word [esi],0FFFFh + je check_next_type_name + or ebx,ebx + jz check_this_type_name + xor ecx,ecx + compare_with_previous_type_name: + mov ax,[esi+ecx] + cmp ax,[ebx+ecx] + ja check_this_type_name + jb check_next_type_name + add ecx,2 + mov ax,[esi+ecx] + or ax,[ebx+ecx] + jnz compare_with_previous_type_name + jmp check_next_type_name + check_this_type_name: + or edx,edx + jz type_name_found + xor ecx,ecx + compare_with_current_type_name: + mov ax,[esi+ecx] + cmp ax,[edx+ecx] + ja check_next_type_name + jb type_name_found + add ecx,2 + mov ax,[esi+ecx] + or ax,[edx+ecx] + jnz compare_with_current_type_name + jmp same_type_name + type_name_found: + mov edx,esi + same_type_name: + mov [esi-16],edi + check_next_type_name: + mov eax,[esi-4] + add esi,eax + jmp find_type_name + type_name_ok: + or edx,edx + jz type_name_directory_done + mov ebx,edx + make_type_name_entry: + mov eax,[resource_data] + inc word [eax+12] + lea eax,[edi+8] + cmp eax,[display_buffer] + jae out_of_memory + mov eax,ebx + stos dword [edi] + xor eax,eax + stos dword [edi] + jmp make_type_name_directory + type_name_directory_done: + mov ebx,-1 + make_type_id_directory: + mov esi,[free_additional_memory] + mov edx,10000h + find_type_id: + cmp dword [esi],0 + je type_id_ok + add esi,20 + cmp word [esi],0FFFFh + jne check_next_type_id + movzx eax,word [esi+2] + cmp eax,ebx + jle check_next_type_id + cmp eax,edx + jg check_next_type_id + mov edx,eax + mov [esi-16],edi + check_next_type_id: + mov eax,[esi-4] + add esi,eax + jmp find_type_id + type_id_ok: + cmp edx,10000h + je type_id_directory_done + mov ebx,edx + make_type_id_entry: + mov eax,[resource_data] + inc word [eax+14] + lea eax,[edi+8] + cmp eax,[display_buffer] + jae out_of_memory + mov eax,ebx + stos dword [edi] + xor eax,eax + stos dword [edi] + jmp make_type_id_directory + type_id_directory_done: + mov esi,[resource_data] + add esi,10h + mov ecx,[esi-4] + or cx,cx + jz resource_directories_ok + make_resource_directories: + push ecx + push edi + mov edx,edi + sub edx,[resource_data] + bts edx,31 + mov [esi+4],edx + lea eax,[edi+16] + cmp eax,[display_buffer] + jae out_of_memory + xor eax,eax + stos dword [edi] + call make_timestamp + stos dword [edi] + xor eax,eax + stos dword [edi] + stos dword [edi] + mov ebp,esi + xor ebx,ebx + make_resource_name_directory: + mov esi,[free_additional_memory] + xor edx,edx + find_resource_name: + cmp dword [esi],0 + je resource_name_ok + push esi + cmp [esi+4],ebp + jne check_next_resource_name + add esi,20 + call skip_resource_name + cmp word [esi],0FFFFh + je check_next_resource_name + or ebx,ebx + jz check_this_resource_name + xor ecx,ecx + compare_with_previous_resource_name: + mov ax,[esi+ecx] + cmp ax,[ebx+ecx] + ja check_this_resource_name + jb check_next_resource_name + add ecx,2 + mov ax,[esi+ecx] + or ax,[ebx+ecx] + jnz compare_with_previous_resource_name + jmp check_next_resource_name + skip_resource_name: + cmp word [esi],0FFFFh + jne skip_unicode_string + add esi,4 + ret + skip_unicode_string: + add esi,2 + cmp word [esi-2],0 + jne skip_unicode_string + ret + check_this_resource_name: + or edx,edx + jz resource_name_found + xor ecx,ecx + compare_with_current_resource_name: + mov ax,[esi+ecx] + cmp ax,[edx+ecx] + ja check_next_resource_name + jb resource_name_found + add ecx,2 + mov ax,[esi+ecx] + or ax,[edx+ecx] + jnz compare_with_current_resource_name + jmp same_resource_name + resource_name_found: + mov edx,esi + same_resource_name: + mov eax,[esp] + mov [eax+8],edi + check_next_resource_name: + pop esi + mov eax,[esi+16] + lea esi,[esi+20+eax] + jmp find_resource_name + resource_name_ok: + or edx,edx + jz resource_name_directory_done + mov ebx,edx + make_resource_name_entry: + mov eax,[esp] + inc word [eax+12] + lea eax,[edi+8] + cmp eax,[display_buffer] + jae out_of_memory + mov eax,ebx + stos dword [edi] + xor eax,eax + stos dword [edi] + jmp make_resource_name_directory + resource_name_directory_done: + mov ebx,-1 + make_resource_id_directory: + mov esi,[free_additional_memory] + mov edx,10000h + find_resource_id: + cmp dword [esi],0 + je resource_id_ok + push esi + cmp [esi+4],ebp + jne check_next_resource_id + add esi,20 + call skip_resource_name + cmp word [esi],0FFFFh + jne check_next_resource_id + movzx eax,word [esi+2] + cmp eax,ebx + jle check_next_resource_id + cmp eax,edx + jg check_next_resource_id + mov edx,eax + mov eax,[esp] + mov [eax+8],edi + check_next_resource_id: + pop esi + mov eax,[esi+16] + lea esi,[esi+20+eax] + jmp find_resource_id + resource_id_ok: + cmp edx,10000h + je resource_id_directory_done + mov ebx,edx + make_resource_id_entry: + mov eax,[esp] + inc word [eax+14] + lea eax,[edi+8] + cmp eax,[display_buffer] + jae out_of_memory + mov eax,ebx + stos dword [edi] + xor eax,eax + stos dword [edi] + jmp make_resource_id_directory + resource_id_directory_done: + pop eax + mov esi,ebp + pop ecx + add esi,8 + dec cx + jnz make_resource_directories + resource_directories_ok: + shr ecx,16 + jnz make_resource_directories + mov esi,[resource_data] + add esi,10h + movzx eax,word [esi-4] + movzx edx,word [esi-2] + add eax,edx + lea esi,[esi+eax*8] + push edi ; address of language directories + update_resource_directories: + cmp esi,[esp] + je resource_directories_updated + add esi,10h + mov ecx,[esi-4] + or cx,cx + jz language_directories_ok + make_language_directories: + push ecx + push edi + mov edx,edi + sub edx,[resource_data] + bts edx,31 + mov [esi+4],edx + lea eax,[edi+16] + cmp eax,[display_buffer] + jae out_of_memory + xor eax,eax + stos dword [edi] + call make_timestamp + stos dword [edi] + xor eax,eax + stos dword [edi] + stos dword [edi] + mov ebp,esi + mov ebx,-1 + make_language_id_directory: + mov esi,[free_additional_memory] + mov edx,10000h + find_language_id: + cmp dword [esi],0 + je language_id_ok + push esi + cmp [esi+8],ebp + jne check_next_language_id + add esi,20 + mov eax,esi + call skip_resource_name + call skip_resource_name + neg eax + add eax,esi + and eax,11b + add esi,eax + get_language_id: + movzx eax,word [esi+6] + cmp eax,ebx + jle check_next_language_id + cmp eax,edx + jge check_next_language_id + mov edx,eax + mov eax,[esp] + mov [current_offset],eax + check_next_language_id: + pop esi + mov eax,[esi+16] + lea esi,[esi+20+eax] + jmp find_language_id + language_id_ok: + cmp edx,10000h + je language_id_directory_done + mov ebx,edx + make_language_id_entry: + mov eax,[esp] + inc word [eax+14] + lea eax,[edi+8] + cmp eax,[display_buffer] + jae out_of_memory + mov eax,ebx + stos dword [edi] + mov eax,[current_offset] + stos dword [edi] + jmp make_language_id_directory + language_id_directory_done: + pop eax + mov esi,ebp + pop ecx + add esi,8 + dec cx + jnz make_language_directories + language_directories_ok: + shr ecx,16 + jnz make_language_directories + jmp update_resource_directories + resource_directories_updated: + mov esi,[resource_data] + push edi + make_name_strings: + add esi,10h + movzx eax,word [esi-2] + movzx ecx,word [esi-4] + add eax,ecx + lea eax,[esi+eax*8] + push eax + or ecx,ecx + jz string_entries_processed + process_string_entries: + push ecx + mov edx,edi + sub edx,[resource_data] + bts edx,31 + xchg [esi],edx + mov ebx,edi + xor ax,ax + stos word [edi] + copy_string_data: + lea eax,[edi+2] + cmp eax,[display_buffer] + jae out_of_memory + mov ax,[edx] + or ax,ax + jz string_data_copied + stos word [edi] + inc word [ebx] + add edx,2 + jmp copy_string_data + string_data_copied: + add esi,8 + pop ecx + loop process_string_entries + string_entries_processed: + pop esi + cmp esi,[esp] + jb make_name_strings + mov eax,edi + sub eax,[resource_data] + test al,11b + jz resource_strings_alignment_ok + xor ax,ax + stos word [edi] + resource_strings_alignment_ok: + pop edx + pop ebx ; address of language directories + mov ebp,edi + update_language_directories: + add ebx,10h + movzx eax,word [ebx-2] + movzx ecx,word [ebx-4] + add ecx,eax + make_data_records: + push ecx + mov esi,edi + sub esi,[resource_data] + xchg esi,[ebx+4] + lea eax,[edi+16] + cmp eax,[display_buffer] + jae out_of_memory + mov eax,esi + stos dword [edi] + mov eax,[esi+12] + stos dword [edi] + xor eax,eax + stos dword [edi] + stos dword [edi] + pop ecx + add ebx,8 + loop make_data_records + cmp ebx,edx + jb update_language_directories + pop ebx ; file handle + mov esi,ebp + mov ebp,edi + update_data_records: + push ebp + mov ecx,edi + mov eax,[current_section] + sub ecx,[eax+14h] + add ecx,[eax+0Ch] + xchg ecx,[esi] + mov edx,[ecx] + xor al,al + call lseek + mov edx,edi + mov ecx,[esi+4] + add edi,ecx + cmp edi,[display_buffer] + ja out_of_memory + call read + mov eax,edi + sub eax,[resource_data] + and eax,11b + jz resource_data_alignment_ok + mov ecx,4 + sub ecx,eax + xor al,al + rep stos byte [edi] + resource_data_alignment_ok: + pop ebp + add esi,16 + cmp esi,ebp + jb update_data_records + pop esi + call close + mov eax,edi + sub eax,[resource_data] + mov [resource_size],eax + resource_done: + ret +make_pe_fixups: + bts [resolver_flags],0 + jc pe_relocatable_ok + or [next_pass_needed],-1 + pe_relocatable_ok: + push esi + mov ecx,[number_of_relocations] + mov esi,[free_additional_memory] + mov eax,ecx + shl eax,2 + sub esi,eax + mov [free_additional_memory],esi + or [number_of_relocations],-1 + xor edx,edx + mov ebp,edi + make_fixups: + cmp [esi],edx + jb store_fixup + mov eax,edi + sub eax,ebp + test eax,11b + jz fixups_block + xor ax,ax + stos word [edi] + add dword [ebx],2 + fixups_block: + mov eax,edx + add edx,1000h + cmp [esi],edx + jae fixups_block + stos dword [edi] + mov ebx,edi + mov eax,8 + stos dword [edi] + store_fixup: + jecxz fixups_done + add dword [ebx],2 + mov eax,[esi] + and ax,0FFFh + test [format_flags],8 + jnz fixup_64bit + or ax,3000h + jmp fixup_ok + fixup_64bit: + or ax,0A000h + fixup_ok: + stos word [edi] + add esi,4 + loop make_fixups + fixups_done: + pop esi + ret +close_pe: + call close_pe_section + mov edx,[code_start] + mov [edx+50h],eax + call make_timestamp + mov edx,[code_start] + mov [edx+8],eax + mov eax,[number_of_relocations] + cmp eax,-1 + je pe_relocations_ok + shl eax,2 + sub [free_additional_memory],eax + btr [resolver_flags],0 + jnc pe_relocations_ok + or [next_pass_needed],-1 + pe_relocations_ok: + mov eax,[number_of_sections] + mov [edx+6],ax + imul eax,28h + movzx ecx,word [edx+14h] + lea eax,[eax+18h+ecx] + add eax,[stub_size] + mov ecx,[edx+3Ch] + dec ecx + add eax,ecx + not ecx + and eax,ecx + cmp eax,[edx+54h] + je pe_sections_ok + or [next_pass_needed],-1 + pe_sections_ok: + xor ecx,ecx + add edx,78h + test [format_flags],8 + jz process_directories + add edx,10h + process_directories: + mov eax,[edx+ecx*8] + or eax,eax + jz directory_ok + cmp dword [edx+ecx*8+4],-1 + jne directory_ok + section_data: + mov ebx,[edx+ecx*8] + mov eax,[ebx+0Ch] + mov [edx+ecx*8],eax ; directory rva + mov eax,[ebx+8] + mov [edx+ecx*8+4],eax ; directory size + directory_ok: + inc cl + cmp cl,10h + jb process_directories + mov ebx,[code_start] + sub ebx,[stub_size] + mov ecx,edi + sub ecx,ebx + mov ebp,ecx + shr ecx,1 + xor eax,eax + cdq + calculate_checksum: + mov dx,[ebx] + add eax,edx + mov dx,ax + shr eax,16 + add eax,edx + add ebx,2 + loop calculate_checksum + add eax,ebp + mov ebx,[code_start] + mov [ebx+58h],eax + ret + +format_coff: + mov eax,[additional_memory] + mov [symbols_stream],eax + mov ebx,eax + add eax,20h + cmp eax,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],eax + xor eax,eax + mov [ebx],al + mov [ebx+4],eax + mov [ebx+8],edi + mov al,4 + mov [ebx+10h],eax + mov al,60h + bt [format_flags],0 + jnc flat_section_flags_ok + or eax,0E0000000h + flat_section_flags_ok: + mov dword [ebx+14h],eax + mov [current_section],ebx + mov [number_of_sections],0 + mov dword [org_origin],edi + mov dword [org_origin+4],0 + mov [org_registers],0 + mov [org_start],edi + mov [org_symbol],ebx + mov [labels_type],2 + mov [code_type],32 + test [format_flags],8 + jz instruction_assembled + mov [labels_type],4 + mov [code_type],64 + jmp instruction_assembled +coff_section: + call close_coff_section + mov ebx,[free_additional_memory] + lea eax,[ebx+20h] + cmp eax,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],eax + mov [current_section],ebx + inc [number_of_sections] + xor eax,eax + mov [ebx],al + mov [ebx+8],edi + mov dword [org_origin],edi + mov dword [org_origin+4],0 + mov [org_registers],0 + mov [org_start],edi + mov [org_symbol],ebx + mov [labels_type],2 + test [format_flags],8 + jz coff_labels_type_ok + mov [labels_type],4 + coff_labels_type_ok: + mov [ebx+10h],eax + mov [ebx+14h],eax + lods word [esi] + cmp ax,'(' + jne invalid_argument + mov [ebx+4],esi + mov ecx,[esi] + lea esi,[esi+4+ecx+1] + cmp ecx,8 + ja name_too_long + coff_section_flags: + cmp byte [esi],1Ch + je coff_section_alignment + cmp byte [esi],19h + jne coff_section_settings_ok + inc esi + lods byte [esi] + bt [format_flags],0 + jc coff_section_flag_ok + cmp al,7 + ja invalid_argument + coff_section_flag_ok: + mov cl,al + mov eax,1 + shl eax,cl + test dword [ebx+14h],eax + jnz setting_already_specified + or dword [ebx+14h],eax + jmp coff_section_flags + coff_section_alignment: + bt [format_flags],0 + jnc invalid_argument + inc esi + lods byte [esi] + or al,al + jnz invalid_argument + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + push ebx + call get_dword_value + pop ebx + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,eax + dec edx + test eax,edx + jnz invalid_value + or eax,eax + jz invalid_value + cmp eax,2000h + ja invalid_value + bsf edx,eax + inc edx + shl edx,20 + or [ebx+14h],edx + xchg [ebx+10h],eax + or eax,eax + jnz setting_already_specified + jmp coff_section_flags + coff_section_settings_ok: + cmp dword [ebx+10h],0 + jne instruction_assembled + mov dword [ebx+10h],4 + bt [format_flags],0 + jnc instruction_assembled + or dword [ebx+14h],300000h + jmp instruction_assembled + close_coff_section: + mov ebx,[current_section] + mov eax,edi + mov edx,[ebx+8] + sub eax,edx + mov [ebx+0Ch],eax + xor eax,eax + xchg [undefined_data_end],eax + cmp eax,edi + jne coff_section_ok + cmp edx,[undefined_data_start] + jne coff_section_ok + mov edi,edx + or byte [ebx+14h],80h + coff_section_ok: + ret +mark_coff_relocation: + cmp [value_type],3 + je coff_relocation_relative + push ebx eax + test [format_flags],8 + jnz coff_64bit_relocation + mov al,6 + jmp coff_relocation + coff_64bit_relocation: + mov al,1 + cmp [value_type],4 + je coff_relocation + mov al,2 + jmp coff_relocation + coff_relocation_relative: + push ebx + bt [format_flags],0 + jnc relative_ok + mov ebx,[current_section] + mov ebx,[ebx+8] + sub ebx,edi + sub eax,ebx + add eax,4 + relative_ok: + push eax + mov al,20 + test [format_flags],8 + jnz relative_coff_64bit_relocation + cmp [labels_type],2 + jne invalid_use_of_symbol + jmp coff_relocation + relative_coff_64bit_relocation: + mov al,4 + cmp [labels_type],4 + jne invalid_use_of_symbol + coff_relocation: + mov ebx,[free_additional_memory] + add ebx,0Ch + cmp ebx,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],ebx + mov byte [ebx-0Ch],al + mov eax,[current_section] + mov eax,[eax+8] + neg eax + add eax,edi + mov [ebx-0Ch+4],eax + mov eax,[symbol_identifier] + mov [ebx-0Ch+8],eax + pop eax ebx + ret +close_coff: + call close_coff_section + cmp [next_pass_needed],0 + je coff_closed + mov eax,[symbols_stream] + mov [free_additional_memory],eax + coff_closed: + ret +coff_formatter: + sub edi,[code_start] + mov [code_size],edi + call prepare_default_section + mov edi,[free_additional_memory] + mov ebx,edi + mov ecx,28h shr 2 + imul ecx,[number_of_sections] + add ecx,14h shr 2 + lea eax,[edi+ecx*4] + cmp eax,[structures_buffer] + jae out_of_memory + xor eax,eax + rep stos dword [edi] + mov word [ebx],14Ch + test [format_flags],8 + jz coff_magic_ok + mov word [ebx],8664h + coff_magic_ok: + mov word [ebx+12h],104h + bt [format_flags],0 + jnc coff_flags_ok + or byte [ebx+12h],80h + coff_flags_ok: + push ebx + call make_timestamp + pop ebx + mov [ebx+4],eax + mov eax,[number_of_sections] + mov [ebx+2],ax + mov esi,[symbols_stream] + xor eax,eax + xor ecx,ecx + enumerate_symbols: + cmp esi,[free_additional_memory] + je symbols_enumerated + mov dl,[esi] + or dl,dl + jz enumerate_section + cmp dl,80h + je enumerate_public + ja enumerate_extrn + add esi,0Ch + jmp enumerate_symbols + enumerate_section: + mov edx,eax + shl edx,8 + mov [esi],edx + inc eax + inc ecx + mov [esi+1Eh],cx + add esi,20h + jmp enumerate_symbols + enumerate_public: + mov edx,eax + shl edx,8 + mov dl,80h + mov [esi],edx + mov edx,[esi+8] + add esi,10h + inc eax + cmp byte [edx+11],2 + jne enumerate_symbols + mov edx,[edx+20] + cmp byte [edx],81h + jne enumerate_symbols + inc eax + jmp enumerate_symbols + enumerate_extrn: + mov edx,eax + shl edx,8 + mov dl,81h + mov [esi],edx + add esi,0Ch + inc eax + jmp enumerate_symbols + prepare_default_section: + mov ebx,[symbols_stream] + cmp dword [ebx+0Ch],0 + jne default_section_ok + cmp [number_of_sections],0 + je default_section_ok + mov edx,ebx + find_references_to_default_section: + cmp ebx,[free_additional_memory] + jne check_reference + add [symbols_stream],20h + ret + check_reference: + mov al,[ebx] + or al,al + jz skip_other_section + cmp al,80h + je check_public_reference + ja next_reference + cmp edx,[ebx+8] + je default_section_ok + next_reference: + add ebx,0Ch + jmp find_references_to_default_section + check_public_reference: + mov eax,[ebx+8] + add ebx,10h + test byte [eax+8],1 + jz find_references_to_default_section + mov cx,[current_pass] + cmp cx,[eax+16] + jne find_references_to_default_section + cmp edx,[eax+20] + je default_section_ok + jmp find_references_to_default_section + skip_other_section: + add ebx,20h + jmp find_references_to_default_section + default_section_ok: + inc [number_of_sections] + ret + symbols_enumerated: + mov [ebx+0Ch],eax + mov ebp,edi + sub ebp,ebx + push ebp + lea edi,[ebx+14h] + mov esi,[symbols_stream] + find_section: + cmp esi,[free_additional_memory] + je sections_finished + mov al,[esi] + or al,al + jz section_found + add esi,0Ch + cmp al,80h + jne find_section + add esi,4 + jmp find_section + section_found: + push esi edi + mov esi,[esi+4] + or esi,esi + jz default_section + mov ecx,[esi] + add esi,4 + rep movs byte [edi],[esi] + jmp section_name_ok + default_section: + mov al,'.' + stos byte [edi] + mov eax,'flat' + stos dword [edi] + section_name_ok: + pop edi esi + mov eax,[esi+0Ch] + mov [edi+10h],eax + mov eax,[esi+14h] + mov [edi+24h],eax + test al,80h + jnz section_ptr_ok + mov eax,[esi+8] + sub eax,[code_start] + add eax,ebp + mov [edi+14h],eax + section_ptr_ok: + mov ebx,[code_start] + mov edx,[code_size] + add ebx,edx + add edx,ebp + xor ecx,ecx + add esi,20h + find_relocations: + cmp esi,[free_additional_memory] + je section_relocations_done + mov al,[esi] + or al,al + jz section_relocations_done + cmp al,80h + jb add_relocation + ja next_relocation + add esi,10h + jmp find_relocations + add_relocation: + lea eax,[ebx+0Ah] + cmp eax,[display_buffer] + ja out_of_memory + mov eax,[esi+4] + mov [ebx],eax + mov eax,[esi+8] + mov eax,[eax] + shr eax,8 + mov [ebx+4],eax + movzx ax,byte [esi] + mov [ebx+8],ax + add ebx,0Ah + inc ecx + next_relocation: + add esi,0Ch + jmp find_relocations + section_relocations_done: + cmp ecx,10000h + jb section_relocations_count_16bit + bt [format_flags],0 + jnc format_limitations_exceeded + mov word [edi+20h],0FFFFh + or dword [edi+24h],1000000h + mov [edi+18h],edx + push esi edi + push ecx + lea esi,[ebx-1] + add ebx,0Ah + lea edi,[ebx-1] + imul ecx,0Ah + std + rep movs byte [edi],[esi] + cld + pop ecx + inc esi + inc ecx + mov [esi],ecx + xor eax,eax + mov [esi+4],eax + mov [esi+8],ax + pop edi esi + jmp section_relocations_ok + section_relocations_count_16bit: + mov [edi+20h],cx + jcxz section_relocations_ok + mov [edi+18h],edx + section_relocations_ok: + sub ebx,[code_start] + mov [code_size],ebx + add edi,28h + jmp find_section + sections_finished: + mov edx,[free_additional_memory] + mov ebx,[code_size] + add ebp,ebx + mov [edx+8],ebp + add ebx,[code_start] + mov edi,ebx + mov ecx,[edx+0Ch] + imul ecx,12h shr 1 + xor eax,eax + shr ecx,1 + jnc zero_symbols_table + stos word [edi] + zero_symbols_table: + rep stos dword [edi] + mov edx,edi + stos dword [edi] + mov esi,[symbols_stream] + make_symbols_table: + cmp esi,[free_additional_memory] + je symbols_table_ok + mov al,[esi] + cmp al,80h + je add_public_symbol + ja add_extrn_symbol + or al,al + jz add_section_symbol + add esi,0Ch + jmp make_symbols_table + add_section_symbol: + call store_symbol_name + movzx eax,word [esi+1Eh] + mov [ebx+0Ch],ax + mov byte [ebx+10h],3 + add esi,20h + add ebx,12h + jmp make_symbols_table + add_extrn_symbol: + call store_symbol_name + mov byte [ebx+10h],2 + add esi,0Ch + add ebx,12h + jmp make_symbols_table + add_public_symbol: + call store_symbol_name + mov eax,[esi+0Ch] + mov [current_line],eax + mov eax,[esi+8] + test byte [eax+8],1 + jz undefined_symbol + mov cx,[current_pass] + cmp cx,[eax+16] + jne undefined_symbol + mov cl,[eax+11] + or cl,cl + jz public_constant + test [format_flags],8 + jnz check_64bit_public_symbol + cmp cl,2 + je public_symbol_type_ok + jmp invalid_use_of_symbol + check_64bit_public_symbol: + cmp cl,4 + jne invalid_use_of_symbol + public_symbol_type_ok: + mov ecx,[eax+20] + cmp byte [ecx],81h + je alias_symbol + cmp byte [ecx],0 + jne invalid_use_of_symbol + mov cx,[ecx+1Eh] + mov [ebx+0Ch],cx + public_symbol_section_ok: + cmp dword [eax+4],0 + je store_public_symbol + cmp dword [eax+4],-1 + jne value_out_of_range + bt dword [eax],31 + jnc value_out_of_range + store_public_symbol: + mov eax,[eax] + mov [ebx+8],eax + mov byte [ebx+10h],2 + add esi,10h + add ebx,12h + jmp make_symbols_table + alias_symbol: + bt [format_flags],0 + jnc invalid_use_of_symbol + mov ecx,[eax] + or ecx,[eax+4] + jnz invalid_use_of_symbol + mov byte [ebx+10h],69h + mov byte [ebx+11h],1 + add ebx,12h + mov ecx,[eax+20] + mov ecx,[ecx] + shr ecx,8 + mov [ebx],ecx + mov byte [ebx+4],3 + add esi,10h + add ebx,12h + jmp make_symbols_table + public_constant: + mov word [ebx+0Ch],0FFFFh + jmp public_symbol_section_ok + symbols_table_ok: + mov eax,edi + sub eax,edx + mov [edx],eax + sub edi,[code_start] + mov [code_size],edi + mov [written_size],0 + mov edx,[output_file] + call create + jc write_failed + mov edx,[free_additional_memory] + pop ecx + add [written_size],ecx + call write + jc write_failed + jmp write_output + store_symbol_name: + push esi + mov esi,[esi+4] + or esi,esi + jz default_name + lods dword [esi] + mov ecx,eax + cmp ecx,8 + ja add_string + push edi + mov edi,ebx + rep movs byte [edi],[esi] + pop edi esi + ret + default_name: + mov dword [ebx],'.fla' + mov dword [ebx+4],'t' + pop esi + ret + add_string: + mov eax,edi + sub eax,edx + mov [ebx+4],eax + inc ecx + rep movs byte [edi],[esi] + pop esi + ret + +format_elf: + test [format_flags],8 + jnz format_elf64 + mov edx,edi + mov ecx,34h shr 2 + lea eax,[edi+ecx*4] + cmp eax,[display_buffer] + jae out_of_memory + xor eax,eax + rep stos dword [edi] + mov dword [edx],7Fh + 'ELF' shl 8 + mov al,1 + mov [edx+4],al + mov [edx+5],al + mov [edx+6],al + mov [edx+14h],al + mov byte [edx+12h],3 + mov byte [edx+28h],34h + mov byte [edx+2Eh],28h + mov [code_type],32 + cmp word [esi],1D19h + je format_elf_exe + mov [labels_type],2 + elf_header_ok: + mov byte [edx+10h],1 + mov eax,[additional_memory] + mov [symbols_stream],eax + mov ebx,eax + add eax,20h + cmp eax,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],eax + xor eax,eax + mov [current_section],ebx + mov [number_of_sections],eax + mov dword [org_origin],edi + mov dword [org_origin+4],eax + mov [org_registers],eax + mov [org_start],edi + mov [org_symbol],ebx + mov [ebx],al + mov [ebx+4],eax + mov [ebx+8],edi + mov al,111b + mov [ebx+14h],eax + mov al,4 + mov [ebx+10h],eax + test [format_flags],8 + jz instruction_assembled + mov byte [ebx+10h],8 + jmp instruction_assembled + format_elf64: + mov edx,edi + mov ecx,40h shr 2 + lea eax,[edi+ecx*4] + cmp eax,[display_buffer] + jae out_of_memory + xor eax,eax + rep stos dword [edi] + mov dword [edx],7Fh + 'ELF' shl 8 + mov al,1 + mov [edx+5],al + mov [edx+6],al + mov [edx+14h],al + mov byte [edx+4],2 + mov byte [edx+12h],62 + mov byte [edx+34h],40h + mov byte [edx+3Ah],40h + mov [code_type],64 + cmp word [esi],1D19h + je format_elf64_exe + mov [labels_type],4 + jmp elf_header_ok +elf_section: + bt [format_flags],0 + jc illegal_instruction + call close_coff_section + mov ebx,[free_additional_memory] + lea eax,[ebx+20h] + cmp eax,[structures_buffer] + jae out_of_memory + mov [free_additional_memory],eax + mov [current_section],ebx + inc word [number_of_sections] + jz format_limitations_exceeded + xor eax,eax + mov [ebx],al + mov [ebx+8],edi + mov dword [org_origin],edi + mov dword [org_origin+4],0 + mov [org_registers],0 + mov [org_start],edi + mov [org_symbol],ebx + test [format_flags],8 + jnz elf64_labels_type + mov [labels_type],2 + jmp elf_labels_type_ok + elf64_labels_type: + mov [labels_type],4 + elf_labels_type_ok: + mov [ebx+10h],eax + mov al,10b + mov [ebx+14h],eax + lods word [esi] + cmp ax,'(' + jne invalid_argument + mov [ebx+4],esi + mov ecx,[esi] + lea esi,[esi+4+ecx+1] + elf_section_flags: + cmp byte [esi],1Ch + je elf_section_alignment + cmp byte [esi],19h + jne elf_section_settings_ok + inc esi + lods byte [esi] + sub al,28 + xor al,11b + test al,not 10b + jnz invalid_argument + mov cl,al + mov al,1 + shl al,cl + test byte [ebx+14h],al + jnz setting_already_specified + or byte [ebx+14h],al + jmp elf_section_flags + elf_section_alignment: + inc esi + lods byte [esi] + or al,al + jnz invalid_argument + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + push ebx + call get_dword_value + pop ebx + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,eax + dec edx + test eax,edx + jnz invalid_value + or eax,eax + jz invalid_value + xchg [ebx+10h],eax + or eax,eax + jnz setting_already_specified + jmp elf_section_flags + elf_section_settings_ok: + cmp dword [ebx+10h],0 + jne instruction_assembled + mov dword [ebx+10h],4 + test [format_flags],8 + jz instruction_assembled + mov byte [ebx+10h],8 + jmp instruction_assembled +mark_elf_relocation: + cmp [value_type],3 + je elf_relocation_relative + push ebx eax + cmp [value_type],3 + je elf_gotoff_relocation + mov al,1 + test [format_flags],8 + jz coff_relocation + cmp [value_type],4 + je coff_relocation + mov al,11 + jmp coff_relocation + elf_gotoff_relocation: + mov al,9 + jmp coff_relocation + elf_relocation_relative: + cmp [labels_type],0 + je invalid_use_of_symbol + push ebx + mov ebx,[current_section] + mov ebx,[ebx+8] + sub ebx,edi + sub eax,ebx + push eax + mov al,2 + jmp coff_relocation +close_elf: + bt [format_flags],0 + jc close_elf_exe + call close_coff_section + cmp [next_pass_needed],0 + je elf_closed + mov eax,[symbols_stream] + mov [free_additional_memory],eax + elf_closed: + ret +elf_formatter: + push edi + call prepare_default_section + mov esi,[symbols_stream] + mov edi,[free_additional_memory] + xor eax,eax + mov ecx,4 + rep stos dword [edi] + test [format_flags],8 + jz find_first_section + mov ecx,2 + rep stos dword [edi] + find_first_section: + mov al,[esi] + or al,al + jz first_section_found + cmp al,80h + jne skip_other_symbol + add esi,4 + skip_other_symbol: + add esi,0Ch + jmp find_first_section + first_section_found: + mov ebx,esi + mov ebp,esi + add esi,20h + xor ecx,ecx + xor edx,edx + find_next_section: + cmp esi,[free_additional_memory] + je make_section_symbol + mov al,[esi] + or al,al + jz make_section_symbol + cmp al,80h + je skip_public + ja skip_extrn + or byte [ebx+14h],40h + skip_extrn: + add esi,0Ch + jmp find_next_section + skip_public: + add esi,10h + jmp find_next_section + make_section_symbol: + mov eax,edi + xchg eax,[ebx+4] + stos dword [edi] + test [format_flags],8 + jnz elf64_section_symbol + xor eax,eax + stos dword [edi] + stos dword [edi] + call store_section_index + jmp section_symbol_ok + store_section_index: + inc ecx + mov eax,ecx + shl eax,8 + mov [ebx],eax + inc dx + jz format_limitations_exceeded + mov eax,edx + shl eax,16 + mov al,3 + test byte [ebx+14h],40h + jz section_index_ok + or ah,-1 + inc dx + jz format_limitations_exceeded + section_index_ok: + stos dword [edi] + ret + elf64_section_symbol: + call store_section_index + xor eax,eax + stos dword [edi] + stos dword [edi] + stos dword [edi] + stos dword [edi] + section_symbol_ok: + mov ebx,esi + add esi,20h + cmp ebx,[free_additional_memory] + jne find_next_section + inc dx + jz format_limitations_exceeded + mov [current_section],edx + mov esi,[symbols_stream] + find_other_symbols: + cmp esi,[free_additional_memory] + je elf_symbol_table_ok + mov al,[esi] + or al,al + jz skip_section + cmp al,80h + je make_public_symbol + ja make_extrn_symbol + add esi,0Ch + jmp find_other_symbols + skip_section: + add esi,20h + jmp find_other_symbols + make_public_symbol: + mov eax,[esi+0Ch] + mov [current_line],eax + mov ebx,[esi+8] + test byte [ebx+8],1 + jz undefined_symbol + mov ax,[current_pass] + cmp ax,[ebx+16] + jne undefined_symbol + mov dl,[ebx+11] + or dl,dl + jz public_absolute + mov eax,[ebx+20] + cmp byte [eax],0 + jne invalid_use_of_symbol + mov eax,[eax+4] + test [format_flags],8 + jnz elf64_public + cmp dl,2 + jne invalid_use_of_symbol + mov dx,[eax+0Eh] + jmp section_for_public_ok + elf64_public: + cmp dl,4 + jne invalid_use_of_symbol + mov dx,[eax+6] + jmp section_for_public_ok + public_absolute: + mov dx,0FFF1h + section_for_public_ok: + mov eax,[esi+4] + stos dword [edi] + test [format_flags],8 + jnz elf64_public_symbol + call get_public_value + stos dword [edi] + xor eax,eax + mov al,[ebx+10] + stos dword [edi] + mov eax,edx + shl eax,16 + mov al,10h + cmp byte [ebx+10],0 + je elf_public_function + or al,1 + jmp store_elf_public_info + elf_public_function: + or al,2 + store_elf_public_info: + stos dword [edi] + jmp public_symbol_ok + elf64_public_symbol: + mov eax,edx + shl eax,16 + mov al,10h + cmp byte [ebx+10],0 + je elf64_public_function + or al,1 + jmp store_elf64_public_info + elf64_public_function: + or al,2 + store_elf64_public_info: + stos dword [edi] + call get_public_value + stos dword [edi] + xor eax,eax + stos dword [edi] + mov al,[ebx+10] + stos dword [edi] + xor al,al + stos dword [edi] + public_symbol_ok: + inc ecx + mov eax,ecx + shl eax,8 + mov al,80h + mov [esi],eax + add esi,10h + jmp find_other_symbols + get_public_value: + mov eax,[ebx] + cmp dword [ebx+4],0 + je public_value_ok + cmp dword [ebx+4],-1 + jne value_out_of_range + bt eax,31 + jnc value_out_of_range + public_value_ok: + ret + make_extrn_symbol: + mov eax,[esi+4] + stos dword [edi] + test [format_flags],8 + jnz elf64_extrn_symbol + xor eax,eax + stos dword [edi] + mov eax,[esi+8] + stos dword [edi] + mov eax,10h + stos dword [edi] + jmp extrn_symbol_ok + elf64_extrn_symbol: + mov eax,10h + stos dword [edi] + xor al,al + stos dword [edi] + stos dword [edi] + mov eax,[esi+8] + stos dword [edi] + xor eax,eax + stos dword [edi] + extrn_symbol_ok: + inc ecx + mov eax,ecx + shl eax,8 + mov al,81h + mov [esi],eax + add esi,0Ch + jmp find_other_symbols + elf_symbol_table_ok: + mov edx,edi + mov ebx,[free_additional_memory] + xor al,al + stos byte [edi] + add edi,16 + mov [edx+1],edx + add ebx,10h + test [format_flags],8 + jz make_string_table + add ebx,8 + make_string_table: + cmp ebx,edx + je elf_string_table_ok + test [format_flags],8 + jnz make_elf64_string + cmp byte [ebx+0Dh],0 + je rel_prefix_ok + mov byte [ebx+0Dh],0 + mov eax,'.rel' + stos dword [edi] + rel_prefix_ok: + mov esi,edi + sub esi,edx + xchg esi,[ebx] + add ebx,10h + make_elf_string: + or esi,esi + jz default_string + lods dword [esi] + mov ecx,eax + rep movs byte [edi],[esi] + xor al,al + stos byte [edi] + jmp make_string_table + make_elf64_string: + cmp byte [ebx+5],0 + je elf64_rel_prefix_ok + mov byte [ebx+5],0 + mov eax,'.rel' + stos dword [edi] + mov al,'a' + stos byte [edi] + elf64_rel_prefix_ok: + mov esi,edi + sub esi,edx + xchg esi,[ebx] + add ebx,18h + jmp make_elf_string + default_string: + mov eax,'.fla' + stos dword [edi] + mov ax,'t' + stos word [edi] + jmp make_string_table + elf_string_table_ok: + mov [edx+1+8],edi + mov ebx,[code_start] + mov eax,edi + sub eax,[free_additional_memory] + test [format_flags],8 + jnz finish_elf64_header + mov [ebx+20h],eax + mov eax,[current_section] + inc ax + jz format_limitations_exceeded + mov [ebx+32h],ax + inc ax + jz format_limitations_exceeded + mov [ebx+30h],ax + jmp elf_header_finished + finish_elf64_header: + mov [ebx+28h],eax + mov eax,[current_section] + inc ax + jz format_limitations_exceeded + mov [ebx+3Eh],ax + inc ax + jz format_limitations_exceeded + mov [ebx+3Ch],ax + elf_header_finished: + xor eax,eax + mov ecx,10 + rep stos dword [edi] + test [format_flags],8 + jz elf_null_section_ok + mov ecx,6 + rep stos dword [edi] + elf_null_section_ok: + mov esi,ebp + xor ecx,ecx + make_section_entry: + mov ebx,edi + mov eax,[esi+4] + mov eax,[eax] + stos dword [edi] + mov eax,1 + cmp dword [esi+0Ch],0 + je bss_section + test byte [esi+14h],80h + jz section_type_ok + bss_section: + mov al,8 + section_type_ok: + stos dword [edi] + mov eax,[esi+14h] + and al,3Fh + call store_elf_machine_word + xor eax,eax + call store_elf_machine_word + mov eax,[esi+8] + mov [image_base],eax + sub eax,[code_start] + call store_elf_machine_word + mov eax,[esi+0Ch] + call store_elf_machine_word + xor eax,eax + stos dword [edi] + stos dword [edi] + mov eax,[esi+10h] + call store_elf_machine_word + xor eax,eax + call store_elf_machine_word + inc ecx + add esi,20h + xchg edi,[esp] + mov ebp,edi + convert_relocations: + cmp esi,[free_additional_memory] + je relocations_converted + mov al,[esi] + or al,al + jz relocations_converted + cmp al,80h + jb make_relocation_entry + ja relocation_entry_ok + add esi,10h + jmp convert_relocations + make_relocation_entry: + test [format_flags],8 + jnz make_elf64_relocation_entry + mov eax,[esi+4] + stos dword [edi] + mov eax,[esi+8] + mov eax,[eax] + mov al,[esi] + stos dword [edi] + jmp relocation_entry_ok + make_elf64_relocation_entry: + mov eax,[esi+4] + stos dword [edi] + xor eax,eax + stos dword [edi] + movzx eax,byte [esi] + stos dword [edi] + mov eax,[esi+8] + mov eax,[eax] + shr eax,8 + stos dword [edi] + xor eax,eax + stos dword [edi] + stos dword [edi] + relocation_entry_ok: + add esi,0Ch + jmp convert_relocations + store_elf_machine_word: + stos dword [edi] + test [format_flags],8 + jz elf_machine_word_ok + mov dword [edi],0 + add edi,4 + elf_machine_word_ok: + ret + relocations_converted: + cmp edi,ebp + xchg edi,[esp] + je rel_section_ok + mov eax,[ebx] + sub eax,4 + test [format_flags],8 + jz store_relocations_name_offset + dec eax + store_relocations_name_offset: + stos dword [edi] + test [format_flags],8 + jnz rela_section + mov eax,9 + jmp store_relocations_type + rela_section: + mov eax,4 + store_relocations_type: + stos dword [edi] + xor al,al + call store_elf_machine_word + call store_elf_machine_word + mov eax,ebp + sub eax,[code_start] + call store_elf_machine_word + mov eax,[esp] + sub eax,ebp + call store_elf_machine_word + mov eax,[current_section] + stos dword [edi] + mov eax,ecx + stos dword [edi] + inc ecx + test [format_flags],8 + jnz finish_elf64_rela_section + mov eax,4 + stos dword [edi] + mov al,8 + stos dword [edi] + jmp rel_section_ok + finish_elf64_rela_section: + mov eax,8 + stos dword [edi] + xor al,al + stos dword [edi] + mov al,24 + stos dword [edi] + xor al,al + stos dword [edi] + rel_section_ok: + cmp esi,[free_additional_memory] + jne make_section_entry + pop eax + mov ebx,[code_start] + sub eax,ebx + mov [code_size],eax + mov ecx,20h + test [format_flags],8 + jz adjust_elf_section_headers_offset + mov ecx,28h + adjust_elf_section_headers_offset: + add [ebx+ecx],eax + mov eax,1 + stos dword [edi] + mov al,2 + stos dword [edi] + xor al,al + call store_elf_machine_word + call store_elf_machine_word + mov eax,[code_size] + call store_elf_machine_word + mov eax,[edx+1] + sub eax,[free_additional_memory] + call store_elf_machine_word + mov eax,[current_section] + inc eax + stos dword [edi] + mov eax,[number_of_sections] + inc eax + stos dword [edi] + test [format_flags],8 + jnz finish_elf64_sym_section + mov eax,4 + stos dword [edi] + mov al,10h + stos dword [edi] + jmp sym_section_ok + finish_elf64_sym_section: + mov eax,8 + stos dword [edi] + xor al,al + stos dword [edi] + mov al,18h + stos dword [edi] + xor al,al + stos dword [edi] + sym_section_ok: + mov al,1+8 + stos dword [edi] + mov al,3 + stos dword [edi] + xor al,al + call store_elf_machine_word + call store_elf_machine_word + mov eax,[edx+1] + sub eax,[free_additional_memory] + add eax,[code_size] + call store_elf_machine_word + mov eax,[edx+1+8] + sub eax,[edx+1] + call store_elf_machine_word + xor eax,eax + stos dword [edi] + stos dword [edi] + mov al,1 + call store_elf_machine_word + xor eax,eax + call store_elf_machine_word + mov eax,'tab' + mov dword [edx+1],'.sym' + mov [edx+1+4],eax + mov dword [edx+1+8],'.str' + mov [edx+1+8+4],eax + mov [written_size],0 + mov edx,[output_file] + call create + jc write_failed + call write_code + mov ecx,edi + mov edx,[free_additional_memory] + sub ecx,edx + add [written_size],ecx + call write + jc write_failed + jmp output_written + +format_elf_exe: + add esi,2 + or [format_flags],1 + mov [image_base],8048000h + cmp byte [esi],80h + jne elf_exe_base_ok + lods word [esi] + cmp ah,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + push edx + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov [image_base],eax + pop edx + elf_exe_base_ok: + mov byte [edx+10h],2 + mov byte [edx+2Ah],20h + mov ebx,edi + mov ecx,20h shr 2 + cmp [current_pass],0 + je init_elf_segments + imul ecx,[number_of_sections] + init_elf_segments: + xor eax,eax + rep stos dword [edi] + mov [number_of_sections],0 + mov byte [ebx],1 + mov word [ebx+1Ch],1000h + mov byte [ebx+18h],111b + mov eax,edi + sub eax,[code_start] + mov [ebx+4],eax + add eax,[image_base] + mov [ebx+8],eax + mov [ebx+0Ch],eax + mov [edx+18h],eax + xor edx,edx + not eax + not edx + add eax,1 + adc edx,0 + add eax,edi + adc edx,0 + mov dword [org_origin],eax + mov dword [org_origin+4],edx + mov [org_registers],0 + mov [org_start],edi + mov [symbols_stream],edi + jmp instruction_assembled + format_elf64_exe: + add esi,2 + or [format_flags],1 + mov [image_base],400000h + mov [image_base_high],0 + cmp byte [esi],80h + jne elf64_exe_base_ok + lods word [esi] + cmp ah,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + push edx + call get_qword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov [image_base],eax + mov [image_base_high],edx + pop edx + elf64_exe_base_ok: + mov byte [edx+10h],2 + mov byte [edx+36h],38h + mov ebx,edi + mov ecx,38h shr 2 + cmp [current_pass],0 + je init_elf64_segments + imul ecx,[number_of_sections] + init_elf64_segments: + xor eax,eax + rep stos dword [edi] + mov [number_of_sections],0 + mov byte [ebx],1 + mov word [ebx+30h],1000h + mov byte [ebx+4],111b + push edx + mov eax,edi + sub eax,[code_start] + mov [ebx+8],eax + xor edx,edx + add eax,[image_base] + adc edx,[image_base_high] + mov [ebx+10h],eax + mov [ebx+10h+4],edx + mov [ebx+18h],eax + mov [ebx+18h+4],edx + pop ebx + mov [ebx+18h],eax + mov [ebx+18h+4],edx + not eax + not edx + add eax,1 + adc edx,0 + add eax,edi + adc edx,0 + mov dword [org_origin],eax + mov dword [org_origin+4],edx + mov [org_registers],0 + mov [org_start],edi + mov [symbols_stream],edi + jmp instruction_assembled +elf_entry: + lods byte [esi] + cmp al,'(' + jne invalid_argument + cmp byte [esi],'.' + je invalid_value + test [format_flags],8 + jnz elf64_entry + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,[code_start] + mov [edx+18h],eax + jmp instruction_assembled + elf64_entry: + call get_qword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov ebx,[code_start] + mov [ebx+18h],eax + mov [ebx+1Ch],edx + jmp instruction_assembled +elf_segment: + bt [format_flags],0 + jnc illegal_instruction + test [format_flags],8 + jnz elf64_segment + call close_elf_segment + push eax + mov ebx,[number_of_sections] + shl ebx,5 + add ebx,[code_start] + add ebx,34h + cmp ebx,[symbols_stream] + jb new_elf_segment + mov ebx,[symbols_stream] + sub ebx,20h + push edi + mov edi,ebx + mov ecx,20h shr 2 + xor eax,eax + rep stos dword [edi] + pop edi + or [next_pass_needed],-1 + new_elf_segment: + mov byte [ebx],1 + mov word [ebx+1Ch],1000h + elf_segment_flags: + cmp byte [esi],19h + jne elf_segment_flags_ok + lods word [esi] + sub ah,28 + jbe invalid_argument + cmp ah,1 + je mark_elf_segment_flag + cmp ah,3 + ja invalid_argument + xor ah,1 + cmp ah,2 + je mark_elf_segment_flag + inc ah + mark_elf_segment_flag: + test [ebx+18h],ah + jnz setting_already_specified + or [ebx+18h],ah + jmp elf_segment_flags + elf_segment_flags_ok: + mov eax,edi + sub eax,[code_start] + mov [ebx+4],eax + pop edx + and eax,0FFFh + add edx,eax + mov [ebx+8],edx + mov [ebx+0Ch],edx + mov eax,edx + xor edx,edx + not eax + not edx + add eax,1 + adc edx,0 + add eax,edi + adc edx,0 + mov dword [org_origin],eax + mov dword [org_origin+4],edx + mov [org_registers],0 + mov [org_start],edi + inc [number_of_sections] + jmp instruction_assembled + close_elf_segment: + cmp [number_of_sections],0 + jne finish_elf_segment + cmp edi,[symbols_stream] + jne first_elf_segment_ok + push edi + mov edi,[code_start] + add edi,34h + mov ecx,20h shr 2 + xor eax,eax + rep stos dword [edi] + pop edi + mov eax,[image_base] + ret + first_elf_segment_ok: + inc [number_of_sections] + finish_elf_segment: + mov ebx,[number_of_sections] + dec ebx + shl ebx,5 + add ebx,[code_start] + add ebx,34h + mov eax,edi + sub eax,[code_start] + sub eax,[ebx+4] + mov edx,edi + cmp edi,[undefined_data_end] + jne elf_segment_size_ok + mov edi,[undefined_data_start] + elf_segment_size_ok: + mov [ebx+14h],eax + add eax,edi + sub eax,edx + mov [ebx+10h],eax + mov eax,[ebx+8] + add eax,[ebx+14h] + add eax,0FFFh + and eax,not 0FFFh + ret + elf64_segment: + call close_elf64_segment + push eax edx + mov ebx,[number_of_sections] + imul ebx,38h + add ebx,[code_start] + add ebx,40h + cmp ebx,[symbols_stream] + jb new_elf64_segment + mov ebx,[symbols_stream] + sub ebx,38h + push edi + mov edi,ebx + mov ecx,38h shr 2 + xor eax,eax + rep stos dword [edi] + pop edi + or [next_pass_needed],-1 + new_elf64_segment: + mov byte [ebx],1 + mov word [ebx+30h],1000h + elf64_segment_flags: + cmp byte [esi],19h + jne elf64_segment_flags_ok + lods word [esi] + sub ah,28 + jbe invalid_argument + cmp ah,1 + je mark_elf64_segment_flag + cmp ah,3 + ja invalid_argument + xor ah,1 + cmp ah,2 + je mark_elf64_segment_flag + inc ah + mark_elf64_segment_flag: + test [ebx+4],ah + jnz setting_already_specified + or [ebx+4],ah + jmp elf64_segment_flags + elf64_segment_flags_ok: + mov ecx,edi + sub ecx,[code_start] + mov [ebx+8],ecx + pop edx eax + and ecx,0FFFh + add eax,ecx + adc edx,0 + mov [ebx+10h],eax + mov [ebx+10h+4],edx + mov [ebx+18h],eax + mov [ebx+18h+4],edx + not eax + not edx + add eax,1 + adc edx,0 + add eax,edi + adc edx,0 + mov dword [org_origin],eax + mov dword [org_origin+4],edx + mov [org_registers],0 + mov [org_start],edi + inc [number_of_sections] + jmp instruction_assembled + close_elf64_segment: + cmp [number_of_sections],0 + jne finish_elf64_segment + cmp edi,[symbols_stream] + jne first_elf64_segment_ok + push edi + mov edi,[code_start] + add edi,40h + mov ecx,38h shr 2 + xor eax,eax + rep stos dword [edi] + pop edi + mov eax,[image_base] + mov edx,[image_base_high] + ret + first_elf64_segment_ok: + inc [number_of_sections] + finish_elf64_segment: + mov ebx,[number_of_sections] + dec ebx + imul ebx,38h + add ebx,[code_start] + add ebx,40h + mov eax,edi + sub eax,[code_start] + sub eax,[ebx+8] + mov edx,edi + cmp edi,[undefined_data_end] + jne elf64_segment_size_ok + mov edi,[undefined_data_start] + elf64_segment_size_ok: + mov [ebx+28h],eax + add eax,edi + sub eax,edx + mov [ebx+20h],eax + mov eax,[ebx+10h] + mov edx,[ebx+10h+4] + add eax,[ebx+28h] + adc edx,0 + sub eax,1 + sbb edx,0 + shrd eax,edx,12 + shr edx,12 + add eax,1 + adc edx,0 + shld edx,eax,12 + shl eax,12 + ret +close_elf_exe: + test [format_flags],8 + jnz close_elf64_exe + call close_elf_segment + mov edx,[code_start] + mov eax,[number_of_sections] + mov byte [edx+1Ch],34h + mov [edx+2Ch],ax + shl eax,5 + add eax,edx + add eax,34h + cmp eax,[symbols_stream] + je elf_exe_ok + or [next_pass_needed],-1 + elf_exe_ok: + ret + close_elf64_exe: + call close_elf64_segment + mov edx,[code_start] + mov eax,[number_of_sections] + mov byte [edx+20h],40h + mov [edx+38h],ax + imul eax,38h + add eax,edx + add eax,40h + cmp eax,[symbols_stream] + je elf64_exe_ok + or [next_pass_needed],-1 + elf64_exe_ok: + ret diff --git a/programs/develop/fasm/trunk/parser.inc b/programs/develop/fasm/trunk/parser.inc new file mode 100644 index 0000000000..82f1256d2a --- /dev/null +++ b/programs/develop/fasm/trunk/parser.inc @@ -0,0 +1,1349 @@ + +; flat assembler core +; Copyright (c) 1999-2006, Tomasz Grysztar. +; All rights reserved. + +parser: + mov eax,[memory_end] + mov [labels_list],eax + mov eax,[additional_memory] + mov [free_additional_memory],eax + xor eax,eax + mov [current_locals_prefix],eax + mov [anonymous_reverse],eax + mov [anonymous_forward],eax + mov [hash_tree],eax + mov [blocks_stack],eax + mov esi,[memory_start] + mov edi,[source_start] + parser_loop: + mov [current_line],esi + lea eax,[edi+100h] + cmp eax,[labels_list] + jae out_of_memory + cmp byte [esi+16],0 + je empty_line + mov al,0Fh + stos byte [edi] + mov eax,esi + stos dword [edi] + add esi,16 + parse_line: + cmp byte [esi],1Ah + jne empty_instruction + push edi + add esi,2 + movzx ecx,byte [esi-1] + cmp byte [esi+ecx],':' + je simple_label + cmp byte [esi+ecx],'=' + je constant_label + call get_instruction + jnc main_instruction_identified + cmp byte [esi+ecx],1Ah + jne no_data_label + push esi ecx + lea esi,[esi+ecx+2] + movzx ecx,byte [esi-1] + call get_data_directive + jnc data_label + pop ecx esi + no_data_label: + call get_data_directive + jnc main_instruction_identified + pop edi + sub esi,2 + xor bx,bx + call parse_line_contents + jmp parse_next_line + simple_label: + pop edi + call identify_label + mov byte [edi],2 + inc edi + stos dword [edi] + inc esi + xor al,al + stos byte [edi] + jmp parse_line + constant_label: + pop edi + call get_label_id + mov byte [edi],3 + inc edi + stos dword [edi] + xor al,al + stos byte [edi] + inc esi + xor bx,bx + call parse_line_contents + jmp parse_next_line + data_label: + pop ecx edx + pop edi + push eax ebx esi + mov esi,edx + movzx ecx,byte [esi-1] + call identify_label + mov byte [edi],2 + inc edi + stos dword [edi] + pop esi ebx eax + stos byte [edi] + push edi + main_instruction_identified: + pop edi + mov dl,al + mov al,1 + stos byte [edi] + mov ax,bx + stos word [edi] + mov al,dl + stos byte [edi] + cmp bx,if_directive-assembler + je parse_block + cmp bx,repeat_directive-assembler + je parse_block + cmp bx,while_directive-assembler + je parse_block + cmp bx,end_directive-assembler + je parse_end_directive + cmp bx,else_directive-assembler + je parse_else + common_parse: + call parse_line_contents + jmp parse_next_line + empty_instruction: + lods byte [esi] + or al,al + jz parse_next_line + cmp al,':' + je invalid_name + cmp al,3Bh + je skip_preprocessed_symbol + dec esi + call parse_argument + jmp parse_next_line + skip_preprocessed_symbol: + lods byte [esi] + movzx eax,al + add esi,eax + skip_next: + lods byte [esi] + or al,al + jz parse_next_line + cmp al,1Ah + je skip_preprocessed_symbol + cmp al,3Bh + je skip_preprocessed_symbol + cmp al,22h + je skip_preprocessed_string + jmp skip_next + skip_preprocessed_string: + lods dword [esi] + add esi,eax + jmp skip_next + empty_line: + add esi,17 + parse_next_line: + cmp esi,[source_start] + jb parser_loop + source_parsed: + cmp [blocks_stack],0 + je blocks_stack_ok + pop eax + pop [current_line] + jmp missing_end_directive + blocks_stack_ok: + xor al,al + stos byte [edi] + mov eax,[error_line] + mov [current_line],eax + cmp [anonymous_forward],0 + jne invalid_value + add edi,0Fh + and edi,not 0Fh + mov [code_start],edi + ret + parse_block: + mov eax,esp + sub eax,100h + jc stack_overflow + cmp eax,[stack_limit] + jb stack_overflow + push [current_line] + mov ax,bx + shl eax,16 + push eax + inc [blocks_stack] + cmp bx,if_directive-assembler + je parse_if + cmp bx,while_directive-assembler + je parse_while + call parse_line_contents + jmp parse_next_line + parse_end_directive: + cmp byte [esi],1Ah + jne common_parse + push edi + inc esi + movzx ecx,byte [esi] + inc esi + call get_instruction + pop edi + jnc parse_end_block + sub esi,2 + jmp common_parse + parse_end_block: + mov dl,al + mov al,1 + stos byte [edi] + mov ax,bx + stos word [edi] + mov al,dl + stos byte [edi] + lods byte [esi] + or al,al + jnz extra_characters_on_line + cmp bx,if_directive-assembler + je close_parsing_block + cmp bx,repeat_directive-assembler + je close_parsing_block + cmp bx,while_directive-assembler + je close_parsing_block + jmp parse_next_line + close_parsing_block: + cmp [blocks_stack],0 + je unexpected_instruction + cmp bx,[esp+2] + jne unexpected_instruction + dec [blocks_stack] + pop eax edx + cmp bx,if_directive-assembler + jne parse_next_line + test al,1100b + jz parse_next_line + test al,10000b + jnz parse_next_line + sub edi,8 + jmp parse_next_line + parse_if: + push edi + call parse_line_contents + xor al,al + stos byte [edi] + xchg esi,[esp] + mov edi,esi + call preevaluate_logical_expression + pop esi + cmp al,'0' + je parse_false_condition_block + cmp al,'1' + je parse_true_condition_block + or byte [esp],10000b + jmp parse_next_line + parse_while: + push edi + call parse_line_contents + xor al,al + stos byte [edi] + xchg esi,[esp] + mov edi,esi + call preevaluate_logical_expression + pop esi + cmp al,'0' + je parse_false_condition_block + cmp al,'1' + jne parse_next_line + stos byte [edi] + jmp parse_next_line + parse_false_condition_block: + or byte [esp],1 + sub edi,4 + jmp skip_parsing + parse_true_condition_block: + or byte [esp],100b + sub edi,4 + jmp parse_next_line + parse_else: + cmp [blocks_stack],0 + je unexpected_instruction + cmp word [esp+2],if_directive-assembler + jne unexpected_instruction + lods byte [esi] + or al,al + jz parse_pure_else + cmp al,1Ah + jne extra_characters_on_line + push edi + movzx ecx,byte [esi] + inc esi + call get_instruction + jc extra_characters_on_line + pop edi + cmp bx,if_directive-assembler + jne extra_characters_on_line + test byte [esp],100b + jnz skip_true_condition_else + mov dl,al + mov al,1 + stos byte [edi] + mov ax,bx + stos word [edi] + mov al,dl + stos byte [edi] + jmp parse_if + skip_true_condition_else: + sub edi,4 + or byte [esp],1 + jmp skip_parsing_contents + parse_pure_else: + bts dword [esp],1 + jc unexpected_instruction + test byte [esp],100b + jz parse_next_line + sub edi,4 + or byte [esp],1 + jmp skip_parsing + skip_parsing: + cmp esi,[source_start] + jae source_parsed + mov [current_line],esi + add esi,16 + skip_parsing_line: + cmp byte [esi],1Ah + jne skip_parsing_contents + inc esi + movzx ecx,byte [esi] + inc esi + cmp byte [esi+ecx],':' + je skip_parsing_label + push edi + call get_instruction + pop edi + jnc skip_parsing_instruction + add esi,ecx + jmp skip_parsing_contents + skip_parsing_label: + lea esi,[esi+ecx+1] + jmp skip_parsing_line + skip_parsing_instruction: + cmp bx,if_directive-assembler + je skip_parsing_block + cmp bx,repeat_directive-assembler + je skip_parsing_block + cmp bx,while_directive-assembler + je skip_parsing_block + cmp bx,end_directive-assembler + je skip_parsing_end_directive + cmp bx,else_directive-assembler + je skip_parsing_else + skip_parsing_contents: + lods byte [esi] + or al,al + jz skip_parsing + cmp al,1Ah + je skip_parsing_symbol + cmp al,3Bh + je skip_parsing_symbol + cmp al,22h + je skip_parsing_string + jmp skip_parsing_contents + skip_parsing_symbol: + lods byte [esi] + movzx eax,al + add esi,eax + jmp skip_parsing_contents + skip_parsing_string: + lods dword [esi] + add esi,eax + jmp skip_parsing_contents + skip_parsing_block: + mov eax,esp + sub eax,100h + jc stack_overflow + cmp eax,[stack_limit] + jb stack_overflow + push [current_line] + mov ax,bx + shl eax,16 + push eax + inc [blocks_stack] + jmp skip_parsing_contents + skip_parsing_end_directive: + cmp byte [esi],1Ah + jne skip_parsing_contents + push edi + inc esi + movzx ecx,byte [esi] + inc esi + call get_instruction + pop edi + jnc skip_parsing_end_block + add esi,ecx + jmp skip_parsing_contents + skip_parsing_end_block: + lods byte [esi] + or al,al + jnz extra_characters_on_line + cmp bx,if_directive-assembler + je close_skip_parsing_block + cmp bx,repeat_directive-assembler + je close_skip_parsing_block + cmp bx,while_directive-assembler + je close_skip_parsing_block + jmp skip_parsing + close_skip_parsing_block: + cmp [blocks_stack],0 + je unexpected_instruction + cmp bx,[esp+2] + jne unexpected_instruction + dec [blocks_stack] + pop eax edx + test al,1 + jz skip_parsing + cmp bx,if_directive-assembler + jne parse_next_line + test al,10000b + jz parse_next_line + mov al,0Fh + stos byte [edi] + mov eax,[current_line] + stos dword [edi] + mov eax,1 + (end_directive-assembler) shl 8 + stos dword [edi] + mov eax,1 + (if_directive-assembler) shl 8 + stos dword [edi] + jmp parse_next_line + skip_parsing_else: + cmp [blocks_stack],0 + je unexpected_instruction + cmp word [esp+2],if_directive-assembler + jne unexpected_instruction + lods byte [esi] + or al,al + jz skip_parsing_pure_else + cmp al,1Ah + jne extra_characters_on_line + push edi + movzx ecx,byte [esi] + inc esi + call get_instruction + jc extra_characters_on_line + pop edi + cmp bx,if_directive-assembler + jne extra_characters_on_line + mov al,[esp] + test al,1 + jz skip_parsing_contents + test al,100b + jnz skip_parsing_contents + test al,10000b + jnz parse_else_if + xor al,al + mov [esp],al + mov al,0Fh + stos byte [edi] + mov eax,[current_line] + stos dword [edi] + parse_else_if: + mov eax,1 + (if_directive-assembler) shl 8 + stos dword [edi] + jmp parse_if + skip_parsing_pure_else: + bts dword [esp],1 + jc unexpected_instruction + mov al,[esp] + test al,1 + jz skip_parsing + test al,100b + jnz skip_parsing + and al,not 1 + or al,1000b + mov [esp],al + jmp parse_next_line + +parse_line_contents: + mov [parenthesis_stack],0 + parse_instruction_arguments: + cmp bx,prefix_instruction-assembler + je allow_embedded_instruction + cmp bx,times_directive-assembler + je parse_times_directive + cmp bx,end_directive-assembler + je allow_embedded_instruction + cmp bx,label_directive-assembler + je parse_label_directive + cmp bx,segment_directive-assembler + je parse_label_directive + cmp bx,load_directive-assembler + je parse_load_directive + cmp bx,extrn_directive-assembler + je parse_extrn_directive + cmp bx,public_directive-assembler + je parse_public_directive + parse_argument: + lea eax,[edi+100h] + cmp eax,[labels_list] + jae out_of_memory + lods byte [esi] + cmp al,':' + je instruction_separator + cmp al,',' + je separator + cmp al,'=' + je separator + cmp al,'|' + je separator + cmp al,'&' + je separator + cmp al,'~' + je separator + cmp al,'>' + je greater + cmp al,'<' + je less + cmp al,')' + je close_parenthesis + or al,al + jz contents_parsed + cmp al,'[' + je address_argument + cmp al,']' + je separator + cmp al,'{' + je unallowed_character + cmp al,'}' + je unallowed_character + cmp al,'#' + je unallowed_character + cmp al,'`' + je unallowed_character + dec esi + cmp al,1Ah + jne expression_argument + push edi + mov edi,directive_operators + call get_operator + or al,al + jnz operator_argument + inc esi + movzx ecx,byte [esi] + inc esi + call get_symbol + jnc symbol_argument + cmp ecx,1 + jne check_argument + cmp byte [esi],'?' + jne check_argument + pop edi + movs byte [edi],[esi] + jmp argument_parsed + symbol_argument: + pop edi + stos word [edi] + jmp argument_parsed + operator_argument: + pop edi + cmp al,85h + je ptr_argument + stos byte [edi] + cmp al,80h + je forced_expression + cmp al,81h + je forced_parenthesis + cmp al,82h + je parse_from_operator + cmp al,89h + je parse_label_operator + jmp argument_parsed + allow_embedded_instruction: + cmp byte [esi],1Ah + jne parse_argument + push edi + inc esi + movzx ecx,byte [esi] + inc esi + call get_instruction + jnc embedded_instruction + call get_data_directive + jnc embedded_instruction + pop edi + sub esi,2 + jmp parse_argument + embedded_instruction: + pop edi + mov dl,al + mov al,1 + stos byte [edi] + mov ax,bx + stos word [edi] + mov al,dl + stos byte [edi] + jmp parse_instruction_arguments + parse_times_directive: + mov al,'(' + stos byte [edi] + call convert_expression + mov al,')' + stos byte [edi] + cmp byte [esi],':' + jne allow_embedded_instruction + movs byte [edi],[esi] + jmp allow_embedded_instruction + parse_label_directive: + cmp byte [esi],1Ah + jne argument_parsed + push esi + inc esi + movzx ecx,byte [esi] + inc esi + call identify_label + pop ebx + cmp eax,0Fh + je non_label_identified + mov byte [edi],2 + inc edi + stos dword [edi] + xor al,al + stos byte [edi] + jmp argument_parsed + non_label_identified: + mov esi,ebx + jmp argument_parsed + parse_load_directive: + cmp byte [esi],1Ah + jne argument_parsed + push esi + inc esi + movzx ecx,byte [esi] + inc esi + call get_label_id + pop ebx + cmp eax,0Fh + je non_label_identified + mov byte [edi],2 + inc edi + stos dword [edi] + xor al,al + stos byte [edi] + jmp argument_parsed + parse_public_directive: + cmp byte [esi],1Ah + jne parse_argument + inc esi + push esi + movzx ecx,byte [esi] + inc esi + mov al,2 + stos byte [edi] + call get_label_id + stos dword [edi] + mov ax,8600h + stos word [edi] + pop ebx + push ebx esi edi + mov edi,directive_operators + call get_operator + pop edi edx ebx + cmp al,86h + je argument_parsed + mov esi,edx + xchg esi,ebx + movzx ecx,byte [esi] + inc esi + mov ax,'(' + stos word [edi] + mov eax,ecx + stos dword [edi] + rep movs byte [edi],[esi] + xor al,al + stos byte [edi] + xchg esi,ebx + jmp argument_parsed + parse_extrn_directive: + cmp byte [esi],22h + je parse_quoted_extrn + cmp byte [esi],1Ah + jne parse_argument + push esi + movzx ecx,byte [esi+1] + add esi,2 + mov ax,'(' + stos word [edi] + mov eax,ecx + stos dword [edi] + rep movs byte [edi],[esi] + mov ax,8600h + stos word [edi] + pop esi + parse_label_operator: + cmp byte [esi],1Ah + jne argument_parsed + inc esi + movzx ecx,byte [esi] + inc esi + mov al,2 + stos byte [edi] + call get_label_id + stos dword [edi] + xor al,al + stos byte [edi] + jmp argument_parsed + parse_from_operator: + cmp byte [esi],22h + jne forced_expression + jmp argument_parsed + parse_quoted_extrn: + inc esi + mov ax,'(' + stos word [edi] + lods dword [esi] + mov ecx,eax + stos dword [edi] + rep movs byte [edi],[esi] + xor al,al + stos byte [edi] + push esi edi + mov edi,directive_operators + call get_operator + mov edx,esi + pop edi esi + cmp al,86h + jne argument_parsed + stos byte [edi] + mov esi,edx + jmp parse_label_operator + ptr_argument: + call parse_address + jmp address_parsed + check_argument: + push esi ecx + sub esi,2 + mov edi,single_operand_operators + call get_operator + pop ecx esi + or al,al + jnz not_instruction + call get_instruction + jnc embedded_instruction + call get_data_directive + jnc embedded_instruction + not_instruction: + pop edi + sub esi,2 + expression_argument: + cmp byte [esi],22h + jne not_string + mov eax,[esi+1] + lea ebx,[esi+5+eax] + push ebx ecx esi edi + mov al,'(' + stos byte [edi] + call convert_expression + mov al,')' + stos byte [edi] + pop eax edx ecx ebx + cmp esi,ebx + jne expression_parsed + mov edi,eax + mov esi,edx + string_argument: + inc esi + mov ax,'(' + stos word [edi] + lods dword [esi] + mov ecx,eax + stos dword [edi] + shr ecx,1 + jnc string_movsb_ok + movs byte [edi],[esi] + string_movsb_ok: + shr ecx,1 + jnc string_movsw_ok + movs word [edi],[esi] + string_movsw_ok: + rep movs dword [edi],[esi] + xor al,al + stos byte [edi] + jmp expression_parsed + not_string: + cmp byte [esi],'(' + jne expression + mov eax,esp + sub eax,100h + jc stack_overflow + cmp eax,[stack_limit] + jb stack_overflow + push esi edi + inc esi + mov al,'{' + stos byte [edi] + inc [parenthesis_stack] + jmp parse_argument + expression: + mov al,'(' + stos byte [edi] + call convert_expression + mov al,')' + stos byte [edi] + jmp expression_parsed + forced_expression: + mov al,'(' + stos byte [edi] + call convert_expression + mov al,')' + stos byte [edi] + jmp argument_parsed + address_argument: + call parse_address + lods byte [esi] + cmp al,']' + je address_parsed + dec esi + mov al,')' + stos byte [edi] + jmp argument_parsed + address_parsed: + mov al,']' + stos byte [edi] + jmp argument_parsed + parse_address: + mov al,'[' + stos byte [edi] + cmp word [esi],021Ah + jne convert_address + push esi + add esi,4 + lea ebx,[esi+1] + cmp byte [esi],':' + pop esi + jne convert_address + add esi,2 + mov ecx,2 + push ebx edi + call get_symbol + pop edi esi + jc unknown_segment_prefix + cmp al,10h + jne unknown_segment_prefix + mov al,ah + and ah,11110000b + cmp ah,60h + jne unknown_segment_prefix + stos byte [edi] + jmp convert_address + unknown_segment_prefix: + sub esi,5 + convert_address: + push edi + mov edi,address_sizes + call get_operator + pop edi + or al,al + jz convert_expression + add al,70h + stos byte [edi] + jmp convert_expression + forced_parenthesis: + cmp byte [esi],'(' + jne argument_parsed + inc esi + mov al,'{' + jmp separator + unallowed_character: + mov al,0FFh + jmp separator + close_parenthesis: + mov al,'}' + separator: + stos byte [edi] + jmp argument_parsed + instruction_separator: + stos byte [edi] + jmp allow_embedded_instruction + greater: + cmp byte [esi],'=' + jne separator + inc esi + mov al,0F2h + jmp separator + less: + cmp byte [edi-1],0F6h + je separator + cmp byte [esi],'>' + je not_equal + cmp byte [esi],'=' + jne separator + inc esi + mov al,0F3h + jmp separator + not_equal: + inc esi + mov al,0F1h + jmp separator + argument_parsed: + cmp [parenthesis_stack],0 + je parse_argument + dec [parenthesis_stack] + add esp,8 + jmp argument_parsed + expression_parsed: + cmp [parenthesis_stack],0 + je parse_argument + cmp byte [esi],')' + jne argument_parsed + dec [parenthesis_stack] + pop edi esi + jmp expression + contents_parsed: + cmp [parenthesis_stack],0 + jne invalid_expression + ret + +identify_label: + cmp byte [esi],'.' + je local_label_name + call get_label_id + cmp eax,10h + jb label_identified + or ebx,ebx + jz anonymous_label_name + dec ebx + mov [current_locals_prefix],ebx + label_identified: + ret + anonymous_label_name: + cmp byte [esi-1],'@' + je anonymous_label_name_ok + mov eax,0Fh + anonymous_label_name_ok: + ret + local_label_name: + call get_label_id + ret + +get_operator: + cmp byte [esi],1Ah + jne get_simple_operator + mov edx,esi + push ebp + inc esi + lods byte [esi] + movzx ebp,al + push edi + mov ecx,ebp + call lower_case + pop edi + check_operator: + mov esi,converted + movzx ecx,byte [edi] + jecxz no_operator + inc edi + mov ebx,edi + add ebx,ecx + cmp ecx,ebp + jne next_operator + repe cmps byte [esi],[edi] + je operator_found + next_operator: + mov edi,ebx + inc edi + jmp check_operator + no_operator: + mov esi,edx + mov ecx,ebp + pop ebp + no_simple_operator: + xor al,al + ret + operator_found: + lea esi,[edx+2+ebp] + mov ecx,ebp + pop ebp + mov al,[edi] + ret + get_simple_operator: + mov al,[esi] + cmp al,22h + je no_simple_operator + simple_operator: + cmp byte [edi],1 + jb no_simple_operator + ja simple_next_operator + cmp al,[edi+1] + je simple_operator_found + simple_next_operator: + movzx ecx,byte [edi] + lea edi,[edi+1+ecx+1] + jmp simple_operator + simple_operator_found: + inc esi + mov al,[edi+2] + ret + +get_symbol: + push esi + mov ebp,ecx + call lower_case + mov ecx,ebp + cmp cl,11 + ja no_symbol + sub cl,2 + jc no_symbol + movzx ebx,word [symbols+ecx*4] + add ebx,symbols + movzx edx,word [symbols+ecx*4+2] + scan_symbols: + or edx,edx + jz no_symbol + mov eax,edx + shr eax,1 + lea edi,[ebp+2] + imul eax,edi + lea edi,[ebx+eax] + mov esi,converted + mov ecx,ebp + repe cmps byte [esi],[edi] + ja symbols_up + jb symbols_down + pop esi + add esi,ebp + mov ax,[edi] + clc + ret + no_symbol: + pop esi + mov ecx,ebp + stc + ret + symbols_down: + shr edx,1 + jmp scan_symbols + symbols_up: + lea ebx,[edi+ecx+2] + shr edx,1 + adc edx,-1 + jmp scan_symbols + +get_data_directive: + push esi + mov ebp,ecx + call lower_case + mov ecx,ebp + cmp cl,4 + ja no_instruction + sub cl,2 + jc no_instruction + movzx ebx,word [data_directives+ecx*4] + add ebx,data_directives + movzx edx,word [data_directives+ecx*4+2] + jmp scan_instructions + +get_instruction: + push esi + mov ebp,ecx + call lower_case + mov ecx,ebp + cmp cl,11 + ja no_instruction + sub cl,2 + jc no_instruction + movzx ebx,word [instructions+ecx*4] + add ebx,instructions + movzx edx,word [instructions+ecx*4+2] + scan_instructions: + or edx,edx + jz no_instruction + mov eax,edx + shr eax,1 + lea edi,[ebp+3] + imul eax,edi + lea edi,[ebx+eax] + mov esi,converted + mov ecx,ebp + repe cmps byte [esi],[edi] + ja instructions_up + jb instructions_down + pop esi + add esi,ebp + mov al,[edi] + mov bx,[edi+1] + clc + ret + no_instruction: + pop esi + mov ecx,ebp + stc + ret + instructions_down: + shr edx,1 + jmp scan_instructions + instructions_up: + lea ebx,[edi+ecx+3] + shr edx,1 + adc edx,-1 + jmp scan_instructions + +get_label_id: + cmp ecx,100h + jae name_too_long + cmp byte [esi],'@' + je anonymous_label + cmp byte [esi],'.' + jne standard_label + cmp byte [esi+1],'.' + je standard_label + cmp [current_locals_prefix],0 + je standard_label + push edi + mov edi,[additional_memory_end] + sub edi,2 + sub edi,ecx + push ecx esi + mov esi,[current_locals_prefix] + lods byte [esi] + movzx ecx,al + sub edi,ecx + cmp edi,[free_additional_memory] + jb out_of_memory + mov word [edi],0 + add edi,2 + mov ebx,edi + rep movs byte [edi],[esi] + pop esi ecx + add al,cl + jc name_too_long + rep movs byte [edi],[esi] + pop edi + push ebx esi + movzx ecx,al + mov byte [ebx-1],al + mov esi,ebx + call get_label_id + pop esi ebx + cmp ebx,[eax+24] + jne composed_label_id_ok + lea edx,[ebx-2] + mov [additional_memory_end],edx + composed_label_id_ok: + ret + anonymous_label: + cmp ecx,2 + jne standard_label + mov al,[esi+1] + mov ebx,characters + xlat byte [ebx] + cmp al,'@' + je new_anonymous + cmp al,'b' + je anonymous_back + cmp al,'r' + je anonymous_back + cmp al,'f' + jne standard_label + add esi,2 + mov eax,[anonymous_forward] + or eax,eax + jnz anonymous_ok + mov eax,[current_line] + mov [error_line],eax + call allocate_label + mov [anonymous_forward],eax + anonymous_ok: + xor ebx,ebx + ret + anonymous_back: + add esi,2 + mov eax,[anonymous_reverse] + or eax,eax + jz invalid_value + jmp anonymous_ok + new_anonymous: + add esi,2 + mov eax,[anonymous_forward] + or eax,eax + jnz new_anonymous_ok + call allocate_label + new_anonymous_ok: + mov [anonymous_reverse],eax + mov [anonymous_forward],0 + jmp anonymous_ok + standard_label: + cmp byte [esi],'%' + je get_predefined_id + cmp byte [esi],'$' + jne find_label + cmp ecx,2 + ja find_label + inc esi + jb get_current_offset_id + inc esi + cmp byte [esi-1],'$' + je get_org_origin_id + sub esi,ecx + jmp find_label + get_current_offset_id: + xor eax,eax + ret + get_counter_id: + mov eax,1 + ret + get_timestamp_id: + mov eax,2 + ret + get_org_origin_id: + mov eax,3 + ret + get_predefined_id: + cmp ecx,2 + ja find_label + inc esi + cmp cl,1 + je get_counter_id + lods byte [esi] + mov ebx,characters + xlat [ebx] + cmp al,'t' + je get_timestamp_id + sub esi,2 + find_label: + xor ebx,ebx + mov eax,2166136261 + mov ebp,16777619 + hash_label: + xor al,[esi+ebx] + mul ebp + inc bl + cmp bl,cl + jb hash_label + mov ebp,eax + shl eax,8 + and ebp,0FFh shl 24 + xor ebp,eax + or ebp,ebx + mov [label_hash],ebp + push edi esi + push ecx + mov ecx,32 + mov ebx,hash_tree + follow_tree: + mov edx,[ebx] + or edx,edx + jz extend_tree + xor eax,eax + shl ebp,1 + adc eax,0 + lea ebx,[edx+eax*4] + dec ecx + jnz follow_tree + mov [label_leaf],ebx + pop edx + mov eax,[ebx] + or eax,eax + jz add_label + mov ebx,esi + mov ebp,[label_hash] + compare_labels: + mov esi,ebx + mov ecx,edx + mov edi,[eax+4] + mov edi,[edi+24] + repe cmps byte [esi],[edi] + je label_found + mov eax,[eax] + or eax,eax + jnz compare_labels + jmp add_label + label_found: + add esp,4 + pop edi + mov eax,[eax+4] + ret + extend_tree: + mov edx,[free_additional_memory] + lea eax,[edx+8] + cmp eax,[additional_memory_end] + ja out_of_memory + mov [free_additional_memory],eax + xor eax,eax + mov [edx],eax + mov [edx+4],eax + shl ebp,1 + adc eax,0 + mov [ebx],edx + lea ebx,[edx+eax*4] + dec ecx + jnz extend_tree + mov [label_leaf],ebx + pop edx + add_label: + mov ecx,edx + pop esi + cmp byte [esi-2],0 + je label_name_ok + mov al,[esi] + cmp al,30h + jb name_first_char_ok + cmp al,39h + jbe invalid_name + name_first_char_ok: + cmp ecx,1 + jne check_for_reserved_word + cmp al,'$' + je reserved_word + check_for_reserved_word: + call get_instruction + jnc reserved_word + call get_data_directive + jnc reserved_word + call get_symbol + jnc reserved_word + sub esi,2 + mov edi,operators + call get_operator + or al,al + jnz reserved_word + mov edi,single_operand_operators + call get_operator + or al,al + jnz reserved_word + mov edi,directive_operators + call get_operator + or al,al + jnz reserved_word + inc esi + movzx ecx,byte [esi] + inc esi + label_name_ok: + mov edx,[free_additional_memory] + lea eax,[edx+8] + cmp eax,[additional_memory_end] + ja out_of_memory + mov [free_additional_memory],eax + mov ebx,esi + add esi,ecx + mov eax,[label_leaf] + mov edi,[eax] + mov [edx],edi + mov [eax],edx + call allocate_label + mov [edx+4],eax + mov [eax+24],ebx + pop edi + ret + reserved_word: + mov eax,0Fh + pop edi + ret + allocate_label: + mov eax,[labels_list] + mov ecx,LABEL_STRUCTURE_SIZE shr 2 + initialize_label: + sub eax,4 + mov dword [eax],0 + loop initialize_label + mov [labels_list],eax + ret + +LABEL_STRUCTURE_SIZE = 32 diff --git a/programs/develop/fasm/trunk/preproce.inc b/programs/develop/fasm/trunk/preproce.inc new file mode 100644 index 0000000000..948d2ae474 --- /dev/null +++ b/programs/develop/fasm/trunk/preproce.inc @@ -0,0 +1,2488 @@ + +; flat assembler core +; Copyright (c) 1999-2006, Tomasz Grysztar. +; All rights reserved. + +preprocessor: + mov edi,characters + mov ecx,100h + xor al,al + make_characters_table: + stosb + inc al + loop make_characters_table + mov esi,characters+'a' + mov edi,characters+'A' + mov ecx,26 + rep movsb + mov edi,characters + mov esi,symbol_characters+1 + movzx ecx,byte [esi-1] + xor eax,eax + mark_symbol_characters: + lodsb + mov byte [edi+eax],0 + loop mark_symbol_characters + mov edi,locals_counter + mov al,7 + stos byte [edi] + movzx ecx,al + mov al,'0' + rep stos byte [edi] + mov edi,[memory_start] + mov [include_paths],edi + mov esi,include_variable + call get_environment_variable + xor al,al + stosb + mov [memory_start],edi + mov eax,[additional_memory] + mov [free_additional_memory],eax + mov eax,[additional_memory_end] + mov [labels_list],eax + xor eax,eax + mov [display_buffer],eax + mov [hash_tree],eax + mov [macro_status],al + mov esi,[input_file] + mov edx,esi + call open + jc main_file_not_found + mov edi,[memory_start] + call preprocess_file + mov eax,[error_line] + mov [current_line],eax + cmp [macro_status],0 + jne incomplete_macro + mov [source_start],edi + ret + +preprocess_file: + push [memory_end] + push esi + mov al,2 + xor edx,edx + call lseek + push eax + xor al,al + xor edx,edx + call lseek + pop ecx + mov edx,[memory_end] + dec edx + mov byte [edx],1Ah + sub edx,ecx + jc out_of_memory + mov esi,edx + cmp edx,edi + jbe out_of_memory + mov [memory_end],edx + call read + call close + pop edx + xor ecx,ecx + mov ebx,esi + preprocess_source: + inc ecx + mov [current_line],edi + mov eax,edx + stos dword [edi] + mov eax,ecx + stos dword [edi] + mov eax,esi + sub eax,ebx + stos dword [edi] + xor eax,eax + stos dword [edi] + push ebx edx + call convert_line + call preprocess_line + pop edx ebx + next_line: + cmp byte [esi-1],1Ah + jne preprocess_source + file_end: + pop [memory_end] + clc + ret + +convert_line: + push ecx + test [macro_status],0Fh + jz convert_line_data + mov ax,3Bh + stos word [edi] + convert_line_data: + cmp edi,[memory_end] + jae out_of_memory + lods byte [esi] + cmp al,20h + je convert_line_data + cmp al,9 + je convert_line_data + mov ah,al + mov ebx,characters + xlat byte [ebx] + or al,al + jz convert_separator + cmp ah,27h + je convert_string + cmp ah,22h + je convert_string + mov byte [edi],1Ah + scas word [edi] + xchg al,ah + stos byte [edi] + mov ebx,characters + xor ecx,ecx + convert_symbol: + lods byte [esi] + stos byte [edi] + xlat byte [ebx] + or al,al + loopnzd convert_symbol + neg ecx + cmp ecx,255 + ja name_too_long + mov ebx,edi + sub ebx,ecx + mov byte [ebx-2],cl + found_separator: + dec edi + mov ah,[esi-1] + convert_separator: + xchg al,ah + cmp al,20h + jb control_character + je convert_line_data + symbol_character: + cmp al,3Bh + je ignore_comment + cmp al,5Ch + je backslash_character + stos byte [edi] + jmp convert_line_data + control_character: + cmp al,1Ah + je line_end + cmp al,0Dh + je cr_character + cmp al,0Ah + je lf_character + cmp al,9 + je convert_line_data + or al,al + jnz symbol_character + jmp line_end + lf_character: + lods byte [esi] + cmp al,0Dh + je line_end + dec esi + jmp line_end + cr_character: + lods byte [esi] + cmp al,0Ah + je line_end + dec esi + jmp line_end + convert_string: + mov al,22h + stos byte [edi] + scas dword [edi] + mov ebx,edi + copy_string: + lods byte [esi] + stos byte [edi] + cmp al,0Ah + je missing_end_quote + cmp al,0Dh + je missing_end_quote + or al,al + jz missing_end_quote + cmp al,1Ah + je missing_end_quote + cmp al,ah + jne copy_string + lods byte [esi] + cmp al,ah + je copy_string + dec esi + dec edi + mov eax,edi + sub eax,ebx + mov [ebx-4],eax + jmp convert_line_data + backslash_character: + mov byte [edi],0 + lods byte [esi] + cmp al,20h + je concatenate_lines + cmp al,9 + je concatenate_lines + cmp al,1Ah + je unexpected_end_of_file + cmp al,0Ah + je concatenate_lf + cmp al,0Dh + je concatenate_cr + cmp al,3Bh + je find_concatenated_line + mov al,1Ah + stos byte [edi] + mov ecx,edi + mov ax,5C01h + stos word [edi] + dec esi + group_backslashes: + lods byte [esi] + cmp al,5Ch + jne backslashed_symbol + stos byte [edi] + inc byte [ecx] + jmp group_backslashes + backslashed_symbol: + cmp al,1Ah + je unexpected_end_of_file + cmp al,0Ah + je extra_characters_on_line + cmp al,0Dh + je extra_characters_on_line + cmp al,20h + je extra_characters_on_line + cmp al,9 + je extra_characters_on_line + cmp al,22h + je extra_characters_on_line + cmp al,27h + je extra_characters_on_line + cmp al,3Bh + je extra_characters_on_line + mov ah,al + mov ebx,characters + xlat byte [ebx] + or al,al + jz backslashed_symbol_character + mov al,ah + convert_backslashed_symbol: + stos byte [edi] + xlat byte [ebx] + or al,al + jz found_separator + inc byte [ecx] + jz name_too_long + lods byte [esi] + jmp convert_backslashed_symbol + backslashed_symbol_character: + mov al,ah + stos byte [edi] + inc byte [ecx] + jmp convert_line_data + concatenate_lines: + lods byte [esi] + cmp al,20h + je concatenate_lines + cmp al,9 + je concatenate_lines + cmp al,1Ah + je unexpected_end_of_file + cmp al,0Ah + je concatenate_lf + cmp al,0Dh + je concatenate_cr + cmp al,3Bh + jne extra_characters_on_line + find_concatenated_line: + lods byte [esi] + cmp al,0Ah + je concatenate_lf + cmp al,0Dh + je concatenate_cr + or al,al + jz concatenate_ok + cmp al,1Ah + jne find_concatenated_line + jmp unexpected_end_of_file + concatenate_lf: + lods byte [esi] + cmp al,0Dh + je concatenate_ok + dec esi + jmp concatenate_ok + concatenate_cr: + lods byte [esi] + cmp al,0Ah + je concatenate_ok + dec esi + concatenate_ok: + inc dword [esp] + jmp convert_line_data + ignore_comment: + lods byte [esi] + cmp al,0Ah + je lf_character + cmp al,0Dh + je cr_character + or al,al + jz line_end + cmp al,1Ah + jne ignore_comment + line_end: + xor al,al + stos byte [edi] + pop ecx + ret + +lower_case: + mov edi,converted + mov ebx,characters + convert_case: + lods byte [esi] + xlat byte [ebx] + stos byte [edi] + loop convert_case + case_ok: + ret + +get_directive: + push edi + mov edx,esi + mov ebp,ecx + call lower_case + pop edi + scan_directives: + mov esi,converted + movzx eax,byte [edi] + or al,al + jz no_directive + mov ecx,ebp + inc edi + mov ebx,edi + add ebx,eax + mov ah,[esi] + cmp ah,[edi] + jb no_directive + ja next_directive + cmp cl,al + jne next_directive + repe cmps byte [esi],[edi] + jb no_directive + je directive_ok + next_directive: + mov edi,ebx + add edi,2 + jmp scan_directives + no_directive: + mov esi,edx + mov ecx,ebp + stc + ret + directive_ok: + lea esi,[edx+ebp] + movzx eax,word [ebx] + add eax,preprocessor + clc + ret + + +preprocess_line: + mov eax,esp + sub eax,100h + jc stack_overflow + cmp eax,[stack_limit] + jb stack_overflow + push ecx esi + preprocess_current_line: + mov esi,[current_line] + add esi,16 + cmp word [esi],3Bh + jne line_start_ok + add esi,2 + line_start_ok: + test [macro_status],0F0h + jnz macro_preprocessing + cmp byte [esi],1Ah + jne not_fix_constant + movzx edx,byte [esi+1] + lea edx,[esi+2+edx] + cmp word [edx],031Ah + jne not_fix_constant + mov ebx,characters + movzx eax,byte [edx+2] + xlat byte [ebx] + ror eax,8 + mov al,[edx+3] + xlat byte [ebx] + ror eax,8 + mov al,[edx+4] + xlat byte [ebx] + ror eax,16 + cmp eax,'fix' + je define_fix_constant + not_fix_constant: + call process_fix_constants + jmp initial_preprocessing_ok + macro_preprocessing: + call process_macro_operators + initial_preprocessing_ok: + mov esi,[current_line] + add esi,16 + mov al,[macro_status] + test al,2 + jnz skip_macro_block + test al,1 + jnz find_macro_block + preprocess_instruction: + mov [current_offset],esi + lods byte [esi] + movzx ecx,byte [esi] + inc esi + cmp al,1Ah + jne not_preprocessor_symbol + cmp cl,3 + jb not_preprocessor_directive + push edi + mov edi,preprocessor_directives + call get_directive + pop edi + jc not_preprocessor_directive + mov byte [edx-2],3Bh + jmp near eax + not_preprocessor_directive: + xor ch,ch + call get_preprocessor_symbol + jc not_macro + mov byte [ebx-2],3Bh + mov [struc_name],0 + jmp use_macro + not_macro: + mov [struc_name],esi + add esi,ecx + lods byte [esi] + cmp al,':' + je preprocess_label + cmp al,1Ah + jne not_preprocessor_symbol + lods byte [esi] + cmp al,3 + jne not_symbolic_constant + mov ebx,characters + movzx eax,byte [esi] + xlat byte [ebx] + ror eax,8 + mov al,[esi+1] + xlat byte [ebx] + ror eax,8 + mov al,[esi+2] + xlat byte [ebx] + ror eax,16 + cmp eax,'equ' + je define_equ_constant + mov al,3 + not_symbolic_constant: + mov ch,1 + mov cl,al + call get_preprocessor_symbol + jc not_preprocessor_symbol + push edx esi + mov esi,[struc_name] + mov [struc_label],esi + sub [struc_label],2 + mov cl,[esi-1] + mov ch,10b + call get_preprocessor_symbol + jc struc_name_ok + mov ecx,[edx+12] + add ecx,3 + lea ebx,[edi+ecx] + mov ecx,edi + sub ecx,[struc_label] + lea esi,[edi-1] + lea edi,[ebx-1] + std + rep movs byte [edi],[esi] + cld + mov edi,[struc_label] + mov esi,[edx+8] + mov ecx,[edx+12] + add [struc_name],ecx + add [struc_name],3 + call move_data + mov al,3Ah + stos byte [edi] + mov ax,3Bh + stos word [edi] + mov edi,ebx + pop esi + add esi,[edx+12] + add esi,3 + pop edx + jmp use_macro + struc_name_ok: + mov edx,[struc_name] + movzx eax,byte [edx-1] + add edx,eax + mov al,3Ah + mov [edx],al + inc al + xchg al,[edx+1] + dec al + mov [edx+2],al + pop esi edx + jmp use_macro + preprocess_label: + dec esi + sub esi,ecx + lea ebp,[esi-2] + mov ch,10b + call get_preprocessor_symbol + jnc symbolic_constant_in_label + lea esi,[esi+ecx+1] + jmp preprocess_instruction + symbolic_constant_in_label: + mov ebx,[edx+8] + mov ecx,[edx+12] + add ecx,ebx + check_for_broken_label: + cmp ebx,ecx + je label_broken + cmp byte [ebx],1Ah + jne label_broken + movzx eax,byte [ebx+1] + lea ebx,[ebx+2+eax] + cmp ebx,ecx + je label_constant_ok + cmp byte [ebx],':' + jne label_broken + inc ebx + jmp check_for_broken_label + label_broken: + push line_preprocessed + jmp replace_symbolic_constant + label_constant_ok: + mov ecx,edi + sub ecx,esi + mov edi,[edx+12] + add edi,ebp + push edi + lea eax,[edi+ecx] + push eax + cmp esi,edi + je replace_label + jb move_rest_of_line_up + rep movs byte [edi],[esi] + jmp replace_label + move_rest_of_line_up: + lea esi,[esi+ecx-1] + lea edi,[edi+ecx-1] + std + rep movs byte [edi],[esi] + cld + replace_label: + mov ecx,[edx+12] + mov edi,[esp+4] + sub edi,ecx + mov esi,[edx+8] + rep movs byte [edi],[esi] + pop edi esi + inc esi + jmp preprocess_instruction + not_preprocessor_symbol: + mov esi,[current_offset] + call process_equ_constants + line_preprocessed: + pop esi ecx + ret + +get_preprocessor_symbol: + push ebp edi esi + mov ebp,ecx + shl ebp,22 + movzx ecx,cl + mov ebx,hash_tree + mov edi,10 + follow_hashes_roots: + mov edx,[ebx] + or edx,edx + jz preprocessor_symbol_not_found + xor eax,eax + shl ebp,1 + adc eax,0 + lea ebx,[edx+eax*4] + dec edi + jnz follow_hashes_roots + mov edi,ebx + call calculate_hash + mov ebp,eax + and ebp,3FFh + shl ebp,10 + xor ebp,eax + mov ebx,edi + mov edi,22 + follow_hashes_tree: + mov edx,[ebx] + or edx,edx + jz preprocessor_symbol_not_found + xor eax,eax + shl ebp,1 + adc eax,0 + lea ebx,[edx+eax*4] + dec edi + jnz follow_hashes_tree + mov al,cl + mov edx,[ebx] + or edx,edx + jz preprocessor_symbol_not_found + compare_with_preprocessor_symbol: + mov edi,[edx+4] + cmp edi,1 + jbe next_equal_hash + repe cmps byte [esi],[edi] + je preprocessor_symbol_found + mov cl,al + mov esi,[esp] + next_equal_hash: + mov edx,[edx] + or edx,edx + jnz compare_with_preprocessor_symbol + preprocessor_symbol_not_found: + pop esi edi ebp + stc + ret + preprocessor_symbol_found: + pop ebx edi ebp + clc + ret + calculate_hash: + xor ebx,ebx + mov eax,2166136261 + mov ebp,16777619 + fnv1a_hash: + xor al,[esi+ebx] + mul ebp + inc bl + cmp bl,cl + jb fnv1a_hash + ret +add_preprocessor_symbol: + push edi esi + call calculate_hash + mov ebp,eax + and ebp,3FFh + shr eax,10 + xor ebp,eax + shl ecx,22 + or ebp,ecx + mov ebx,hash_tree + mov ecx,32 + find_leave_for_symbol: + mov edx,[ebx] + or edx,edx + jz extend_hashes_tree + xor eax,eax + rol ebp,1 + adc eax,0 + lea ebx,[edx+eax*4] + dec ecx + jnz find_leave_for_symbol + mov edx,[ebx] + or edx,edx + jz add_symbol_entry + shr ebp,30 + cmp ebp,11b + je reuse_symbol_entry + cmp dword [edx+4],0 + jne add_symbol_entry + find_entry_to_reuse: + mov edi,[edx] + or edi,edi + jz reuse_symbol_entry + cmp dword [edi+4],0 + jne reuse_symbol_entry + mov edx,edi + jmp find_entry_to_reuse + add_symbol_entry: + mov eax,edx + mov edx,[labels_list] + sub edx,16 + cmp edx,[free_additional_memory] + jb out_of_memory + mov [labels_list],edx + mov [edx],eax + mov [ebx],edx + reuse_symbol_entry: + pop esi edi + mov [edx+4],esi + ret + extend_hashes_tree: + mov edx,[labels_list] + sub edx,8 + cmp edx,[free_additional_memory] + jb out_of_memory + mov [labels_list],edx + xor eax,eax + mov [edx],eax + mov [edx+4],eax + shl ebp,1 + adc eax,0 + mov [ebx],edx + lea ebx,[edx+eax*4] + dec ecx + jnz extend_hashes_tree + mov edx,[labels_list] + sub edx,16 + cmp edx,[free_additional_memory] + jb out_of_memory + mov [labels_list],edx + mov dword [edx],0 + mov [ebx],edx + pop esi edi + mov [edx+4],esi + ret + +define_fix_constant: + add edx,5 + add esi,2 + push edx esi + mov esi,edx + call skip_parameters + xchg esi,[esp] + mov ch,11b + jmp define_preprocessor_constant +define_equ_constant: + add esi,3 + push esi + call process_equ_constants + push esi + mov esi,[struc_name] + mov ch,10b + define_preprocessor_constant: + mov byte [esi-2],3Bh + mov cl,[esi-1] + call add_preprocessor_symbol + pop esi ebx + mov ecx,edi + dec ecx + sub ecx,ebx + mov [edx+8],ebx + mov [edx+12],ecx + jmp line_preprocessed +define_symbolic_constant: + lods byte [esi] + cmp al,1Ah + jne invalid_name + lods byte [esi] + mov cl,al + mov ch,10b + call add_preprocessor_symbol + movzx eax,byte [esi-1] + add esi,eax + push esi edx + call skip_parameters + pop edx ebx + lea ecx,[esi-1] + sub ecx,ebx + mov [edx+8],ebx + mov [edx+12],ecx + jmp line_preprocessed + skip_parameters: + lods byte [esi] + or al,al + jz parameters_skipped + cmp al,'{' + je parameters_skipped + cmp al,22h + je skip_quoted_parameter + cmp al,1Ah + jne skip_parameters + lods byte [esi] + movzx eax,al + add esi,eax + jmp skip_parameters + skip_quoted_parameter: + lods dword [esi] + add esi,eax + jmp skip_parameters + parameters_skipped: + ret + +define_struc: + mov ch,1 + jmp make_macro +define_macro: + xor ch,ch + make_macro: + lods byte [esi] + cmp al,1Ah + jne invalid_name + lods byte [esi] + mov cl,al + call add_preprocessor_symbol + mov eax,[current_line] + mov [edx+12],eax + movzx eax,byte [esi-1] + add esi,eax + mov [edx+8],esi + mov al,[macro_status] + and al,0F0h + or al,1 + mov [macro_status],al + mov eax,[current_line] + mov [error_line],eax + xor bl,bl + lods byte [esi] + or al,al + jz line_preprocessed + cmp al,'{' + je found_macro_block + dec esi + skip_macro_arguments: + lods byte [esi] + cmp al,1Ah + je skip_macro_argument + cmp al,'[' + jne invalid_macro_arguments + xor bl,-1 + jz invalid_macro_arguments + lods byte [esi] + cmp al,1Ah + jne invalid_macro_arguments + skip_macro_argument: + movzx eax,byte [esi] + inc esi + add esi,eax + lods byte [esi] + cmp al,'*' + jne macro_argument_end + lods byte [esi] + macro_argument_end: + cmp al,',' + je skip_macro_arguments + cmp al,']' + jne end_macro_arguments + lods byte [esi] + not bl + end_macro_arguments: + or bl,bl + jnz invalid_macro_arguments + or al,al + jz line_preprocessed + cmp al,'{' + je found_macro_block + jmp invalid_macro_arguments + find_macro_block: + add esi,2 + lods byte [esi] + or al,al + jz line_preprocessed + cmp al,'{' + jne unexpected_characters + found_macro_block: + or [macro_status],2 + skip_macro_block: + lods byte [esi] + cmp al,1Ah + je skip_macro_symbol + cmp al,3Bh + je skip_macro_symbol + cmp al,22h + je skip_macro_string + or al,al + jz line_preprocessed + cmp al,'}' + jne skip_macro_block + mov al,[macro_status] + and [macro_status],0F0h + test al,8 + jnz use_instant_macro + cmp byte [esi],0 + je line_preprocessed + mov ecx,edi + sub ecx,esi + mov edx,esi + lea esi,[esi+ecx-1] + lea edi,[edi+1+16] + mov ebx,edi + dec edi + std + rep movs byte [edi],[esi] + cld + mov edi,edx + xor al,al + stos byte [edi] + mov esi,[current_line] + mov [current_line],edi + mov ecx,4 + rep movs dword [edi],[esi] + mov edi,ebx + jmp preprocess_current_line + skip_macro_symbol: + movzx eax,byte [esi] + inc esi + add esi,eax + jmp skip_macro_block + skip_macro_string: + lods dword [esi] + add esi,eax + jmp skip_macro_block +rept_directive: + mov [base_code],0 + jmp define_instant_macro +irp_directive: + mov [base_code],1 + jmp define_instant_macro +irps_directive: + mov [base_code],2 + jmp define_instant_macro +match_directive: + mov [base_code],10h +define_instant_macro: + mov al,[macro_status] + and al,0F0h + or al,8+1 + mov [macro_status],al + mov eax,[current_line] + mov [error_line],eax + mov [instant_macro_start],esi + cmp [base_code],10h + je prepare_match + call skip_parameters + instant_macro_parameters_skipped: + dec esi + mov [parameters_end],esi + lods byte [esi] + cmp al,'{' + je found_macro_block + or al,al + jnz invalid_macro_arguments + jmp line_preprocessed +prepare_match: + call skip_pattern + mov [value_type],80h+10b + call process_symbolic_constants + jmp instant_macro_parameters_skipped + skip_pattern: + lods byte [esi] + or al,al + jz invalid_macro_arguments + cmp al,',' + je pattern_skipped + cmp al,22h + je skip_quoted_string_in_pattern + cmp al,1Ah + je skip_symbol_in_pattern + cmp al,'=' + jne skip_pattern + mov al,[esi] + cmp al,1Ah + je skip_pattern + cmp al,22h + je skip_pattern + inc esi + jmp skip_pattern + skip_symbol_in_pattern: + lods byte [esi] + movzx eax,al + add esi,eax + jmp skip_pattern + skip_quoted_string_in_pattern: + lods dword [esi] + add esi,eax + jmp skip_pattern + pattern_skipped: + ret + +purge_macro: + xor ch,ch + jmp restore_preprocessor_symbol +purge_struc: + mov ch,1 + jmp restore_preprocessor_symbol +restore_equ_constant: + mov ch,10b + restore_preprocessor_symbol: + push ecx + lods byte [esi] + cmp al,1Ah + jne invalid_name + lods byte [esi] + mov cl,al + call get_preprocessor_symbol + jc no_symbol_to_restore + mov dword [edx+4],0 + jmp symbol_restored + no_symbol_to_restore: + add esi,ecx + symbol_restored: + pop ecx + lods byte [esi] + cmp al,',' + je restore_preprocessor_symbol + or al,al + jnz extra_characters_on_line + jmp line_preprocessed + +process_fix_constants: + mov [value_type],11b + jmp process_symbolic_constants +process_equ_constants: + mov [value_type],10b + process_symbolic_constants: + mov ebp,esi + lods byte [esi] + cmp al,1Ah + je check_symbol + cmp al,22h + je ignore_string + cmp al,'{' + je check_brace + or al,al + jnz process_symbolic_constants + ret + ignore_string: + lods dword [esi] + add esi,eax + jmp process_symbolic_constants + check_brace: + test [value_type],80h + jz process_symbolic_constants + ret + no_replacing: + movzx ecx,byte [esi-1] + add esi,ecx + jmp process_symbolic_constants + check_symbol: + mov cl,[esi] + inc esi + mov ch,[value_type] + call get_preprocessor_symbol + jc no_replacing + mov [current_section],edi + replace_symbolic_constant: + mov ecx,[edx+12] + mov edx,[edx+8] + xchg esi,edx + call move_data + mov esi,edx + process_after_replaced: + lods byte [esi] + cmp al,1Ah + je symbol_after_replaced + stos byte [edi] + cmp al,22h + je string_after_replaced + cmp al,'{' + je brace_after_replaced + or al,al + jnz process_after_replaced + mov ecx,edi + sub ecx,esi + mov edi,ebp + call move_data + mov esi,edi + ret + move_data: + lea eax,[edi+ecx] + cmp eax,[memory_end] + jae out_of_memory + shr ecx,1 + jnc movsb_ok + movs byte [edi],[esi] + movsb_ok: + shr ecx,1 + jnc movsw_ok + movs word [edi],[esi] + movsw_ok: + rep movs dword [edi],[esi] + ret + string_after_replaced: + lods dword [esi] + stos dword [edi] + mov ecx,eax + call move_data + jmp process_after_replaced + brace_after_replaced: + test [value_type],80h + jz process_after_replaced + mov edx,edi + mov ecx,[current_section] + sub edx,ecx + sub ecx,esi + rep movs byte [edi],[esi] + mov ecx,edi + sub ecx,esi + mov edi,ebp + call move_data + lea esi,[ebp+edx] + ret + symbol_after_replaced: + mov cl,[esi] + inc esi + mov ch,[value_type] + call get_preprocessor_symbol + jnc replace_symbolic_constant + movzx ecx,byte [esi-1] + mov al,1Ah + mov ah,cl + stos word [edi] + call move_data + jmp process_after_replaced +process_macro_operators: + xor dl,dl + mov ebp,edi + before_macro_operators: + mov edi,esi + lods byte [esi] + cmp al,'`' + je symbol_conversion + cmp al,'#' + je concatenation + cmp al,1Ah + je symbol_before_macro_operators + cmp al,3Bh + je no_more_macro_operators + cmp al,22h + je string_before_macro_operators + xor dl,dl + or al,al + jnz before_macro_operators + mov edi,esi + ret + no_more_macro_operators: + mov edi,ebp + ret + symbol_before_macro_operators: + mov dl,1Ah + mov ebx,esi + lods byte [esi] + movzx ecx,al + jecxz symbol_before_macro_operators_ok + mov edi,esi + cmp byte [esi],'\' + je escaped_symbol + symbol_before_macro_operators_ok: + add esi,ecx + jmp before_macro_operators + string_before_macro_operators: + mov dl,22h + mov ebx,esi + lods dword [esi] + add esi,eax + jmp before_macro_operators + escaped_symbol: + dec byte [edi-1] + dec ecx + inc esi + cmp ecx,1 + rep movs byte [edi],[esi] + jne after_macro_operators + mov al,[esi-1] + mov ecx,ebx + mov ebx,characters + xlat byte [ebx] + mov ebx,ecx + or al,al + jnz after_macro_operators + sub edi,3 + mov al,[esi-1] + stos byte [edi] + xor dl,dl + jmp after_macro_operators + reduce_symbol_conversion: + inc esi + symbol_conversion: + mov edx,esi + mov al,[esi] + cmp al,1Ah + jne symbol_character_conversion + lods word [esi] + movzx ecx,ah + lea ebx,[edi+3] + jmp convert_to_quoted_string + symbol_character_conversion: + cmp al,22h + je after_macro_operators + cmp al,'`' + je reduce_symbol_conversion + lea ebx,[edi+5] + xor ecx,ecx + or al,al + jz convert_to_quoted_string + cmp al,'#' + je convert_to_quoted_string + inc ecx + convert_to_quoted_string: + sub ebx,edx + ja shift_line_data + mov al,22h + mov dl,al + stos byte [edi] + mov ebx,edi + mov eax,ecx + stos dword [edi] + rep movs byte [edi],[esi] + cmp edi,esi + je before_macro_operators + jmp after_macro_operators + shift_line_data: + push ecx + mov edx,esi + lea esi,[ebp-1] + add ebp,ebx + lea edi,[ebp-1] + lea ecx,[esi+1] + sub ecx,edx + std + rep movs byte [edi],[esi] + cld + pop eax + sub edi,3 + mov dl,22h + mov [edi-1],dl + mov ebx,edi + mov [edi],eax + lea esi,[edi+4+eax] + jmp before_macro_operators + concatenation: + cmp dl,1Ah + je symbol_concatenation + cmp dl,22h + je string_concatenation + no_concatenation: + cmp esi,edi + je before_macro_operators + jmp after_macro_operators + symbol_concatenation: + cmp byte [esi],1Ah + jne no_concatenation + inc esi + lods byte [esi] + movzx ecx,al + jecxz do_symbol_concatenation + cmp byte [esi],'\' + jne do_symbol_concatenation + sub esi,2 + jmp no_concatenation + do_symbol_concatenation: + add [ebx],al + jc name_too_long + rep movs byte [edi],[esi] + jmp after_macro_operators + string_concatenation: + cmp byte [esi],22h + je do_string_concatenation + cmp byte [esi],'`' + jne no_concatenation + concatenate_converted_symbol: + inc esi + mov al,[esi] + cmp al,'`' + je concatenate_converted_symbol + cmp al,22h + je do_string_concatenation + cmp al,1Ah + jne concatenate_converted_symbol_character + inc esi + lods byte [esi] + movzx ecx,al + add [ebx],ecx + rep movs byte [edi],[esi] + jmp after_macro_operators + concatenate_converted_symbol_character: + or al,al + jz after_macro_operators + cmp al,'#' + je after_macro_operators + inc dword [ebx] + movs byte [edi],[esi] + jmp after_macro_operators + do_string_concatenation: + inc esi + lods dword [esi] + mov ecx,eax + add [ebx],eax + rep movs byte [edi],[esi] + after_macro_operators: + lods byte [esi] + cmp al,'`' + je symbol_conversion + cmp al,'#' + je concatenation + stos byte [edi] + cmp al,1Ah + je symbol_after_macro_operators + cmp al,3Bh + je no_more_macro_operators + cmp al,22h + je string_after_macro_operators + xor dl,dl + or al,al + jnz after_macro_operators + ret + symbol_after_macro_operators: + mov dl,1Ah + mov ebx,edi + lods byte [esi] + stos byte [edi] + movzx ecx,al + jecxz symbol_after_macro_operatorss_ok + cmp byte [esi],'\' + je escaped_symbol + symbol_after_macro_operatorss_ok: + rep movs byte [edi],[esi] + jmp after_macro_operators + string_after_macro_operators: + mov dl,22h + mov ebx,edi + lods dword [esi] + stos dword [edi] + mov ecx,eax + rep movs byte [edi],[esi] + jmp after_macro_operators + +use_macro: + push [free_additional_memory] + push [macro_symbols] + mov [macro_symbols],0 + push [counter_limit] + push dword [edx+4] + mov dword [edx+4],1 + push edx + mov ebx,esi + mov esi,[edx+8] + mov eax,[edx+12] + mov [macro_line],eax + mov [counter_limit],0 + process_macro_arguments: + mov al,[esi] + or al,al + jz arguments_end + cmp al,'{' + je arguments_end + inc esi + cmp al,'[' + jne get_macro_arguments + mov ebp,esi + inc esi + inc [counter_limit] + get_macro_arguments: + call get_macro_argument + lods byte [esi] + cmp al,',' + je next_argument + cmp al,']' + je next_arguments_group + dec esi + jmp arguments_end + next_argument: + cmp byte [ebx],',' + jne process_macro_arguments + inc ebx + jmp process_macro_arguments + next_arguments_group: + cmp byte [ebx],',' + jne arguments_end + inc ebx + inc [counter_limit] + mov esi,ebp + jmp process_macro_arguments + get_macro_argument: + lods byte [esi] + movzx ecx,al + mov eax,[counter_limit] + call add_macro_symbol + add esi,ecx + xchg esi,ebx + mov [edx+12],esi + cmp byte [esi],'<' + jne simple_argument + inc esi + mov [edx+12],esi + mov ecx,1 + enclosed_argument: + lods byte [esi] + or al,al + jz invalid_macro_arguments + cmp al,1Ah + je enclosed_symbol + cmp al,22h + je enclosed_string + cmp al,'>' + je enclosed_argument_end + cmp al,'<' + jne enclosed_argument + inc ecx + jmp enclosed_argument + enclosed_symbol: + movzx eax,byte [esi] + inc esi + add esi,eax + jmp enclosed_argument + enclosed_string: + lods dword [esi] + add esi,eax + jmp enclosed_argument + enclosed_argument_end: + loop enclosed_argument + mov al,[esi] + or al,al + jz enclosed_argument_ok + cmp al,',' + jne invalid_macro_arguments + enclosed_argument_ok: + mov eax,esi + sub eax,[edx+12] + dec eax + or eax,80000000h + mov [edx+8],eax + jmp argument_value_ok + simple_argument: + lods byte [esi] + or al,al + jz argument_value_end + cmp al,',' + je argument_value_end + cmp al,22h + je argument_string + cmp al,1Ah + jne simple_argument + movzx eax,byte [esi] + inc esi + add esi,eax + jmp simple_argument + argument_string: + lods dword [esi] + add esi,eax + jmp simple_argument + argument_value_end: + dec esi + mov eax,esi + sub eax,[edx+12] + mov [edx+8],eax + argument_value_ok: + xchg esi,ebx + cmp byte [esi],'*' + jne macro_argument_ok + cmp dword [edx+8],0 + je invalid_macro_arguments + inc esi + macro_argument_ok: + ret + arguments_end: + cmp byte [ebx],0 + jne invalid_macro_arguments + mov eax,[esp+4] + dec eax + call process_macro + pop edx + pop dword [edx+4] + pop [counter_limit] + pop [macro_symbols] + pop [free_additional_memory] + jmp line_preprocessed +use_instant_macro: + push edi [current_line] esi + mov eax,[error_line] + mov [current_line],eax + mov [macro_line],eax + mov esi,[instant_macro_start] + cmp [base_code],10h + jae do_match + cmp [base_code],0 + jne do_irp + call get_number + jc invalid_value + or ebp,ebp + jnz invalid_value + cmp dword [edi+4],0 + jne value_out_of_range + mov eax,[edi] + or eax,eax + jz instant_macro_done + cmp eax,80000000h + jae value_out_of_range + push [free_additional_memory] + push [macro_symbols] + mov [macro_symbols],0 + push [counter_limit] + mov [struc_name],0 + mov [counter_limit],eax + lods byte [esi] + or al,al + jz rept_counters_ok + cmp al,'{' + je rept_counters_ok + cmp al,1Ah + jne invalid_macro_arguments + add_rept_counter: + lods byte [esi] + movzx ecx,al + xor eax,eax + call add_macro_symbol + add esi,ecx + xor eax,eax + mov dword [edx+12],eax + inc eax + mov dword [edx+8],eax + lods byte [esi] + cmp al,':' + jne rept_counter_added + push edx + call get_number + jc invalid_value + or ebp,ebp + jnz invalid_value + cmp dword [edi+4],0 + jne value_out_of_range + mov eax,[edi] + mov edx,eax + add edx,[counter_limit] + jc value_out_of_range + pop edx + mov dword [edx+8],eax + lods byte [esi] + rept_counter_added: + cmp al,',' + jne rept_counters_ok + lods byte [esi] + cmp al,1Ah + jne invalid_macro_arguments + jmp add_rept_counter + rept_counters_ok: + dec esi + instant_macro_parameters_ok: + xor eax,eax + call process_macro + pop [counter_limit] + pop [macro_symbols] + pop [free_additional_memory] + instant_macro_done: + pop ebx esi edx + cmp byte [ebx],0 + je line_preprocessed + mov [current_line],edi + mov ecx,4 + rep movs dword [edi],[esi] + test [macro_status],0Fh + jz instant_macro_attached_line + mov ax,3Bh + stos word [edi] + instant_macro_attached_line: + mov esi,ebx + sub edx,ebx + mov ecx,edx + call move_data + jmp preprocess_current_line +do_irp: + cmp byte [esi],1Ah + jne invalid_macro_arguments + movzx eax,byte [esi+1] + lea esi,[esi+2+eax] + lods byte [esi] + cmp [base_code],1 + ja irps_name_ok + cmp al,'*' + jne irp_name_ok + lods byte [esi] + irp_name_ok: + cmp al,',' + jne invalid_macro_arguments + jmp irp_parameters_start + irps_name_ok: + cmp al,',' + jne invalid_macro_arguments + mov al,[esi] + or al,al + jz instant_macro_done + cmp al,'{' + je instant_macro_done + irp_parameters_start: + xor eax,eax + push [free_additional_memory] + push [macro_symbols] + mov [macro_symbols],eax + push [counter_limit] + mov [counter_limit],eax + mov [struc_name],eax + mov ebx,esi + cmp [base_code],1 + ja get_irps_parameter + mov edx,[parameters_end] + mov al,[edx] + push eax + mov byte [edx],0 + get_irp_parameter: + inc [counter_limit] + mov esi,[instant_macro_start] + inc esi + call get_macro_argument + cmp byte [ebx],',' + jne irp_parameters_end + inc ebx + jmp get_irp_parameter + irp_parameters_end: + mov esi,ebx + pop eax + mov [esi],al + jmp instant_macro_parameters_ok + get_irps_parameter: + mov esi,[instant_macro_start] + inc esi + lods byte [esi] + movzx ecx,al + inc [counter_limit] + mov eax,[counter_limit] + call add_macro_symbol + mov [edx+12],ebx + cmp byte [ebx],1Ah + je irps_symbol + cmp byte [ebx],22h + je irps_quoted_string + mov eax,1 + jmp irps_parameter_ok + irps_quoted_string: + mov eax,[ebx+1] + add eax,1+4 + jmp irps_parameter_ok + irps_symbol: + movzx eax,byte [ebx+1] + add eax,1+1 + irps_parameter_ok: + mov [edx+8],eax + add ebx,eax + cmp byte [ebx],0 + je irps_parameters_end + cmp byte [ebx],'{' + jne get_irps_parameter + irps_parameters_end: + mov esi,ebx + jmp instant_macro_parameters_ok +do_match: + mov ebx,esi + call skip_pattern + call exact_match + mov edx,edi + mov al,[ebx] + cmp al,1Ah + je free_match + cmp al,',' + jne instant_macro_done + cmp esi,[parameters_end] + je matched_pattern + jmp instant_macro_done + free_match: + add edx,12 + cmp edx,[memory_end] + ja out_of_memory + mov [edx-12],ebx + mov [edx-8],esi + call skip_match_element + jc try_different_matching + mov [edx-4],esi + movzx eax,byte [ebx+1] + lea ebx,[ebx+2+eax] + cmp byte [ebx],1Ah + je free_match + find_exact_match: + call exact_match + cmp esi,[parameters_end] + je end_matching + cmp byte [ebx],1Ah + je free_match + mov ebx,[edx-12] + movzx eax,byte [ebx+1] + lea ebx,[ebx+2+eax] + mov esi,[edx-4] + jmp match_more_elements + try_different_matching: + sub edx,12 + cmp edx,edi + je instant_macro_done + mov ebx,[edx-12] + movzx eax,byte [ebx+1] + lea ebx,[ebx+2+eax] + cmp byte [ebx],1Ah + je try_different_matching + mov esi,[edx-4] + match_more_elements: + call skip_match_element + jc try_different_matching + mov [edx-4],esi + jmp find_exact_match + skip_match_element: + cmp esi,[parameters_end] + je cannot_match + mov al,[esi] + cmp al,1Ah + je skip_match_symbol + cmp al,22h + je skip_match_quoted_string + add esi,1 + ret + skip_match_quoted_string: + mov eax,[esi+1] + add esi,5 + jmp skip_match_ok + skip_match_symbol: + movzx eax,byte [esi+1] + add esi,2 + skip_match_ok: + add esi,eax + ret + cannot_match: + stc + ret + exact_match: + cmp esi,[parameters_end] + je exact_match_complete + mov ah,[esi] + mov al,[ebx] + cmp al,',' + je exact_match_complete + cmp al,1Ah + je exact_match_complete + cmp al,'=' + je match_verbatim + call match_elements + je exact_match + exact_match_complete: + ret + match_verbatim: + inc ebx + call match_elements + je exact_match + dec ebx + ret + match_elements: + mov al,[ebx] + cmp al,1Ah + je match_symbols + cmp al,22h + je match_quoted_strings + cmp al,ah + je symbol_characters_matched + ret + symbol_characters_matched: + lea ebx,[ebx+1] + lea esi,[esi+1] + ret + match_quoted_strings: + mov ecx,[ebx+1] + add ecx,5 + jmp compare_elements + match_symbols: + movzx ecx,byte [ebx+1] + add ecx,2 + compare_elements: + mov eax,esi + mov ebp,edi + mov edi,ebx + repe cmps byte [esi],[edi] + jne elements_mismatch + mov ebx,edi + mov edi,ebp + ret + elements_mismatch: + mov esi,eax + mov edi,ebp + ret + end_matching: + cmp byte [ebx],',' + jne instant_macro_done + matched_pattern: + xor eax,eax + push [free_additional_memory] + push [macro_symbols] + mov [macro_symbols],eax + push [counter_limit] + mov [counter_limit],eax + mov [struc_name],eax + push esi edi edx + add_matched_symbol: + cmp edi,[esp] + je matched_symbols_ok + mov esi,[edi] + inc esi + lods byte [esi] + movzx ecx,al + xor eax,eax + call add_macro_symbol + mov eax,[edi+4] + mov dword [edx+12],eax + mov ecx,[edi+8] + sub ecx,eax + mov dword [edx+8],ecx + add edi,12 + jmp add_matched_symbol + matched_symbols_ok: + pop edx edi esi + jmp instant_macro_parameters_ok + +process_macro: + push dword [macro_status] + or [macro_status],10h + push [counter] + push [macro_block] + push [macro_block_line] + push [macro_block_line_number] + push [struc_label] + push [struc_name] + push eax + push [current_line] + lods byte [esi] + cmp al,'{' + je macro_instructions_start + or al,al + jnz unexpected_characters + find_macro_instructions: + mov [macro_line],esi + add esi,16+2 + lods byte [esi] + or al,al + jz find_macro_instructions + cmp al,'{' + je macro_instructions_start + cmp al,3Bh + jne unexpected_characters + call skip_foreign_symbol + jmp find_macro_instructions + macro_instructions_start: + mov ecx,80000000h + mov [macro_block],esi + mov eax,[macro_line] + mov [macro_block_line],eax + mov [macro_block_line_number],ecx + xor eax,eax + mov [counter],eax + cmp [counter_limit],eax + je process_macro_line + inc [counter] + process_macro_line: + mov [current_line],edi + lea eax,[edi+10h] + cmp eax,[memory_end] + jae out_of_memory + mov eax,[esp+4] + or eax,eax + jz instant_macro_line_header + stos dword [edi] + mov eax,ecx + stos dword [edi] + mov eax,[esp] + stos dword [edi] + mov eax,[macro_line] + stos dword [edi] + jmp macro_line_header_ok + instant_macro_line_header: + mov edx,[macro_line] + mov eax,[edx] + stos dword [edi] + mov eax,[edx+4] + stos dword [edi] + mov eax,[edx+8] + stos dword [edi] + mov eax,[edx+12] + stos dword [edi] + macro_line_header_ok: + or [macro_status],20h + push ebx ecx + test [macro_status],0Fh + jz process_macro_line_element + mov ax,3Bh + stos word [edi] + process_macro_line_element: + lea eax,[edi+100h] + cmp eax,[memory_end] + jae out_of_memory + lods byte [esi] + cmp al,'}' + je macro_line_processed + or al,al + jz macro_line_processed + cmp al,1Ah + je process_macro_symbol + cmp al,3Bh + je macro_foreign_line + and [macro_status],not 20h + stos byte [edi] + cmp al,22h + jne process_macro_line_element + copy_macro_string: + mov ecx,[esi] + add ecx,4 + call move_data + jmp process_macro_line_element + process_macro_symbol: + push esi edi + test [macro_status],20h + jz not_macro_directive + movzx ecx,byte [esi] + inc esi + mov edi,macro_directives + call get_directive + jnc process_macro_directive + dec esi + jmp not_macro_directive + process_macro_directive: + mov edx,eax + pop edi eax + mov byte [edi],0 + inc edi + pop ecx ebx + jmp near edx + not_macro_directive: + and [macro_status],not 20h + movzx ecx,byte [esi] + inc esi + mov eax,[counter] + call get_macro_symbol + jnc group_macro_symbol + xor eax,eax + cmp [counter],eax + je multiple_macro_symbol_values + call get_macro_symbol + jc not_macro_symbol + replace_macro_symbol: + pop edi eax + mov ecx,[edx+8] + and ecx,not 80000000h + mov edx,[edx+12] + or edx,edx + jz replace_macro_counter + xchg esi,edx + call move_data + mov esi,edx + jmp process_macro_line_element + group_macro_symbol: + xor eax,eax + cmp [counter],eax + je replace_macro_symbol + push esi edx + sub esi,ecx + call get_macro_symbol + mov ebx,edx + pop edx esi + jc replace_macro_symbol + cmp edx,ebx + ja replace_macro_symbol + mov edx,ebx + jmp replace_macro_symbol + multiple_macro_symbol_values: + inc eax + push eax + call get_macro_symbol + pop eax + jc not_macro_symbol + pop edi + push ecx + mov ecx,[edx+8] + mov edx,[edx+12] + xchg esi,edx + btr ecx,31 + jc enclose_macro_symbol_value + rep movs byte [edi],[esi] + jmp macro_symbol_value_ok + enclose_macro_symbol_value: + mov byte [edi],'<' + inc edi + rep movs byte [edi],[esi] + mov byte [edi],'>' + inc edi + macro_symbol_value_ok: + cmp eax,[counter_limit] + je multiple_macro_symbol_values_ok + mov byte [edi],',' + inc edi + mov esi,edx + pop ecx + push edi + sub esi,ecx + jmp multiple_macro_symbol_values + multiple_macro_symbol_values_ok: + pop ecx eax + mov esi,edx + jmp process_macro_line_element + replace_macro_counter: + mov eax,[counter] + and eax,not 80000000h + jz group_macro_counter + add ecx,eax + dec ecx + call store_number_symbol + jmp process_macro_line_element + group_macro_counter: + mov edx,ecx + xor ecx,ecx + multiple_macro_counter_values: + push ecx edx + add ecx,edx + call store_number_symbol + pop edx ecx + inc ecx + cmp ecx,[counter_limit] + je process_macro_line_element + mov byte [edi],',' + inc edi + jmp multiple_macro_counter_values + store_number_symbol: + mov ax,1Ah + stos word [edi] + push edi + mov eax,ecx + mov ecx,1000000000 + xor edx,edx + xor bl,bl + store_number_digits: + div ecx + push edx + or bl,bl + jnz store_number_digit + cmp ecx,1 + je store_number_digit + or al,al + jz number_digit_ok + not bl + store_number_digit: + add al,30h + stos byte [edi] + number_digit_ok: + mov eax,ecx + xor edx,edx + mov ecx,10 + div ecx + mov ecx,eax + pop eax + or ecx,ecx + jnz store_number_digits + pop ebx + mov eax,edi + sub eax,ebx + mov [ebx-1],al + ret + not_macro_symbol: + pop edi esi + mov al,1Ah + stos byte [edi] + mov al,[esi] + inc esi + stos byte [edi] + cmp byte [esi],'.' + jne copy_raw_symbol + mov ebx,[esp+8+8] + or ebx,ebx + jz copy_raw_symbol + cmp al,1 + je copy_struc_name + xchg esi,ebx + movzx ecx,byte [esi-1] + add [edi-1],cl + jc name_too_long + rep movs byte [edi],[esi] + xchg esi,ebx + copy_raw_symbol: + movzx ecx,al + rep movs byte [edi],[esi] + jmp process_macro_line_element + copy_struc_name: + inc esi + xchg esi,ebx + movzx ecx,byte [esi-1] + mov [edi-1],cl + rep movs byte [edi],[esi] + xchg esi,ebx + mov eax,[esp+8+12] + cmp byte [eax],3Bh + je process_macro_line_element + cmp byte [eax],1Ah + jne disable_replaced_struc_name + mov byte [eax],3Bh + jmp process_macro_line_element + disable_replaced_struc_name: + mov ebx,[esp+8+8] + push esi edi + lea edi,[ebx-3] + lea esi,[edi-2] + lea ecx,[esi+1] + sub ecx,eax + std + rep movs byte [edi],[esi] + cld + mov word [eax],3Bh + pop edi esi + jmp process_macro_line_element + skip_foreign_symbol: + lods byte [esi] + movzx eax,al + add esi,eax + skip_foreign_line: + lods byte [esi] + cmp al,1Ah + je skip_foreign_symbol + cmp al,3Bh + je skip_foreign_symbol + cmp al,22h + je skip_foreign_string + or al,al + jnz skip_foreign_line + ret + skip_foreign_string: + lods dword [esi] + add esi,eax + jmp skip_foreign_line + macro_foreign_line: + call skip_foreign_symbol + macro_line_processed: + mov byte [edi],0 + inc edi + push eax + call preprocess_line + pop eax + pop ecx ebx + cmp al,'}' + je macro_block_processed + process_next_line: + inc ecx + mov [macro_line],esi + add esi,16+2 + jmp process_macro_line + macro_block_processed: + call close_macro_block + jc process_macro_line + pop [current_line] + add esp,12 + pop [macro_block_line_number] + pop [macro_block_line] + pop [macro_block] + pop [counter] + pop eax + and al,0F0h + and [macro_status],0Fh + or [macro_status],al + ret + +local_symbols: + lods byte [esi] + cmp al,1Ah + jne invalid_argument + mov byte [edi-1],3Bh + xor al,al + stos byte [edi] + make_local_symbol: + push ecx + lods byte [esi] + movzx ecx,al + mov eax,[counter] + call add_macro_symbol + mov [edx+12],edi + movzx eax,[locals_counter] + add eax,ecx + inc eax + cmp eax,100h + jae name_too_long + lea ebp,[edi+2+eax] + cmp ebp,[memory_end] + jae out_of_memory + mov ah,al + mov al,1Ah + stos word [edi] + rep movs byte [edi],[esi] + mov al,'?' + stos byte [edi] + push esi + mov esi,locals_counter+1 + movzx ecx,[locals_counter] + rep movs byte [edi],[esi] + pop esi + mov eax,edi + sub eax,[edx+12] + mov [edx+8],eax + xor al,al + stos byte [edi] + mov eax,locals_counter + movzx ecx,byte [eax] + counter_loop: + inc byte [eax+ecx] + cmp byte [eax+ecx],':' + jb counter_ok + jne letter_digit + mov byte [eax+ecx],'A' + jmp counter_ok + letter_digit: + cmp byte [eax+ecx],'F' + jbe counter_ok + mov byte [eax+ecx],'0' + loop counter_loop + counter_ok: + pop ecx + lods byte [esi] + cmp al,'}' + je macro_block_processed + or al,al + jz process_next_line + cmp al,',' + jne extra_characters_on_line + dec edi + lods byte [esi] + cmp al,1Ah + je make_local_symbol + jmp invalid_argument +common_block: + call close_macro_block + jc process_macro_line + mov [counter],0 + jmp new_macro_block +forward_block: + cmp [counter_limit],0 + je common_block + call close_macro_block + jc process_macro_line + mov [counter],1 + jmp new_macro_block +reverse_block: + cmp [counter_limit],0 + je common_block + call close_macro_block + jc process_macro_line + mov eax,[counter_limit] + or eax,80000000h + mov [counter],eax + new_macro_block: + mov [macro_block],esi + mov eax,[macro_line] + mov [macro_block_line],eax + mov [macro_block_line_number],ecx + jmp process_macro_line +close_macro_block: + cmp [counter],0 + je block_closed + jl reverse_counter + mov eax,[counter] + cmp eax,[counter_limit] + je block_closed + inc [counter] + jmp continue_block + reverse_counter: + mov eax,[counter] + dec eax + cmp eax,80000000h + je block_closed + mov [counter],eax + continue_block: + mov esi,[macro_block] + mov eax,[macro_block_line] + mov [macro_line],eax + mov ecx,[macro_block_line_number] + stc + ret + block_closed: + clc + ret +get_macro_symbol: + push ecx + call find_macro_symbol_leaf + jc macro_symbol_not_found + mov edx,[ebx] + mov ebx,esi + try_macro_symbol: + or edx,edx + jz macro_symbol_not_found + mov ecx,[esp] + mov edi,[edx+4] + repe cmps byte [esi],[edi] + je macro_symbol_found + mov esi,ebx + mov edx,[edx] + jmp try_macro_symbol + macro_symbol_found: + pop ecx + clc + ret + macro_symbol_not_found: + pop ecx + stc + ret + find_macro_symbol_leaf: + shl eax,8 + mov al,cl + mov ebp,eax + mov ebx,macro_symbols + follow_macro_symbols_tree: + mov edx,[ebx] + or edx,edx + jz no_such_macro_symbol + xor eax,eax + shr ebp,1 + adc eax,0 + lea ebx,[edx+eax*4] + or ebp,ebp + jnz follow_macro_symbols_tree + add ebx,8 + clc + ret + no_such_macro_symbol: + stc + ret +add_macro_symbol: + push ebx ebp + call find_macro_symbol_leaf + jc extend_macro_symbol_tree + mov eax,[ebx] + make_macro_symbol: + mov edx,[free_additional_memory] + add edx,16 + cmp edx,[labels_list] + ja out_of_memory + xchg edx,[free_additional_memory] + mov [ebx],edx + mov [edx],eax + mov [edx+4],esi + pop ebp ebx + ret + extend_macro_symbol_tree: + mov edx,[free_additional_memory] + add edx,16 + cmp edx,[labels_list] + ja out_of_memory + xchg edx,[free_additional_memory] + xor eax,eax + mov [edx],eax + mov [edx+4],eax + mov [edx+8],eax + mov [edx+12],eax + shr ebp,1 + adc eax,0 + mov [ebx],edx + lea ebx,[edx+eax*4] + or ebp,ebp + jnz extend_macro_symbol_tree + add ebx,8 + xor eax,eax + jmp make_macro_symbol + +include_file: + lods byte [esi] + cmp al,22h + jne invalid_argument + lods dword [esi] + cmp byte [esi+eax],0 + jne extra_characters_on_line + push esi + push edi + mov ebx,[current_line] + find_current_file_path: + mov esi,[ebx] + test byte [ebx+7],80h + jz copy_current_file_path + mov ebx,[ebx+8] + jmp find_current_file_path + copy_current_file_path: + lods byte [esi] + stos byte [edi] + or al,al + jnz copy_current_file_path + cut_current_file_name: + cmp edi,[esp] + je current_file_path_ok + cmp byte [edi-1],'\' + je current_file_path_ok + cmp byte [edi-1],'/' + je current_file_path_ok + dec edi + jmp cut_current_file_name + current_file_path_ok: + mov esi,[esp+4] + call preprocess_path + pop edx + mov esi,edx + call open + jnc include_path_ok + mov ebp,[include_paths] + try_include_directories: + mov edi,esi + mov esi,ebp + cmp byte [esi],0 + je try_in_current_directory + push ebp + push edi + copy_include_directory: + lods byte [esi] + cmp al,';' + je include_directory_ok + stos byte [edi] + or al,al + jnz copy_include_directory + dec esi + dec edi + include_directory_ok: + cmp byte [edi-1],'/' + je path_separator_ok + cmp byte [edi-1],'\' + je path_separator_ok + mov al,'/' + stos byte [edi] + path_separator_ok: + mov [esp+4],esi + mov esi,[esp+8] + call preprocess_path + pop edx + mov esi,edx + call open + pop ebp + jnc include_path_ok + jmp try_include_directories + mov edi,esi + try_in_current_directory: + mov esi,[esp] + push edi + call preprocess_path + pop edx + mov esi,edx + call open + jc file_not_found + include_path_ok: + mov edi,[esp] + copy_preprocessed_path: + lods byte [esi] + stos byte [edi] + or al,al + jnz copy_preprocessed_path + pop esi + lea ecx,[edi-1] + sub ecx,esi + mov [esi-4],ecx + push dword [macro_status] + and [macro_status],0Fh + call preprocess_file + pop eax + mov [macro_status],al + jmp line_preprocessed + preprocess_path: + lods byte [esi] + cmp al,'%' + je environment_variable + stos byte [edi] + or al,al + jnz preprocess_path + cmp edi,[memory_end] + ja out_of_memory + ret + environment_variable: + mov ebx,esi + find_variable_end: + lods byte [esi] + or al,al + jz not_environment_variable + cmp al,'%' + jne find_variable_end + mov byte [esi-1],0 + push esi + mov esi,ebx + call get_environment_variable + pop esi + mov byte [esi-1],'%' + jmp preprocess_path + not_environment_variable: + mov al,'%' + stos byte [edi] + mov esi,ebx + jmp preprocess_path diff --git a/programs/fasm/trunk/struct.inc b/programs/develop/fasm/trunk/struct.inc similarity index 100% rename from programs/fasm/trunk/struct.inc rename to programs/develop/fasm/trunk/struct.inc diff --git a/programs/fasm/trunk/system.inc b/programs/develop/fasm/trunk/system.inc similarity index 100% rename from programs/fasm/trunk/system.inc rename to programs/develop/fasm/trunk/system.inc diff --git a/programs/fasm/trunk/variable.inc b/programs/develop/fasm/trunk/variable.inc similarity index 94% rename from programs/fasm/trunk/variable.inc rename to programs/develop/fasm/trunk/variable.inc index d0cf1abb15..827fe57ddf 100644 --- a/programs/fasm/trunk/variable.inc +++ b/programs/develop/fasm/trunk/variable.inc @@ -1,6 +1,6 @@ ; flat assembler core variables -; Copyright (c) 1999-2005, Tomasz Grysztar. +; Copyright (c) 1999-2006, Tomasz Grysztar. ; All rights reserved. ; Variables which have to be set up by interface: @@ -70,6 +70,7 @@ symbol_identifier dd ? address_symbol dd ? address_high dd ? format_flags dd ? +resolver_flags dd ? symbols_stream dd ? number_of_relocations dd ? number_of_sections dd ? @@ -83,10 +84,11 @@ image_base dd ? image_base_high dd ? resource_data dd ? resource_size dd ? +parenthesis_stack dd ? +blocks_stack dd ? next_pass_needed db ? macro_status db ? -parenthesis_stack db ? output_format db ? code_type db ? labels_type db ? @@ -108,6 +110,7 @@ postbyte_register db ? segment_register db ? mmx_size db ? jump_type db ? +push_size db ? operand_prefix db ? rex_prefix db ? immediate_size db ? diff --git a/programs/fasm/trunk/version.inc b/programs/develop/fasm/trunk/version.inc similarity index 93% rename from programs/fasm/trunk/version.inc rename to programs/develop/fasm/trunk/version.inc index 8448999b8c..9b97c7bda1 100644 --- a/programs/fasm/trunk/version.inc +++ b/programs/develop/fasm/trunk/version.inc @@ -1,6 +1,6 @@ -; flat assembler version 1.64 -; Copyright (c) 1999-2005, Tomasz Grysztar. +; flat assembler version 1.67 +; Copyright (c) 1999-2006, Tomasz Grysztar. ; All rights reserved. ; ; This programs is free for commercial and non-commercial use as long as @@ -33,7 +33,7 @@ ; cannot simply be copied and put under another distribution licence ; (including the GNU Public Licence). -VERSION_STRING equ "1.64" +VERSION_STRING equ "1.67.5" VERSION_MAJOR = 1 -VERSION_MINOR = 64 +VERSION_MINOR = 67 diff --git a/programs/develop/fasm/trunk/x86_64.inc b/programs/develop/fasm/trunk/x86_64.inc new file mode 100644 index 0000000000..83221cbd94 --- /dev/null +++ b/programs/develop/fasm/trunk/x86_64.inc @@ -0,0 +1,6495 @@ + +; flat assembler core +; Copyright (c) 1999-2006, Tomasz Grysztar. +; All rights reserved. + +simple_instruction_except64: + cmp [code_type],64 + je illegal_instruction +simple_instruction: + stos byte [edi] + jmp instruction_assembled +simple_instruction_only64: + cmp [code_type],64 + jne illegal_instruction + jmp simple_instruction +simple_instruction_16bit_except64: + cmp [code_type],64 + je illegal_instruction +simple_instruction_16bit: + cmp [code_type],16 + jne size_prefix + stos byte [edi] + jmp instruction_assembled + size_prefix: + mov ah,al + mov al,66h + stos word [edi] + jmp instruction_assembled +simple_instruction_32bit_except64: + cmp [code_type],64 + je illegal_instruction +simple_instruction_32bit: + cmp [code_type],16 + je size_prefix + stos byte [edi] + jmp instruction_assembled +simple_instruction_64bit: + cmp [code_type],64 + jne illegal_instruction + mov ah,al + mov al,48h + stos word [edi] + jmp instruction_assembled +simple_extended_instruction: + mov ah,al + mov al,0Fh + stos word [edi] + jmp instruction_assembled +prefix_instruction: + stos byte [edi] + or [prefixed_instruction],-1 + jmp continue_line +segment_prefix: + mov ah,al + shr ah,4 + cmp ah,6 + jne illegal_instruction + and al,1111b + mov [segment_register],al + call store_segment_prefix + or [prefixed_instruction],-1 + jmp continue_line +int_instruction: + lods byte [esi] + call get_size_operator + cmp ah,1 + ja invalid_operand_size + cmp al,'(' + jne invalid_operand + call get_byte_value + mov ah,al + mov al,0CDh + stos word [edi] + jmp instruction_assembled +iret_instruction: + cmp [code_type],64 + jne simple_instruction + call operand_64bit + jmp simple_instruction +aa_instruction: + cmp [code_type],64 + je illegal_instruction + push eax + mov bl,10 + cmp byte [esi],'(' + jne aa_store + inc esi + xor al,al + xchg al,[operand_size] + cmp al,1 + ja invalid_operand_size + call get_byte_value + mov bl,al + aa_store: + cmp [operand_size],0 + jne invalid_operand + pop eax + mov ah,bl + stos word [edi] + jmp instruction_assembled + +basic_instruction: + mov [base_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + je basic_reg + cmp al,'[' + jne invalid_operand + basic_mem: + call get_address + push edx bx cx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'(' + je basic_mem_imm + cmp al,10h + jne invalid_operand + basic_mem_reg: + lods byte [esi] + call convert_register + mov [postbyte_register],al + pop cx bx edx + mov al,ah + cmp al,1 + je basic_mem_reg_8bit + call operand_autodetect + inc [base_code] + basic_mem_reg_8bit: + call store_instruction + jmp instruction_assembled + basic_mem_imm: + mov al,[operand_size] + cmp al,1 + je basic_mem_imm_8bit + cmp al,2 + je basic_mem_imm_16bit + cmp al,4 + je basic_mem_imm_32bit + cmp al,8 + je basic_mem_imm_64bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne basic_mem_imm_8bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + basic_mem_imm_8bit: + call get_byte_value + mov byte [value],al + mov al,[base_code] + shr al,3 + mov [postbyte_register],al + pop cx bx edx + mov [base_code],80h + call store_instruction_with_imm8 + jmp instruction_assembled + basic_mem_imm_16bit: + call operand_16bit + call get_word_value + mov word [value],ax + mov al,[base_code] + shr al,3 + mov [postbyte_register],al + pop cx bx edx + cmp [value_type],0 + jne basic_mem_imm_16bit_store + cmp [size_declared],0 + jne basic_mem_imm_16bit_store + cmp word [value],80h + jb basic_mem_simm_8bit + cmp word [value],-80h + jae basic_mem_simm_8bit + basic_mem_imm_16bit_store: + mov [base_code],81h + call store_instruction_with_imm16 + jmp instruction_assembled + basic_mem_simm_8bit: + mov [base_code],83h + call store_instruction_with_imm8 + jmp instruction_assembled + basic_mem_imm_32bit: + call operand_32bit + call get_dword_value + basic_mem_imm_32bit_ok: + mov dword [value],eax + mov al,[base_code] + shr al,3 + mov [postbyte_register],al + pop cx bx edx + cmp [value_type],0 + jne basic_mem_imm_32bit_store + cmp [size_declared],0 + jne basic_mem_imm_32bit_store + cmp dword [value],80h + jb basic_mem_simm_8bit + cmp dword [value],-80h + jae basic_mem_simm_8bit + basic_mem_imm_32bit_store: + mov [base_code],81h + call store_instruction_with_imm32 + jmp instruction_assembled + basic_mem_imm_64bit: + cmp [size_declared],0 + jne long_immediate_not_encodable + call operand_64bit + call get_simm32 + cmp [value_type],4 + jae long_immediate_not_encodable + jmp basic_mem_imm_32bit_ok + get_simm32: + call get_qword_value + mov ecx,edx + cdq + cmp ecx,edx + jne value_out_of_range + ret + basic_reg: + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je basic_reg_reg + cmp al,'(' + je basic_reg_imm + cmp al,'[' + jne invalid_operand + basic_reg_mem: + call get_address + mov al,[operand_size] + cmp al,1 + je basic_reg_mem_8bit + call operand_autodetect + add [base_code],3 + call store_instruction + jmp instruction_assembled + basic_reg_mem_8bit: + add [base_code],2 + call store_instruction + jmp instruction_assembled + basic_reg_reg: + lods byte [esi] + call convert_register + mov bl,[postbyte_register] + mov [postbyte_register],al + mov al,ah + cmp al,1 + je basic_reg_reg_8bit + call operand_autodetect + inc [base_code] + basic_reg_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled + basic_reg_imm: + mov al,[operand_size] + cmp al,1 + je basic_reg_imm_8bit + cmp al,2 + je basic_reg_imm_16bit + cmp al,4 + je basic_reg_imm_32bit + cmp al,8 + je basic_reg_imm_64bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne basic_reg_imm_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp basic_reg_imm_32bit + basic_reg_imm_8bit: + call get_byte_value + mov dl,al + mov bl,[base_code] + shr bl,3 + xchg bl,[postbyte_register] + or bl,bl + jz basic_al_imm + mov [base_code],80h + call store_nomem_instruction + mov al,dl + stos byte [edi] + jmp instruction_assembled + basic_al_imm: + mov al,[base_code] + add al,4 + stos byte [edi] + mov al,dl + stos byte [edi] + jmp instruction_assembled + basic_reg_imm_16bit: + call operand_16bit + call get_word_value + mov dx,ax + mov bl,[base_code] + shr bl,3 + xchg bl,[postbyte_register] + cmp [value_type],0 + jne basic_reg_imm_16bit_store + cmp [size_declared],0 + jne basic_reg_imm_16bit_store + cmp dx,80h + jb basic_reg_simm_8bit + cmp dx,-80h + jae basic_reg_simm_8bit + basic_reg_imm_16bit_store: + or bl,bl + jz basic_ax_imm + mov [base_code],81h + call store_nomem_instruction + mov ax,dx + call mark_relocation + stos word [edi] + jmp instruction_assembled + basic_reg_simm_8bit: + mov [base_code],83h + call store_nomem_instruction + mov al,dl + stos byte [edi] + jmp instruction_assembled + basic_ax_imm: + add [base_code],5 + call store_instruction_code + mov ax,dx + call mark_relocation + stos word [edi] + jmp instruction_assembled + basic_reg_imm_32bit: + call operand_32bit + call get_dword_value + basic_reg_imm_32bit_ok: + mov edx,eax + mov bl,[base_code] + shr bl,3 + xchg bl,[postbyte_register] + cmp [value_type],0 + jne basic_reg_imm_32bit_store + cmp [size_declared],0 + jne basic_reg_imm_32bit_store + cmp edx,80h + jb basic_reg_simm_8bit + cmp edx,-80h + jae basic_reg_simm_8bit + basic_reg_imm_32bit_store: + or bl,bl + jz basic_eax_imm + mov [base_code],81h + call store_nomem_instruction + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + basic_eax_imm: + add [base_code],5 + call store_instruction_code + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + basic_reg_imm_64bit: + cmp [size_declared],0 + jne long_immediate_not_encodable + call operand_64bit + call get_simm32 + cmp [value_type],4 + jae long_immediate_not_encodable + jmp basic_reg_imm_32bit_ok +single_operand_instruction: + mov [base_code],0F6h + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,10h + je single_reg + cmp al,'[' + jne invalid_operand + single_mem: + call get_address + mov al,[operand_size] + cmp al,1 + je single_mem_8bit + jb single_mem_nosize + call operand_autodetect + inc [base_code] + call store_instruction + jmp instruction_assembled + single_mem_nosize: + cmp [error_line],0 + jne single_mem_8bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + single_mem_8bit: + call store_instruction + jmp instruction_assembled + single_reg: + lods byte [esi] + call convert_register + mov bl,al + mov al,ah + cmp al,1 + je single_reg_8bit + call operand_autodetect + inc [base_code] + single_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled +mov_instruction: + mov [base_code],88h + lods byte [esi] + call get_size_operator + cmp al,10h + je mov_reg + cmp al,'[' + jne invalid_operand + mov_mem: + call get_address + push edx bx cx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'(' + je mov_mem_imm + cmp al,10h + jne invalid_operand + mov_mem_reg: + lods byte [esi] + cmp al,60h + jb mov_mem_general_reg + cmp al,70h + jb mov_mem_sreg + mov_mem_general_reg: + call convert_register + mov [postbyte_register],al + pop cx bx edx + cmp ah,1 + je mov_mem_reg_8bit + mov al,ah + call operand_autodetect + mov al,[postbyte_register] + or al,bl + or al,bh + jz mov_mem_ax + inc [base_code] + call store_instruction + jmp instruction_assembled + mov_mem_reg_8bit: + or al,bl + or al,bh + jz mov_mem_al + call store_instruction + jmp instruction_assembled + mov_mem_al: + test ch,22h + jnz mov_mem_address16_al + test ch,44h + jnz mov_mem_address32_al + test ch,88h + jnz mov_mem_address64_al + or ch,ch + jnz invalid_address_size + cmp [code_type],64 + je mov_mem_address64_al + cmp [code_type],32 + je mov_mem_address32_al + cmp edx,10000h + jb mov_mem_address16_al + mov_mem_address32_al: + call store_segment_prefix_if_necessary + call address_32bit_prefix + mov [base_code],0A2h + store_mov_address32: + call store_instruction_code + push instruction_assembled + jmp store_address_32bit_value + mov_mem_address16_al: + call store_segment_prefix_if_necessary + call address_16bit_prefix + mov [base_code],0A2h + store_mov_address16: + cmp [code_type],64 + je invalid_address + call store_instruction_code + mov eax,edx + stos word [edi] + cmp edx,10000h + jge value_out_of_range + jmp instruction_assembled + mov_mem_address64_al: + call store_segment_prefix_if_necessary + mov [base_code],0A2h + store_mov_address64: + call store_instruction_code + push instruction_assembled + jmp store_address_64bit_value + mov_mem_ax: + test ch,22h + jnz mov_mem_address16_ax + test ch,44h + jnz mov_mem_address32_ax + test ch,88h + jnz mov_mem_address64_ax + or ch,ch + jnz invalid_address_size + cmp [code_type],64 + je mov_mem_address64_ax + cmp [code_type],32 + je mov_mem_address32_ax + cmp edx,10000h + jb mov_mem_address16_ax + mov_mem_address32_ax: + call store_segment_prefix_if_necessary + call address_32bit_prefix + mov [base_code],0A3h + jmp store_mov_address32 + mov_mem_address16_ax: + call store_segment_prefix_if_necessary + call address_16bit_prefix + mov [base_code],0A3h + jmp store_mov_address16 + mov_mem_address64_ax: + call store_segment_prefix_if_necessary + mov [base_code],0A3h + jmp store_mov_address64 + mov_mem_sreg: + sub al,61h + mov [postbyte_register],al + pop cx bx edx + mov ah,[operand_size] + or ah,ah + jz mov_mem_sreg_store + cmp ah,2 + jne invalid_operand_size + mov_mem_sreg_store: + mov [base_code],8Ch + call store_instruction + jmp instruction_assembled + mov_mem_imm: + mov al,[operand_size] + cmp al,1 + je mov_mem_imm_8bit + cmp al,2 + je mov_mem_imm_16bit + cmp al,4 + je mov_mem_imm_32bit + cmp al,8 + je mov_mem_imm_64bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne mov_mem_imm_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp mov_mem_imm_32bit + mov_mem_imm_8bit: + call get_byte_value + mov byte [value],al + mov [postbyte_register],0 + mov [base_code],0C6h + pop cx bx edx + call store_instruction_with_imm8 + jmp instruction_assembled + mov_mem_imm_16bit: + call operand_16bit + call get_word_value + mov word [value],ax + mov [postbyte_register],0 + mov [base_code],0C7h + pop cx bx edx + call store_instruction_with_imm16 + jmp instruction_assembled + mov_mem_imm_32bit: + call operand_32bit + call get_dword_value + mov_mem_imm_32bit_store: + mov dword [value],eax + mov [postbyte_register],0 + mov [base_code],0C7h + pop cx bx edx + call store_instruction_with_imm32 + jmp instruction_assembled + mov_mem_imm_64bit: + cmp [size_declared],0 + jne long_immediate_not_encodable + call operand_64bit + call get_simm32 + cmp [value_type],4 + jae long_immediate_not_encodable + jmp mov_mem_imm_32bit_store + mov_reg: + lods byte [esi] + mov ah,al + sub ah,10h + and ah,al + test ah,0F0h + jnz mov_sreg + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + je mov_reg_mem + cmp al,'(' + je mov_reg_imm + cmp al,10h + jne invalid_operand + mov_reg_reg: + lods byte [esi] + mov ah,al + sub ah,10h + and ah,al + test ah,0F0h + jnz mov_reg_sreg + call convert_register + mov bl,[postbyte_register] + mov [postbyte_register],al + mov al,ah + cmp al,1 + je mov_reg_reg_8bit + call operand_autodetect + inc [base_code] + mov_reg_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled + mov_reg_sreg: + mov bl,[postbyte_register] + mov ah,al + and al,1111b + mov [postbyte_register],al + shr ah,4 + cmp ah,5 + je mov_reg_creg + cmp ah,7 + je mov_reg_dreg + ja mov_reg_treg + dec [postbyte_register] + cmp [operand_size],8 + je mov_reg_sreg64 + cmp [operand_size],4 + je mov_reg_sreg32 + cmp [operand_size],2 + jne invalid_operand_size + call operand_16bit + jmp mov_reg_sreg_store + mov_reg_sreg64: + call operand_64bit + jmp mov_reg_sreg_store + mov_reg_sreg32: + call operand_32bit + mov_reg_sreg_store: + mov [base_code],8Ch + call store_nomem_instruction + jmp instruction_assembled + mov_reg_treg: + cmp ah,9 + jne invalid_operand + mov [extended_code],24h + jmp mov_reg_xrx + mov_reg_dreg: + mov [extended_code],21h + jmp mov_reg_xrx + mov_reg_creg: + mov [extended_code],20h + mov_reg_xrx: + mov [base_code],0Fh + cmp [code_type],64 + je mov_reg_xrx_64bit + cmp [operand_size],4 + jne invalid_operand_size + cmp [postbyte_register],8 + jne mov_reg_xrx_store + cmp [extended_code],20h + jne mov_reg_xrx_store + mov al,0F0h + stos byte [edi] + mov [postbyte_register],0 + mov_reg_xrx_store: + call store_nomem_instruction + jmp instruction_assembled + mov_reg_xrx_64bit: + cmp [operand_size],8 + jne invalid_operand_size + call store_nomem_instruction + jmp instruction_assembled + mov_reg_mem: + call get_address + mov al,[operand_size] + cmp al,1 + je mov_reg_mem_8bit + call operand_autodetect + mov al,[postbyte_register] + or al,bl + or al,bh + jz mov_ax_mem + add [base_code],3 + call store_instruction + jmp instruction_assembled + mov_reg_mem_8bit: + mov al,[postbyte_register] + or al,bl + or al,bh + jz mov_al_mem + add [base_code],2 + call store_instruction + jmp instruction_assembled + mov_al_mem: + test ch,22h + jnz mov_al_mem_address16 + test ch,44h + jnz mov_al_mem_address32 + test ch,88h + jnz mov_al_mem_address64 + or ch,ch + jnz invalid_address_size + cmp [code_type],64 + je mov_al_mem_address64 + cmp [code_type],32 + je mov_al_mem_address32 + cmp edx,10000h + jb mov_al_mem_address16 + mov_al_mem_address32: + call store_segment_prefix_if_necessary + call address_32bit_prefix + mov [base_code],0A0h + jmp store_mov_address32 + mov_al_mem_address16: + call store_segment_prefix_if_necessary + call address_16bit_prefix + mov [base_code],0A0h + jmp store_mov_address16 + mov_al_mem_address64: + call store_segment_prefix_if_necessary + mov [base_code],0A0h + jmp store_mov_address64 + mov_ax_mem: + test ch,22h + jnz mov_ax_mem_address16 + test ch,44h + jnz mov_ax_mem_address32 + test ch,88h + jnz mov_ax_mem_address64 + or ch,ch + jnz invalid_address_size + cmp [code_type],64 + je mov_ax_mem_address64 + cmp [code_type],32 + je mov_ax_mem_address32 + cmp edx,10000h + jb mov_ax_mem_address16 + mov_ax_mem_address32: + call store_segment_prefix_if_necessary + call address_32bit_prefix + mov [base_code],0A1h + jmp store_mov_address32 + mov_ax_mem_address16: + call store_segment_prefix_if_necessary + call address_16bit_prefix + mov [base_code],0A1h + jmp store_mov_address16 + mov_ax_mem_address64: + call store_segment_prefix_if_necessary + mov [base_code],0A1h + jmp store_mov_address64 + mov_reg_imm: + mov al,[operand_size] + cmp al,1 + je mov_reg_imm_8bit + cmp al,2 + je mov_reg_imm_16bit + cmp al,4 + je mov_reg_imm_32bit + cmp al,8 + je mov_reg_imm_64bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne mov_reg_imm_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp mov_reg_imm_32bit + mov_reg_imm_8bit: + call get_byte_value + mov dl,al + mov al,0B0h + call store_mov_reg_imm_code + mov al,dl + stos byte [edi] + jmp instruction_assembled + mov_reg_imm_16bit: + call get_word_value + mov dx,ax + call operand_16bit + mov al,0B8h + call store_mov_reg_imm_code + mov ax,dx + call mark_relocation + stos word [edi] + jmp instruction_assembled + mov_reg_imm_32bit: + call operand_32bit + call get_dword_value + mov edx,eax + mov al,0B8h + call store_mov_reg_imm_code + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + mov_reg_imm_64bit: + call operand_64bit + call get_qword_value + mov ecx,edx + cmp [size_declared],0 + jne mov_reg_imm_64bit_store + cmp [value_type],4 + jae mov_reg_imm_64bit_store + cdq + cmp ecx,edx + je mov_reg_64bit_imm_32bit + mov_reg_imm_64bit_store: + push eax ecx + mov al,0B8h + call store_mov_reg_imm_code + pop edx eax + call mark_relocation + stos dword [edi] + mov eax,edx + stos dword [edi] + jmp instruction_assembled + store_mov_reg_imm_code: + mov ah,[postbyte_register] + test ah,1000b + jz mov_reg_imm_prefix_ok + or [rex_prefix],41h + mov_reg_imm_prefix_ok: + and ah,111b + add al,ah + mov [base_code],al + call store_instruction_code + ret + mov_reg_64bit_imm_32bit: + mov edx,eax + mov bl,[postbyte_register] + mov [postbyte_register],0 + mov [base_code],0C7h + call store_nomem_instruction + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + mov_sreg: + mov ah,al + and al,1111b + mov [postbyte_register],al + shr ah,4 + cmp ah,5 + je mov_creg + cmp ah,7 + je mov_dreg + ja mov_treg + cmp al,2 + je illegal_instruction + dec [postbyte_register] + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + je mov_sreg_mem + cmp al,10h + jne invalid_operand + mov_sreg_reg: + lods byte [esi] + call convert_register + or ah,ah + jz mov_sreg_reg_size_ok + cmp ah,2 + jne invalid_operand_size + mov bl,al + mov_sreg_reg_size_ok: + mov [base_code],8Eh + call store_nomem_instruction + jmp instruction_assembled + mov_sreg_mem: + call get_address + mov al,[operand_size] + or al,al + jz mov_sreg_mem_size_ok + cmp al,2 + jne invalid_operand_size + mov_sreg_mem_size_ok: + mov [base_code],8Eh + call store_instruction + jmp instruction_assembled + mov_treg: + cmp ah,9 + jne invalid_operand + mov [extended_code],26h + jmp mov_xrx + mov_dreg: + mov [extended_code],23h + jmp mov_xrx + mov_creg: + mov [extended_code],22h + mov_xrx: + mov [base_code],0Fh + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov bl,al + cmp [code_type],64 + je mov_xrx_64bit + cmp ah,4 + jne invalid_operand_size + cmp [postbyte_register],8 + jne mov_xrx_store + cmp [extended_code],22h + jne mov_xrx_store + mov al,0F0h + stos byte [edi] + mov [postbyte_register],0 + mov_xrx_store: + call store_nomem_instruction + jmp instruction_assembled + mov_xrx_64bit: + cmp ah,8 + jne invalid_operand_size + call store_nomem_instruction + jmp instruction_assembled +cmov_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + je cmov_reg_mem + cmp al,10h + jne invalid_operand + cmov_reg_reg: + lods byte [esi] + call convert_register + mov bl,al + mov al,ah + call operand_autodetect + call store_nomem_instruction + jmp instruction_assembled + cmov_reg_mem: + call get_address + mov al,[operand_size] + call operand_autodetect + call store_instruction + jmp instruction_assembled +test_instruction: + mov [base_code],84h + lods byte [esi] + call get_size_operator + cmp al,10h + je test_reg + cmp al,'[' + jne invalid_operand + test_mem: + call get_address + push edx bx cx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'(' + je test_mem_imm + cmp al,10h + jne invalid_operand + test_mem_reg: + lods byte [esi] + call convert_register + mov [postbyte_register],al + pop cx bx edx + mov al,ah + cmp al,1 + je test_mem_reg_8bit + call operand_autodetect + inc [base_code] + test_mem_reg_8bit: + call store_instruction + jmp instruction_assembled + test_mem_imm: + mov al,[operand_size] + cmp al,1 + je test_mem_imm_8bit + cmp al,2 + je test_mem_imm_16bit + cmp al,4 + je test_mem_imm_32bit + cmp al,8 + je test_mem_imm_64bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne test_mem_imm_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp test_mem_imm_32bit + test_mem_imm_8bit: + call get_byte_value + mov byte [value],al + mov [postbyte_register],0 + mov [base_code],0F6h + pop cx bx edx + call store_instruction_with_imm8 + jmp instruction_assembled + test_mem_imm_16bit: + call operand_16bit + call get_word_value + mov word [value],ax + mov [postbyte_register],0 + mov [base_code],0F7h + pop cx bx edx + call store_instruction_with_imm16 + jmp instruction_assembled + test_mem_imm_32bit: + call operand_32bit + call get_dword_value + test_mem_imm_32bit_store: + mov dword [value],eax + mov [postbyte_register],0 + mov [base_code],0F7h + pop cx bx edx + call store_instruction_with_imm32 + jmp instruction_assembled + test_mem_imm_64bit: + cmp [size_declared],0 + jne long_immediate_not_encodable + call operand_64bit + call get_simm32 + cmp [value_type],4 + jae long_immediate_not_encodable + jmp test_mem_imm_32bit_store + test_reg: + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + je test_reg_mem + cmp al,'(' + je test_reg_imm + cmp al,10h + jne invalid_operand + test_reg_reg: + lods byte [esi] + call convert_register + mov bl,[postbyte_register] + mov [postbyte_register],al + mov al,ah + cmp al,1 + je test_reg_reg_8bit + call operand_autodetect + inc [base_code] + test_reg_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled + test_reg_imm: + mov al,[operand_size] + cmp al,1 + je test_reg_imm_8bit + cmp al,2 + je test_reg_imm_16bit + cmp al,4 + je test_reg_imm_32bit + cmp al,8 + je test_reg_imm_64bit + jmp invalid_operand_size + test_reg_imm_8bit: + call get_byte_value + mov dl,al + mov bl,[postbyte_register] + mov [postbyte_register],0 + mov [base_code],0F6h + or bl,bl + jz test_al_imm + call store_nomem_instruction + mov al,dl + stos byte [edi] + jmp instruction_assembled + test_al_imm: + mov [base_code],0A8h + call store_instruction_code + mov al,dl + stos byte [edi] + jmp instruction_assembled + test_reg_imm_16bit: + call operand_16bit + call get_word_value + mov dx,ax + mov bl,[postbyte_register] + mov [postbyte_register],0 + mov [base_code],0F7h + or bl,bl + jz test_ax_imm + call store_nomem_instruction + mov ax,dx + call mark_relocation + stos word [edi] + jmp instruction_assembled + test_ax_imm: + mov [base_code],0A9h + call store_instruction_code + mov ax,dx + stos word [edi] + jmp instruction_assembled + test_reg_imm_32bit: + call operand_32bit + call get_dword_value + test_reg_imm_32bit_store: + mov edx,eax + mov bl,[postbyte_register] + mov [postbyte_register],0 + mov [base_code],0F7h + or bl,bl + jz test_eax_imm + call store_nomem_instruction + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + test_eax_imm: + mov [base_code],0A9h + call store_instruction_code + mov eax,edx + stos dword [edi] + jmp instruction_assembled + test_reg_imm_64bit: + cmp [size_declared],0 + jne long_immediate_not_encodable + call operand_64bit + call get_simm32 + cmp [value_type],4 + jae long_immediate_not_encodable + jmp test_reg_imm_32bit_store + test_reg_mem: + call get_address + mov al,[operand_size] + cmp al,1 + je test_reg_mem_8bit + call operand_autodetect + inc [base_code] + test_reg_mem_8bit: + call store_instruction + jmp instruction_assembled +xchg_instruction: + mov [base_code],86h + lods byte [esi] + call get_size_operator + cmp al,10h + je xchg_reg + cmp al,'[' + jne invalid_operand + xchg_mem: + call get_address + push edx bx cx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je test_mem_reg + jmp invalid_operand + xchg_reg: + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + je test_reg_mem + cmp al,10h + jne invalid_operand + xchg_reg_reg: + lods byte [esi] + call convert_register + mov bl,al + mov al,ah + cmp al,1 + je xchg_reg_reg_8bit + call operand_autodetect + cmp [postbyte_register],0 + je xchg_ax_reg + or bl,bl + jnz xchg_reg_reg_store + mov bl,[postbyte_register] + xchg_ax_reg: + cmp [code_type],64 + jne xchg_ax_reg_ok + cmp ah,4 + jne xchg_ax_reg_ok + or bl,bl + jz xchg_reg_reg_store + xchg_ax_reg_ok: + test bl,1000b + jz xchg_ax_reg_store + or [rex_prefix],41h + and bl,111b + xchg_ax_reg_store: + add bl,90h + mov [base_code],bl + call store_instruction_code + jmp instruction_assembled + xchg_reg_reg_store: + inc [base_code] + xchg_reg_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled +push_instruction: + mov [push_size],al + push_next: + lods byte [esi] + call get_size_operator + cmp al,10h + je push_reg + cmp al,'(' + je push_imm + cmp al,'[' + jne invalid_operand + push_mem: + call get_address + mov al,[operand_size] + mov ah,[push_size] + cmp al,2 + je push_mem_16bit + cmp al,4 + je push_mem_32bit + cmp al,8 + je push_mem_64bit + or al,al + jnz invalid_operand_size + cmp ah,2 + je push_mem_16bit + cmp ah,4 + je push_mem_32bit + cmp ah,8 + je push_mem_64bit + cmp [error_line],0 + jne push_mem_store + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp push_mem_store + push_mem_16bit: + test ah,not 2 + jnz invalid_operand_size + call operand_16bit + jmp push_mem_store + push_mem_32bit: + test ah,not 4 + jnz invalid_operand_size + cmp [code_type],64 + je illegal_instruction + call operand_32bit + jmp push_mem_store + push_mem_64bit: + test ah,not 8 + jnz invalid_operand_size + cmp [code_type],64 + jne illegal_instruction + push_mem_store: + mov [base_code],0FFh + mov [postbyte_register],110b + call store_instruction + jmp push_done + push_reg: + lods byte [esi] + mov ah,al + sub ah,10h + and ah,al + test ah,0F0h + jnz push_sreg + call convert_register + test al,1000b + jz push_reg_ok + or [rex_prefix],41h + and al,111b + push_reg_ok: + add al,50h + mov [base_code],al + mov al,ah + mov ah,[push_size] + cmp al,2 + je push_reg_16bit + cmp al,4 + je push_reg_32bit + cmp al,8 + jne invalid_operand_size + push_reg_64bit: + test ah,not 8 + jnz invalid_operand_size + cmp [code_type],64 + jne illegal_instruction + jmp push_reg_store + push_reg_32bit: + test ah,not 4 + jnz invalid_operand_size + cmp [code_type],64 + je illegal_instruction + call operand_32bit + jmp push_reg_store + push_reg_16bit: + test ah,not 2 + jnz invalid_operand_size + call operand_16bit + push_reg_store: + call store_instruction_code + jmp push_done + push_sreg: + mov bl,al + mov dl,[operand_size] + mov dh,[push_size] + cmp dl,2 + je push_sreg16 + cmp dl,4 + je push_sreg32 + cmp dl,8 + je push_sreg64 + or dl,dl + jnz invalid_operand_size + cmp dh,2 + je push_sreg16 + cmp dh,4 + je push_sreg32 + cmp dh,8 + je push_sreg64 + jmp push_sreg_store + push_sreg16: + test dh,not 2 + jnz invalid_operand_size + call operand_16bit + jmp push_sreg_store + push_sreg32: + test dh,not 4 + jnz invalid_operand_size + cmp [code_type],64 + je illegal_instruction + call operand_32bit + jmp push_sreg_store + push_sreg64: + test dh,not 8 + jnz invalid_operand_size + cmp [code_type],64 + jne illegal_instruction + push_sreg_store: + mov al,bl + cmp al,70h + jae invalid_operand + sub al,61h + cmp al,4 + jae push_sreg_386 + shl al,3 + add al,6 + mov [base_code],al + cmp [code_type],64 + je illegal_instruction + jmp push_reg_store + push_sreg_386: + sub al,4 + shl al,3 + add al,0A0h + mov [extended_code],al + mov [base_code],0Fh + jmp push_reg_store + push_imm: + mov al,[operand_size] + mov ah,[push_size] + or al,al + je push_imm_size_ok + or ah,ah + je push_imm_size_ok + cmp al,ah + jne invalid_operand_size + push_imm_size_ok: + cmp al,2 + je push_imm_16bit + cmp al,4 + je push_imm_32bit + cmp al,8 + je push_imm_64bit + cmp ah,2 + je push_imm_optimized_16bit + cmp ah,4 + je push_imm_optimized_32bit + cmp ah,8 + je push_imm_optimized_64bit + or al,al + jnz invalid_operand_size + cmp [code_type],16 + je push_imm_optimized_16bit + cmp [code_type],32 + je push_imm_optimized_32bit + push_imm_optimized_64bit: + cmp [code_type],64 + jne illegal_instruction + call get_simm32 + mov edx,eax + cmp [value_type],0 + jne push_imm_32bit_store + cmp eax,-80h + jl push_imm_32bit_store + cmp eax,80h + jge push_imm_32bit_store + jmp push_imm_8bit + push_imm_optimized_32bit: + cmp [code_type],64 + je illegal_instruction + call get_dword_value + mov edx,eax + call operand_32bit + cmp [value_type],0 + jne push_imm_32bit_store + cmp eax,-80h + jl push_imm_32bit_store + cmp eax,80h + jge push_imm_32bit_store + jmp push_imm_8bit + push_imm_optimized_16bit: + call get_word_value + mov dx,ax + call operand_16bit + cmp [value_type],0 + jne push_imm_16bit_store + cmp ax,-80h + jl push_imm_16bit_store + cmp ax,80h + jge push_imm_16bit_store + push_imm_8bit: + mov ah,al + mov [base_code],6Ah + call store_instruction_code + mov al,ah + stos byte [edi] + jmp push_done + push_imm_16bit: + call get_word_value + mov dx,ax + call operand_16bit + push_imm_16bit_store: + mov [base_code],68h + call store_instruction_code + mov ax,dx + call mark_relocation + stos word [edi] + jmp push_done + push_imm_64bit: + cmp [code_type],64 + jne illegal_instruction + call get_simm32 + mov edx,eax + jmp push_imm_32bit_store + push_imm_32bit: + cmp [code_type],64 + je illegal_instruction + call get_dword_value + mov edx,eax + call operand_32bit + push_imm_32bit_store: + mov [base_code],68h + call store_instruction_code + mov eax,edx + call mark_relocation + stos dword [edi] + push_done: + lods byte [esi] + dec esi + cmp al,0Fh + je instruction_assembled + or al,al + jz instruction_assembled + mov [operand_size],0 + mov [size_override],0 + mov [operand_prefix],0 + mov [rex_prefix],0 + jmp push_next +pop_instruction: + mov [push_size],al + pop_next: + lods byte [esi] + call get_size_operator + cmp al,10h + je pop_reg + cmp al,'[' + jne invalid_operand + pop_mem: + call get_address + mov al,[operand_size] + mov ah,[push_size] + cmp al,2 + je pop_mem_16bit + cmp al,4 + je pop_mem_32bit + cmp al,8 + je pop_mem_64bit + or al,al + jnz invalid_operand_size + cmp ah,2 + je pop_mem_16bit + cmp ah,4 + je pop_mem_32bit + cmp ah,8 + je pop_mem_64bit + cmp [error_line],0 + jne pop_mem_store + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp pop_mem_store + pop_mem_16bit: + test ah,not 2 + jnz invalid_operand_size + call operand_16bit + jmp pop_mem_store + pop_mem_32bit: + test ah,not 4 + jnz invalid_operand_size + cmp [code_type],64 + je illegal_instruction + call operand_32bit + jmp pop_mem_store + pop_mem_64bit: + test ah,not 8 + jnz invalid_operand_size + cmp [code_type],64 + jne illegal_instruction + pop_mem_store: + mov [base_code],08Fh + mov [postbyte_register],0 + call store_instruction + jmp pop_done + pop_reg: + lods byte [esi] + mov ah,al + sub ah,10h + and ah,al + test ah,0F0h + jnz pop_sreg + call convert_register + test al,1000b + jz pop_reg_ok + or [rex_prefix],41h + and al,111b + pop_reg_ok: + add al,58h + mov [base_code],al + mov al,ah + mov ah,[push_size] + cmp al,2 + je pop_reg_16bit + cmp al,4 + je pop_reg_32bit + cmp al,8 + je pop_reg_64bit + jmp invalid_operand_size + pop_reg_64bit: + test ah,not 8 + jnz invalid_operand_size + cmp [code_type],64 + jne illegal_instruction + jmp pop_reg_store + pop_reg_32bit: + test ah,not 4 + jnz invalid_operand_size + cmp [code_type],64 + je illegal_instruction + call operand_32bit + jmp pop_reg_store + pop_reg_16bit: + test ah,not 2 + jnz invalid_operand_size + call operand_16bit + pop_reg_store: + call store_instruction_code + pop_done: + lods byte [esi] + dec esi + cmp al,0Fh + je instruction_assembled + or al,al + jz instruction_assembled + mov [operand_size],0 + mov [size_override],0 + mov [operand_prefix],0 + mov [rex_prefix],0 + jmp pop_next + pop_sreg: + mov dl,[operand_size] + mov dh,[push_size] + cmp al,62h + je pop_cs + mov bl,al + cmp dl,2 + je pop_sreg16 + cmp dl,4 + je pop_sreg32 + cmp dl,8 + je pop_sreg64 + or dl,dl + jnz invalid_operand_size + cmp dh,2 + je pop_sreg16 + cmp dh,4 + je pop_sreg32 + cmp dh,8 + je pop_sreg64 + jmp pop_sreg_store + pop_sreg16: + test dh,not 2 + jnz invalid_operand_size + call operand_16bit + jmp pop_sreg_store + pop_sreg32: + test dh,not 4 + jnz invalid_operand_size + cmp [code_type],64 + je illegal_instruction + call operand_32bit + jmp pop_sreg_store + pop_sreg64: + test dh,not 8 + jnz invalid_operand_size + cmp [code_type],64 + jne illegal_instruction + pop_sreg_store: + mov al,bl + cmp al,70h + jae invalid_operand + sub al,61h + cmp al,4 + jae pop_sreg_386 + shl al,3 + add al,7 + mov [base_code],al + cmp [code_type],64 + je illegal_instruction + jmp pop_reg_store + pop_cs: + cmp [code_type],16 + jne illegal_instruction + cmp dl,2 + je pop_cs_store + or dl,dl + jnz invalid_operand_size + cmp dh,2 + je pop_cs_store + or dh,dh + jnz illegal_instruction + pop_cs_store: + test dh,not 2 + jnz invalid_operand_size + mov al,0Fh + stos byte [edi] + jmp pop_done + pop_sreg_386: + sub al,4 + shl al,3 + add al,0A1h + mov [extended_code],al + mov [base_code],0Fh + jmp pop_reg_store +inc_instruction: + mov [base_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + je inc_reg + cmp al,'[' + je inc_mem + jne invalid_operand + inc_mem: + call get_address + mov al,[operand_size] + cmp al,1 + je inc_mem_8bit + jb inc_mem_nosize + call operand_autodetect + mov al,0FFh + xchg al,[base_code] + mov [postbyte_register],al + call store_instruction + jmp instruction_assembled + inc_mem_nosize: + cmp [error_line],0 + jne inc_mem_8bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + inc_mem_8bit: + mov al,0FEh + xchg al,[base_code] + mov [postbyte_register],al + call store_instruction + jmp instruction_assembled + inc_reg: + lods byte [esi] + call convert_register + mov bl,al + mov al,0FEh + xchg al,[base_code] + mov [postbyte_register],al + mov al,ah + cmp al,1 + je inc_reg_8bit + call operand_autodetect + cmp [code_type],64 + je inc_reg_long_form + mov al,[postbyte_register] + shl al,3 + add al,bl + add al,40h + mov [base_code],al + call store_instruction_code + jmp instruction_assembled + inc_reg_long_form: + inc [base_code] + inc_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled +set_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + je set_reg + cmp al,'[' + jne invalid_operand + set_mem: + call get_address + cmp [operand_size],1 + ja invalid_operand_size + mov [postbyte_register],0 + call store_instruction + jmp instruction_assembled + set_reg: + lods byte [esi] + call convert_register + cmp ah,1 + jne invalid_operand_size + mov bl,al + mov [postbyte_register],0 + call store_nomem_instruction + jmp instruction_assembled +arpl_instruction: + cmp [code_type],64 + je illegal_instruction + mov [base_code],63h + lods byte [esi] + call get_size_operator + cmp al,10h + je arpl_reg + cmp al,'[' + jne invalid_operand + call get_address + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + cmp ah,2 + jne invalid_operand_size + call store_instruction + jmp instruction_assembled + arpl_reg: + lods byte [esi] + call convert_register + cmp ah,2 + jne invalid_operand_size + mov bl,al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ah,2 + jne invalid_operand_size + mov [postbyte_register],al + call store_nomem_instruction + jmp instruction_assembled +bound_instruction: + cmp [code_type],64 + je illegal_instruction + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + cmp al,2 + je bound_16bit + cmp al,4 + je bound_32bit + jmp invalid_operand_size + bound_32bit: + call operand_32bit + mov [base_code],62h + call store_instruction + jmp instruction_assembled + bound_16bit: + call operand_16bit + mov [base_code],62h + call store_instruction + jmp instruction_assembled +enter_instruction: + lods byte [esi] + call get_size_operator + cmp ah,2 + je enter_imm16_size_ok + or ah,ah + jnz invalid_operand_size + enter_imm16_size_ok: + cmp al,'(' + jne invalid_operand + call get_word_value + cmp [next_pass_needed],0 + jne enter_imm16_ok + cmp [value_type],0 + jne invalid_use_of_symbol + enter_imm16_ok: + push eax + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp ah,1 + je enter_imm8_size_ok + or ah,ah + jnz invalid_operand_size + enter_imm8_size_ok: + cmp al,'(' + jne invalid_operand + call get_byte_value + mov dl,al + pop ebx + mov al,0C8h + stos byte [edi] + mov ax,bx + stos word [edi] + mov al,dl + stos byte [edi] + jmp instruction_assembled +ret_instruction_only64: + cmp [code_type],64 + jne illegal_instruction + jmp ret_instruction +ret_instruction_32bit_except64: + cmp [code_type],64 + je illegal_instruction +ret_instruction_32bit: + call operand_32bit + jmp ret_instruction +ret_instruction_16bit: + call operand_16bit + jmp ret_instruction +retf_instruction: + cmp [code_type],64 + jne ret_instruction +ret_instruction_64bit: + call operand_64bit +ret_instruction: + mov [base_code],al + lods byte [esi] + dec esi + or al,al + jz simple_ret + cmp al,0Fh + je simple_ret + lods byte [esi] + call get_size_operator + or ah,ah + jz ret_imm + cmp ah,2 + je ret_imm + jmp invalid_operand_size + ret_imm: + cmp al,'(' + jne invalid_operand + call get_word_value + cmp [next_pass_needed],0 + jne ret_imm_ok + cmp [value_type],0 + jne invalid_use_of_symbol + ret_imm_ok: + cmp [size_declared],0 + jne ret_imm_store + or ax,ax + jz simple_ret + ret_imm_store: + mov dx,ax + call store_instruction_code + mov ax,dx + stos word [edi] + jmp instruction_assembled + simple_ret: + inc [base_code] + call store_instruction_code + jmp instruction_assembled +lea_instruction: + mov [base_code],8Dh + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + xor al,al + xchg al,[operand_size] + push eax + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + mov [size_override],-1 + call get_address + pop eax + mov [operand_size],al + call operand_autodetect + call store_instruction + jmp instruction_assembled +ls_instruction: + or al,al + jz les_instruction + cmp al,3 + jz lds_instruction + add al,0B0h + mov [extended_code],al + mov [base_code],0Fh + jmp ls_code_ok + les_instruction: + mov [base_code],0C4h + jmp ls_short_code + lds_instruction: + mov [base_code],0C5h + ls_short_code: + cmp [code_type],64 + je illegal_instruction + ls_code_ok: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + add [operand_size],2 + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + cmp al,4 + je ls_16bit + cmp al,6 + je ls_32bit + cmp al,10 + je ls_64bit + jmp invalid_operand_size + ls_16bit: + call operand_16bit + call store_instruction + jmp instruction_assembled + ls_32bit: + call operand_32bit + call store_instruction + jmp instruction_assembled + ls_64bit: + call operand_64bit + call store_instruction + jmp instruction_assembled +sh_instruction: + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,10h + je sh_reg + cmp al,'[' + jne invalid_operand + sh_mem: + call get_address + push edx bx cx + mov al,[operand_size] + push eax + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'(' + je sh_mem_imm + cmp al,10h + jne invalid_operand + sh_mem_reg: + lods byte [esi] + cmp al,11h + jne invalid_operand + pop eax cx bx edx + cmp al,1 + je sh_mem_cl_8bit + jb sh_mem_cl_nosize + call operand_autodetect + mov [base_code],0D3h + call store_instruction + jmp instruction_assembled + sh_mem_cl_nosize: + cmp [error_line],0 + jne sh_mem_cl_8bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + sh_mem_cl_8bit: + mov [base_code],0D2h + call store_instruction + jmp instruction_assembled + sh_mem_imm: + mov al,[operand_size] + or al,al + jz sh_mem_imm_size_ok + cmp al,1 + jne invalid_operand_size + sh_mem_imm_size_ok: + call get_byte_value + mov byte [value],al + pop eax cx bx edx + cmp al,1 + je sh_mem_imm_8bit + jb sh_mem_imm_nosize + call operand_autodetect + cmp byte [value],1 + je sh_mem_1 + mov [base_code],0C1h + call store_instruction_with_imm8 + jmp instruction_assembled + sh_mem_1: + mov [base_code],0D1h + call store_instruction + jmp instruction_assembled + sh_mem_imm_nosize: + cmp [error_line],0 + jne sh_mem_imm_8bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + sh_mem_imm_8bit: + cmp byte [value],1 + je sh_mem_1_8bit + mov [base_code],0C0h + call store_instruction_with_imm8 + jmp instruction_assembled + sh_mem_1_8bit: + mov [base_code],0D0h + call store_instruction + jmp instruction_assembled + sh_reg: + lods byte [esi] + call convert_register + mov bx,ax + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'(' + je sh_reg_imm + cmp al,10h + jne invalid_operand + sh_reg_reg: + lods byte [esi] + cmp al,11h + jne invalid_operand + mov al,bh + cmp al,1 + je sh_reg_cl_8bit + call operand_autodetect + mov [base_code],0D3h + call store_nomem_instruction + jmp instruction_assembled + sh_reg_cl_8bit: + mov [base_code],0D2h + call store_nomem_instruction + jmp instruction_assembled + sh_reg_imm: + mov al,[operand_size] + or al,al + jz sh_reg_imm_size_ok + cmp al,1 + jne invalid_operand_size + sh_reg_imm_size_ok: + push ebx + call get_byte_value + mov dl,al + pop ebx + mov al,bh + cmp al,1 + je sh_reg_imm_8bit + call operand_autodetect + cmp dl,1 + je sh_reg_1 + mov [base_code],0C1h + call store_nomem_instruction + mov al,dl + stos byte [edi] + jmp instruction_assembled + sh_reg_1: + mov [base_code],0D1h + call store_nomem_instruction + jmp instruction_assembled + sh_reg_imm_8bit: + cmp dl,1 + je sh_reg_1_8bit + mov [base_code],0C0h + call store_nomem_instruction + mov al,dl + stos byte [edi] + jmp instruction_assembled + sh_reg_1_8bit: + mov [base_code],0D0h + call store_nomem_instruction + jmp instruction_assembled +shd_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + je shd_reg + cmp al,'[' + jne invalid_operand + shd_mem: + call get_address + push edx bx cx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + mov al,ah + mov [operand_size],0 + push eax + lods byte [esi] + call get_size_operator + cmp al,'(' + je shd_mem_reg_imm + cmp al,10h + jne invalid_operand + lods byte [esi] + cmp al,11h + jne invalid_operand + pop eax cx bx edx + call operand_autodetect + inc [extended_code] + call store_instruction + jmp instruction_assembled + shd_mem_reg_imm: + mov al,[operand_size] + or al,al + jz shd_mem_reg_imm_size_ok + cmp al,1 + jne invalid_operand_size + shd_mem_reg_imm_size_ok: + call get_byte_value + mov byte [value],al + pop eax cx bx edx + call operand_autodetect + call store_instruction_with_imm8 + jmp instruction_assembled + shd_reg: + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov bl,[postbyte_register] + mov [postbyte_register],al + mov al,ah + push eax ebx + lods byte [esi] + cmp al,',' + jne invalid_operand + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,'(' + je shd_reg_reg_imm + cmp al,10h + jne invalid_operand + lods byte [esi] + cmp al,11h + jne invalid_operand + pop ebx eax + call operand_autodetect + inc [extended_code] + call store_nomem_instruction + jmp instruction_assembled + shd_reg_reg_imm: + mov al,[operand_size] + or al,al + jz shd_reg_reg_imm_size_ok + cmp al,1 + jne invalid_operand_size + shd_reg_reg_imm_size_ok: + call get_byte_value + mov dl,al + pop ebx eax + call operand_autodetect + call store_nomem_instruction + mov al,dl + stos byte [edi] + jmp instruction_assembled +movx_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + mov al,ah + push eax + lods byte [esi] + cmp al,',' + jne invalid_operand + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,10h + je movx_reg + cmp al,'[' + jne invalid_operand + call get_address + pop eax + mov ah,[operand_size] + or ah,ah + jz movx_unknown_size + cmp ah,al + jae invalid_operand_size + cmp ah,1 + je movx_mem_8bit + cmp ah,2 + jne invalid_operand_size + movx_mem_16bit: + inc [extended_code] + call operand_autodetect + call store_instruction + jmp instruction_assembled + movx_unknown_size: + cmp [error_line],0 + jne movx_mem_8bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + movx_mem_8bit: + call operand_autodetect + call store_instruction + jmp instruction_assembled + movx_reg: + lods byte [esi] + call convert_register + pop ebx + xchg bl,al + cmp ah,al + jae invalid_operand_size + cmp ah,1 + je movx_reg_8bit + cmp ah,2 + je movx_reg_16bit + jmp invalid_operand_size + movx_reg_8bit: + call operand_autodetect + call store_nomem_instruction + jmp instruction_assembled + movx_reg_16bit: + call operand_autodetect + inc [extended_code] + call store_nomem_instruction + jmp instruction_assembled +movsxd_instruction: + mov [base_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + cmp ah,8 + jne invalid_operand_size + lods byte [esi] + cmp al,',' + jne invalid_operand + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,10h + je movsxd_reg + cmp al,'[' + jne invalid_operand + call get_address + cmp [operand_size],4 + je movsxd_mem_store + cmp [operand_size],0 + jne invalid_operand_size + movsxd_mem_store: + call operand_64bit + call store_instruction + jmp instruction_assembled + movsxd_reg: + lods byte [esi] + call convert_register + cmp ah,4 + jne invalid_operand_size + mov bl,al + call operand_64bit + call store_nomem_instruction + jmp instruction_assembled +bt_instruction: + mov [postbyte_register],al + shl al,3 + add al,83h + mov [extended_code],al + mov [base_code],0Fh + lods byte [esi] + call get_size_operator + cmp al,10h + je bt_reg + cmp al,'[' + jne invalid_operand + call get_address + push eax bx cx + lods byte [esi] + cmp al,',' + jne invalid_operand + cmp byte [esi],'(' + je bt_mem_imm + cmp byte [esi],11h + jne bt_mem_reg + cmp byte [esi+2],'(' + je bt_mem_imm + bt_mem_reg: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + pop cx bx edx + mov al,ah + call operand_autodetect + call store_instruction + jmp instruction_assembled + bt_mem_imm: + xor al,al + xchg al,[operand_size] + push eax + lods byte [esi] + call get_size_operator + cmp al,'(' + jne invalid_operand + mov al,[operand_size] + or al,al + jz bt_mem_imm_size_ok + cmp al,1 + jne invalid_operand_size + bt_mem_imm_size_ok: + call get_byte_value + mov byte [value],al + pop eax + or al,al + jz bt_mem_imm_nosize + call operand_autodetect + bt_mem_imm_store: + pop cx bx edx + mov [extended_code],0BAh + call store_instruction_with_imm8 + jmp instruction_assembled + bt_mem_imm_nosize: + cmp [error_line],0 + jne bt_mem_imm_store + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp bt_mem_imm_store + bt_reg: + lods byte [esi] + call convert_register + mov bl,al + lods byte [esi] + cmp al,',' + jne invalid_operand + cmp byte [esi],'(' + je bt_reg_imm + cmp byte [esi],11h + jne bt_reg_reg + cmp byte [esi+2],'(' + je bt_reg_imm + bt_reg_reg: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + mov al,ah + call operand_autodetect + call store_nomem_instruction + jmp instruction_assembled + bt_reg_imm: + xor al,al + xchg al,[operand_size] + push eax ebx + lods byte [esi] + call get_size_operator + cmp al,'(' + jne invalid_operand + mov al,[operand_size] + or al,al + jz bt_reg_imm_size_ok + cmp al,1 + jne invalid_operand_size + bt_reg_imm_size_ok: + call get_byte_value + mov byte [value],al + pop ebx eax + call operand_autodetect + bt_reg_imm_store: + mov [extended_code],0BAh + call store_nomem_instruction + mov al,byte [value] + stos byte [edi] + jmp instruction_assembled +bs_instruction: + mov [extended_code],al + mov [base_code],0Fh + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je bs_reg_reg + cmp al,'[' + jne invalid_argument + call get_address + mov al,[operand_size] + call operand_autodetect + call store_instruction + jmp instruction_assembled + bs_reg_reg: + lods byte [esi] + call convert_register + mov bl,al + mov al,ah + call operand_autodetect + call store_nomem_instruction + jmp instruction_assembled +imul_instruction: + mov [base_code],0F6h + mov [postbyte_register],5 + lods byte [esi] + call get_size_operator + cmp al,10h + je imul_reg + cmp al,'[' + jne invalid_operand + imul_mem: + call get_address + mov al,[operand_size] + cmp al,1 + je imul_mem_8bit + jb imul_mem_nosize + call operand_autodetect + inc [base_code] + call store_instruction + jmp instruction_assembled + imul_mem_nosize: + cmp [error_line],0 + jne imul_mem_8bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + imul_mem_8bit: + call store_instruction + jmp instruction_assembled + imul_reg: + lods byte [esi] + call convert_register + cmp byte [esi],',' + je imul_reg_ + mov bl,al + mov al,ah + cmp al,1 + je imul_reg_8bit + call operand_autodetect + inc [base_code] + call store_nomem_instruction + jmp instruction_assembled + imul_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled + imul_reg_: + mov [postbyte_register],al + inc esi + cmp byte [esi],'(' + je imul_reg_imm + cmp byte [esi],11h + jne imul_reg_noimm + cmp byte [esi+2],'(' + je imul_reg_imm + imul_reg_noimm: + lods byte [esi] + call get_size_operator + cmp al,10h + je imul_reg_reg + cmp al,'[' + jne invalid_operand + imul_reg_mem: + call get_address + push edx bx cx + cmp byte [esi],',' + je imul_reg_mem_imm + mov al,[operand_size] + call operand_autodetect + pop cx bx edx + mov [base_code],0Fh + mov [extended_code],0AFh + call store_instruction + jmp instruction_assembled + imul_reg_mem_imm: + inc esi + lods byte [esi] + call get_size_operator + cmp al,'(' + jne invalid_operand + mov al,[operand_size] + cmp al,2 + je imul_reg_mem_imm_16bit + cmp al,4 + je imul_reg_mem_imm_32bit + cmp al,8 + je imul_reg_mem_imm_64bit + jmp invalid_operand_size + imul_reg_mem_imm_16bit: + call operand_16bit + call get_word_value + mov word [value],ax + cmp [value_type],0 + jne imul_reg_mem_imm_16bit_store + cmp [size_declared],0 + jne imul_reg_mem_imm_16bit_store + cmp ax,-80h + jl imul_reg_mem_imm_16bit_store + cmp ax,80h + jl imul_reg_mem_imm_8bit_store + imul_reg_mem_imm_16bit_store: + pop cx bx edx + mov [base_code],69h + call store_instruction_with_imm16 + jmp instruction_assembled + imul_reg_mem_imm_32bit: + call operand_32bit + call get_dword_value + imul_reg_mem_imm_32bit_ok: + mov dword [value],eax + cmp [value_type],0 + jne imul_reg_mem_imm_32bit_store + cmp [size_declared],0 + jne imul_reg_mem_imm_32bit_store + cmp eax,-80h + jl imul_reg_mem_imm_32bit_store + cmp eax,80h + jl imul_reg_mem_imm_8bit_store + imul_reg_mem_imm_32bit_store: + pop cx bx edx + mov [base_code],69h + call store_instruction_with_imm32 + jmp instruction_assembled + imul_reg_mem_imm_64bit: + cmp [size_declared],0 + jne long_immediate_not_encodable + call operand_64bit + call get_simm32 + cmp [value_type],4 + jae long_immediate_not_encodable + jmp imul_reg_mem_imm_32bit_ok + imul_reg_mem_imm_8bit_store: + pop cx bx edx + mov [base_code],6Bh + call store_instruction_with_imm8 + jmp instruction_assembled + imul_reg_imm: + mov bl,[postbyte_register] + dec esi + jmp imul_reg_reg_imm + imul_reg_reg: + lods byte [esi] + call convert_register + mov bl,al + cmp byte [esi],',' + je imul_reg_reg_imm + mov al,ah + call operand_autodetect + mov [base_code],0Fh + mov [extended_code],0AFh + call store_nomem_instruction + jmp instruction_assembled + imul_reg_reg_imm: + inc esi + lods byte [esi] + call get_size_operator + cmp al,'(' + jne invalid_operand + mov al,[operand_size] + cmp al,2 + je imul_reg_reg_imm_16bit + cmp al,4 + je imul_reg_reg_imm_32bit + cmp al,8 + je imul_reg_reg_imm_64bit + jmp invalid_operand_size + imul_reg_reg_imm_16bit: + call operand_16bit + push ebx + call get_word_value + pop ebx + mov dx,ax + cmp [value_type],0 + jne imul_reg_reg_imm_16bit_store + cmp [size_declared],0 + jne imul_reg_reg_imm_16bit_store + cmp ax,-80h + jl imul_reg_reg_imm_16bit_store + cmp ax,80h + jl imul_reg_reg_imm_8bit_store + imul_reg_reg_imm_16bit_store: + mov [base_code],69h + call store_nomem_instruction + mov ax,dx + call mark_relocation + stos word [edi] + jmp instruction_assembled + imul_reg_reg_imm_32bit: + call operand_32bit + push ebx + call get_dword_value + imul_reg_reg_imm_32bit_ok: + pop ebx + mov edx,eax + cmp [value_type],0 + jne imul_reg_reg_imm_32bit_store + cmp [size_declared],0 + jne imul_reg_reg_imm_32bit_store + cmp eax,-80h + jl imul_reg_reg_imm_32bit_store + cmp eax,80h + jl imul_reg_reg_imm_8bit_store + imul_reg_reg_imm_32bit_store: + mov [base_code],69h + call store_nomem_instruction + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + imul_reg_reg_imm_64bit: + cmp [size_declared],0 + jne long_immediate_not_encodable + call operand_64bit + push ebx + call get_simm32 + cmp [value_type],4 + jae long_immediate_not_encodable + jmp imul_reg_reg_imm_32bit_ok + imul_reg_reg_imm_8bit_store: + mov [base_code],6Bh + call store_nomem_instruction + mov al,dl + stos byte [edi] + jmp instruction_assembled +in_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + or al,al + jnz invalid_operand + lods byte [esi] + cmp al,',' + jne invalid_operand + mov al,ah + push eax + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,'(' + je in_imm + cmp al,10h + je in_reg + jmp invalid_operand + in_reg: + lods byte [esi] + cmp al,22h + jne invalid_operand + pop eax + cmp al,1 + je in_al_dx + cmp al,2 + je in_ax_dx + cmp al,4 + je in_eax_dx + jmp invalid_operand_size + in_al_dx: + mov al,0ECh + stos byte [edi] + jmp instruction_assembled + in_ax_dx: + call operand_16bit + mov [base_code],0EDh + call store_instruction_code + jmp instruction_assembled + in_eax_dx: + call operand_32bit + mov [base_code],0EDh + call store_instruction_code + jmp instruction_assembled + in_imm: + mov al,[operand_size] + or al,al + jz in_imm_size_ok + cmp al,1 + jne invalid_operand_size + in_imm_size_ok: + call get_byte_value + mov dl,al + pop eax + cmp al,1 + je in_al_imm + cmp al,2 + je in_ax_imm + cmp al,4 + je in_eax_imm + jmp invalid_operand_size + in_al_imm: + mov al,0E4h + stos byte [edi] + mov al,dl + stos byte [edi] + jmp instruction_assembled + in_ax_imm: + call operand_16bit + mov [base_code],0E5h + call store_instruction_code + mov al,dl + stos byte [edi] + jmp instruction_assembled + in_eax_imm: + call operand_32bit + mov [base_code],0E5h + call store_instruction_code + mov al,dl + stos byte [edi] + jmp instruction_assembled +out_instruction: + lods byte [esi] + call get_size_operator + cmp al,'(' + je out_imm + cmp al,10h + jne invalid_operand + lods byte [esi] + cmp al,22h + jne invalid_operand + lods byte [esi] + cmp al,',' + jne invalid_operand + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + or al,al + jnz invalid_operand + mov al,ah + cmp al,1 + je out_dx_al + cmp al,2 + je out_dx_ax + cmp al,4 + je out_dx_eax + jmp invalid_operand_size + out_dx_al: + mov al,0EEh + stos byte [edi] + jmp instruction_assembled + out_dx_ax: + call operand_16bit + mov [base_code],0EFh + call store_instruction_code + jmp instruction_assembled + out_dx_eax: + call operand_32bit + mov [base_code],0EFh + call store_instruction_code + jmp instruction_assembled + out_imm: + mov al,[operand_size] + or al,al + jz out_imm_size_ok + cmp al,1 + jne invalid_operand_size + out_imm_size_ok: + call get_byte_value + mov dl,al + lods byte [esi] + cmp al,',' + jne invalid_operand + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + or al,al + jnz invalid_operand + mov al,ah + cmp al,1 + je out_imm_al + cmp al,2 + je out_imm_ax + cmp al,4 + je out_imm_eax + jmp invalid_operand_size + out_imm_al: + mov al,0E6h + stos byte [edi] + mov al,dl + stos byte [edi] + jmp instruction_assembled + out_imm_ax: + call operand_16bit + mov [base_code],0E7h + call store_instruction_code + mov al,dl + stos byte [edi] + jmp instruction_assembled + out_imm_eax: + call operand_32bit + mov [base_code],0E7h + call store_instruction_code + mov al,dl + stos byte [edi] + jmp instruction_assembled + +call_instruction: + mov [postbyte_register],10b + mov [base_code],0E8h + mov [extended_code],9Ah + jmp process_jmp +jmp_instruction: + mov [postbyte_register],100b + mov [base_code],0E9h + mov [extended_code],0EAh + process_jmp: + lods byte [esi] + call get_jump_operator + call get_size_operator + cmp al,'(' + je jmp_imm + mov [base_code],0FFh + cmp al,10h + je jmp_reg + cmp al,'[' + jne invalid_operand + jmp_mem: + cmp [jump_type],1 + je illegal_instruction + call get_address + mov edx,eax + mov al,[operand_size] + or al,al + jz jmp_mem_size_not_specified + cmp al,2 + je jmp_mem_16bit + cmp al,4 + je jmp_mem_32bit + cmp al,6 + je jmp_mem_48bit + cmp al,8 + je jmp_mem_64bit + cmp al,10 + je jmp_mem_80bit + jmp invalid_operand_size + jmp_mem_size_not_specified: + cmp [jump_type],3 + je jmp_mem_far + cmp [jump_type],2 + je jmp_mem_near + cmp [error_line],0 + jne jmp_mem_near + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + jmp_mem_near: + cmp [code_type],16 + je jmp_mem_16bit + cmp [code_type],32 + je jmp_mem_near_32bit + jmp_mem_64bit: + cmp [jump_type],3 + je invalid_operand_size + cmp [code_type],64 + jne illegal_instruction + call store_instruction + jmp instruction_assembled + jmp_mem_far: + cmp [code_type],16 + je jmp_mem_far_32bit + jmp_mem_48bit: + call operand_32bit + jmp_mem_far_store: + cmp [jump_type],2 + je invalid_operand_size + inc [postbyte_register] + call store_instruction + jmp instruction_assembled + jmp_mem_80bit: + call operand_64bit + jmp jmp_mem_far_store + jmp_mem_far_32bit: + call operand_16bit + jmp jmp_mem_far_store + jmp_mem_32bit: + cmp [jump_type],3 + je jmp_mem_far_32bit + cmp [jump_type],2 + je jmp_mem_near_32bit + cmp [code_type],16 + je jmp_mem_far_32bit + jmp_mem_near_32bit: + cmp [code_type],64 + je illegal_instruction + call operand_32bit + call store_instruction + jmp instruction_assembled + jmp_mem_16bit: + cmp [jump_type],3 + je invalid_operand_size + call operand_16bit + call store_instruction + jmp instruction_assembled + jmp_reg: + test [jump_type],1 + jnz invalid_operand + lods byte [esi] + call convert_register + mov bl,al + mov al,ah + cmp al,2 + je jmp_reg_16bit + cmp al,4 + je jmp_reg_32bit + cmp al,8 + jne invalid_operand_size + jmp_reg_64bit: + cmp [code_type],64 + jne illegal_instruction + call store_nomem_instruction + jmp instruction_assembled + jmp_reg_32bit: + cmp [code_type],64 + je illegal_instruction + call store_nomem_instruction + jmp instruction_assembled + jmp_reg_16bit: + call operand_16bit + call store_nomem_instruction + jmp instruction_assembled + jmp_imm: + cmp byte [esi],'.' + je invalid_value + mov ebx,esi + dec esi + call skip_symbol + xchg esi,ebx + cmp byte [ebx],':' + je jmp_far + cmp [jump_type],3 + je invalid_operand + jmp_near: + mov al,[operand_size] + cmp al,2 + je jmp_imm_16bit + cmp al,4 + je jmp_imm_32bit + cmp al,8 + je jmp_imm_64bit + or al,al + jnz invalid_operand_size + cmp [code_type],16 + je jmp_imm_16bit + cmp [code_type],64 + je jmp_imm_64bit + jmp_imm_32bit: + cmp [code_type],64 + je invalid_operand_size + call get_dword_value + cmp [code_type],16 + jne jmp_imm_32bit_prefix_ok + mov byte [edi],66h + inc edi + jmp_imm_32bit_prefix_ok: + call calculate_jump_offset + cdq + call check_for_short_jump + jc jmp_short + jmp_imm_32bit_store: + mov edx,eax + sub edx,3 + mov al,[base_code] + stos byte [edi] + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + jmp_imm_64bit: + cmp [code_type],64 + jne invalid_operand_size + call get_qword_value + call calculate_jump_offset + mov ecx,edx + cdq + cmp edx,ecx + jne value_out_of_range + call check_for_short_jump + jnc jmp_imm_32bit_store + jmp_short: + mov ah,al + mov al,0EBh + stos word [edi] + jmp instruction_assembled + jmp_imm_16bit: + call get_word_value + cmp [code_type],16 + je jmp_imm_16bit_prefix_ok + mov byte [edi],66h + inc edi + jmp_imm_16bit_prefix_ok: + call calculate_jump_offset + cwde + cdq + call check_for_short_jump + jc jmp_short + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,eax + dec edx + mov al,[base_code] + stos byte [edi] + mov eax,edx + stos word [edi] + jmp instruction_assembled + calculate_jump_offset: + cmp [value_undefined],0 + jne jump_offset_ok + add eax,dword [org_origin] + adc edx,dword [org_origin+4] + lea ebx,[edi+2] + sub eax,ebx + sbb edx,0 + mov bl,[value_type] + or bl,bl + je jump_offset_ok + test bl,1 + jnz invalid_use_of_symbol + cmp bl,[labels_type] + jne invalid_use_of_symbol + mov [value_type],0 + mov ecx,[symbol_identifier] + cmp ecx,[org_symbol] + je jump_offset_ok + mov [value_type],3 + jump_offset_ok: + ret + check_for_short_jump: + cmp [jump_type],1 + je forced_short + ja no_short_jump + cmp [base_code],0E8h + je no_short_jump + cmp [value_type],0 + jne no_short_jump + cmp eax,80h + jb short_jump + cmp eax,-80h + jae short_jump + no_short_jump: + clc + ret + forced_short: + cmp [base_code],0E8h + je illegal_instruction + cmp [next_pass_needed],0 + jne jmp_short_value_type_ok + cmp [value_type],0 + jne invalid_use_of_symbol + jmp_short_value_type_ok: + cmp eax,-80h + jae short_jump + cmp eax,80h + jae jump_out_of_range + short_jump: + stc + ret + jump_out_of_range: + cmp [error_line],0 + jne instruction_assembled + mov eax,[current_line] + mov [error_line],eax + mov [error],relative_jump_out_of_range + jmp instruction_assembled + jmp_far: + cmp [jump_type],2 + je invalid_operand + cmp [code_type],64 + je illegal_instruction + mov al,[extended_code] + mov [base_code],al + call get_word_value + push eax + inc esi + lods byte [esi] + cmp al,'(' + jne invalid_operand + mov al,[value_type] + push eax [symbol_identifier] + cmp byte [esi],'.' + je invalid_value + mov al,[operand_size] + cmp al,4 + je jmp_far_16bit + cmp al,6 + je jmp_far_32bit + or al,al + jnz invalid_operand_size + cmp [code_type],16 + jne jmp_far_32bit + jmp_far_16bit: + call get_word_value + mov ebx,eax + call operand_16bit + call store_instruction_code + mov ax,bx + call mark_relocation + stos word [edi] + jmp_far_segment: + pop [symbol_identifier] eax + mov [value_type],al + pop eax + call mark_relocation + stos word [edi] + jmp instruction_assembled + jmp_far_32bit: + call get_dword_value + mov ebx,eax + call operand_32bit + call store_instruction_code + mov eax,ebx + call mark_relocation + stos dword [edi] + jmp jmp_far_segment +conditional_jump: + mov [base_code],al + lods byte [esi] + call get_jump_operator + cmp [jump_type],3 + je invalid_operand + call get_size_operator + cmp al,'(' + jne invalid_operand + cmp byte [esi],'.' + je invalid_value + mov al,[operand_size] + cmp al,2 + je conditional_jump_16bit + cmp al,4 + je conditional_jump_32bit + cmp al,8 + je conditional_jump_64bit + or al,al + jnz invalid_operand_size + cmp [code_type],16 + je conditional_jump_16bit + cmp [code_type],64 + je conditional_jump_64bit + conditional_jump_32bit: + cmp [code_type],64 + je invalid_operand_size + call get_dword_value + cmp [code_type],16 + jne conditional_jump_32bit_prefix_ok + mov byte [edi],66h + inc edi + conditional_jump_32bit_prefix_ok: + call calculate_jump_offset + cdq + call check_for_short_jump + jc conditional_jump_short + conditional_jump_32bit_store: + mov edx,eax + sub edx,4 + mov ah,[base_code] + add ah,10h + mov al,0Fh + stos word [edi] + mov eax,edx + call mark_relocation + stos dword [edi] + jmp instruction_assembled + conditional_jump_64bit: + cmp [code_type],64 + jne invalid_operand_size + call get_qword_value + call calculate_jump_offset + mov ecx,edx + cdq + cmp edx,ecx + jne value_out_of_range + call check_for_short_jump + jnc conditional_jump_32bit_store + conditional_jump_short: + mov ah,al + mov al,[base_code] + stos word [edi] + jmp instruction_assembled + conditional_jump_16bit: + call get_word_value + cmp [code_type],16 + je conditional_jump_16bit_prefix_ok + mov byte [edi],66h + inc edi + conditional_jump_16bit_prefix_ok: + call calculate_jump_offset + cwde + cdq + call check_for_short_jump + jc conditional_jump_short + cmp [value_type],0 + jne invalid_use_of_symbol + mov edx,eax + sub edx,2 + mov ah,[base_code] + add ah,10h + mov al,0Fh + stos word [edi] + mov eax,edx + stos word [edi] + jmp instruction_assembled +loop_instruction_16bit: + cmp [code_type],64 + je illegal_instruction + mov dl,al + call address_16bit_prefix + mov al,dl + jmp loop_instruction +loop_instruction_32bit: + mov dl,al + call address_32bit_prefix + mov al,dl + jmp loop_instruction +loop_instruction_64bit: + cmp [code_type],64 + jne illegal_instruction +loop_instruction: + mov [base_code],al + lods byte [esi] + call get_jump_operator + cmp [jump_type],1 + ja invalid_operand + call get_size_operator + cmp al,'(' + jne invalid_operand + cmp byte [esi],'.' + je invalid_value + mov al,[operand_size] + cmp al,2 + je loop_jump_16bit + cmp al,4 + je loop_jump_32bit + cmp al,8 + je loop_jump_64bit + or al,al + jnz invalid_operand_size + cmp [code_type],16 + je loop_jump_16bit + cmp [code_type],64 + je loop_jump_64bit + loop_jump_32bit: + cmp [code_type],64 + je invalid_operand_size + call get_dword_value + cmp [code_type],16 + jne loop_jump_32bit_prefix_ok + mov byte [edi],66h + inc edi + loop_jump_32bit_prefix_ok: + call calculate_jump_offset + cdq + make_loop_jump: + call check_for_short_jump + jc conditional_jump_short + jmp jump_out_of_range + loop_jump_64bit: + cmp [code_type],64 + jne invalid_operand_size + call get_qword_value + call calculate_jump_offset + mov ecx,edx + cdq + cmp edx,ecx + jne value_out_of_range + jmp make_loop_jump + loop_jump_16bit: + call get_word_value + cmp [code_type],16 + je loop_jump_16bit_prefix_ok + mov byte [edi],66h + inc edi + loop_jump_16bit_prefix_ok: + call calculate_jump_offset + cwde + cdq + jmp make_loop_jump + +movs_instruction: + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + cmp [segment_register],1 + ja invalid_address + push ebx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + pop edx + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + mov al,dh + mov ah,bh + shr al,4 + shr ah,4 + cmp al,ah + jne address_sizes_do_not_agree + and bh,111b + and dh,111b + cmp bh,6 + jne invalid_address + cmp dh,7 + jne invalid_address + cmp al,2 + je movs_address_16bit + cmp al,4 + je movs_address_32bit + cmp [code_type],64 + jne invalid_address_size + jmp movs_store + movs_address_32bit: + call address_32bit_prefix + jmp movs_store + movs_address_16bit: + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + movs_store: + cmp [segment_register],4 + je movs_segment_ok + call store_segment_prefix + movs_segment_ok: + mov al,0A4h + mov bl,[operand_size] + cmp bl,1 + je simple_instruction + inc al + cmp bl,2 + je simple_instruction_16bit + cmp bl,4 + je simple_instruction_32bit + cmp bl,8 + je simple_instruction_64bit + or bl,bl + jz operand_size_not_specified + jmp invalid_operand_size +lods_instruction: + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + cmp bh,26h + je lods_address_16bit + cmp bh,46h + je lods_address_32bit + cmp bh,86h + jne invalid_address + cmp [code_type],64 + jne invalid_address_size + jmp lods_store + lods_address_32bit: + call address_32bit_prefix + jmp lods_store + lods_address_16bit: + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + lods_store: + cmp [segment_register],4 + je lods_segment_ok + call store_segment_prefix + lods_segment_ok: + mov al,0ACh + mov bl,[operand_size] + cmp bl,1 + je simple_instruction + inc al + cmp bl,2 + je simple_instruction_16bit + cmp bl,4 + je simple_instruction_32bit + cmp bl,8 + je simple_instruction_64bit + or bl,bl + jz operand_size_not_specified + jmp invalid_operand_size +stos_instruction: + mov [base_code],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + cmp bh,27h + je stos_address_16bit + cmp bh,47h + je stos_address_32bit + cmp bh,87h + jne invalid_address + cmp [code_type],64 + jne invalid_address_size + jmp stos_store + stos_address_32bit: + call address_32bit_prefix + jmp stos_store + stos_address_16bit: + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + stos_store: + cmp [segment_register],1 + ja invalid_address + mov al,[base_code] + mov bl,[operand_size] + cmp bl,1 + je simple_instruction + inc al + cmp bl,2 + je simple_instruction_16bit + cmp bl,4 + je simple_instruction_32bit + cmp bl,8 + je simple_instruction_64bit + or bl,bl + jz operand_size_not_specified + jmp invalid_operand_size +cmps_instruction: + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + mov al,[segment_register] + push ax bx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + pop dx ax + cmp [segment_register],1 + ja invalid_address + mov [segment_register],al + mov al,dh + mov ah,bh + shr al,4 + shr ah,4 + cmp al,ah + jne address_sizes_do_not_agree + and bh,111b + and dh,111b + cmp bh,7 + jne invalid_address + cmp dh,6 + jne invalid_address + cmp al,2 + je cmps_address_16bit + cmp al,4 + je cmps_address_32bit + cmp [code_type],64 + jne invalid_address_size + jmp cmps_store + cmps_address_32bit: + call address_32bit_prefix + jmp cmps_store + cmps_address_16bit: + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + cmps_store: + cmp [segment_register],4 + je cmps_segment_ok + call store_segment_prefix + cmps_segment_ok: + mov al,0A6h + mov bl,[operand_size] + cmp bl,1 + je simple_instruction + inc al + cmp bl,2 + je simple_instruction_16bit + cmp bl,4 + je simple_instruction_32bit + cmp bl,8 + je simple_instruction_64bit + or bl,bl + jz operand_size_not_specified + jmp invalid_operand_size +ins_instruction: + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + cmp bh,27h + je ins_address_16bit + cmp bh,47h + je ins_address_32bit + cmp bh,87h + jne invalid_address + cmp [code_type],64 + jne invalid_address_size + jmp ins_store + ins_address_32bit: + call address_32bit_prefix + jmp ins_store + ins_address_16bit: + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + ins_store: + cmp [segment_register],1 + ja invalid_address + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + cmp al,22h + jne invalid_operand + mov al,6Ch + mov bl,[operand_size] + cmp bl,1 + je simple_instruction + inc al + cmp bl,2 + je simple_instruction_16bit + cmp bl,4 + je simple_instruction_32bit + or bl,bl + jz operand_size_not_specified + jmp invalid_operand_size +outs_instruction: + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + cmp al,22h + jne invalid_operand + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + cmp bh,26h + je outs_address_16bit + cmp bh,46h + je outs_address_32bit + cmp bh,86h + jne invalid_address + cmp [code_type],64 + jne invalid_address_size + jmp outs_store + outs_address_32bit: + call address_32bit_prefix + jmp outs_store + outs_address_16bit: + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + outs_store: + cmp [segment_register],4 + je outs_segment_ok + call store_segment_prefix + outs_segment_ok: + mov al,6Eh + mov bl,[operand_size] + cmp bl,1 + je simple_instruction + inc al + cmp bl,2 + je simple_instruction_16bit + cmp bl,4 + je simple_instruction_32bit + or bl,bl + jz operand_size_not_specified + jmp invalid_operand_size +xlat_instruction: + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + or eax,eax + jnz invalid_address + or bl,ch + jnz invalid_address + cmp bh,23h + je xlat_address_16bit + cmp bh,43h + je xlat_address_32bit + cmp bh,83h + jne invalid_address + cmp [code_type],64 + jne invalid_address_size + jmp xlat_store + xlat_address_32bit: + call address_32bit_prefix + jmp xlat_store + xlat_address_16bit: + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + xlat_store: + call store_segment_prefix_if_necessary + mov al,0D7h + cmp [operand_size],1 + jbe simple_instruction + jmp invalid_operand_size + +pm_word_instruction: + mov ah,al + shr ah,4 + and al,111b + mov [base_code],0Fh + mov [extended_code],ah + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,10h + je pm_reg + pm_mem: + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + cmp al,2 + je pm_mem_store + or al,al + jnz invalid_operand_size + pm_mem_store: + call store_instruction + jmp instruction_assembled + pm_reg: + lods byte [esi] + call convert_register + mov bl,al + cmp ah,2 + jne invalid_operand_size + call store_nomem_instruction + jmp instruction_assembled +pm_store_word_instruction: + mov ah,al + shr ah,4 + and al,111b + mov [base_code],0Fh + mov [extended_code],ah + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne pm_mem + lods byte [esi] + call convert_register + mov bl,al + mov al,ah + call operand_autodetect + call store_nomem_instruction + jmp instruction_assembled +lgdt_instruction: + mov [base_code],0Fh + mov [extended_code],1 + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + cmp al,6 + je lgdt_mem_48bit + cmp al,10 + je lgdt_mem_80bit + or al,al + jnz invalid_operand_size + jmp lgdt_mem_store + lgdt_mem_80bit: + cmp [code_type],64 + jne illegal_instruction + jmp lgdt_mem_store + lgdt_mem_48bit: + cmp [code_type],64 + je illegal_instruction + cmp [postbyte_register],2 + jb lgdt_mem_store + call operand_32bit + lgdt_mem_store: + call store_instruction + jmp instruction_assembled +lar_instruction: + mov [extended_code],al + mov [base_code],0Fh + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + xor al,al + xchg al,[operand_size] + call operand_autodetect + lods byte [esi] + call get_size_operator + cmp al,10h + je lar_reg_reg + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + or al,al + jz lar_reg_mem + cmp al,2 + jne invalid_operand_size + lar_reg_mem: + call store_instruction + jmp instruction_assembled + lar_reg_reg: + lods byte [esi] + call convert_register + cmp ah,2 + jne invalid_operand_size + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +invlpg_instruction: + mov [base_code],0Fh + mov [extended_code],1 + mov [postbyte_register],7 + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + call store_instruction + jmp instruction_assembled +swapgs_instruction: + mov [base_code],0Fh + mov [extended_code],1 + mov [postbyte_register],7 + mov bl,al + call store_nomem_instruction + jmp instruction_assembled + +basic_486_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + je basic_486_reg + cmp al,'[' + jne invalid_operand + call get_address + push edx bx cx + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + pop cx bx edx + mov al,ah + cmp al,1 + je basic_486_mem_reg_8bit + call operand_autodetect + inc [extended_code] + basic_486_mem_reg_8bit: + call store_instruction + jmp instruction_assembled + basic_486_reg: + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov bl,[postbyte_register] + mov [postbyte_register],al + mov al,ah + cmp al,1 + je basic_486_reg_reg_8bit + call operand_autodetect + inc [extended_code] + basic_486_reg_reg_8bit: + call store_nomem_instruction + jmp instruction_assembled +bswap_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + test al,1000b + jz bswap_reg_code_ok + or [rex_prefix],41h + and al,111b + bswap_reg_code_ok: + add al,0C8h + mov [extended_code],al + mov [base_code],0Fh + cmp ah,8 + je bswap_reg64 + cmp ah,4 + jne invalid_operand_size + call operand_32bit + call store_instruction_code + jmp instruction_assembled + bswap_reg64: + call operand_64bit + call store_instruction_code + jmp instruction_assembled +cmpxchgx_instruction: + mov [base_code],0Fh + mov [extended_code],0C7h + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov ah,1 + xchg [postbyte_register],ah + mov al,[operand_size] + or al,al + jz cmpxchgx_size_ok + cmp al,ah + jne invalid_operand_size + cmpxchgx_size_ok: + cmp ah,16 + jne cmpxchgx_store + call operand_64bit + cmpxchgx_store: + call store_instruction + jmp instruction_assembled + +basic_fpu_instruction: + mov [postbyte_register],al + mov [base_code],0D8h + lods byte [esi] + call get_size_operator + cmp al,10h + je basic_fpu_streg + cmp al,'[' + je basic_fpu_mem + dec esi + mov ah,[postbyte_register] + cmp ah,2 + jb invalid_operand + cmp ah,3 + ja invalid_operand + mov bl,1 + call store_nomem_instruction + jmp instruction_assembled + basic_fpu_mem: + call get_address + mov al,[operand_size] + cmp al,4 + je basic_fpu_mem_32bit + cmp al,8 + je basic_fpu_mem_64bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne basic_fpu_mem_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + basic_fpu_mem_32bit: + call store_instruction + jmp instruction_assembled + basic_fpu_mem_64bit: + mov [base_code],0DCh + call store_instruction + jmp instruction_assembled + basic_fpu_streg: + lods byte [esi] + call convert_fpu_register + mov bl,al + mov ah,[postbyte_register] + cmp ah,2 + je basic_fpu_single_streg + cmp ah,3 + je basic_fpu_single_streg + or al,al + jz basic_fpu_st0 + test ah,110b + jz basic_fpu_streg_st0 + xor [postbyte_register],1 + basic_fpu_streg_st0: + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_fpu_register + or al,al + jnz invalid_operand + mov [base_code],0DCh + call store_nomem_instruction + jmp instruction_assembled + basic_fpu_st0: + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_fpu_register + mov bl,al + basic_fpu_single_streg: + mov [base_code],0D8h + call store_nomem_instruction + jmp instruction_assembled +simple_fpu_instruction: + mov ah,al + or ah,11000000b + mov al,0D9h + stos word [edi] + jmp instruction_assembled +fi_instruction: + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + cmp al,2 + je fi_mem_16bit + cmp al,4 + je fi_mem_32bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne fi_mem_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + fi_mem_32bit: + mov [base_code],0DAh + call store_instruction + jmp instruction_assembled + fi_mem_16bit: + mov [base_code],0DEh + call store_instruction + jmp instruction_assembled +fld_instruction: + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,10h + je fld_streg + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + cmp al,4 + je fld_mem_32bit + cmp al,8 + je fld_mem_64bit + cmp al,10 + je fld_mem_80bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne fld_mem_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + fld_mem_32bit: + mov [base_code],0D9h + call store_instruction + jmp instruction_assembled + fld_mem_64bit: + mov [base_code],0DDh + call store_instruction + jmp instruction_assembled + fld_mem_80bit: + mov al,[postbyte_register] + cmp al,0 + je fld_mem_80bit_store + dec [postbyte_register] + cmp al,3 + je fld_mem_80bit_store + jmp invalid_operand_size + fld_mem_80bit_store: + add [postbyte_register],5 + mov [base_code],0DBh + call store_instruction + jmp instruction_assembled + fld_streg: + lods byte [esi] + call convert_fpu_register + mov bl,al + cmp [postbyte_register],2 + jae fst_streg + mov [base_code],0D9h + call store_nomem_instruction + jmp instruction_assembled + fst_streg: + mov [base_code],0DDh + call store_nomem_instruction + jmp instruction_assembled +fild_instruction: + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + cmp al,2 + je fild_mem_16bit + cmp al,4 + je fild_mem_32bit + cmp al,8 + je fild_mem_64bit + or al,al + jnz invalid_operand_size + cmp [error_line],0 + jne fild_mem_32bit + mov eax,[current_line] + mov [error_line],eax + mov [error],operand_size_not_specified + fild_mem_32bit: + mov [base_code],0DBh + call store_instruction + jmp instruction_assembled + fild_mem_16bit: + mov [base_code],0DFh + call store_instruction + jmp instruction_assembled + fild_mem_64bit: + mov al,[postbyte_register] + cmp al,1 + je fisttp_64bit_store + jb fild_mem_64bit_store + dec [postbyte_register] + cmp al,3 + je fild_mem_64bit_store + jmp invalid_operand_size + fild_mem_64bit_store: + add [postbyte_register],5 + mov [base_code],0DFh + call store_instruction + jmp instruction_assembled + fisttp_64bit_store: + mov [base_code],0DDh + call store_instruction + jmp instruction_assembled +fbld_instruction: + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + or al,al + jz fbld_mem_80bit + cmp al,10 + je fbld_mem_80bit + jmp invalid_operand_size + fbld_mem_80bit: + mov [base_code],0DFh + call store_instruction + jmp instruction_assembled +faddp_instruction: + mov [postbyte_register],al + mov [base_code],0DEh + mov edx,esi + lods byte [esi] + call get_size_operator + cmp al,10h + je faddp_streg + mov esi,edx + mov bl,1 + call store_nomem_instruction + jmp instruction_assembled + faddp_streg: + lods byte [esi] + call convert_fpu_register + mov bl,al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_fpu_register + or al,al + jnz invalid_operand + call store_nomem_instruction + jmp instruction_assembled +fcompp_instruction: + mov ax,0D9DEh + stos word [edi] + jmp instruction_assembled +fucompp_instruction: + mov ax,0E9DAh + stos word [edi] + jmp instruction_assembled +fxch_instruction: + mov dx,01D9h + jmp fpu_single_operand +ffreep_instruction: + mov dx,00DFh + jmp fpu_single_operand +ffree_instruction: + mov dl,0DDh + mov dh,al + fpu_single_operand: + mov ebx,esi + lods byte [esi] + call get_size_operator + cmp al,10h + je fpu_streg + or dh,dh + jz invalid_operand + mov esi,ebx + shl dh,3 + or dh,11000001b + mov ax,dx + stos word [edi] + jmp instruction_assembled + fpu_streg: + lods byte [esi] + call convert_fpu_register + shl dh,3 + or dh,al + or dh,11000000b + mov ax,dx + stos word [edi] + jmp instruction_assembled +fstenv_instruction: + mov byte [edi],9Bh + inc edi +fldenv_instruction: + mov [base_code],0D9h + jmp fpu_mem +fsave_instruction: + mov byte [edi],9Bh + inc edi +fnsave_instruction: + mov [base_code],0DDh + fpu_mem: + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + cmp [operand_size],0 + jne invalid_operand_size + call store_instruction + jmp instruction_assembled +fstcw_instruction: + mov byte [edi],9Bh + inc edi +fldcw_instruction: + mov [postbyte_register],al + mov [base_code],0D9h + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + or al,al + jz fldcw_mem_16bit + cmp al,2 + je fldcw_mem_16bit + jmp invalid_operand_size + fldcw_mem_16bit: + call store_instruction + jmp instruction_assembled +fstsw_instruction: + mov al,9Bh + stos byte [edi] +fnstsw_instruction: + mov [base_code],0DDh + mov [postbyte_register],7 + lods byte [esi] + call get_size_operator + cmp al,10h + je fstsw_reg + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + or al,al + jz fstsw_mem_16bit + cmp al,2 + je fstsw_mem_16bit + jmp invalid_operand_size + fstsw_mem_16bit: + call store_instruction + jmp instruction_assembled + fstsw_reg: + lods byte [esi] + call convert_register + cmp ax,0200h + jne invalid_operand + mov ax,0E0DFh + stos word [edi] + jmp instruction_assembled +finit_instruction: + mov byte [edi],9Bh + inc edi +fninit_instruction: + mov ah,al + mov al,0DBh + stos word [edi] + jmp instruction_assembled +fcmov_instruction: + mov dh,0DAh + jmp fcomi_streg +fcomi_instruction: + mov dh,0DBh + jmp fcomi_streg +fcomip_instruction: + mov dh,0DFh + fcomi_streg: + mov dl,al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_fpu_register + mov ah,al + cmp byte [esi],',' + je fcomi_st0_streg + add ah,dl + mov al,dh + stos word [edi] + jmp instruction_assembled + fcomi_st0_streg: + or ah,ah + jnz invalid_operand + inc esi + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_fpu_register + mov ah,al + add ah,dl + mov al,dh + stos word [edi] + jmp instruction_assembled + +mmx_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je mmx_mmreg_mmreg + cmp al,'[' + jne invalid_operand + mmx_mmreg_mem: + call get_address + call store_instruction + jmp instruction_assembled + mmx_mmreg_mmreg: + lods byte [esi] + call convert_mmx_register + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +mmx_ps_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,10h + je mmx_mmreg_mmreg + cmp al,'(' + je mmx_ps_mmreg_imm8 + cmp al,'[' + je mmx_mmreg_mem + jmp invalid_operand + mmx_ps_mmreg_imm8: + call get_byte_value + mov byte [value],al + test [operand_size],not 1 + jnz invalid_value + mov bl,[extended_code] + mov al,bl + shr bl,4 + and al,1111b + add al,70h + mov [extended_code],al + sub bl,0Ch + shl bl,1 + xchg bl,[postbyte_register] + call store_nomem_instruction + mov al,byte [value] + stos byte [edi] + jmp instruction_assembled +pextrw_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ah,4 + jnz invalid_operand_size + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + mov bl,al + call make_mmx_prefix + cmp [extended_code],0C5h + je mmx_nomem_imm8 + call store_nomem_instruction + jmp instruction_assembled + mmx_imm8: + push bx cx edx + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + test ah,not 1 + jnz invalid_operand_size + cmp al,'(' + jne invalid_operand + call get_byte_value + mov byte [value],al + pop edx cx bx + call store_instruction_with_imm8 + jmp instruction_assembled + mmx_nomem_imm8: + call store_nomem_instruction + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + test ah,not 1 + jnz invalid_operand_size + cmp al,'(' + jne invalid_operand + call get_byte_value + stosb + jmp instruction_assembled +pinsrw_instruction: + mov [extended_code],al + mov [base_code],0Fh + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je pinsrw_mmreg_reg + cmp al,'[' + jne invalid_operand + call get_address + cmp [operand_size],0 + je mmx_imm8 + cmp [operand_size],2 + jne invalid_operand_size + jmp mmx_imm8 + pinsrw_mmreg_reg: + lods byte [esi] + call convert_register + cmp ah,4 + jne invalid_operand_size + mov bl,al + jmp mmx_nomem_imm8 +pshufw_instruction: + mov [mmx_size],8 + mov [operand_prefix],al + jmp pshuf_instruction +pshufd_instruction: + mov [mmx_size],16 + mov [operand_prefix],al + pshuf_instruction: + mov [base_code],0Fh + mov [extended_code],70h + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,[mmx_size] + jne invalid_operand_size + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je pshuf_mmreg_mmreg + cmp al,'[' + jne invalid_operand + call get_address + jmp mmx_imm8 + pshuf_mmreg_mmreg: + lods byte [esi] + call convert_mmx_register + mov bl,al + jmp mmx_nomem_imm8 +movd_instruction: + mov [base_code],0Fh + mov [extended_code],7Eh + lods byte [esi] + call get_size_operator + cmp al,10h + je movd_reg + cmp al,'[' + jne invalid_operand + call get_address + test [operand_size],not 4 + jnz invalid_operand_size + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + call make_mmx_prefix + mov [postbyte_register],al + call store_instruction + jmp instruction_assembled + movd_reg: + lods byte [esi] + cmp al,0B0h + jae movd_mmreg + call convert_register + cmp ah,4 + jne invalid_operand_size + mov [operand_size],0 + mov bl,al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + mov [postbyte_register],al + call make_mmx_prefix + call store_nomem_instruction + jmp instruction_assembled + movd_mmreg: + mov [extended_code],6Eh + call convert_mmx_register + call make_mmx_prefix + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je movd_mmreg_reg + cmp al,'[' + jne invalid_operand + call get_address + test [operand_size],not 4 + jnz invalid_operand_size + call store_instruction + jmp instruction_assembled + movd_mmreg_reg: + lods byte [esi] + call convert_register + cmp ah,4 + jne invalid_operand_size + mov bl,al + call store_nomem_instruction + jmp instruction_assembled + make_mmx_prefix: + cmp [operand_size],16 + jne no_mmx_prefix + mov [operand_prefix],66h + no_mmx_prefix: + ret +movq_instruction: + mov [base_code],0Fh + lods byte [esi] + call get_size_operator + cmp al,10h + je movq_reg + cmp al,'[' + jne invalid_operand + call get_address + test [operand_size],not 8 + jnz invalid_operand_size + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + mov [postbyte_register],al + cmp ah,16 + je movq_mem_xmmreg + mov [extended_code],7Fh + call store_instruction + jmp instruction_assembled + movq_mem_xmmreg: + mov [extended_code],0D6h + mov [operand_prefix],66h + call store_instruction + jmp instruction_assembled + movq_reg: + lods byte [esi] + cmp al,0B0h + jae movq_mmreg + call convert_register + cmp ah,8 + jne invalid_operand_size + mov bl,al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + mov [postbyte_register],al + call make_mmx_prefix + mov [extended_code],7Eh + call operand_64bit + call store_nomem_instruction + jmp instruction_assembled + movq_mmreg: + call convert_mmx_register + mov [postbyte_register],al + mov [extended_code],6Fh + mov [mmx_size],ah + cmp ah,16 + jne movq_mmreg_ + mov [extended_code],7Eh + mov [operand_prefix],0F3h + movq_mmreg_: + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je movq_mmreg_reg + call get_address + test [operand_size],not 8 + jnz invalid_operand_size + call store_instruction + jmp instruction_assembled + movq_mmreg_reg: + lods byte [esi] + cmp al,0B0h + jae movq_mmreg_mmreg + mov [operand_size],0 + call convert_register + cmp ah,8 + jne invalid_operand_size + mov [extended_code],6Eh + mov [operand_prefix],0 + mov bl,al + cmp [mmx_size],16 + jne movq_mmreg_reg_store + mov [operand_prefix],66h + movq_mmreg_reg_store: + call operand_64bit + call store_nomem_instruction + jmp instruction_assembled + movq_mmreg_mmreg: + call convert_mmx_register + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +movdq_instruction: + mov [operand_prefix],al + mov [base_code],0Fh + mov [extended_code],6Fh + lods byte [esi] + call get_size_operator + cmp al,10h + je movdq_mmreg + cmp al,'[' + jne invalid_operand + call get_address + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + mov [extended_code],7Fh + call store_instruction + jmp instruction_assembled + movdq_mmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je movdq_mmreg_mmreg + cmp al,'[' + jne invalid_operand + call get_address + call store_instruction + jmp instruction_assembled + movdq_mmreg_mmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +lddqu_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + push eax + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + pop eax + mov [postbyte_register],al + mov [operand_prefix],0F2h + mov [base_code],0Fh + mov [extended_code],0F0h + call store_instruction + jmp instruction_assembled +movq2dq_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov bl,al + mov [operand_prefix],0F3h + mov [base_code],0Fh + mov [extended_code],0D6h + call store_nomem_instruction + jmp instruction_assembled +movdq2q_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov bl,al + mov [operand_prefix],0F2h + mov [base_code],0Fh + mov [extended_code],0D6h + call store_nomem_instruction + jmp instruction_assembled + +sse_ps_instruction: + mov [mmx_size],16 + jmp sse_instruction +sse_pd_instruction: + mov [mmx_size],16 + mov [operand_prefix],66h + jmp sse_instruction +sse_ss_instruction: + mov [mmx_size],4 + mov [operand_prefix],0F3h + jmp sse_instruction +sse_sd_instruction: + mov [mmx_size],8 + mov [operand_prefix],0F2h + jmp sse_instruction +comiss_instruction: + mov [mmx_size],4 + jmp sse_instruction +comisd_instruction: + mov [mmx_size],8 + mov [operand_prefix],66h + jmp sse_instruction +cvtps2pd_instruction: + mov [mmx_size],8 + jmp sse_instruction +cvtpd2dq_instruction: + mov [mmx_size],16 + mov [operand_prefix],0F2h + jmp sse_instruction +cvtdq2pd_instruction: + mov [mmx_size],16 + mov [operand_prefix],0F3h +sse_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + sse_xmmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + sse_reg: + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je sse_xmmreg_xmmreg + sse_reg_mem: + cmp al,'[' + jne invalid_operand + call get_address + cmp [operand_size],0 + je sse_mem_size_ok + mov al,[mmx_size] + cmp [operand_size],al + jne invalid_operand_size + sse_mem_size_ok: + cmp [extended_code],0C6h + je mmx_imm8 + call store_instruction + jmp instruction_assembled + sse_xmmreg_xmmreg: + cmp [operand_prefix],66h + jne sse_xmmreg_xmmreg_ok + cmp [extended_code],12h + je invalid_operand + cmp [extended_code],16h + je invalid_operand + sse_xmmreg_xmmreg_ok: + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov bl,al + cmp [extended_code],0C6h + je mmx_nomem_imm8 + call store_nomem_instruction + jmp instruction_assembled +ps_dq_instruction: + mov [postbyte_register],al + mov [operand_prefix],66h + mov [base_code],0Fh + mov [extended_code],73h + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov bl,al + jmp mmx_nomem_imm8 +movpd_instruction: + mov [operand_prefix],66h +movps_instruction: + mov [base_code],0Fh + mov [extended_code],al + mov [mmx_size],16 + jmp sse_mov_instruction +movss_instruction: + mov [mmx_size],4 + mov [operand_prefix],0F3h + jmp sse_movs +movsd_instruction: + mov al,0A5h + mov ah,[esi] + or ah,ah + jz simple_instruction_32bit + cmp ah,0Fh + je simple_instruction_32bit + mov [mmx_size],8 + mov [operand_prefix],0F2h + sse_movs: + mov [base_code],0Fh + mov [extended_code],10h + jmp sse_mov_instruction +sse_mov_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + je sse_xmmreg + sse_mem: + cmp al,'[' + jne invalid_operand + inc [extended_code] + call get_address + cmp [operand_size],0 + je sse_mem_xmmreg + mov al,[mmx_size] + cmp [operand_size],al + jne invalid_operand_size + mov [operand_size],0 + sse_mem_xmmreg: + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + call store_instruction + jmp instruction_assembled +movlpd_instruction: + mov [operand_prefix],66h +movlps_instruction: + mov [base_code],0Fh + mov [extended_code],al + mov [mmx_size],8 + lods byte [esi] + call get_size_operator + cmp al,10h + jne sse_mem + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + jmp sse_reg_mem +movhlps_instruction: + mov [base_code],0Fh + mov [extended_code],al + mov [mmx_size],0 + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je sse_xmmreg_xmmreg_ok + jmp invalid_operand +maskmovq_instruction: + mov cl,8 + jmp maskmov_instruction +maskmovdqu_instruction: + mov cl,16 + mov [operand_prefix],66h + maskmov_instruction: + mov [base_code],0Fh + mov [extended_code],0F7h + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,cl + jne invalid_operand_size + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +movmskpd_instruction: + mov [operand_prefix],66h +movmskps_instruction: + mov [base_code],0Fh + mov [extended_code],50h + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ah,4 + jne invalid_operand_size + mov [operand_size],0 + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +cmppd_instruction: + mov [operand_prefix],66h +cmpps_instruction: + mov [base_code],0Fh + mov [extended_code],0C2h + mov [mmx_size],16 + mov byte [value],-1 + jmp sse_cmp_instruction +cmp_pd_instruction: + mov [operand_prefix],66h +cmp_ps_instruction: + mov [base_code],0Fh + mov [extended_code],0C2h + mov [mmx_size],16 + mov byte [value],al + jmp sse_cmp_instruction +cmpss_instruction: + mov [mmx_size],4 + mov [operand_prefix],0F3h + jmp cmpsx_instruction +cmpsd_instruction: + mov al,0A7h + mov ah,[esi] + or ah,ah + jz simple_instruction_32bit + cmp ah,0Fh + je simple_instruction_32bit + mov [mmx_size],8 + mov [operand_prefix],0F2h + cmpsx_instruction: + mov [base_code],0Fh + mov [extended_code],0C2h + mov byte [value],-1 + jmp sse_cmp_instruction +cmp_ss_instruction: + mov [mmx_size],4 + mov [operand_prefix],0F3h + jmp cmp_sx_instruction +cmp_sd_instruction: + mov [mmx_size],8 + mov [operand_prefix],0F2h + cmp_sx_instruction: + mov [base_code],0Fh + mov [extended_code],0C2h + mov byte [value],al +sse_cmp_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + mov [operand_size],0 + lods byte [esi] + call get_size_operator + cmp al,10h + je sse_cmp_xmmreg_xmmreg + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + or al,al + jz sse_cmp_size_ok + cmp al,[mmx_size] + jne invalid_operand_size + sse_cmp_size_ok: + push bx cx edx + call get_nextbyte + pop edx cx bx + call store_instruction_with_imm8 + jmp instruction_assembled + sse_cmp_xmmreg_xmmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov bl,al + call store_nomem_instruction + call get_nextbyte + mov al,byte [value] + stos byte [edi] + jmp instruction_assembled + get_nextbyte: + cmp byte [value],-1 + jne nextbyte_ok + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + test [operand_size],not 1 + jnz invalid_value + cmp al,'(' + jne invalid_operand + call get_byte_value + cmp al,7 + ja invalid_value + mov byte [value],al + nextbyte_ok: + ret +cvtpi2pd_instruction: + mov [operand_prefix],66h +cvtpi2ps_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je cvtpi_xmmreg_xmmreg + cmp al,'[' + jne invalid_operand + call get_address + cmp [operand_size],0 + je cvtpi_size_ok + cmp [operand_size],8 + jne invalid_operand_size + cvtpi_size_ok: + call store_instruction + jmp instruction_assembled + cvtpi_xmmreg_xmmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +cvtsi2ss_instruction: + mov [operand_prefix],0F3h + jmp cvtsi_instruction +cvtsi2sd_instruction: + mov [operand_prefix],0F2h + cvtsi_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,16 + jne invalid_operand_size + mov [postbyte_register],al + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je cvtsi_xmmreg_reg + cmp al,'[' + jne invalid_operand + call get_address + cmp [operand_size],0 + je cvtsi_size_ok + cmp [operand_size],4 + jne invalid_operand_size + cvtsi_size_ok: + call store_instruction + jmp instruction_assembled + cvtsi_xmmreg_reg: + lods byte [esi] + call convert_register + cmp ah,4 + je cvtsi_xmmreg_reg_store + cmp ah,8 + jne invalid_operand_size + call operand_64bit + cvtsi_xmmreg_reg_store: + mov bl,al + call store_nomem_instruction + jmp instruction_assembled +cvtps2pi_instruction: + mov [mmx_size],8 + jmp cvtpd_instruction +cvtpd2pi_instruction: + mov [operand_prefix],66h + mov [mmx_size],16 + cvtpd_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov [operand_size],0 + jmp sse_reg +cvtss2si_instruction: + mov [operand_prefix],0F3h + mov [mmx_size],4 + jmp cvt2si_instruction +cvtsd2si_instruction: + mov [operand_prefix],0F2h + mov [mmx_size],8 + cvt2si_instruction: + mov [extended_code],al + mov [base_code],0Fh + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [operand_size],0 + cmp ah,4 + je sse_reg + cmp ah,8 + jne invalid_operand_size + call operand_64bit + jmp sse_reg +amd3dnow_instruction: + mov [base_code],0Fh + mov [extended_code],0Fh + mov byte [value],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + je amd3dnow_mmreg_mmreg + cmp al,'[' + jne invalid_operand + call get_address + call store_instruction_with_imm8 + jmp instruction_assembled + amd3dnow_mmreg_mmreg: + lods byte [esi] + call convert_mmx_register + cmp ah,8 + jne invalid_operand_size + mov bl,al + call store_nomem_instruction + mov al,byte [value] + stos byte [edi] + jmp instruction_assembled + +fxsave_instruction: + mov [extended_code],0AEh + mov [base_code],0Fh + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov ah,[operand_size] + or ah,ah + jz fxsave_size_ok + mov al,[postbyte_register] + cmp al,111b + je clflush_size_check + cmp al,10b + jb invalid_operand_size + cmp al,11b + ja invalid_operand_size + cmp ah,4 + jne invalid_operand_size + jmp fxsave_size_ok + clflush_size_check: + cmp ah,1 + jne invalid_operand_size + fxsave_size_ok: + call store_instruction + jmp instruction_assembled +prefetch_instruction: + mov [extended_code],18h + prefetch_mem_8bit: + mov [base_code],0Fh + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + or ah,ah + jz prefetch_size_ok + cmp ah,1 + jne invalid_operand_size + prefetch_size_ok: + call get_address + call store_instruction + jmp instruction_assembled +amd_prefetch_instruction: + mov [extended_code],0Dh + jmp prefetch_mem_8bit +fence_instruction: + mov bl,al + mov ax,0AE0Fh + stos word [edi] + mov al,bl + stos byte [edi] + jmp instruction_assembled +pause_instruction: + mov ax,90F3h + stos word [edi] + jmp instruction_assembled +movntq_instruction: + mov [mmx_size],8 + jmp movnt_instruction +movntps_instruction: + mov [mmx_size],16 + jmp movnt_instruction +movntdq_instruction: + mov [operand_prefix],66h + mov [mmx_size],16 + movnt_instruction: + mov [extended_code],al + mov [base_code],0Fh + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_mmx_register + cmp ah,[mmx_size] + jne invalid_operand_size + mov [postbyte_register],al + call store_instruction + jmp instruction_assembled +movnti_instruction: + mov [base_code],0Fh + mov [extended_code],al + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ah,4 + je movnti_store + cmp ah,8 + jne invalid_operand_size + call operand_64bit + movnti_store: + mov [postbyte_register],al + call store_instruction + jmp instruction_assembled +monitor_instruction: + mov [postbyte_register],al + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ax,0400h + jne invalid_operand + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ax,0401h + jne invalid_operand + cmp [postbyte_register],0C8h + jne monitor_instruction_store + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ax,0402h + jne invalid_operand + monitor_instruction_store: + mov ax,010Fh + stos word [edi] + mov al,[postbyte_register] + stos byte [edi] + jmp instruction_assembled + +simple_vmx_instruction: + mov ah,al + mov al,0Fh + stos byte [edi] + mov al,1 + stos word [edi] + jmp instruction_assembled +vmclear_instruction: + mov [operand_prefix],66h + jmp vmx_instruction +vmxon_instruction: + mov [operand_prefix],0F3h +vmx_instruction: + mov [postbyte_register],al + mov [extended_code],0C7h + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + mov al,[operand_size] + or al,al + jz vmx_size_ok + cmp al,8 + jne invalid_operand_size + vmx_size_ok: + mov [base_code],0Fh + call store_instruction + jmp instruction_assembled +vmread_instruction: + mov [extended_code],78h + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + vmread_check_size: + cmp [code_type],64 + je vmread_long + cmp [operand_size],4 + je vmx_size_ok + jmp invalid_operand_size + vmread_long: + cmp [operand_size],8 + je vmx_size_ok + jmp invalid_operand_size +vmwrite_instruction: + mov [extended_code],79h + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + mov [postbyte_register],al + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,'[' + jne invalid_operand + call get_address + jmp vmread_check_size +simple_svm_instruction: + push eax + mov [base_code],0Fh + mov [extended_code],1 + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + or al,al + jnz invalid_operand + simple_svm_detect_size: + cmp ah,2 + je simple_svm_16bit + cmp ah,4 + je simple_svm_32bit + cmp [code_type],64 + jne invalid_operand_size + jmp simple_svm_store + simple_svm_16bit: + cmp [code_type],16 + je simple_svm_store + cmp [code_type],64 + je invalid_operand_size + jmp prefixed_svm_store + simple_svm_32bit: + cmp [code_type],32 + je simple_svm_store + prefixed_svm_store: + mov al,67h + stos byte [edi] + simple_svm_store: + call store_instruction_code + pop eax + stos byte [edi] + jmp instruction_assembled +skinit_instruction: + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ax,0400h + jne invalid_operand + mov al,0DEh + jmp simple_vmx_instruction +invlpga_instruction: + push eax + mov [base_code],0Fh + mov [extended_code],1 + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + or al,al + jnz invalid_operand + mov bl,ah + mov [operand_size],0 + lods byte [esi] + cmp al,',' + jne invalid_operand + lods byte [esi] + call get_size_operator + cmp al,10h + jne invalid_operand + lods byte [esi] + call convert_register + cmp ax,0401h + jne invalid_operand + mov ah,bl + jmp simple_svm_detect_size + +convert_register: + mov ah,al + shr ah,4 + and al,0Fh + cmp ah,8 + je match_register_size + cmp ah,4 + ja invalid_operand + cmp ah,1 + ja match_register_size + cmp al,4 + jb match_register_size + or ah,ah + jz high_byte_register + or [rex_prefix],40h + match_register_size: + cmp ah,[operand_size] + je register_size_ok + cmp [operand_size],0 + jne operand_sizes_do_not_match + mov [operand_size],ah + register_size_ok: + ret + high_byte_register: + mov ah,1 + or [rex_prefix],80h + jmp match_register_size +convert_fpu_register: + mov ah,al + shr ah,4 + and al,111b + cmp ah,10 + jne invalid_operand + jmp match_register_size +convert_mmx_register: + mov ah,al + shr ah,4 + cmp ah,0Ch + je xmm_register + ja invalid_operand + and al,111b + cmp ah,0Bh + jne invalid_operand + mov ah,8 + jmp match_register_size + xmm_register: + and al,0Fh + mov ah,16 + cmp al,8 + jb match_register_size + cmp [code_type],64 + jne invalid_operand + jmp match_register_size +get_size_operator: + xor ah,ah + cmp al,11h + jne no_size_operator + mov [size_declared],1 + lods word [esi] + xchg al,ah + mov [size_override],1 + cmp ah,[operand_size] + je size_operator_ok + cmp [operand_size],0 + jne operand_sizes_do_not_match + mov [operand_size],ah + size_operator_ok: + ret + no_size_operator: + mov [size_declared],0 + cmp al,'[' + jne size_operator_ok + mov [size_override],0 + ret +get_jump_operator: + mov [jump_type],0 + cmp al,12h + jne jump_operator_ok + lods word [esi] + mov [jump_type],al + mov al,ah + jump_operator_ok: + ret +get_address: + mov [segment_register],0 + mov [address_size],0 + mov al,[code_type] + shr al,3 + mov [value_size],al + mov al,[esi] + and al,11110000b + cmp al,60h + jne get_size_prefix + lods byte [esi] + sub al,60h + mov [segment_register],al + mov al,[esi] + and al,11110000b + get_size_prefix: + cmp al,70h + jne address_size_prefix_ok + lods byte [esi] + sub al,70h + cmp al,2 + jb invalid_address_size + cmp al,8 + ja invalid_address_size + mov [address_size],al + mov [value_size],al + address_size_prefix_ok: + call calculate_address + cmp byte [esi-1],']' + jne invalid_address + mov [address_high],edx + mov edx,eax + cmp [code_type],64 + jne address_ok + or bx,bx + jnz address_ok + test ch,0Fh + jnz address_ok + calculate_relative_address: + call calculate_relative_offset + cmp byte [esi-1],']' + jne invalid_address + mov [address_high],edx + mov edx,[symbol_identifier] + mov [address_symbol],edx + mov edx,eax + mov ch,[value_type] + mov bx,0FF00h + xor cl,cl + address_ok: + ret + +operand_16bit: + cmp [code_type],16 + je size_prefix_ok + mov [operand_prefix],66h + ret +operand_32bit: + cmp [code_type],16 + jne size_prefix_ok + mov [operand_prefix],66h + size_prefix_ok: + ret +operand_64bit: + cmp [code_type],64 + jne illegal_instruction + or [rex_prefix],48h + ret +operand_autodetect: + cmp al,2 + je operand_16bit + cmp al,4 + je operand_32bit + cmp al,8 + je operand_64bit + jmp invalid_operand_size +store_segment_prefix_if_necessary: + mov al,[segment_register] + or al,al + jz segment_prefix_ok + cmp al,3 + je ss_prefix + cmp al,4 + ja segment_prefix_386 + jb segment_prefix_86 + cmp bl,25h + je segment_prefix_86 + cmp bh,25h + je segment_prefix_86 + cmp bh,45h + je segment_prefix_86 + cmp bh,44h + je segment_prefix_86 + ret + ss_prefix: + cmp bl,25h + je segment_prefix_ok + cmp bh,25h + je segment_prefix_ok + cmp bh,45h + je segment_prefix_ok + cmp bh,44h + je segment_prefix_ok + jmp segment_prefix_86 +store_segment_prefix: + mov al,[segment_register] + or al,al + jz segment_prefix_ok + cmp al,5 + jae segment_prefix_386 + segment_prefix_86: + dec al + shl al,3 + add al,26h + stos byte [edi] + jmp segment_prefix_ok + segment_prefix_386: + add al,64h-5 + stos byte [edi] + segment_prefix_ok: + ret +store_instruction_code: + mov al,[operand_prefix] + or al,al + jz operand_prefix_ok + stos byte [edi] + operand_prefix_ok: + mov al,[rex_prefix] + test al,40h + jz rex_prefix_ok + cmp [code_type],64 + jne invalid_operand + test al,0B0h + jnz prefix_conflict + stos byte [edi] + rex_prefix_ok: + mov al,[base_code] + stos byte [edi] + cmp al,0Fh + jne instruction_code_ok + store_extended_code: + mov al,[extended_code] + stos byte [edi] + instruction_code_ok: + ret +store_nomem_instruction: + test [postbyte_register],1000b + jz nomem_reg_code_ok + or [rex_prefix],44h + and [postbyte_register],111b + nomem_reg_code_ok: + test bl,1000b + jz nomem_rm_code_ok + or [rex_prefix],41h + and bl,111b + nomem_rm_code_ok: + call store_instruction_code + mov al,[postbyte_register] + shl al,3 + or al,bl + or al,11000000b + stos byte [edi] + ret +store_instruction: + mov [current_offset],edi + test [postbyte_register],1000b + jz reg_code_ok + or [rex_prefix],44h + and [postbyte_register],111b + reg_code_ok: + call store_segment_prefix_if_necessary + or bx,bx + jz address_immediate + cmp bx,0F000h + je address_rip_based + cmp bx,0FF00h + je address_relative + mov al,bl + or al,bh + and al,11110000b + cmp al,80h + je postbyte_64bit + cmp al,40h + je postbyte_32bit + cmp al,20h + jne invalid_address + cmp [code_type],64 + je invalid_address_size + call address_16bit_prefix + call store_instruction_code + cmp bx,2326h + je address_bx_si + cmp bx,2623h + je address_bx_si + cmp bx,2327h + je address_bx_di + cmp bx,2723h + je address_bx_di + cmp bx,2526h + je address_bp_si + cmp bx,2625h + je address_bp_si + cmp bx,2527h + je address_bp_di + cmp bx,2725h + je address_bp_di + cmp bx,2600h + je address_si + cmp bx,2700h + je address_di + cmp bx,2300h + je address_bx + cmp bx,2500h + je address_bp + jmp invalid_address + address_bx_si: + xor al,al + jmp postbyte_16bit + address_bx_di: + mov al,1 + jmp postbyte_16bit + address_bp_si: + mov al,10b + jmp postbyte_16bit + address_bp_di: + mov al,11b + jmp postbyte_16bit + address_si: + mov al,100b + jmp postbyte_16bit + address_di: + mov al,101b + jmp postbyte_16bit + address_bx: + mov al,111b + jmp postbyte_16bit + address_bp: + mov al,110b + postbyte_16bit: + test ch,22h + jnz address_16bit_value + or ch,ch + jnz address_sizes_do_not_agree + cmp edx,10000h + jge value_out_of_range + cmp edx,-8000h + jl value_out_of_range + or dx,dx + jz address + cmp dx,80h + jb address_8bit_value + cmp dx,-80h + jae address_8bit_value + address_16bit_value: + or al,10000000b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + mov eax,edx + stos word [edi] + ret + address_8bit_value: + or al,01000000b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + mov al,dl + stos byte [edi] + cmp dx,80h + jge value_out_of_range + cmp dx,-80h + jl value_out_of_range + ret + address: + cmp al,110b + je address_8bit_value + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + ret + postbyte_32bit: + call address_32bit_prefix + jmp address_prefix_ok + postbyte_64bit: + cmp [code_type],64 + jne invalid_address_size + address_prefix_ok: + test bh,1000b + jz base_code_ok + or [rex_prefix],41h + base_code_ok: + test bl,1000b + jz index_code_ok + or [rex_prefix],42h + index_code_ok: + call store_instruction_code + cmp bl,44h + je swap_base_with_index + cmp bl,84h + jne base_register_ok + swap_base_with_index: + cmp cl,1 + jne invalid_address + xchg bl,bh + cmp bl,44h + je invalid_address + cmp bl,84h + je invalid_address + base_register_ok: + or cl,cl + jz only_base_register + base_and_index: + mov al,100b + xor ah,ah + cmp cl,1 + je scale_ok + cmp cl,2 + je scale_1 + cmp cl,4 + je scale_2 + or ah,11000000b + jmp scale_ok + scale_2: + or ah,10000000b + jmp scale_ok + scale_1: + or ah,01000000b + scale_ok: + or bh,bh + jz only_index_register + and bl,111b + shl bl,3 + or ah,bl + and bh,111b + or ah,bh + test ch,44h + jnz sib_address_32bit_value + test ch,88h + jnz sib_address_32bit_value + or ch,ch + jnz address_sizes_do_not_agree + cmp bh,5 + je address_value + or edx,edx + jz sib_address + address_value: + cmp edx,80h + jb sib_address_8bit_value + cmp edx,-80h + jae sib_address_8bit_value + sib_address_32bit_value: + or al,10000000b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos word [edi] + jmp store_address_32bit_value + sib_address_8bit_value: + or al,01000000b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos word [edi] + mov al,dl + stos byte [edi] + cmp edx,80h + jge value_out_of_range + cmp edx,-80h + jl value_out_of_range + ret + sib_address: + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos word [edi] + ret + only_index_register: + or ah,101b + and bl,111b + shl bl,3 + or ah,bl + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos word [edi] + test ch,44h + jnz store_address_32bit_value + or ch,ch + jnz invalid_address_size + jmp store_address_32bit_value + zero_index_register: + mov bl,4 + mov cl,1 + jmp base_and_index + only_base_register: + mov al,bh + and al,111b + cmp al,4 + je zero_index_register + test ch,44h + jnz simple_address_32bit_value + test ch,88h + jnz simple_address_32bit_value + or ch,ch + jnz address_sizes_do_not_agree + or edx,edx + jz simple_address + cmp edx,80h + jb simple_address_8bit_value + cmp edx,-80h + jae simple_address_8bit_value + simple_address_32bit_value: + or al,10000000b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + jmp store_address_32bit_value + simple_address_8bit_value: + or al,01000000b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + mov al,dl + stos byte [edi] + cmp edx,80h + jge value_out_of_range + cmp edx,-80h + jl value_out_of_range + ret + simple_address: + cmp al,5 + je simple_address_8bit_value + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + ret + address_immediate: + cmp [code_type],64 + je address_immediate_sib + test ch,44h + jnz address_immediate_32bit + test ch,22h + jnz address_immediate_16bit + or ch,ch + jnz invalid_address_size + cmp [code_type],16 + je addressing_16bit + address_immediate_32bit: + call address_32bit_prefix + call store_instruction_code + store_immediate_address: + mov al,101b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + store_address_32bit_value: + test ch,0F0h + jz address_32bit_relocation_ok + mov al,2 + xchg [value_type],al + mov ebx,[address_symbol] + xchg ebx,[symbol_identifier] + call mark_relocation + mov [value_type],al + mov [symbol_identifier],ebx + address_32bit_relocation_ok: + mov eax,edx + stos dword [edi] + ret + store_address_64bit_value: + test ch,0F0h + jz address_64bit_relocation_ok + mov al,4 + xchg [value_type],al + mov ebx,[address_symbol] + xchg ebx,[symbol_identifier] + call mark_relocation + mov [value_type],al + mov [symbol_identifier],ebx + address_64bit_relocation_ok: + mov eax,edx + stos dword [edi] + mov eax,[address_high] + stos dword [edi] + ret + address_immediate_sib: + test ch,not 44h + jnz invalid_address_size + cmp [value_type],0 + jne address_immediate_sib_nosignextend + test edx,80000000h + jz address_immediate_sib_prefix_ok + address_immediate_sib_nosignextend: + call address_32bit_prefix + address_immediate_sib_prefix_ok: + call store_instruction_code + mov al,100b + mov ah,100101b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos word [edi] + jmp store_address_32bit_value + address_rip_based: + cmp [code_type],64 + jne invalid_address + call store_instruction_code + jmp store_immediate_address + address_relative: + call store_instruction_code + movzx eax,[immediate_size] + add eax,edi + sub eax,[current_offset] + add eax,5 + sub edx,eax + jo value_out_of_range + mov al,101b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + xchg [value_type],ch + mov ebx,[address_symbol] + xchg ebx,[symbol_identifier] + mov eax,edx + call mark_relocation + mov [value_type],ch + mov [symbol_identifier],ebx + stos dword [edi] + ret + addressing_16bit: + cmp edx,10000h + jge address_immediate_32bit + cmp edx,-8000h + jl address_immediate_32bit + movzx edx,dx + address_immediate_16bit: + call address_16bit_prefix + call store_instruction_code + mov al,110b + mov cl,[postbyte_register] + shl cl,3 + or al,cl + stos byte [edi] + mov eax,edx + stos word [edi] + cmp edx,10000h + jge value_out_of_range + cmp edx,-8000h + jl value_out_of_range + ret + address_16bit_prefix: + cmp [code_type],16 + je instruction_prefix_ok + mov al,67h + stos byte [edi] + ret + address_32bit_prefix: + cmp [code_type],32 + je instruction_prefix_ok + mov al,67h + stos byte [edi] + instruction_prefix_ok: + ret +store_instruction_with_imm8: + mov [immediate_size],1 + call store_instruction + mov al,byte [value] + stos byte [edi] + ret +store_instruction_with_imm16: + mov [immediate_size],2 + call store_instruction + mov ax,word [value] + call mark_relocation + stos word [edi] + ret +store_instruction_with_imm32: + mov [immediate_size],4 + call store_instruction + mov eax,dword [value] + call mark_relocation + stos dword [edi] + ret diff --git a/programs/h2d2b/trunk/build_en.bat b/programs/develop/h2d2b/trunk/build_en.bat similarity index 100% rename from programs/h2d2b/trunk/build_en.bat rename to programs/develop/h2d2b/trunk/build_en.bat diff --git a/programs/h2d2b/trunk/build_ru.bat b/programs/develop/h2d2b/trunk/build_ru.bat similarity index 100% rename from programs/h2d2b/trunk/build_ru.bat rename to programs/develop/h2d2b/trunk/build_ru.bat diff --git a/programs/h2d2b/trunk/h2d2b.asm b/programs/develop/h2d2b/trunk/h2d2b.asm similarity index 100% rename from programs/h2d2b/trunk/h2d2b.asm rename to programs/develop/h2d2b/trunk/h2d2b.asm diff --git a/programs/grscreen/trunk/macros.inc b/programs/develop/h2d2b/trunk/macros.inc similarity index 100% rename from programs/grscreen/trunk/macros.inc rename to programs/develop/h2d2b/trunk/macros.inc diff --git a/programs/heed/trunk/build_en.bat b/programs/develop/heed/trunk/build_en.bat similarity index 100% rename from programs/heed/trunk/build_en.bat rename to programs/develop/heed/trunk/build_en.bat diff --git a/programs/heed/trunk/build_ru.bat b/programs/develop/heed/trunk/build_ru.bat similarity index 100% rename from programs/heed/trunk/build_ru.bat rename to programs/develop/heed/trunk/build_ru.bat diff --git a/programs/heed/trunk/heed.asm b/programs/develop/heed/trunk/heed.asm similarity index 100% rename from programs/heed/trunk/heed.asm rename to programs/develop/heed/trunk/heed.asm diff --git a/programs/h2d2b/trunk/macros.inc b/programs/develop/heed/trunk/macros.inc similarity index 100% rename from programs/h2d2b/trunk/macros.inc rename to programs/develop/heed/trunk/macros.inc diff --git a/programs/hexview/trunk/build_en.bat b/programs/develop/hexview/trunk/build_en.bat similarity index 100% rename from programs/hexview/trunk/build_en.bat rename to programs/develop/hexview/trunk/build_en.bat diff --git a/programs/hexview/trunk/build_ru.bat b/programs/develop/hexview/trunk/build_ru.bat similarity index 100% rename from programs/hexview/trunk/build_ru.bat rename to programs/develop/hexview/trunk/build_ru.bat diff --git a/programs/hexview/trunk/hexview.asm b/programs/develop/hexview/trunk/hexview.asm similarity index 100% rename from programs/hexview/trunk/hexview.asm rename to programs/develop/hexview/trunk/hexview.asm diff --git a/programs/heed/trunk/macros.inc b/programs/develop/hexview/trunk/macros.inc similarity index 100% rename from programs/heed/trunk/macros.inc rename to programs/develop/hexview/trunk/macros.inc diff --git a/programs/keyascii/trunk/build_en.bat b/programs/develop/keyascii/trunk/build_en.bat similarity index 100% rename from programs/keyascii/trunk/build_en.bat rename to programs/develop/keyascii/trunk/build_en.bat diff --git a/programs/keyascii/trunk/build_ru.bat b/programs/develop/keyascii/trunk/build_ru.bat similarity index 100% rename from programs/keyascii/trunk/build_ru.bat rename to programs/develop/keyascii/trunk/build_ru.bat diff --git a/programs/keyascii/trunk/keyascii.asm b/programs/develop/keyascii/trunk/keyascii.asm similarity index 100% rename from programs/keyascii/trunk/keyascii.asm rename to programs/develop/keyascii/trunk/keyascii.asm diff --git a/programs/eyes/trunk/macros.inc b/programs/develop/keyascii/trunk/macros.inc similarity index 100% rename from programs/eyes/trunk/macros.inc rename to programs/develop/keyascii/trunk/macros.inc diff --git a/programs/mhc/trunk/build_en.bat b/programs/develop/mhc/trunk/build_en.bat similarity index 100% rename from programs/mhc/trunk/build_en.bat rename to programs/develop/mhc/trunk/build_en.bat diff --git a/programs/mhc/trunk/build_ru.bat b/programs/develop/mhc/trunk/build_ru.bat similarity index 100% rename from programs/mhc/trunk/build_ru.bat rename to programs/develop/mhc/trunk/build_ru.bat diff --git a/programs/fire/trunk/macros.inc b/programs/develop/mhc/trunk/macros.inc similarity index 100% rename from programs/fire/trunk/macros.inc rename to programs/develop/mhc/trunk/macros.inc diff --git a/programs/mhc/trunk/mhc.asm b/programs/develop/mhc/trunk/mhc.asm similarity index 100% rename from programs/mhc/trunk/mhc.asm rename to programs/develop/mhc/trunk/mhc.asm diff --git a/programs/mview/trunk/build_en.bat b/programs/develop/mview/trunk/build_en.bat similarity index 100% rename from programs/mview/trunk/build_en.bat rename to programs/develop/mview/trunk/build_en.bat diff --git a/programs/mview/trunk/build_ru.bat b/programs/develop/mview/trunk/build_ru.bat similarity index 100% rename from programs/mview/trunk/build_ru.bat rename to programs/develop/mview/trunk/build_ru.bat diff --git a/programs/icon/trunk/macros.inc b/programs/develop/mview/trunk/macros.inc similarity index 100% rename from programs/icon/trunk/macros.inc rename to programs/develop/mview/trunk/macros.inc diff --git a/programs/mview/trunk/mview.asm b/programs/develop/mview/trunk/mview.asm similarity index 100% rename from programs/mview/trunk/mview.asm rename to programs/develop/mview/trunk/mview.asm diff --git a/programs/param/trunk/build_en.bat b/programs/develop/param/trunk/build_en.bat similarity index 100% rename from programs/param/trunk/build_en.bat rename to programs/develop/param/trunk/build_en.bat diff --git a/programs/param/trunk/build_ru.bat b/programs/develop/param/trunk/build_ru.bat similarity index 100% rename from programs/param/trunk/build_ru.bat rename to programs/develop/param/trunk/build_ru.bat diff --git a/programs/param/trunk/cmdipc.inc b/programs/develop/param/trunk/cmdipc.inc similarity index 100% rename from programs/param/trunk/cmdipc.inc rename to programs/develop/param/trunk/cmdipc.inc diff --git a/programs/calendar/trunk/macros.inc b/programs/develop/param/trunk/macros.inc similarity index 100% rename from programs/calendar/trunk/macros.inc rename to programs/develop/param/trunk/macros.inc diff --git a/programs/param/trunk/param.asm b/programs/develop/param/trunk/param.asm similarity index 100% rename from programs/param/trunk/param.asm rename to programs/develop/param/trunk/param.asm diff --git a/programs/scancode/trunk/build_en.bat b/programs/develop/scancode/trunk/build_en.bat similarity index 100% rename from programs/scancode/trunk/build_en.bat rename to programs/develop/scancode/trunk/build_en.bat diff --git a/programs/scancode/trunk/build_ru.bat b/programs/develop/scancode/trunk/build_ru.bat similarity index 100% rename from programs/scancode/trunk/build_ru.bat rename to programs/develop/scancode/trunk/build_ru.bat diff --git a/programs/cdp/trunk/macros.inc b/programs/develop/scancode/trunk/macros.inc similarity index 100% rename from programs/cdp/trunk/macros.inc rename to programs/develop/scancode/trunk/macros.inc diff --git a/programs/scancode/trunk/scancode.asm b/programs/develop/scancode/trunk/scancode.asm similarity index 100% rename from programs/scancode/trunk/scancode.asm rename to programs/develop/scancode/trunk/scancode.asm diff --git a/programs/tinypad/trunk/build_en.bat b/programs/develop/tinypad/trunk/build_en.bat similarity index 100% rename from programs/tinypad/trunk/build_en.bat rename to programs/develop/tinypad/trunk/build_en.bat diff --git a/programs/tinypad/trunk/build_ru.bat b/programs/develop/tinypad/trunk/build_ru.bat similarity index 100% rename from programs/tinypad/trunk/build_ru.bat rename to programs/develop/tinypad/trunk/build_ru.bat diff --git a/programs/tinypad/trunk/helpwnd.asm b/programs/develop/tinypad/trunk/helpwnd.asm similarity index 100% rename from programs/tinypad/trunk/helpwnd.asm rename to programs/develop/tinypad/trunk/helpwnd.asm diff --git a/programs/tinypad/trunk/macros.inc b/programs/develop/tinypad/trunk/macros.inc similarity index 100% rename from programs/tinypad/trunk/macros.inc rename to programs/develop/tinypad/trunk/macros.inc diff --git a/programs/tinypad/trunk/struct.inc b/programs/develop/tinypad/trunk/struct.inc similarity index 100% rename from programs/tinypad/trunk/struct.inc rename to programs/develop/tinypad/trunk/struct.inc diff --git a/programs/tinypad/trunk/tinypad.asm b/programs/develop/tinypad/trunk/tinypad.asm similarity index 100% rename from programs/tinypad/trunk/tinypad.asm rename to programs/develop/tinypad/trunk/tinypad.asm diff --git a/programs/fasm/trunk/assemble.inc b/programs/fasm/trunk/assemble.inc deleted file mode 100644 index 42a913d571..0000000000 --- a/programs/fasm/trunk/assemble.inc +++ /dev/null @@ -1,1960 +0,0 @@ - -; flat assembler core -; Copyright (c) 1999-2005, Tomasz Grysztar. -; All rights reserved. - -assembler: - mov ecx,[memory_end] - mov edi,[labels_list] - sub ecx,edi - cmp edi,[code_start] - jbe out_of_memory - shr ecx,2 - xor eax,eax - rep stos dword [edi] - mov [stub_size],eax - mov [number_of_sections],eax - mov [current_pass],ax - assembler_loop: - mov eax,[labels_list] - mov [display_buffer],eax - mov eax,[additional_memory] - mov [free_additional_memory],eax - mov eax,[additional_memory_end] - mov [structures_buffer],eax - mov esi,[source_start] - mov edi,[code_start] - xor eax,eax - mov dword [adjustment],eax - mov dword [adjustment+4],eax - mov dword [org_origin],edi - mov dword [org_origin+4],eax - mov [org_start],edi - mov [org_registers],eax - mov [org_symbol],eax - mov [error_line],eax - mov [counter],eax - mov [format_flags],eax - mov [number_of_relocations],eax - mov [undefined_data_end],eax - mov [next_pass_needed],al - mov [output_format],al - mov [labels_type],al - mov [virtual_data],al - mov [code_type],16 - pass_loop: - call assemble_line - jnc pass_loop - mov eax,[additional_memory_end] - cmp eax,[structures_buffer] - je pass_done - sub eax,20h - mov eax,[eax+4] - mov [current_line],eax - jmp missing_end_directive - pass_done: - call close_pass - mov eax,[labels_list] - check_symbols: - cmp eax,[memory_end] - jae symbols_checked - test byte [eax+8],8 - jz symbol_defined_ok - mov cx,[current_pass] - cmp cx,[eax+18] - jne symbol_defined_ok - test byte [eax+8],1 - jz symbol_defined_ok - sub cx,[eax+16] - cmp cx,1 - jne symbol_defined_ok - and byte [eax+8],not 1 - or [next_pass_needed],-1 - symbol_defined_ok: - test byte [eax+8],10h - jz use_prediction_ok - mov cx,[current_pass] - and byte [eax+8],not 10h - test byte [eax+8],20h - jnz check_use_prediction - cmp cx,[eax+18] - jne use_prediction_ok - test byte [eax+8],8 - jz use_prediction_ok - jmp use_misprediction - check_use_prediction: - test byte [eax+8],8 - jz use_misprediction - cmp cx,[eax+18] - je use_prediction_ok - use_misprediction: - or [next_pass_needed],-1 - use_prediction_ok: - test byte [eax+8],40h - jz check_next_symbol - and byte [eax+8],not 40h - test byte [eax+8],4 - jnz define_misprediction - mov cx,[current_pass] - test byte [eax+8],80h - jnz check_define_prediction - cmp cx,[eax+16] - jne check_next_symbol - test byte [eax+8],1 - jz check_next_symbol - jmp define_misprediction - check_define_prediction: - test byte [eax+8],1 - jz define_misprediction - cmp cx,[eax+16] - je check_next_symbol - define_misprediction: - or [next_pass_needed],-1 - check_next_symbol: - add eax,24 - jmp check_symbols - symbols_checked: - cmp [next_pass_needed],0 - jne next_pass - mov eax,[error_line] - or eax,eax - jz assemble_ok - mov [current_line],eax - jmp near [error] - next_pass: - inc [current_pass] - mov ax,[current_pass] - cmp ax,[passes_limit] - je code_cannot_be_generated - jmp assembler_loop - assemble_ok: - ret - -assemble_line: - mov eax,[display_buffer] - sub eax,100h - cmp edi,eax - ja out_of_memory - lods byte [esi] - cmp al,1 - je assemble_instruction - jb source_end - cmp al,3 - jb define_label - je define_constant - cmp al,0Fh - je new_line - cmp al,13h - je code_type_setting - cmp al,10h - jne illegal_instruction - lods byte [esi] - jmp segment_prefix - code_type_setting: - lods byte [esi] - mov [code_type],al - jmp line_assembled - new_line: - lods dword [esi] - mov [current_line],eax - mov [prefixed_instruction],0 - continue_line: - cmp byte [esi],0Fh - je line_assembled - jmp assemble_line - define_label: - lods dword [esi] - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - mov ebx,eax - lods byte [esi] - mov cl,al - mov eax,edi - xor edx,edx - sub eax,dword [org_origin] - sbb edx,dword [org_origin+4] - mov ch,[labels_type] - cmp [virtual_data],0 - jne make_virtual_label - or byte [ebx+9],1 - xchg eax,[ebx] - xchg edx,[ebx+4] - sub eax,[ebx] - sbb edx,[ebx+4] - mov dword [adjustment],eax - mov dword [adjustment+4],edx - or eax,edx - setnz ah - jmp finish_label_symbol - make_virtual_label: - and byte [ebx+9],not 1 - cmp eax,[ebx] - mov [ebx],eax - setne ah - cmp edx,[ebx+4] - mov [ebx+4],edx - setne al - or ah,al - finish_label_symbol: - cmp cl,[ebx+10] - mov [ebx+10],cl - setne al - or ah,al - cmp ch,[ebx+11] - mov [ebx+11],ch - setne al - or ah,al - mov edx,[org_registers] - cmp edx,[ebx+12] - mov [ebx+12],edx - setne al - or ah,al - or ch,ch - jz label_symbol_ok - mov edx,[org_symbol] - cmp edx,[ebx+20] - mov [ebx+20],edx - setne al - or ah,al - label_symbol_ok: - mov cx,[current_pass] - xchg [ebx+16],cx - and byte [ebx+8],not 2 - test byte [ebx+8],1 - jz new_label - cmp cx,[ebx+16] - je symbol_already_defined - inc cx - sub cx,[ebx+16] - setnz al - or ah,al - jz continue_line - test byte [ebx+8],8 - jz continue_line - mov cx,[current_pass] - cmp cx,[ebx+18] - jne continue_line - or [next_pass_needed],-1 - jmp continue_line - new_label: - or byte [ebx+8],1 - jmp continue_line - define_constant: - lods dword [esi] - inc esi - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - mov edx,[eax+8] - push edx - cmp [current_pass],0 - je get_constant_value - test dl,4 - jnz get_constant_value - mov cx,[current_pass] - cmp cx,[eax+16] - je get_constant_value - and dl,not 1 - mov [eax+8],dl - get_constant_value: - push eax - mov al,byte [esi-1] - push eax - call get_value - pop ebx - mov ch,bl - pop ebx - pop dword [ebx+8] - cmp ebx,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - xor cl,cl - mov ch,[value_type] - cmp ch,3 - je invalid_use_of_symbol - make_constant: - and byte [ebx+9],not 1 - cmp eax,[ebx] - mov [ebx],eax - setne ah - cmp edx,[ebx+4] - mov [ebx+4],edx - setne al - or ah,al - cmp cl,[ebx+10] - mov [ebx+10],cl - setne al - or ah,al - cmp ch,[ebx+11] - mov [ebx+11],ch - setne al - or ah,al - xor edx,edx - cmp edx,[ebx+12] - mov [ebx+12],edx - setne al - or ah,al - or ch,ch - jz constant_symbol_ok - mov edx,[symbol_identifier] - cmp edx,[ebx+20] - mov [ebx+20],edx - setne al - or ah,al - constant_symbol_ok: - mov cx,[current_pass] - xchg [ebx+16],cx - test byte [ebx+8],1 - jz new_constant - cmp cx,[ebx+16] - jne redeclare_constant - test byte [ebx+8],2 - jz symbol_already_defined - or byte [ebx+8],4 - jmp instruction_assembled - redeclare_constant: - inc cx - sub cx,[ebx+16] - setnz al - or ah,al - jz instruction_assembled - test byte [ebx+8],4 - jnz instruction_assembled - test byte [ebx+8],8 - jz instruction_assembled - mov cx,[current_pass] - cmp cx,[ebx+18] - jne instruction_assembled - or [next_pass_needed],-1 - jmp instruction_assembled - new_constant: - or byte [ebx+8],1+2 - jmp instruction_assembled - assemble_instruction: - mov [operand_size],0 - mov [size_override],0 - mov [operand_prefix],0 - mov [rex_prefix],0 - mov [immediate_size],0 - movzx ebx,word [esi] - mov al,[esi+2] - add ebx,assembler - add esi,3 - jmp near ebx - instruction_assembled: - mov al,[esi] - cmp al,0Fh - je line_assembled - or al,al - jnz extra_characters_on_line - line_assembled: - clc - ret - source_end: - dec esi - stc - ret -skip_line: - call skip_symbol - jnc skip_line - ret -skip_symbol: - lods byte [esi] - or al,al - jz nothing_to_skip - cmp al,0Fh - je nothing_to_skip - cmp al,1 - je skip_instruction - cmp al,2 - je skip_label - cmp al,3 - je skip_label - cmp al,20h - jb skip_assembler_symbol - cmp al,'(' - je skip_expression - cmp al,'[' - je skip_address - skip_done: - clc - ret - skip_label: - add esi,2 - skip_instruction: - add esi,2 - skip_assembler_symbol: - inc esi - jmp skip_done - skip_address: - mov al,[esi] - and al,11110000b - cmp al,60h - jb skip_expression - cmp al,70h - ja skip_expression - inc esi - jmp skip_address - skip_expression: - lods byte [esi] - or al,al - jz skip_string - cmp al,'.' - je skip_fp_value - cmp al,')' - je skip_done - cmp al,']' - je skip_done - cmp al,0Fh - je skip_expression - cmp al,10h - je skip_register - cmp al,11h - je skip_label_value - cmp al,80h - jae skip_expression - movzx eax,al - add esi,eax - jmp skip_expression - skip_label_value: - add esi,3 - skip_register: - inc esi - jmp skip_expression - skip_fp_value: - add esi,12 - jmp skip_done - skip_string: - lods dword [esi] - add esi,eax - inc esi - jmp skip_done - nothing_to_skip: - dec esi - stc - ret - -org_directive: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_qword_value - mov cl,[value_type] - test cl,1 - jnz invalid_use_of_symbol - mov [labels_type],cl - mov ecx,edi - sub ecx,eax - sbb edx,0 - mov dword [org_origin],ecx - mov dword [org_origin+4],edx - mov [org_registers],0 - mov [org_start],edi - mov edx,[symbol_identifier] - mov [org_symbol],edx - cmp [output_format],1 - ja instruction_assembled - cmp edi,[code_start] - jne instruction_assembled - cmp eax,100h - jne instruction_assembled - bts [format_flags],0 - jmp instruction_assembled -label_directive: - lods byte [esi] - cmp al,2 - jne invalid_argument - lods dword [esi] - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - inc esi - mov ebx,eax - xor cl,cl - lods byte [esi] - cmp al,':' - je get_label_size - dec esi - cmp al,11h - jne label_size_ok - get_label_size: - lods word [esi] - cmp al,11h - jne invalid_argument - mov cl,ah - label_size_ok: - mov eax,edi - xor edx,edx - sub eax,dword [org_origin] - sbb edx,dword [org_origin+4] - mov ebp,[org_registers] - cmp byte [esi],80h - je get_free_label_value - mov ch,[labels_type] - push [org_symbol] - pop [address_symbol] - cmp [virtual_data],0 - jne make_free_label - or byte [ebx+9],1 - xchg eax,[ebx] - xchg edx,[ebx+4] - sub eax,[ebx] - sbb edx,[ebx+4] - mov dword [adjustment],eax - mov dword [adjustment+4],edx - or eax,edx - setne ah - jmp finish_label - get_free_label_value: - inc esi - lods byte [esi] - cmp al,'(' - jne invalid_argument - push dword [ebx+8] - push ebx ecx - and byte [ebx+8],not 1 - cmp byte [esi],'.' - je invalid_value - call get_address_value - or bh,bh - setnz ch - xchg ch,cl - mov bp,cx - shl ebp,16 - xchg bl,bh - mov bp,bx - pop ecx ebx - pop dword [ebx+8] - mov ch,[value_type] - or ch,ch - jz make_free_label - cmp ch,2 - jne invalid_use_of_symbol - make_free_label: - and byte [ebx+9],not 1 - cmp eax,[ebx] - mov [ebx],eax - setne ah - cmp edx,[ebx+4] - mov [ebx+4],edx - setne al - or ah,al - jmp finish_label - finish_label: - cmp cl,[ebx+10] - mov [ebx+10],cl - setne al - or ah,al - cmp ch,[ebx+11] - mov [ebx+11],ch - setne al - or ah,al - cmp ebp,[ebx+12] - mov [ebx+12],ebp - setne al - or ah,al - or ch,ch - jz free_label_symbol_ok - mov edx,[address_symbol] - cmp edx,[ebx+20] - mov [ebx+20],edx - setne al - or ah,al - free_label_symbol_ok: - mov cx,[current_pass] - xchg [ebx+16],cx - and byte [ebx+8],not 2 - test byte [ebx+8],1 - jz new_free_label - cmp cx,[ebx+16] - je symbol_already_defined - inc cx - sub cx,[ebx+16] - setnz al - or ah,al - jz instruction_assembled - test byte [ebx+8],8 - jz instruction_assembled - mov cx,[current_pass] - cmp cx,[ebx+18] - jne instruction_assembled - or [next_pass_needed],-1 - jmp instruction_assembled - new_free_label: - or byte [ebx+8],1 - jmp instruction_assembled -load_directive: - lods byte [esi] - cmp al,2 - jne invalid_argument - lods dword [esi] - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - inc esi - push eax - mov al,1 - cmp byte [esi],11h - jne load_size_ok - lods byte [esi] - lods byte [esi] - load_size_ok: - cmp al,8 - ja invalid_value - mov [operand_size],al - mov dword [value],0 - mov dword [value+4],0 - lods word [esi] - cmp ax,82h+'(' shl 8 - jne invalid_argument - load_from_code: - cmp byte [esi],'.' - je invalid_value - call get_relative_offset - neg eax - cmp [next_pass_needed],0 - jne load_address_ok - cmp [value_type],0 - jne invalid_use_of_symbol - load_address_ok: - push esi edi - mov esi,edi - sub esi,eax - jc bad_load_address - cmp esi,[org_start] - jb bad_load_address - mov edi,value - movzx ecx,[operand_size] - cmp ecx,eax - ja bad_load_address - rep movs byte [edi],[esi] - jmp value_loaded - bad_load_address: - cmp [error_line],0 - jne value_loaded - mov eax,[current_line] - mov [error_line],eax - mov [error],value_out_of_range - value_loaded: - pop edi esi - mov eax,dword [value] - mov edx,dword [value+4] - pop ebx - xor cx,cx - jmp make_constant -store_directive: - cmp byte [esi],11h - je sized_store - lods byte [esi] - cmp al,'(' - jne invalid_argument - call get_byte_value - xor edx,edx - movzx eax,al - mov [operand_size],1 - jmp store_value_ok - sized_store: - call get_value - store_value_ok: - cmp [value_type],0 - jne invalid_use_of_symbol - mov dword [value],eax - mov dword [value+4],edx - lods word [esi] - cmp ax,80h+'(' shl 8 - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_relative_offset - neg eax - cmp [next_pass_needed],0 - jne store_address_ok - cmp [value_type],0 - jne invalid_use_of_symbol - store_address_ok: - push esi edi - sub edi,eax - jc bad_store_address - cmp edi,[org_start] - jb bad_store_address - mov esi,value - movzx ecx,[operand_size] - cmp ecx,eax - ja bad_store_address - rep movs byte [edi],[esi] - mov eax,edi - pop edi esi - cmp edi,[undefined_data_end] - jne instruction_assembled - cmp eax,[undefined_data_start] - jbe instruction_assembled - mov [undefined_data_start],eax - jmp instruction_assembled - bad_store_address: - pop edi esi - cmp [error_line],0 - jne instruction_assembled - mov eax,[current_line] - mov [error_line],eax - mov [error],value_out_of_range - jmp instruction_assembled - -display_directive: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],0 - jne display_byte - inc esi - lods dword [esi] - mov ecx,eax - push edi - mov edi,[display_buffer] - sub edi,4 - sub edi,eax - mov [display_buffer],edi - rep movs byte [edi],[esi] - stos dword [edi] - pop edi - inc esi - jmp display_next - display_byte: - call get_byte_value - push edi - mov edi,[display_buffer] - sub edi,4+1 - mov [display_buffer],edi - stos byte [edi] - mov eax,1 - stos dword [edi] - pop edi - display_next: - cmp edi,[display_buffer] - ja out_of_memory - lods byte [esi] - cmp al,',' - je display_directive - dec esi - jmp instruction_assembled -flush_display_buffer: - mov eax,[display_buffer] - or eax,eax - jz display_done - mov esi,[labels_list] - cmp esi,eax - je display_done - display_messages: - sub esi,4 - mov ecx,[esi] - sub esi,ecx - push esi - call display_block - pop esi - cmp esi,[display_buffer] - jne display_messages - mov eax,[labels_list] - mov [display_buffer],eax - display_done: - ret -times_directive: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne times_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - times_value_ok: - cmp eax,0 - je zero_times - jl negative_times - cmp byte [esi],':' - jne times_argument_ok - inc esi - times_argument_ok: - push [counter] - push [counter_limit] - mov [counter_limit],eax - mov [counter],1 - times_loop: - mov eax,esp - sub eax,100h - jc stack_overflow - cmp eax,[stack_limit] - jb stack_overflow - push esi - or [prefixed_instruction],-1 - call continue_line - mov eax,[counter_limit] - cmp [counter],eax - je times_done - inc [counter] - pop esi - jmp times_loop - times_done: - pop eax - pop [counter_limit] - pop [counter] - jmp instruction_assembled - negative_times: - cmp [error_line],0 - jne zero_times - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_value - zero_times: - call skip_line - jmp instruction_assembled - -virtual_directive: - lods byte [esi] - cmp al,80h - jne virtual_at_current - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_address_value - mov ebp,[address_symbol] - xor ch,ch - or bh,bh - jz set_virtual - mov ch,1 - jmp set_virtual - virtual_at_current: - dec esi - mov al,[labels_type] - mov [value_type],al - mov ebp,[org_symbol] - mov eax,edi - xor edx,edx - sub eax,dword [org_origin] - sbb edx,dword [org_origin+4] - xor bx,bx - xor cx,cx - set_virtual: - push [org_registers] - mov byte [org_registers],bh - mov byte [org_registers+1],bl - mov byte [org_registers+2],ch - mov byte [org_registers+3],cl - call allocate_structure_data - mov word [ebx],virtual_directive-assembler - not eax - not edx - add eax,1 - adc edx,0 - add eax,edi - adc edx,0 - xchg dword [org_origin],eax - xchg dword [org_origin+4],edx - mov [ebx+10h],eax - mov [ebx+14h],edx - pop eax - mov [ebx+18h],eax - mov al,[virtual_data] - mov [ebx+2],al - mov al,[labels_type] - mov [ebx+3],al - mov eax,edi - xchg eax,[org_start] - mov [ebx+0Ch],eax - xchg ebp,[org_symbol] - mov [ebx+1Ch],ebp - mov [ebx+8],edi - mov eax,[current_line] - mov [ebx+4],eax - or [virtual_data],-1 - mov al,[value_type] - test al,1 - jnz invalid_use_of_symbol - mov [labels_type],al - jmp instruction_assembled - allocate_structure_data: - mov ebx,[structures_buffer] - sub ebx,20h - cmp ebx,[free_additional_memory] - jb out_of_memory - mov [structures_buffer],ebx - ret - find_structure_data: - mov ebx,[structures_buffer] - scan_structures: - cmp ebx,[additional_memory_end] - je no_such_structure - cmp ax,[ebx] - jne next_structure - clc - ret - next_structure: - cmp ax,if_directive-assembler - je check_structure_overlapping - cmp ax,repeat_directive-assembler - je check_structure_overlapping - cmp ax,while_directive-assembler - je check_structure_overlapping - add ebx,20h - jmp scan_structures - check_structure_overlapping: - cmp word [ebx],if_directive-assembler - je no_such_structure - cmp word [ebx],repeat_directive-assembler - je no_such_structure - cmp word [ebx],while_directive-assembler - je no_such_structure - add ebx,20h - jmp scan_structures - no_such_structure: - stc - ret - end_virtual: - call find_structure_data - jc unexpected_instruction - mov al,[ebx+2] - mov [virtual_data],al - mov al,[ebx+3] - mov [labels_type],al - mov eax,[ebx+10h] - mov dword [org_origin],eax - mov eax,[ebx+14h] - mov dword [org_origin+4],eax - mov eax,[ebx+18h] - mov [org_registers],eax - mov eax,[ebx+0Ch] - mov [org_start],eax - mov eax,[ebx+1Ch] - mov [org_symbol],eax - mov edi,[ebx+8] - remove_structure_data: - push esi edi - mov esi,[structures_buffer] - mov ecx,ebx - sub ecx,esi - lea edi,[esi+20h] - mov [structures_buffer],edi - shr ecx,2 - rep movs dword [edi],[esi] - pop edi esi - ret -repeat_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne repeat_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - repeat_value_ok: - cmp eax,0 - je zero_repeat - jl negative_repeat - call allocate_structure_data - mov word [ebx],repeat_directive-assembler - xchg eax,[counter_limit] - mov [ebx+10h],eax - mov eax,1 - xchg eax,[counter] - mov [ebx+14h],eax - mov [ebx+8],esi - mov eax,[current_line] - mov [ebx+4],eax - jmp instruction_assembled - end_repeat: - cmp [prefixed_instruction],0 - jne unexpected_instruction - call find_structure_data - jc unexpected_instruction - mov eax,[counter_limit] - inc [counter] - cmp [counter],eax - jbe continue_repeating - stop_repeat: - mov eax,[ebx+10h] - mov [counter_limit],eax - mov eax,[ebx+14h] - mov [counter],eax - call remove_structure_data - jmp instruction_assembled - continue_repeating: - mov esi,[ebx+8] - jmp instruction_assembled - negative_repeat: - cmp [error_line],0 - jne zero_repeat - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_value - zero_repeat: - mov al,[esi] - or al,al - jz missing_end_directive - cmp al,0Fh - jne extra_characters_on_line - call find_end_repeat - jmp instruction_assembled - find_end_repeat: - call find_structure_end - cmp ax,repeat_directive-assembler - jne unexpected_instruction - ret -while_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction - call allocate_structure_data - mov word [ebx],while_directive-assembler - mov eax,1 - xchg eax,[counter] - mov [ebx+10h],eax - mov [ebx+8],esi - mov eax,[current_line] - mov [ebx+4],eax - do_while: - push ebx - call calculate_logical_expression - or al,al - jnz while_true - mov al,[esi] - or al,al - jz missing_end_directive - cmp al,0Fh - jne extra_characters_on_line - stop_while: - call find_end_while - pop ebx - mov eax,[ebx+10h] - mov [counter],eax - call remove_structure_data - jmp instruction_assembled - while_true: - pop ebx - jmp instruction_assembled - end_while: - cmp [prefixed_instruction],0 - jne unexpected_instruction - call find_structure_data - jc unexpected_instruction - mov eax,[ebx+4] - mov [current_line],eax - inc [counter] - jz too_many_repeats - mov esi,[ebx+8] - jmp do_while - find_end_while: - call find_structure_end - cmp ax,while_directive-assembler - jne unexpected_instruction - ret -if_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction - call calculate_logical_expression - mov dl,al - mov al,[esi] - or al,al - jz missing_end_directive - cmp al,0Fh - jne extra_characters_on_line - or dl,dl - jnz if_true - call find_else - jc instruction_assembled - mov al,[esi] - cmp al,1 - jne else_true - cmp word [esi+1],if_directive-assembler - jne else_true - add esi,4 - jmp if_directive - if_true: - xor al,al - make_if_structure: - call allocate_structure_data - mov word [ebx],if_directive-assembler - mov byte [ebx+2],al - mov eax,[current_line] - mov [ebx+4],eax - jmp instruction_assembled - else_true: - or al,al - jz missing_end_directive - cmp al,0Fh - jne extra_characters_on_line - or al,-1 - jmp make_if_structure - else_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction - mov ax,if_directive-assembler - call find_structure_data - jc unexpected_instruction - cmp byte [ebx+2],0 - jne unexpected_instruction - found_else: - mov al,[esi] - cmp al,1 - jne skip_else - cmp word [esi+1],if_directive-assembler - jne skip_else - add esi,4 - call find_else - jnc found_else - call remove_structure_data - jmp instruction_assembled - skip_else: - or al,al - jz missing_end_directive - cmp al,0Fh - jne extra_characters_on_line - call find_end_if - call remove_structure_data - jmp instruction_assembled - end_if: - cmp [prefixed_instruction],0 - jne unexpected_instruction - call find_structure_data - jc unexpected_instruction - call remove_structure_data - jmp instruction_assembled - find_else: - call find_structure_end - cmp ax,else_directive-assembler - je else_found - cmp ax,if_directive-assembler - jne unexpected_instruction - stc - ret - else_found: - clc - ret - find_end_if: - call find_structure_end - cmp ax,if_directive-assembler - jne unexpected_instruction - ret - find_structure_end: - push [error_line] - mov eax,[current_line] - mov [error_line],eax - find_end_directive: - call skip_line - lods byte [esi] - cmp al,0Fh - jne no_end_directive - lods dword [esi] - mov [current_line],eax - skip_labels: - cmp byte [esi],2 - jne labels_ok - add esi,6 - jmp skip_labels - labels_ok: - cmp byte [esi],1 - jne find_end_directive - mov ax,[esi+1] - cmp ax,prefix_instruction-assembler - je find_end_directive - add esi,4 - cmp ax,repeat_directive-assembler - je skip_repeat - cmp ax,while_directive-assembler - je skip_while - cmp ax,if_directive-assembler - je skip_if - cmp ax,else_directive-assembler - je structure_end - cmp ax,end_directive-assembler - jne find_end_directive - cmp byte [esi],1 - jne find_end_directive - mov ax,[esi+1] - add esi,4 - cmp ax,repeat_directive-assembler - je structure_end - cmp ax,while_directive-assembler - je structure_end - cmp ax,if_directive-assembler - jne find_end_directive - structure_end: - pop [error_line] - ret - no_end_directive: - mov eax,[error_line] - mov [current_line],eax - jmp missing_end_directive - skip_repeat: - call find_end_repeat - jmp find_end_directive - skip_while: - call find_end_while - jmp find_end_directive - skip_if: - call skip_if_block - jmp find_end_directive - skip_if_block: - call find_else - jc if_block_skipped - cmp byte [esi],1 - jne skip_after_else - cmp word [esi+1],if_directive-assembler - jne skip_after_else - add esi,4 - jmp skip_if_block - skip_after_else: - call find_end_if - if_block_skipped: - ret -end_directive: - lods byte [esi] - cmp al,1 - jne invalid_argument - lods word [esi] - inc esi - cmp ax,virtual_directive-assembler - je end_virtual - cmp ax,repeat_directive-assembler - je end_repeat - cmp ax,while_directive-assembler - je end_while - cmp ax,if_directive-assembler - je end_if - cmp ax,data_directive-assembler - je end_data - jmp invalid_argument -break_directive: - mov ebx,[structures_buffer] - mov al,[esi] - or al,al - jz find_breakable_structure - cmp al,0Fh - jne extra_characters_on_line - find_breakable_structure: - cmp ebx,[additional_memory_end] - je unexpected_instruction - mov ax,[ebx] - cmp ax,repeat_directive-assembler - je break_repeat - cmp ax,while_directive-assembler - je break_while - cmp ax,if_directive-assembler - je break_if - add ebx,20h - jmp find_breakable_structure - break_if: - push [current_line] - mov eax,[ebx+4] - mov [current_line],eax - call remove_structure_data - call skip_if_block - pop [current_line] - mov ebx,[structures_buffer] - jmp find_breakable_structure - break_repeat: - push ebx - call find_end_repeat - pop ebx - jmp stop_repeat - break_while: - push ebx - jmp stop_while - -data_bytes: - call define_data - lods byte [esi] - cmp al,'(' - je get_byte - cmp al,'?' - jne invalid_argument - mov eax,edi - mov byte [edi],0 - inc edi - jmp undefined_data - get_byte: - cmp byte [esi],0 - je get_string - call get_byte_value - stos byte [edi] - ret - get_string: - inc esi - lods dword [esi] - mov ecx,eax - lea eax,[edi+ecx] - cmp eax,[display_buffer] - ja out_of_memory - rep movs byte [edi],[esi] - inc esi - ret - undefined_data: - cmp [virtual_data],0 - je mark_undefined_data - ret - mark_undefined_data: - cmp eax,[undefined_data_end] - je undefined_data_ok - mov [undefined_data_start],eax - undefined_data_ok: - mov [undefined_data_end],edi - ret - define_data: - cmp edi,[display_buffer] - jae out_of_memory - cmp byte [esi],'(' - jne simple_data_value - mov ebx,esi - inc esi - call skip_expression - xchg esi,ebx - cmp byte [ebx],81h - jne simple_data_value - inc esi - call get_dword_value - cmp [next_pass_needed],0 - jne dup_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - dup_value_ok: - inc esi - cmp eax,0 - jg dup_positive - cmp [error_line],0 - jne dup_invalid - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_value - dup_invalid: - mov eax,1 - dup_positive: - cmp byte [esi],'{' - jne duplicate_single_data_value - inc esi - duplicate_data: - push eax esi - duplicated_values: - cmp edi,[display_buffer] - jae out_of_memory - call near dword [esp+8] - lods byte [esi] - cmp al,',' - je duplicated_values - cmp al,'}' - jne invalid_argument - pop ebx eax - dec eax - jz data_defined - mov esi,ebx - jmp duplicate_data - duplicate_single_data_value: - cmp edi,[display_buffer] - jae out_of_memory - push eax esi - call near dword [esp+8] - pop ebx eax - dec eax - jz data_defined - mov esi,ebx - jmp duplicate_single_data_value - simple_data_value: - cmp edi,[display_buffer] - jae out_of_memory - call near dword [esp] - data_defined: - lods byte [esi] - cmp al,',' - je define_data - dec esi - add esp,4 - jmp instruction_assembled -data_unicode: - or [base_code],-1 - jmp define_words -data_words: - mov [base_code],0 - define_words: - call define_data - lods byte [esi] - cmp al,'(' - je get_word - cmp al,'?' - jne invalid_argument - mov eax,edi - mov word [edi],0 - scas word [edi] - jmp undefined_data - ret - get_word: - cmp [base_code],0 - je word_data_value - cmp byte [esi],0 - je word_string - word_data_value: - call get_word_value - call mark_relocation - stos word [edi] - ret - word_string: - inc esi - lods dword [esi] - mov ecx,eax - jecxz word_string_ok - lea eax,[edi+ecx*2] - cmp eax,[display_buffer] - ja out_of_memory - xor ah,ah - copy_word_string: - lods byte [esi] - stos word [edi] - loop copy_word_string - word_string_ok: - inc esi - ret -data_dwords: - call define_data - lods byte [esi] - cmp al,'(' - je get_dword - cmp al,'?' - jne invalid_argument - mov eax,edi - mov dword [edi],0 - scas dword [edi] - jmp undefined_data - get_dword: - push esi - call get_dword_value - pop ebx - cmp byte [esi],':' - je complex_dword - call mark_relocation - stos dword [edi] - ret - complex_dword: - mov esi,ebx - cmp byte [esi],'.' - je invalid_value - call get_word_value - push eax - inc esi - lods byte [esi] - cmp al,'(' - jne invalid_operand - mov al,[value_type] - push eax - cmp byte [esi],'.' - je invalid_value - call get_word_value - call mark_relocation - stos word [edi] - pop eax - mov [value_type],al - pop eax - call mark_relocation - stos word [edi] - ret -data_pwords: - call define_data - lods byte [esi] - cmp al,'(' - je get_pword - cmp al,'?' - jne invalid_argument - mov eax,edi - mov dword [edi],0 - scas dword [edi] - mov word [edi],0 - scas word [edi] - jmp undefined_data - get_pword: - push esi - call get_pword_value - pop ebx - cmp byte [esi],':' - je complex_pword - call mark_relocation - stos dword [edi] - mov ax,dx - stos word [edi] - ret - complex_pword: - mov esi,ebx - cmp byte [esi],'.' - je invalid_value - call get_word_value - push eax - inc esi - lods byte [esi] - cmp al,'(' - jne invalid_operand - mov al,[value_type] - push eax - cmp byte [esi],'.' - je invalid_value - call get_dword_value - call mark_relocation - stos dword [edi] - pop eax - mov [value_type],al - pop eax - call mark_relocation - stos word [edi] - ret -data_qwords: - call define_data - lods byte [esi] - cmp al,'(' - je get_qword - cmp al,'?' - jne invalid_argument - mov eax,edi - mov dword [edi],0 - scas dword [edi] - mov dword [edi],0 - scas dword [edi] - jmp undefined_data - get_qword: - call get_qword_value - call mark_relocation - stos dword [edi] - mov eax,edx - stos dword [edi] - ret -data_twords: - call define_data - lods byte [esi] - cmp al,'(' - je get_tword - cmp al,'?' - jne invalid_argument - mov eax,edi - mov dword [edi],0 - scas dword [edi] - mov dword [edi],0 - scas dword [edi] - mov word [edi],0 - scas word [edi] - jmp undefined_data - get_tword: - cmp byte [esi],'.' - jne complex_tword - inc esi - cmp word [esi+8],8000h - je fp_zero_tword - mov eax,[esi] - stos dword [edi] - mov eax,[esi+4] - stos dword [edi] - mov ax,[esi+8] - add ax,3FFFh - cmp ax,8000h - jae value_out_of_range - mov bl,[esi+11] - shl bx,15 - or ax,bx - stos word [edi] - add esi,13 - ret - fp_zero_tword: - xor eax,eax - stos dword [edi] - stos dword [edi] - mov al,[esi+11] - shl ax,15 - stos word [edi] - add esi,13 - ret - complex_tword: - call get_word_value - push eax - inc esi - lods byte [esi] - cmp al,'(' - jne invalid_operand - mov al,[value_type] - push eax - cmp byte [esi],'.' - je invalid_value - call get_qword_value - call mark_relocation - stos dword [edi] - mov eax,edx - stos dword [edi] - pop eax - mov [value_type],al - pop eax - call mark_relocation - stos word [edi] - ret -data_file: - lods word [esi] - cmp ax,'(' - jne invalid_argument - add esi,4 - call open_binary_file - mov eax,[esi-4] - lea esi,[esi+eax+1] - mov al,2 - xor edx,edx - call lseek - push eax - xor edx,edx - cmp byte [esi],':' - jne position_ok - inc esi - cmp byte [esi],'(' - jne invalid_argument - inc esi - cmp byte [esi],'.' - je invalid_value - push ebx - call get_dword_value - pop ebx - mov edx,eax - sub [esp],edx - position_ok: - cmp byte [esi],',' - jne size_ok - inc esi - cmp byte [esi],'(' - jne invalid_argument - inc esi - cmp byte [esi],'.' - je invalid_value - push ebx edx - call get_dword_value - pop edx ebx - mov [esp],eax - size_ok: - xor al,al - call lseek - pop ecx - mov edx,edi - add edi,ecx - jc out_of_memory - cmp edi,[display_buffer] - ja out_of_memory - call read - jc error_reading_file - call close - lods byte [esi] - cmp al,',' - je data_file - dec esi - jmp instruction_assembled - open_binary_file: - push esi - push edi - mov esi,[current_line] - mov esi,[esi] - get_current_path: - lodsb - stosb - or al,al - jnz get_current_path - cut_current_path: - cmp edi,[esp] - je current_path_ok - cmp byte [edi-1],'\' - je current_path_ok - cmp byte [edi-1],'/' - je current_path_ok - dec edi - jmp cut_current_path - current_path_ok: - mov esi,[esp+4] - call preprocess_path - pop edx - mov esi,edx - call open - jnc file_opened - mov edi,esi - mov esi,[esp] - push edi - call preprocess_path - pop edx - mov esi,edx - call open - jc file_not_found - file_opened: - mov edi,esi - pop esi - ret -reserve_bytes: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne rb_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - rb_value_ok: - cmp eax,0 - jl reserve_negative - mov ecx,eax - mov edx,ecx - add edx,edi - jc out_of_memory - cmp edx,[display_buffer] - ja out_of_memory - push edi - cmp [next_pass_needed],0 - je zero_bytes - add edi,ecx - jmp reserved_data - zero_bytes: - xor eax,eax - shr ecx,1 - jnc bytes_stosb_ok - stos byte [edi] - bytes_stosb_ok: - shr ecx,1 - jnc bytes_stosw_ok - stos word [edi] - bytes_stosw_ok: - rep stos dword [edi] - reserved_data: - pop eax - call undefined_data - jmp instruction_assembled - reserve_negative: - cmp [error_line],0 - jne instruction_assembled - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_value - jmp instruction_assembled -reserve_words: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne rw_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - rw_value_ok: - cmp eax,0 - jl reserve_negative - mov ecx,eax - mov edx,ecx - shl edx,1 - jc out_of_memory - add edx,edi - jc out_of_memory - cmp edx,[display_buffer] - ja out_of_memory - push edi - cmp [next_pass_needed],0 - je zero_words - lea edi,[edi+ecx*2] - jmp reserved_data - zero_words: - xor eax,eax - shr ecx,1 - jnc words_stosw_ok - stos word [edi] - words_stosw_ok: - rep stos dword [edi] - jmp reserved_data -reserve_dwords: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne rd_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - rd_value_ok: - cmp eax,0 - jl reserve_negative - mov ecx,eax - mov edx,ecx - shl edx,1 - jc out_of_memory - shl edx,1 - jc out_of_memory - add edx,edi - jc out_of_memory - cmp edx,[display_buffer] - ja out_of_memory - push edi - cmp [next_pass_needed],0 - je zero_dwords - lea edi,[edi+ecx*4] - jmp reserved_data - zero_dwords: - xor eax,eax - rep stos dword [edi] - jmp reserved_data -reserve_pwords: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne rp_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - rp_value_ok: - cmp eax,0 - jl reserve_negative - mov ecx,eax - shl ecx,1 - jc out_of_memory - add ecx,eax - mov edx,ecx - shl edx,1 - jc out_of_memory - add edx,edi - jc out_of_memory - cmp edx,[display_buffer] - ja out_of_memory - push edi - cmp [next_pass_needed],0 - je zero_words - lea edi,[edi+ecx*2] - jmp reserved_data -reserve_qwords: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne rq_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - rq_value_ok: - cmp eax,0 - jl reserve_negative - mov ecx,eax - shl ecx,1 - jc out_of_memory - mov edx,ecx - shl edx,1 - jc out_of_memory - shl edx,1 - jc out_of_memory - add edx,edi - jc out_of_memory - cmp edx,[display_buffer] - ja out_of_memory - push edi - cmp [next_pass_needed],0 - je zero_dwords - lea edi,[edi+ecx*4] - jmp reserved_data -reserve_twords: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [next_pass_needed],0 - jne rt_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - rt_value_ok: - cmp eax,0 - jl reserve_negative - mov ecx,eax - shl ecx,2 - jc out_of_memory - add ecx,eax - mov edx,ecx - shl edx,1 - jc out_of_memory - add edx,edi - jc out_of_memory - cmp edx,[display_buffer] - ja out_of_memory - push edi - cmp [next_pass_needed],0 - je zero_words - lea edi,[edi+ecx*2] - jmp reserved_data -align_directive: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,eax - dec edx - test eax,edx - jnz invalid_value - or eax,eax - jz invalid_value - cmp eax,1 - je instruction_assembled - mov ecx,edi - sub ecx,dword [org_origin] - cmp [org_registers],0 - jne section_not_aligned_enough - cmp [labels_type],0 - je make_alignment - cmp [output_format],3 - je pe_alignment - mov ebx,[org_symbol] - cmp byte [ebx],0 - jne section_not_aligned_enough - cmp eax,[ebx+10h] - jbe make_alignment - jmp section_not_aligned_enough - pe_alignment: - cmp eax,1000h - ja section_not_aligned_enough - make_alignment: - dec eax - and ecx,eax - jz instruction_assembled - neg ecx - add ecx,eax - inc ecx - mov edx,ecx - add edx,edi - jc out_of_memory - cmp edx,[display_buffer] - ja out_of_memory - push edi - cmp [next_pass_needed],0 - je nops - add edi,ecx - jmp reserved_data - nops: - mov eax,90909090h - shr ecx,1 - jnc nops_stosb_ok - stos byte [edi] - nops_stosb_ok: - shr ecx,1 - jnc nops_stosw_ok - stos word [edi] - nops_stosw_ok: - rep stos dword [edi] - jmp reserved_data diff --git a/programs/fasm/trunk/expressi.inc b/programs/fasm/trunk/expressi.inc deleted file mode 100644 index 8dfa42e2d0..0000000000 --- a/programs/fasm/trunk/expressi.inc +++ /dev/null @@ -1,2443 +0,0 @@ - -; flat assembler core -; Copyright (c) 1999-2005, Tomasz Grysztar. -; All rights reserved. - -convert_expression: - push ebp - call get_fp_value - jnc fp_expression - mov ebp,esp - expression_loop: - push ebp edi - mov edi,single_operand_operators - call get_operator - pop edi - push eax - mov al,[esi] - cmp al,1Ah - je expression_number - cmp al,22h - je expression_number - cmp al,'(' - je expression_number - mov al,11h - stos byte [edi] - or eax,-1 - stos dword [edi] - jmp expression_number_ok - expression_number: - call convert_number - expression_number_ok: - pop eax - or al,al - jz expression_operator - stos byte [edi] - expression_operator: - push edi - mov edi,operators - call get_operator - pop edi ebp - or al,al - jz expression_end - operators_loop: - cmp esp,ebp - je push_operator - mov bl,al - and bl,0F0h - mov bh,byte [esp] - and bh,0F0h - cmp bl,bh - ja push_operator - pop ebx - mov byte [edi],bl - inc edi - jmp operators_loop - push_operator: - push eax - jmp expression_loop - expression_end: - cmp esp,ebp - je expression_converted - pop eax - stos byte [edi] - jmp expression_end - expression_converted: - pop ebp - ret - fp_expression: - mov al,'.' - stos byte [edi] - mov eax,[fp_value] - stos dword [edi] - mov eax,[fp_value+4] - stos dword [edi] - mov eax,[fp_value+8] - stos dword [edi] - pop ebp - ret - -convert_number: - cmp byte [esi],'(' - je expression_value - inc edi - call get_number - jc symbol_value - or ebp,ebp - jz valid_number - mov byte [edi-1],0Fh - ret - valid_number: - cmp dword [edi+4],0 - jne qword_number - cmp word [edi+2],0 - jne dword_number - cmp byte [edi+1],0 - jne word_number - byte_number: - mov byte [edi-1],1 - inc edi - ret - qword_number: - mov byte [edi-1],8 - add edi,8 - ret - dword_number: - mov byte [edi-1],4 - scas dword [edi] - ret - word_number: - mov byte [edi-1],2 - scas word [edi] - ret - expression_value: - mov eax,esp - sub eax,100h - jc stack_overflow - cmp eax,[stack_limit] - jb stack_overflow - inc esi - call convert_expression - lods byte [esi] - cmp al,')' - jne invalid_expression - ret - symbol_value: - lods byte [esi] - cmp al,1Ah - jne invalid_value - lods byte [esi] - movzx ecx,al - push ecx esi edi - mov edi,address_registers - call get_symbol - jnc register_value - mov edi,directive_operators - call get_symbol - pop edi esi ecx - jnc broken_value - call get_label_id - store_label_value: - mov byte [edi-1],11h - stos dword [edi] - ret - broken_value: - sub esi,2 - or eax,-1 - jmp store_label_value - register_value: - pop edi - add esp,8 - mov byte [edi-1],10h - mov al,ah - stos byte [edi] - ret - -get_number: - xor ebp,ebp - lods byte [esi] - cmp al,22h - je get_text_number - cmp al,1Ah - jne not_number - lods byte [esi] - movzx ecx,al - mov [number_start],esi - mov al,[esi] - cmp al,'$' - je number_begin - sub al,30h - cmp al,9 - ja invalid_number - number_begin: - mov ebx,esi - add esi,ecx - push esi - dec esi - mov dword [edi],0 - mov dword [edi+4],0 - cmp byte [ebx],'$' - je pascal_hex_number - cmp word [ebx],'0x' - je get_hex_number - mov al,[esi] - dec esi - cmp al,'h' - je get_hex_number - cmp al,'b' - je get_bin_number - cmp al,'d' - je get_dec_number - cmp al,'o' - je get_oct_number - cmp al,'H' - je get_hex_number - cmp al,'B' - je get_bin_number - cmp al,'D' - je get_dec_number - cmp al,'O' - je get_oct_number - inc esi - get_dec_number: - mov ebx,esi - mov esi,[number_start] - get_dec_digit: - cmp esi,ebx - ja number_ok - xor edx,edx - mov eax,[edi] - shld edx,eax,2 - shl eax,2 - add eax,[edi] - adc edx,0 - add eax,eax - adc edx,edx - mov [edi],eax - mov eax,[edi+4] - add eax,eax - jc dec_out_of_range - add eax,eax - jc dec_out_of_range - add eax,[edi+4] - jc dec_out_of_range - add eax,eax - jc dec_out_of_range - add eax,edx - jc dec_out_of_range - mov [edi+4],eax - movzx eax,byte [esi] - sub al,30h - cmp al,9 - ja bad_number - add [edi],eax - adc dword [edi+4],0 - jc dec_out_of_range - inc esi - jmp get_dec_digit - dec_out_of_range: - or ebp,-1 - inc esi - jmp get_dec_digit - bad_number: - pop eax - invalid_number: - mov esi,[number_start] - dec esi - not_number: - dec esi - stc - ret - get_bin_number: - xor bl,bl - get_bin_digit: - cmp esi,[number_start] - jb number_ok - movzx eax,byte [esi] - sub al,30h - cmp al,1 - ja bad_number - xor edx,edx - mov cl,bl - dec esi - cmp bl,64 - je bin_out_of_range - inc bl - cmp cl,32 - jae bin_digit_high - shl eax,cl - or dword [edi],eax - jmp get_bin_digit - bin_digit_high: - sub cl,32 - shl eax,cl - or dword [edi+4],eax - jmp get_bin_digit - bin_out_of_range: - or al,al - jz get_bin_digit - or ebp,-1 - jmp get_bin_digit - pascal_hex_number: - cmp cl,1 - je bad_number - get_hex_number: - xor bl,bl - get_hex_digit: - cmp esi,[number_start] - jb number_ok - movzx eax,byte [esi] - cmp al,'x' - je hex_number_ok - cmp al,'$' - je pascal_hex_ok - sub al,30h - cmp al,9 - jbe hex_digit_ok - sub al,7 - cmp al,15 - jbe hex_letter_digit_ok - sub al,20h - cmp al,15 - ja bad_number - hex_letter_digit_ok: - cmp al,10 - jb bad_number - hex_digit_ok: - xor edx,edx - mov cl,bl - dec esi - cmp bl,64 - je hex_out_of_range - add bl,4 - cmp cl,32 - jae hex_digit_high - shl eax,cl - or dword [edi],eax - jmp get_hex_digit - hex_digit_high: - sub cl,32 - shl eax,cl - or dword [edi+4],eax - jmp get_hex_digit - hex_out_of_range: - or al,al - jz get_hex_digit - or ebp,-1 - jmp get_hex_digit - get_oct_number: - xor bl,bl - get_oct_digit: - cmp esi,[number_start] - jb number_ok - movzx eax,byte [esi] - sub al,30h - cmp al,7 - ja bad_number - oct_digit_ok: - xor edx,edx - mov cl,bl - dec esi - cmp bl,64 - jae oct_out_of_range - add bl,3 - cmp cl,30 - je oct_digit_wrap - ja oct_digit_high - shl eax,cl - or dword [edi],eax - jmp get_oct_digit - oct_digit_wrap: - shl eax,cl - adc dword [edi+4],0 - or dword [edi],eax - jmp get_oct_digit - oct_digit_high: - sub cl,32 - shl eax,cl - or dword [edi+4],eax - jmp get_oct_digit - oct_out_of_range: - or al,al - jz get_oct_digit - or ebp,-1 - jmp get_oct_digit - hex_number_ok: - dec esi - pascal_hex_ok: - cmp esi,[number_start] - jne bad_number - number_ok: - pop esi - number_done: - clc - ret - get_text_number: - lods dword [esi] - mov edx,eax - xor bl,bl - mov dword [edi],0 - mov dword [edi+4],0 - get_text_character: - sub edx,1 - jc number_done - movzx eax,byte [esi] - inc esi - mov cl,bl - cmp bl,64 - je text_out_of_range - add bl,8 - cmp cl,32 - jae text_character_high - shl eax,cl - or dword [edi],eax - jmp get_text_character - text_character_high: - sub cl,32 - shl eax,cl - or dword [edi+4],eax - jmp get_text_character - text_out_of_range: - or ebp,-1 - jmp get_text_character - -get_fp_value: - push edi esi - lods byte [esi] - cmp al,1Ah - je fp_value_start - cmp al,'-' - je fp_sign_ok - cmp al,'+' - jne not_fp_value - fp_sign_ok: - lods byte [esi] - cmp al,1Ah - jne not_fp_value - fp_value_start: - lods byte [esi] - movzx ecx,al - cmp cl,1 - jbe not_fp_value - lea edx,[esi+1] - xor ah,ah - check_fp_value: - lods byte [esi] - cmp al,'.' - je fp_character_dot - cmp al,'E' - je fp_character_exp - cmp al,'e' - je fp_character_exp - cmp al,'F' - je fp_last_character - cmp al,'f' - je fp_last_character - digit_expected: - cmp al,'0' - jb not_fp_value - cmp al,'9' - ja not_fp_value - jmp fp_character_ok - fp_character_dot: - cmp esi,edx - je not_fp_value - or ah,ah - jnz not_fp_value - or ah,1 - lods byte [esi] - loop digit_expected - not_fp_value: - pop esi edi - stc - ret - fp_character_exp: - cmp esi,edx - je not_fp_value - cmp ah,1 - ja not_fp_value - or ah,2 - cmp ecx,1 - jne fp_character_ok - cmp byte [esi],'+' - je fp_exp_sign - cmp byte [esi],'-' - jne fp_character_ok - fp_last_character: - cmp cl,1 - jne not_fp_value - or ah,4 - jmp fp_character_ok - fp_exp_sign: - inc esi - cmp byte [esi],1Ah - jne not_fp_value - inc esi - lods byte [esi] - movzx ecx,al - inc ecx - fp_character_ok: - dec ecx - jnz check_fp_value - or ah,ah - jz not_fp_value - pop esi - lods byte [esi] - mov [fp_sign],0 - cmp al,1Ah - je fp_get - inc esi - cmp al,'+' - je fp_get - mov [fp_sign],1 - fp_get: - lods byte [esi] - movzx ecx,al - xor edx,edx - mov edi,fp_value - mov [edi],edx - mov [edi+4],edx - mov [edi+12],edx - call fp_optimize - mov [fp_format],0 - mov al,[esi] - fp_before_dot: - lods byte [esi] - cmp al,'.' - je fp_dot - cmp al,'E' - je fp_exponent - cmp al,'e' - je fp_exponent - cmp al,'F' - je fp_done - cmp al,'f' - je fp_done - sub al,30h - mov edi,fp_value+16 - xor edx,edx - mov dword [edi+12],edx - mov dword [edi],edx - mov dword [edi+4],edx - mov [edi+7],al - mov dl,7 - mov dword [edi+8],edx - call fp_optimize - mov edi,fp_value - push ecx - mov ecx,10 - call fp_mul - pop ecx - mov ebx,fp_value+16 - call fp_add - loop fp_before_dot - fp_dot: - mov edi,fp_value+16 - xor edx,edx - mov [edi],edx - mov [edi+4],edx - mov byte [edi+7],80h - mov [edi+8],edx - mov dword [edi+12],edx - dec ecx - jz fp_done - fp_after_dot: - lods byte [esi] - cmp al,'E' - je fp_exponent - cmp al,'e' - je fp_exponent - cmp al,'F' - je fp_done - cmp al,'f' - je fp_done - inc [fp_format] - cmp [fp_format],80h - jne fp_counter_ok - mov [fp_format],7Fh - fp_counter_ok: - dec esi - mov edi,fp_value+16 - push ecx - mov ecx,10 - call fp_div - push dword [edi] - push dword [edi+4] - push dword [edi+8] - push dword [edi+12] - lods byte [esi] - sub al,30h - movzx ecx,al - call fp_mul - mov ebx,edi - mov edi,fp_value - call fp_add - mov edi,fp_value+16 - pop dword [edi+12] - pop dword [edi+8] - pop dword [edi+4] - pop dword [edi] - pop ecx - loop fp_after_dot - jmp fp_done - fp_exponent: - or [fp_format],80h - xor edx,edx - xor ebp,ebp - dec ecx - jnz get_exponent - cmp byte [esi],'+' - je fp_exponent_sign - cmp byte [esi],'-' - jne fp_done - not ebp - fp_exponent_sign: - add esi,2 - lods byte [esi] - movzx ecx,al - get_exponent: - movzx eax,byte [esi] - inc esi - sub al,30h - cmp al,10 - jae exponent_ok - imul edx,10 - cmp edx,8000h - jae value_out_of_range - add edx,eax - loop get_exponent - exponent_ok: - mov edi,fp_value - or edx,edx - jz fp_done - mov ecx,edx - or ebp,ebp - jnz fp_negative_power - fp_power: - push ecx - mov ecx,10 - call fp_mul - pop ecx - loop fp_power - jmp fp_done - fp_negative_power: - push ecx - mov ecx,10 - call fp_div - pop ecx - loop fp_negative_power - fp_done: - mov edi,fp_value - mov al,[fp_format] - mov [edi+10],al - mov al,[fp_sign] - mov [edi+11],al - test byte [edi+15],80h - jz fp_ok - add dword [edi],1 - adc dword [edi+4],0 - jnc fp_ok - mov eax,[edi+4] - shrd [edi],eax,1 - shr eax,1 - or eax,80000000h - mov [edi+4],eax - inc word [edi+8] - fp_ok: - pop edi - clc - ret - fp_mul: - or ecx,ecx - jz fp_zero - mov eax,[edi+12] - mul ecx - mov [edi+12],eax - mov ebx,edx - mov eax,[edi] - mul ecx - add eax,ebx - adc edx,0 - mov [edi],eax - mov ebx,edx - mov eax,[edi+4] - mul ecx - add eax,ebx - adc edx,0 - mov [edi+4],eax - .loop: - or edx,edx - jz .done - mov eax,[edi] - shrd [edi+12],eax,1 - mov eax,[edi+4] - shrd [edi],eax,1 - shrd eax,edx,1 - mov [edi+4],eax - shr edx,1 - inc dword [edi+8] - cmp dword [edi+8],8000h - jge value_out_of_range - jmp .loop - .done: - ret - fp_div: - mov eax,[edi+4] - xor edx,edx - div ecx - mov [edi+4],eax - mov eax,[edi] - div ecx - mov [edi],eax - mov eax,[edi+12] - div ecx - mov [edi+12],eax - mov ebx,eax - or ebx,[edi] - or ebx,[edi+4] - jz fp_zero - .loop: - test byte [edi+7],80h - jnz .exp_ok - mov eax,[edi] - shld [edi+4],eax,1 - mov eax,[edi+12] - shld [edi],eax,1 - add eax,eax - mov [edi+12],eax - dec dword [edi+8] - add edx,edx - jmp .loop - .exp_ok: - mov eax,edx - xor edx,edx - div ecx - add [edi+12],eax - adc dword [edi],0 - adc dword [edi+4],0 - jnc .done - mov eax,[edi+4] - mov ebx,[edi] - shrd [edi],eax,1 - shrd [edi+12],ebx,1 - shr eax,1 - or eax,80000000h - mov [edi+4],eax - inc dword [edi+8] - .done: - ret - fp_add: - cmp dword [ebx+8],8000h - je .done - cmp dword [edi+8],8000h - je .copy - mov eax,[ebx+8] - cmp eax,[edi+8] - jge .exp_ok - mov eax,[edi+8] - .exp_ok: - call .change_exp - xchg ebx,edi - call .change_exp - xchg ebx,edi - mov edx,[ebx+12] - mov eax,[ebx] - mov ebx,[ebx+4] - add [edi+12],edx - adc [edi],eax - adc [edi+4],ebx - jnc .done - mov eax,[edi] - shrd [edi+12],eax,1 - mov eax,[edi+4] - shrd [edi],eax,1 - shr eax,1 - or eax,80000000h - mov [edi+4],eax - inc dword [edi+8] - .done: - ret - .copy: - mov eax,[ebx] - mov [edi],eax - mov eax,[ebx+4] - mov [edi+4],eax - mov eax,[ebx+8] - mov [edi+8],eax - mov eax,[ebx+12] - mov [edi+12],eax - ret - .change_exp: - push ecx - mov ecx,eax - sub ecx,[ebx+8] - mov edx,[ebx+4] - jecxz .exp_done - .exp_loop: - mov ebp,[ebx] - shrd [ebx+12],ebp,1 - shrd [ebx],edx,1 - shr edx,1 - inc dword [ebx+8] - loop .exp_loop - .exp_done: - mov [ebx+4],edx - pop ecx - ret - fp_optimize: - mov eax,[edi] - mov ebp,[edi+4] - or ebp,[edi] - or ebp,[edi+12] - jz fp_zero - .loop: - test byte [edi+7],80h - jnz .done - shld [edi+4],eax,1 - mov ebp,[edi+12] - shld eax,ebp,1 - mov [edi],eax - shl dword [edi+12],1 - dec dword [edi+8] - jmp .loop - .done: - ret - fp_zero: - mov dword [edi+8],8000h - ret - -calculate_expression: - mov [current_offset],edi - mov [value_undefined],0 - calculation_loop: - lods byte [esi] - or al,al - jz get_string_value - cmp al,'.' - je convert_fp - cmp al,1 - je get_byte_number - cmp al,2 - je get_word_number - cmp al,4 - je get_dword_number - cmp al,8 - je get_qword_number - cmp al,0Fh - je value_out_of_range - cmp al,10h - je get_register - cmp al,11h - je get_label - cmp al,')' - je expression_calculated - cmp al,']' - je expression_calculated - sub edi,14h - mov ebx,edi - sub ebx,14h - cmp al,0E0h - je calculate_rva - cmp al,0D0h - je calculate_not - cmp al,0D1h - je calculate_neg - mov dx,[ebx+8] - or dx,[edi+8] - cmp al,80h - je calculate_add - cmp al,81h - je calculate_sub - mov ah,[ebx+12] - or ah,[edi+12] - jz absolute_values_calculation - cmp [error_line],0 - jne absolute_values_calculation - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - absolute_values_calculation: - cmp al,90h - je calculate_mul - cmp al,91h - je calculate_div - or dx,dx - jnz invalid_expression - cmp al,0A0h - je calculate_mod - cmp al,0B0h - je calculate_and - cmp al,0B1h - je calculate_or - cmp al,0B2h - je calculate_xor - cmp al,0C0h - je calculate_shl - cmp al,0C1h - je calculate_shr - jmp invalid_expression - expression_calculated: - sub edi,14h - cmp [value_undefined],0 - je expression_value_ok - xor eax,eax - mov [edi],eax - mov [edi+4],eax - expression_value_ok: - ret - get_byte_number: - mov word [edi+8],0 - mov byte [edi+12],0 - xor eax,eax - lods byte [esi] - stos dword [edi] - xor al,al - stos dword [edi] - add edi,0Ch - jmp calculation_loop - get_word_number: - mov word [edi+8],0 - mov byte [edi+12],0 - xor eax,eax - lods word [esi] - stos dword [edi] - xor ax,ax - stos dword [edi] - add edi,0Ch - jmp calculation_loop - get_dword_number: - mov word [edi+8],0 - mov byte [edi+12],0 - movs dword [edi],[esi] - xor eax,eax - stos dword [edi] - add edi,0Ch - jmp calculation_loop - get_qword_number: - mov word [edi+8],0 - mov byte [edi+12],0 - movs dword [edi],[esi] - movs dword [edi],[esi] - add edi,0Ch - jmp calculation_loop - get_register: - mov byte [edi+9],0 - mov byte [edi+12],0 - lods byte [esi] - mov [edi+8],al - mov byte [edi+10],1 - xor eax,eax - stos dword [edi] - stos dword [edi] - add edi,0Ch - jmp calculation_loop - get_label: - xor eax,eax - mov [edi+8],eax - mov [edi+12],al - mov [edi+20],eax - lods dword [esi] - cmp eax,0Fh - jb predefined_label - je reserved_word_used_as_symbol - cmp eax,-1 - je invalid_expression - mov ebx,eax - mov ax,[current_pass] - mov [ebx+18],ax - or byte [ebx+8],8 - test byte [ebx+8],1 - jz label_undefined - cmp ax,[ebx+16] - je label_defined - test byte [ebx+8],4 - jnz label_undefined - test byte [ebx+9],1 - jz label_defined - mov eax,[ebx] - sub eax,dword [adjustment] - stos dword [edi] - mov eax,[ebx+4] - sbb eax,dword [adjustment+4] - stos dword [edi] - mov eax,dword [adjustment] - or eax,dword [adjustment+4] - jz got_label - or [next_pass_needed],-1 - jmp got_label - label_defined: - mov eax,[ebx] - stos dword [edi] - mov eax,[ebx+4] - stos dword [edi] - got_label: - mov al,[ebx+11] - mov [edi-8+12],al - mov eax,[ebx+12] - mov [edi-8+8],eax - mov eax,[ebx+20] - mov [edi-8+16],eax - add edi,0Ch - mov al,[ebx+10] - or al,al - jz calculation_loop - cmp [size_override],-1 - je calculation_loop - cmp [size_override],0 - je check_size - cmp [operand_size],0 - jne calculation_loop - mov [operand_size],al - jmp calculation_loop - check_size: - xchg [operand_size],al - or al,al - jz calculation_loop - cmp al,[operand_size] - jne operand_sizes_do_not_match - jmp calculation_loop - current_offset_label: - mov al,[labels_type] - mov [edi+12],al - mov eax,[org_symbol] - mov [edi+16],eax - mov eax,[current_offset] - xor edx,edx - sub eax,dword [org_origin] - sbb edx,dword [org_origin+4] - stos dword [edi] - mov eax,edx - stos dword [edi] - mov eax,[org_registers] - stos dword [edi] - add edi,8 - jmp calculation_loop - org_origin_label: - mov al,[labels_type] - mov [edi+12],al - mov eax,[org_symbol] - mov [edi+16],eax - mov eax,[org_start] - xor edx,edx - sub eax,dword [org_origin] - sbb edx,dword [org_origin+4] - stos dword [edi] - mov eax,edx - stos dword [edi] - mov eax,[org_registers] - stos dword [edi] - add edi,8 - jmp calculation_loop - counter_label: - mov eax,[counter] - make_dword_label_value: - stos dword [edi] - xor eax,eax - stos dword [edi] - add edi,0Ch - jmp calculation_loop - timestamp_label: - call make_timestamp - jmp make_dword_label_value - predefined_label: - or eax,eax - jz current_offset_label - cmp eax,1 - je counter_label - cmp eax,2 - je timestamp_label - cmp eax,3 - je org_origin_label - label_undefined: - cmp [current_pass],1 - jbe force_next_pass - cmp [error_line],0 - jne undefined_value - mov eax,[current_line] - mov [error_line],eax - mov [error],undefined_symbol - jmp undefined_value - force_next_pass: - or [next_pass_needed],-1 - undefined_value: - mov byte [edi+12],0 - or [value_undefined],-1 - xor eax,eax - stos dword [edi] - stos dword [edi] - add edi,0Ch - jmp calculation_loop - calculate_add: - mov ecx,[ebx+16] - cmp byte [edi+12],0 - je add_values - mov ecx,[edi+16] - cmp byte [ebx+12],0 - je add_values - cmp [error_line],0 - jne add_values - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - add_values: - mov al,[edi+12] - or [ebx+12],al - mov [ebx+16],ecx - mov eax,[edi] - add [ebx],eax - mov eax,[edi+4] - adc [ebx+4],eax - or dx,dx - jz calculation_loop - push esi - mov esi,ebx - lea ebx,[edi+10] - mov cl,[edi+8] - call add_register - lea ebx,[edi+11] - mov cl,[edi+9] - call add_register - pop esi - jmp calculation_loop - add_register: - or cl,cl - jz add_register_done - add_register_start: - cmp [esi+8],cl - jne add_in_second_slot - mov al,[ebx] - add [esi+10],al - jnz add_register_done - mov byte [esi+8],0 - ret - add_in_second_slot: - cmp [esi+9],cl - jne create_in_first_slot - mov al,[ebx] - add [esi+11],al - jnz add_register_done - mov byte [esi+9],0 - ret - create_in_first_slot: - cmp byte [esi+8],0 - jne create_in_second_slot - mov [esi+8],cl - mov al,[ebx] - mov [esi+10],al - ret - create_in_second_slot: - cmp byte [esi+9],0 - jne invalid_expression - mov [esi+9],cl - mov al,[ebx] - mov [esi+11],al - add_register_done: - ret - calculate_sub: - xor ah,ah - mov ah,[ebx+12] - mov al,[edi+12] - or al,al - jz sub_values - cmp al,ah - jne invalid_sub - xor ah,ah - mov ecx,[edi+16] - cmp ecx,[ebx+16] - je sub_values - cmp ecx,[org_symbol] - jne invalid_sub - test byte [ebx+12],1 - jnz invalid_sub - mov ah,3 - sub_values: - mov [ebx+12],ah - mov eax,[edi] - sub [ebx],eax - mov eax,[edi+4] - sbb [ebx+4],eax - or dx,dx - jz calculation_loop - push esi - mov esi,ebx - lea ebx,[edi+10] - mov cl,[edi+8] - call sub_register - lea ebx,[edi+11] - mov cl,[edi+9] - call sub_register - pop esi - jmp calculation_loop - invalid_sub: - cmp [error_line],0 - jne sub_values - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - jmp sub_values - sub_register: - or cl,cl - jz add_register_done - neg byte [ebx] - jmp add_register_start - calculate_mul: - or dx,dx - jz mul_start - cmp word [ebx+8],0 - jne mul_start - mov eax,[ebx] - xchg eax,[edi] - mov [ebx],eax - mov eax,[ebx+4] - xchg eax,[edi+4] - mov [ebx+4],eax - mov eax,[ebx+8] - xchg eax,[edi+8] - mov [ebx+8],eax - mov eax,[ebx+12] - xchg eax,[edi+12] - mov [ebx+12],eax - mul_start: - push esi edx - mov esi,ebx - xor bl,bl - bt dword [esi+4],31 - jnc mul_first_sign_ok - not dword [esi] - not dword [esi+4] - add dword [esi],1 - adc dword [esi+4],0 - not bl - mul_first_sign_ok: - bt dword [edi+4],31 - jnc mul_second_sign_ok - not dword [edi] - not dword [edi+4] - add dword [edi],1 - adc dword [edi+4],0 - not bl - mul_second_sign_ok: - cmp dword [esi+4],0 - jz mul_numbers - cmp dword [edi+4],0 - jnz value_out_of_range - mul_numbers: - mov eax,[esi+4] - mul dword [edi] - or edx,edx - jnz value_out_of_range - mov ecx,eax - mov eax,[esi] - mul dword [edi+4] - or edx,edx - jnz value_out_of_range - add ecx,eax - jc value_out_of_range - mov eax,[esi] - mul dword [edi] - add edx,ecx - jc value_out_of_range - test edx,1 shl 31 - jnz value_out_of_range - mov [esi],eax - mov [esi+4],edx - or bl,bl - jz mul_ok - not dword [esi] - not dword [esi+4] - add dword [esi],1 - adc dword [esi+4],0 - mul_ok: - pop edx - or dx,dx - jz mul_calculated - cmp word [edi+8],0 - jne invalid_value - cmp byte [esi+8],0 - je mul_first_register_ok - mov al,[edi] - cbw - cwde - cdq - cmp edx,[edi+4] - jne value_out_of_range - cmp eax,[edi] - jne value_out_of_range - imul byte [esi+10] - mov dl,ah - cbw - cmp ah,dl - jne value_out_of_range - mov [esi+10],al - mul_first_register_ok: - cmp byte [esi+9],0 - je mul_calculated - mov al,[edi] - cbw - cwde - cdq - cmp edx,[edi+4] - jne value_out_of_range - cmp eax,[edi] - jne value_out_of_range - imul byte [esi+11] - mov dl,ah - cbw - cmp ah,dl - jne value_out_of_range - mov [esi+11],al - mul_calculated: - pop esi - jmp calculation_loop - calculate_div: - push esi edx - mov esi,ebx - call div_64 - pop edx - or dx,dx - jz div_calculated - cmp byte [esi+8],0 - je div_first_register_ok - mov al,[edi] - cbw - cwde - cdq - cmp edx,[edi+4] - jne value_out_of_range - cmp eax,[edi] - jne value_out_of_range - or al,al - jz value_out_of_range - mov al,[esi+10] - cbw - idiv byte [edi] - mov [esi+10],al - div_first_register_ok: - cmp byte [esi+9],0 - je div_calculated - mov al,[edi] - cbw - cwde - cdq - cmp edx,[edi+4] - jne value_out_of_range - cmp eax,[edi] - jne value_out_of_range - or al,al - jz value_out_of_range - mov al,[esi+11] - cbw - idiv byte [edi] - mov [esi+11],al - div_calculated: - pop esi - jmp calculation_loop - calculate_mod: - push esi - mov esi,ebx - call div_64 - mov [esi],eax - mov [esi+4],edx - pop esi - jmp calculation_loop - calculate_and: - mov eax,[edi] - and [ebx],eax - mov eax,[edi+4] - and [ebx+4],eax - jmp calculation_loop - calculate_or: - mov eax,[edi] - or [ebx],eax - mov eax,[edi+4] - or [ebx+4],eax - jmp calculation_loop - calculate_xor: - mov eax,[edi] - xor [ebx],eax - mov eax,[edi+4] - xor [ebx+4],eax - jmp calculation_loop - shr_negative: - not dword [edi] - not dword [edi+4] - add dword [edi],1 - adc dword [edi+4],0 - calculate_shl: - mov eax,dword [edi+4] - bt eax,31 - jc shl_negative - or eax,eax - jnz zero_value - mov ecx,[edi] - cmp ecx,64 - jae zero_value - cmp ecx,32 - jae shl_high - mov edx,[ebx+4] - mov eax,[ebx] - shld edx,eax,cl - shl eax,cl - mov [ebx],eax - mov [ebx+4],edx - jmp calculation_loop - shl_high: - sub cl,32 - mov eax,[ebx] - shl eax,cl - mov [ebx+4],eax - mov dword [ebx],0 - jmp calculation_loop - shl_negative: - not dword [edi] - not dword [edi+4] - add dword [edi],1 - adc dword [edi+4],0 - calculate_shr: - mov eax,dword [edi+4] - bt eax,31 - jc shr_negative - or eax,eax - jnz zero_value - mov ecx,[edi] - cmp ecx,64 - jae zero_value - cmp ecx,32 - jae shr_high - mov edx,[ebx+4] - mov eax,[ebx] - shrd eax,edx,cl - shr edx,cl - mov [ebx],eax - mov [ebx+4],edx - jmp calculation_loop - shr_high: - sub cl,32 - mov eax,[ebx+4] - shr eax,cl - mov [ebx],eax - mov dword [ebx+4],0 - jmp calculation_loop - zero_value: - mov dword [ebx],0 - mov dword [ebx+4],0 - jmp calculation_loop - calculate_not: - cmp word [edi+8],0 - jne invalid_expression - cmp byte [edi+12],0 - je not_ok - cmp [error_line],0 - jne not_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - not_ok: - cmp [value_size],1 - je not_byte - cmp [value_size],2 - je not_word - cmp [value_size],4 - je not_dword - cmp [value_size],6 - je not_pword - not_qword: - not dword [edi] - not dword [edi+4] - add edi,14h - jmp calculation_loop - not_byte: - cmp dword [edi+4],0 - jne not_qword - cmp word [edi+2],0 - jne not_qword - cmp byte [edi+1],0 - jne not_qword - not byte [edi] - add edi,14h - jmp calculation_loop - not_word: - cmp dword [edi+4],0 - jne not_qword - cmp word [edi+2],0 - jne not_qword - not word [edi] - add edi,14h - jmp calculation_loop - not_dword: - cmp dword [edi+4],0 - jne not_qword - not dword [edi] - add edi,14h - jmp calculation_loop - not_pword: - cmp word [edi+6],0 - jne not_qword - not dword [edi] - not word [edi+4] - add edi,14h - jmp calculation_loop - calculate_neg: - cmp word [edi+8],0 - jne invalid_expression - cmp byte [edi+12],0 - je neg_ok - cmp [error_line],0 - jne neg_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - neg_ok: - mov eax,[edi] - mov edx,[edi+4] - mov dword [edi],0 - mov dword [edi+4],0 - sub [edi],eax - sbb [edi+4],edx - add edi,14h - jmp calculation_loop - calculate_rva: - cmp [output_format],3 - jne invalid_expression - cmp word [edi+8],0 - jne invalid_expression - test [format_flags],8 - jnz pe64_rva - cmp byte [edi+12],2 - je rva_ok - cmp [error_line],0 - jne rva_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - rva_ok: - mov byte [edi+12],0 - mov eax,[code_start] - mov eax,[eax+34h] - cdq - sub [edi],eax - sbb [edi+4],edx - add edi,14h - jmp calculation_loop - pe64_rva: - cmp byte [edi+12],4 - je pe64_rva_ok - cmp [error_line],0 - jne pe64_rva_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - pe64_rva_ok: - mov byte [edi+12],0 - mov eax,[code_start] - mov edx,[eax+34h] - mov eax,[eax+30h] - sub [edi],eax - sbb [edi+4],edx - add edi,14h - jmp calculation_loop - div_64: - xor ebx,ebx - cmp dword [edi],0 - jne divider_ok - cmp dword [edi+4],0 - jne divider_ok - cmp [next_pass_needed],0 - je value_out_of_range - jmp div_done - divider_ok: - bt dword [esi+4],31 - jnc div_first_sign_ok - not dword [esi] - not dword [esi+4] - add dword [esi],1 - adc dword [esi+4],0 - not bx - div_first_sign_ok: - bt dword [edi+4],31 - jnc div_second_sign_ok - not dword [edi] - not dword [edi+4] - add dword [edi],1 - adc dword [edi+4],0 - not bl - div_second_sign_ok: - cmp dword [edi+4],0 - jne div_high - mov ecx,[edi] - mov eax,[esi+4] - xor edx,edx - div ecx - mov [esi+4],eax - mov eax,[esi] - div ecx - mov [esi],eax - mov eax,edx - xor edx,edx - jmp div_done - div_high: - mov eax,[esi+4] - xor edx,edx - div dword [edi+4] - mov ebx,[esi] - mov [esi],eax - mov dword [esi+4],0 - mov ecx,edx - mul dword [edi] - div_high_loop: - cmp ecx,edx - ja div_high_done - jb div_high_large_correction - cmp ebx,eax - jae div_high_done - div_high_correction: - dec dword [esi] - sub eax,[edi] - sbb edx,[edi+4] - jnc div_high_loop - div_high_done: - sub ebx,eax - sbb ecx,edx - mov edx,ecx - mov eax,ebx - ret - div_high_large_correction: - push eax edx - mov eax,edx - sub eax,ecx - xor edx,edx - div dword [edi+4] - shr eax,1 - jz div_high_small_correction - sub [esi],eax - push eax - mul dword [edi+4] - sub dword [esp+4],eax - pop eax - mul dword [edi] - sub dword [esp+4],eax - sbb dword [esp],edx - pop edx eax - jmp div_high_loop - div_high_small_correction: - pop edx eax - jmp div_high_correction - div_done: - or bh,bh - jz remainder_ok - not eax - not edx - add eax,1 - adc edx,0 - remainder_ok: - or bl,bl - jz div_ok - not dword [esi] - not dword [esi+4] - add dword [esi],1 - adc dword [esi+4],0 - div_ok: - ret - convert_fp: - mov word [edi+8],0 - mov byte [edi+12],0 - mov al,[value_size] - cmp al,4 - je convert_fp_dword - cmp al,8 - je convert_fp_qword - jmp invalid_value - convert_fp_dword: - xor eax,eax - cmp word [esi+8],8000h - je fp_dword_store - mov bx,[esi+8] - mov eax,[esi+4] - shl eax,1 - shr eax,9 - jnc fp_dword_ok - inc eax - bt eax,23 - jnc fp_dword_ok - and eax,1 shl 23 - 1 - inc bx - shr eax,1 - fp_dword_ok: - add bx,7Fh - cmp bx,100h - jae value_out_of_range - shl ebx,23 - or eax,ebx - fp_dword_store: - mov bl,[esi+11] - shl ebx,31 - or eax,ebx - mov [edi],eax - xor eax,eax - mov [edi+4],eax - add esi,13 - ret - convert_fp_qword: - xor eax,eax - xor edx,edx - cmp word [esi+8],8000h - je fp_qword_store - mov bx,[esi+8] - mov eax,[esi] - mov edx,[esi+4] - add eax,eax - adc edx,edx - mov ecx,edx - shr edx,12 - shrd eax,ecx,12 - jnc fp_qword_ok - add eax,1 - adc edx,0 - bt edx,20 - jnc fp_qword_ok - and edx,1 shl 20 - 1 - inc bx - shr edx,1 - rcr eax,1 - fp_qword_ok: - add bx,3FFh - cmp bx,800h - jae value_out_of_range - shl ebx,20 - or edx,ebx - fp_qword_store: - mov bl,[esi+11] - shl ebx,31 - or edx,ebx - mov [edi],eax - mov [edi+4],edx - add esi,13 - ret - get_string_value: - lods dword [esi] - mov ecx,eax - cmp ecx,8 - ja value_out_of_range - mov edx,edi - xor eax,eax - stos dword [edi] - stos dword [edi] - mov edi,edx - rep movs byte [edi],[esi] - mov edi,edx - inc esi - mov word [edi+8],0 - mov byte [edi+12],0 - ret - -get_byte_value: - mov [value_size],1 - mov [size_override],-1 - call calculate_expression - mov eax,[edi+16] - mov [symbol_identifier],eax - mov [value_type],0 - cmp word [edi+8],0 - jne invalid_value - cmp byte [edi+12],0 - je check_byte_value - cmp [error_line],0 - jne check_byte_value - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - check_byte_value: - mov eax,[edi] - mov edx,[edi+4] - or edx,edx - jz byte_positive - cmp edx,-1 - jne range_exceeded - cmp eax,-80h - jb range_exceeded - ret - byte_positive: - cmp eax,100h - jae range_exceeded - return_byte_value: - ret - range_exceeded: - xor eax,eax - xor edx,edx - cmp [error_line],0 - jne return_byte_value - mov ecx,[current_line] - mov [error_line],ecx - mov [error],value_out_of_range - ret -get_word_value: - mov [value_size],2 - mov [size_override],-1 - call calculate_expression - mov eax,[edi+16] - mov [symbol_identifier],eax - cmp word [edi+8],0 - jne invalid_value - mov al,[edi+12] - mov [value_type],al - cmp al,2 - jb check_word_value - cmp [error_line],0 - jne check_word_value - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - check_word_value: - mov eax,[edi] - mov edx,[edi+4] - or edx,edx - jz word_positive - cmp edx,-1 - jne range_exceeded - cmp eax,-8000h - jb range_exceeded - ret - word_positive: - cmp eax,10000h - jae range_exceeded - ret -get_dword_value: - mov [value_size],4 - mov [size_override],-1 - call calculate_expression - mov eax,[edi+16] - mov [symbol_identifier],eax - cmp word [edi+8],0 - jne invalid_value - mov al,[edi+12] - mov [value_type],al - cmp al,4 - jb check_dword_value - cmp [error_line],0 - jne check_dword_value - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - check_dword_value: - mov eax,[edi] - mov edx,[edi+4] - or edx,edx - jz dword_positive - cmp edx,-1 - jne range_exceeded - bt eax,31 - jnc range_exceeded - dword_positive: - ret -get_pword_value: - mov [value_size],6 - mov [size_override],-1 - call calculate_expression - mov eax,[edi+16] - mov [symbol_identifier],eax - cmp word [edi+8],0 - jne invalid_value - mov al,[edi+12] - mov [value_type],al - cmp al,4 - jb check_pword_value - cmp [error_line],0 - jne check_pword_value - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_use_of_symbol - check_pword_value: - mov eax,[edi] - mov edx,[edi+4] - cmp edx,10000h - jge range_exceeded - cmp edx,-8000h - jl range_exceeded - ret -get_qword_value: - mov [value_size],8 - mov [size_override],-1 - call calculate_expression - mov eax,[edi+16] - mov [symbol_identifier],eax - cmp word [edi+8],0 - jne invalid_value - mov al,[edi+12] - mov [value_type],al - check_qword_value: - mov eax,[edi] - mov edx,[edi+4] - ret -get_value: - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,'(' - jne invalid_value - mov al,[operand_size] - cmp al,1 - je value_byte - cmp al,2 - je value_word - cmp al,4 - je value_dword - cmp al,6 - je value_pword - cmp al,8 - je value_qword - or al,al - jnz invalid_value - value_qword: - call get_qword_value - ret - value_pword: - call get_pword_value - movzx edx,dx - ret - value_dword: - call get_dword_value - xor edx,edx - ret - value_word: - call get_word_value - xor edx,edx - movzx eax,ax - ret - value_byte: - call get_byte_value - xor edx,edx - movzx eax,al - ret -get_address_value: - mov [address_size],0 - mov [value_size],8 - calculate_address: - cmp byte [esi],'.' - je invalid_address - call calculate_expression - mov eax,[edi+16] - mov [address_symbol],eax - mov al,[edi+12] - test al,1 - jnz invalid_use_of_symbol - mov [value_type],al - or al,al - jz address_symbol_ok - shl al,5 - mov ah,[address_size] - or [address_size],al - shr al,4 - or ah,ah - jz address_symbol_ok - cmp al,ah - jne address_sizes_do_not_agree - address_symbol_ok: - xor bx,bx - xor cl,cl - mov ch,[address_size] - cmp word [edi+8],0 - je check_immediate_address - mov al,[edi+8] - mov dl,[edi+10] - call get_address_register - mov al,[edi+9] - mov dl,[edi+11] - call get_address_register - mov ax,bx - shr ah,4 - shr al,4 - or bh,bh - jz check_address_registers - or bl,bl - jz check_address_registers - cmp al,ah - jne invalid_address - check_address_registers: - or al,ah - cmp al,4 - je sib_allowed - cmp al,8 - je sib_allowed - or cl,cl - jz check_word_value - cmp cl,1 - je check_word_value - jmp invalid_address - get_address_register: - or al,al - jz address_register_ok - cmp dl,1 - jne scaled_register - or bh,bh - jnz scaled_register - mov bh,al - address_register_ok: - ret - scaled_register: - or bl,bl - jnz invalid_address - mov bl,al - mov cl,dl - jmp address_register_ok - sib_allowed: - or bh,bh - jnz check_index_scale - cmp cl,2 - je special_index_scale - cmp cl,3 - je special_index_scale - cmp cl,5 - je special_index_scale - cmp cl,9 - je special_index_scale - check_index_scale: - or cl,cl - jz address_registers_ok - cmp cl,1 - je address_registers_ok - cmp cl,2 - je address_registers_ok - cmp cl,4 - je address_registers_ok - cmp cl,8 - je address_registers_ok - jmp invalid_address - special_index_scale: - mov bh,bl - dec cl - address_registers_ok: - jmp check_dword_value - check_immediate_address: - cmp [code_type],64 - jne check_dword_value - jmp check_qword_value -get_relative_offset: - mov [value_size],4 - mov [size_override],-1 - call calculate_expression - calculate_relative_offset: - push esi - add edi,14h - mov esi,[display_buffer] - sub esi,7 - lea eax,[esi-14h] - cmp eax,edi - jb out_of_memory - mov byte [esi],11h - xor eax,eax - mov dword [esi+1],eax - mov word [esi+5],')' shl 8 + 81h - call calculation_loop - pop esi - cmp word [edi+8],0 - jne invalid_value - mov al,[edi+12] - mov [value_type],al - mov eax,[edi+16] - mov [symbol_identifier],eax - mov eax,[edi] - mov edx,[edi+4] - or edx,edx - jz offset_positive - cmp edx,-1 - jne range_exceeded - bt eax,31 - jnc range_exceeded - ret - offset_positive: - bt eax,31 - jc range_exceeded - ret - -calculate_logical_expression: - call get_logical_value - logical_loop: - cmp byte [esi],'|' - je logical_or - cmp byte [esi],'&' - je logical_and - ret - logical_or: - inc esi - push eax - call get_logical_value - pop ebx - or al,bl - jmp logical_loop - logical_and: - inc esi - push eax - call get_logical_value - pop ebx - and al,bl - jmp logical_loop - -get_logical_value: - xor al,al - check_for_negation: - cmp byte [esi],'~' - jne negation_ok - inc esi - xor al,-1 - jmp check_for_negation - negation_ok: - push eax - mov al,[esi] - cmp al,'{' - je logical_expression - cmp al,88h - je check_for_defined - cmp al,89h - je check_for_used - push esi - cmp al,11h - jne check_for_values - add esi,2 - check_for_values: - xor bl,bl - cmp byte [esi],'(' - jne find_eq_symbol - call skip_symbol - lods byte [esi] - cmp al,'=' - je compare_values - cmp al,'>' - je compare_values - cmp al,'<' - je compare_values - cmp al,0F1h - je compare_values - cmp al,0F2h - je compare_values - cmp al,0F3h - je compare_values - dec esi - find_eq_symbol: - cmp byte [esi],0F0h - je compare_symbols - cmp byte [esi],0F7h - je compare_symbol_types - cmp byte [esi],0F6h - je scan_symbols_list - call check_character - jc logical_number - cmp al,',' - jne next_eq_symbol - mov bl,1 - next_eq_symbol: - call skip_symbol - jmp find_eq_symbol - compare_symbols: - inc esi - pop ebx - mov edx,esi - push edi - mov edi,ebx - mov ecx,esi - dec ecx - sub ecx,edi - repe cmps byte [esi],[edi] - pop edi - je symbols_equal - mov esi,edx - symbols_different: - call check_character - jc return_false - call skip_symbol - jmp symbols_different - symbols_equal: - call check_character - jc return_true - jmp symbols_different - compare_symbol_types: - inc esi - pop ebx - type_comparision: - call check_character - jc types_compared - mov al,[esi] - cmp al,[ebx] - jne symbols_different - cmp al,'(' - jne equal_type - mov al,[esi+1] - mov ah,[ebx+1] - cmp al,ah - je equal_type - or al,al - jz symbols_different - or ah,ah - jz symbols_different - cmp al,'.' - je symbols_different - cmp ah,'.' - je symbols_different - equal_type: - call skip_symbol - xchg esi,ebx - call skip_symbol - xchg esi,ebx - jmp type_comparision - types_compared: - cmp byte [ebx],0F7h - jne return_false - jmp return_true - scan_symbols_list: - or bl,bl - jnz invalid_expression - xor bp,bp - inc esi - lods byte [esi] - cmp al,'<' - jne invalid_expression - pop ebx - mov ecx,esi - sub ecx,2 - sub ecx,ebx - compare_in_list: - mov edx,esi - push ecx edi - mov edi,ebx - repe cmps byte [esi],[edi] - pop edi ecx - jne not_equal_in_list - cmp byte [esi],',' - je skip_rest_of_list - cmp byte [esi],'>' - jne not_equal_in_list - skip_rest_of_list: - mov al,[esi] - or al,al - jz invalid_expression - cmp al,0Fh - je invalid_expression - cmp al,'>' - je list_return_true - call skip_symbol - jmp skip_rest_of_list - list_return_true: - inc esi - jmp return_true - not_equal_in_list: - mov esi,edx - skip_list_item: - mov al,[esi] - or al,al - jz invalid_expression - cmp al,0Fh - je invalid_expression - cmp al,'<' - je invalid_expression - cmp al,'>' - je list_return_false - cmp al,',' - je next_in_list - call skip_symbol - jmp skip_list_item - next_in_list: - inc esi - jmp compare_in_list - list_return_false: - inc esi - jmp return_false - check_character: - mov al,[esi] - or al,al - jz stop - cmp al,0Fh - je stop - cmp al,'}' - je stop - cmp al,'|' - je stop - cmp al,'&' - je stop - clc - ret - stop: - stc - ret - compare_values: - pop esi - call get_value - mov bl,[value_type] - push eax edx ebx - lods byte [esi] - mov [compare_type],al - call get_value - pop ebx - cmp [next_pass_needed],0 - jne values_ok - cmp bl,[value_type] - jne invalid_use_of_symbol - values_ok: - pop ecx ebx - cmp [compare_type],'=' - je check_equal - cmp [compare_type],'>' - je check_greater - cmp [compare_type],'<' - je check_less - cmp [compare_type],0F1h - je check_not_equal - cmp [compare_type],0F2h - je check_not_less - cmp [compare_type],0F3h - je check_not_greater - jmp invalid_expression - check_equal: - cmp eax,ebx - jne return_false - cmp edx,ecx - jne return_false - jmp return_true - check_greater: - cmp edx,ecx - jl return_true - jg return_false - cmp eax,ebx - jb return_true - jae return_false - check_less: - cmp edx,ecx - jl return_false - jg return_true - cmp eax,ebx - jbe return_false - ja return_true - check_not_less: - cmp edx,ecx - jl return_true - jg return_false - cmp eax,ebx - jbe return_true - ja return_false - check_not_greater: - cmp edx,ecx - jl return_false - jg return_true - cmp eax,ebx - jb return_false - jae return_true - check_not_equal: - cmp eax,ebx - jne return_true - cmp edx,ecx - jne return_true - jmp return_false - logical_number: - pop esi - call get_value - cmp [value_type],0 - jne invalid_expression - or eax,edx - jnz return_true - jmp return_false - check_for_defined: - or bl,-1 - lods word [esi] - cmp ah,'(' - jne invalid_expression - check_expression: - lods byte [esi] - or al,al - jz defined_string - cmp al,'.' - je defined_fp_value - cmp al,')' - je expression_checked - cmp al,0Fh - je check_expression - cmp al,10h - je defined_register - cmp al,11h - je check_if_symbol_defined - cmp al,80h - jae check_expression - movzx eax,al - add esi,eax - jmp check_expression - defined_register: - inc esi - jmp check_expression - defined_fp_value: - add esi,12 - jmp expression_checked - defined_string: - lods dword [esi] - add esi,eax - inc esi - jmp expression_checked - check_if_symbol_defined: - lods dword [esi] - cmp eax,-1 - je invalid_expression - cmp eax,0Fh - jb check_expression - je reserved_word_used_as_symbol - test byte [eax+8],4 - jnz no_prediction - test byte [eax+8],1 - jz symbol_predicted_undefined - mov cx,[current_pass] - sub cx,[eax+16] - jz check_expression - cmp cx,1 - ja symbol_predicted_undefined - or byte [eax+8],40h+80h - jmp check_expression - no_prediction: - test byte [eax+8],1 - jz symbol_undefined - mov cx,[current_pass] - sub cx,[eax+16] - jz check_expression - jmp symbol_undefined - symbol_predicted_undefined: - or byte [eax+8],40h - and byte [eax+8],not 80h - symbol_undefined: - xor bl,bl - jmp check_expression - expression_checked: - mov al,bl - jmp logical_value_ok - check_for_used: - lods word [esi] - cmp ah,2 - jne invalid_expression - lods dword [esi] - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - inc esi - test byte [eax+8],8 - jz not_used - mov cx,[current_pass] - sub cx,[eax+18] - jz return_true - cmp cx,1 - ja not_used - or byte [eax+8],10h+20h - jmp return_true - not_used: - or byte [eax+8],10h - and byte [eax+8],not 20h - return_false: - xor al,al - jmp logical_value_ok - return_true: - or al,-1 - jmp logical_value_ok - logical_expression: - inc esi - call calculate_logical_expression - push eax - lods byte [esi] - cmp al,'}' - jne invalid_expression - pop eax - logical_value_ok: - pop ebx - xor al,bl - ret diff --git a/programs/fasm/trunk/formats.inc b/programs/fasm/trunk/formats.inc deleted file mode 100644 index 1bed170c48..0000000000 --- a/programs/fasm/trunk/formats.inc +++ /dev/null @@ -1,3802 +0,0 @@ - -; flat assembler core -; Copyright (c) 1999-2005, Tomasz Grysztar. -; All rights reserved. - -formatter: - cmp [output_file],0 - jne output_path_ok - push edi - mov esi,[input_file] - mov edi,[free_additional_memory] - copy_output_path: - lods byte [esi] - cmp edi,[structures_buffer] - jae out_of_memory - stos byte [edi] - or al,al - jnz copy_output_path - dec edi - mov eax,edi - find_extension: - dec eax - cmp eax,[free_additional_memory] - jb extension_found - cmp byte [eax],'\' - je extension_found - cmp byte [eax],'/' - je extension_found - cmp byte [eax],'.' - jne find_extension - mov edi,eax - extension_found: - lea eax,[edi+9] - cmp eax,[structures_buffer] - jae out_of_memory - cmp [output_format],2 - je exe_extension - jb bin_extension - cmp [output_format],4 - je obj_extension - cmp [output_format],5 - je o_extension - cmp [output_format],3 - jne no_extension - cmp [subsystem],1 - je sys_extension - bt [format_flags],8 - jnc exe_extension - mov eax,'.dll' - jmp make_extension - sys_extension: - mov eax,'.sys' - jmp make_extension - bin_extension: - mov eax,'.bin' - bt [format_flags],0 - jnc make_extension - mov eax,'.com' - jmp make_extension - obj_extension: - mov eax,'.obj' - jmp make_extension - o_extension: - mov eax,'.o' - bt [format_flags],0 - jnc make_extension - no_extension: - xor eax,eax - jmp make_extension - exe_extension: - mov eax,'.exe' - make_extension: - xchg eax,[edi] - scas dword [edi] - mov byte [edi],0 - scas byte [edi] - mov esi,edi - stos dword [edi] - sub edi,9 - xor eax,eax - mov ebx,characters - adapt_case: - mov al,[esi] - or al,al - jz adapt_next - xlat byte [ebx] - cmp al,[esi] - je adapt_ok - sub byte [edi],20h - adapt_ok: - inc esi - adapt_next: - inc edi - cmp byte [edi],0 - jne adapt_case - mov esi,edi - lea ecx,[esi+1] - sub ecx,[free_additional_memory] - mov edi,[structures_buffer] - dec edi - std - rep movs byte [edi],[esi] - cld - inc edi - mov [structures_buffer],edi - mov [output_file],edi - pop edi - output_path_ok: - cmp [output_format],4 - je coff_formatter - cmp [output_format],5 - jne common_formatter - bt [format_flags],0 - jnc elf_formatter - common_formatter: - mov eax,edi - sub eax,[code_start] - mov [real_code_size],eax - cmp edi,[undefined_data_end] - jne calculate_code_size - mov edi,[undefined_data_start] - calculate_code_size: - sub edi,[code_start] - mov [code_size],edi - mov [written_size],0 - mov edx,[output_file] - call create - jc write_failed - cmp [output_format],3 - jne stub_written - mov edx,[code_start] - mov ecx,[stub_size] - sub edx,ecx - add [written_size],ecx - call write - stub_written: - cmp [output_format],2 - jne write_output - call write_mz_header - write_output: - call write_code - output_written: - call close - ret - write_code: - mov eax,[written_size] - mov [headers_size],eax - mov edx,[code_start] - mov ecx,[code_size] - add [written_size],ecx - call write - jc write_failed - ret -format_directive: - cmp edi,[code_start] - jne unexpected_instruction - cmp [virtual_data],0 - jne unexpected_instruction - cmp [output_format],0 - jne unexpected_instruction - lods byte [esi] - cmp al,17h - je format_prefix - cmp al,18h - jne invalid_argument - lods byte [esi] - select_format: - mov dl,al - shr al,4 - mov [output_format],al - and edx,0Fh - or [format_flags],edx - cmp al,2 - je format_mz - cmp al,3 - je format_pe - cmp al,4 - je format_coff - cmp al,5 - je format_elf - jmp instruction_assembled - format_prefix: - lods byte [esi] - mov ah,al - lods byte [esi] - cmp al,18h - jne invalid_argument - lods byte [esi] - mov edx,eax - shr dl,4 - shr dh,4 - cmp dl,dh - jne invalid_argument - or al,ah - jmp select_format -entry_directive: - bts [format_flags],10h - jc setting_already_specified - mov al,[output_format] - cmp al,2 - je mz_entry - cmp al,3 - je pe_entry - cmp al,5 - jne illegal_instruction - bt [format_flags],0 - jc elf_entry - jmp illegal_instruction -stack_directive: - bts [format_flags],11h - jc setting_already_specified - mov al,[output_format] - cmp al,2 - je mz_stack - cmp al,3 - je pe_stack - jmp illegal_instruction -heap_directive: - bts [format_flags],12h - jc setting_already_specified - mov al,[output_format] - cmp al,2 - je mz_heap - cmp al,3 - je pe_heap - jmp illegal_instruction -section_directive: - cmp [virtual_data],0 - jne illegal_instruction - mov al,[output_format] - cmp al,3 - je pe_section - cmp al,4 - je coff_section - cmp al,5 - je elf_section - jmp illegal_instruction -public_directive: - mov al,[output_format] - cmp al,4 - je public_allowed - cmp al,5 - jne illegal_instruction - bt [format_flags],0 - jc illegal_instruction - public_allowed: - lods byte [esi] - cmp al,2 - jne invalid_argument - lods dword [esi] - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - mov dx,[current_pass] - mov [eax+18],dx - or byte [eax+8],8 - inc esi - mov ebx,[free_additional_memory] - lea edx,[ebx+10h] - cmp edx,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],edx - mov [ebx+8],eax - mov eax,[current_line] - mov [ebx+0Ch],eax - lods byte [esi] - cmp al,86h - jne invalid_argument - lods word [esi] - cmp ax,'(' - jne invalid_argument - mov [ebx+4],esi - lods dword [esi] - lea esi,[esi+eax+1] - mov byte [ebx],80h - jmp instruction_assembled -extrn_directive: - mov al,[output_format] - cmp al,4 - je extrn_allowed - cmp al,5 - jne illegal_instruction - bt [format_flags],0 - jc illegal_instruction - extrn_allowed: - lods word [esi] - cmp ax,'(' - jne invalid_argument - mov ebx,esi - lods dword [esi] - lea esi,[esi+eax+1] - mov edx,[free_additional_memory] - lea eax,[edx+0Ch] - cmp eax,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],eax - mov byte [edx],81h - mov [edx+4],ebx - lods byte [esi] - cmp al,86h - jne invalid_argument - lods byte [esi] - cmp al,2 - jne invalid_argument - lods dword [esi] - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - inc esi - mov ebx,eax - xor ah,ah - lods byte [esi] - cmp al,':' - je get_extrn_size - dec esi - cmp al,11h - jne extrn_size_ok - get_extrn_size: - lods word [esi] - cmp al,11h - jne invalid_argument - extrn_size_ok: - mov [address_symbol],edx - movzx ecx,ah - mov [edx+8],ecx - xor eax,eax - xor edx,edx - xor ebp,ebp - mov ch,2 - test [format_flags],8 - jz make_free_label - mov ch,4 - jmp make_free_label -mark_relocation: - cmp [value_type],0 - je relocation_ok - cmp [virtual_data],0 - jne relocation_ok - cmp [output_format],2 - je mark_mz_relocation - cmp [output_format],3 - je mark_pe_relocation - cmp [output_format],4 - je mark_coff_relocation - cmp [output_format],5 - je mark_elf_relocation - relocation_ok: - ret -close_pass: - mov al,[output_format] - cmp al,3 - je close_pe - cmp al,4 - je close_coff - cmp al,5 - je close_elf - ret - -format_mz: - mov edx,[additional_memory] - push edi - mov edi,edx - mov ecx,1Ch shr 2 - xor eax,eax - rep stos dword [edi] - mov [free_additional_memory],edi - pop edi - mov word [edx+0Ch],0FFFFh - mov word [edx+10h],1000h - mov [code_type],16 - jmp instruction_assembled -mark_mz_relocation: - push eax ebx - inc [number_of_relocations] - mov ebx,[free_additional_memory] - mov eax,edi - sub eax,[code_start] - mov [ebx],ax - shr eax,16 - shl ax,12 - mov [ebx+2],ax - cmp word [ebx],0FFFFh - jne mz_relocation_ok - inc word [ebx+2] - sub word [ebx],10h - mz_relocation_ok: - add ebx,4 - cmp ebx,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],ebx - pop ebx eax - ret -segment_directive: - cmp [output_format],2 - jne illegal_instruction - cmp [virtual_data],0 - jne illegal_instruction - lods byte [esi] - cmp al,2 - jne invalid_argument - lods dword [esi] - cmp eax,0Fh - jb invalid_use_of_symbol - je reserved_word_used_as_symbol - inc esi - mov ebx,eax - mov eax,edi - sub eax,[code_start] - mov ecx,0Fh - add eax,0Fh - and eax,1111b - sub ecx,eax - mov edx,edi - xor al,al - rep stos byte [edi] - mov dword [org_origin],edi - mov dword [org_origin+4],0 - mov [org_registers],0 - mov [org_start],edi - mov eax,edx - call undefined_data - mov eax,edi - sub eax,[code_start] - shr eax,4 - cmp eax,10000h - jae value_out_of_range - mov edx,eax - mov al,16 - cmp byte [esi],13h - jne segment_type_ok - inc esi - lods byte [esi] - segment_type_ok: - mov [code_type],al - mov eax,edx - mov cx,0100h - xor edx,edx - xor ebp,ebp - mov [address_symbol],edx - jmp make_free_label -mz_entry: - lods byte [esi] - cmp al,'(' - jne invalid_argument - call get_word_value - cmp [value_type],1 - je initial_cs_ok - cmp [error_line],0 - jne initial_cs_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_address - initial_cs_ok: - mov edx,[additional_memory] - mov [edx+16h],ax - lods byte [esi] - cmp al,':' - jne invalid_argument - lods byte [esi] - cmp al,'(' - jne invalid_argument - ja invalid_address - call get_word_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[additional_memory] - mov [edx+14h],ax - jmp instruction_assembled -mz_stack: - lods byte [esi] - cmp al,'(' - jne invalid_argument - call get_word_value - cmp byte [esi],':' - je stack_pointer - cmp ax,10h - jb invalid_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[additional_memory] - mov [edx+10h],ax - jmp instruction_assembled - stack_pointer: - cmp [value_type],1 - je initial_ss_ok - cmp [error_line],0 - jne initial_ss_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_address - initial_ss_ok: - mov edx,[additional_memory] - mov [edx+0Eh],ax - lods byte [esi] - cmp al,':' - jne invalid_argument - lods byte [esi] - cmp al,'(' - jne invalid_argument - call get_word_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[additional_memory] - mov [edx+10h],ax - bts [format_flags],4 - jmp instruction_assembled -mz_heap: - cmp [output_format],2 - jne illegal_instruction - lods byte [esi] - call get_size_operator - cmp ah,1 - je invalid_value - cmp ah,2 - ja invalid_value - cmp al,'(' - jne invalid_argument - call get_word_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[additional_memory] - mov [edx+0Ch],ax - jmp instruction_assembled -write_mz_header: - mov edx,[additional_memory] - bt [format_flags],4 - jc mz_stack_ok - mov eax,[real_code_size] - dec eax - shr eax,4 - inc eax - mov [edx+0Eh],ax - shl eax,4 - movzx ecx,word [edx+10h] - add eax,ecx - mov [real_code_size],eax - mz_stack_ok: - mov edi,[free_additional_memory] - mov eax,[number_of_relocations] - shl eax,2 - add eax,1Ch - sub edi,eax - xchg edi,[free_additional_memory] - mov ecx,0Fh - add eax,0Fh - and eax,1111b - sub ecx,eax - xor al,al - rep stos byte [edi] - sub edi,[free_additional_memory] - mov ecx,edi - shr edi,4 - mov word [edx],'MZ' ; signature - mov [edx+8],di ; header size in paragraphs - mov eax,[number_of_relocations] - mov [edx+6],ax ; number of relocation entries - mov eax,[code_size] - add eax,ecx - mov esi,eax - shr esi,9 - and eax,1FFh - inc si - or ax,ax - jnz mz_size_ok - mov ax,200h - dec si - mz_size_ok: - mov [edx+2],ax ; number of bytes in last page - mov [edx+4],si ; number of pages - mov eax,[real_code_size] - dec eax - shr eax,4 - inc eax - mov esi,[code_size] - dec esi - shr esi,4 - inc esi - sub eax,esi - mov [edx+0Ah],ax ; minimum memory in addition to code - add [edx+0Ch],ax ; maximum memory in addition to code - salc - mov ah,al - or [edx+0Ch],ax - mov word [edx+18h],1Ch ; offset of relocation table - add [written_size],ecx - call write - jc write_failed - ret - -make_stub: - mov [stub_file],edx - or edx,edx - jnz stub_from_file - push esi - mov edx,edi - xor eax,eax - mov ecx,20h - rep stos dword [edi] - mov eax,40h+default_stub_end-default_stub - mov cx,100h+default_stub_end-default_stub - mov word [edx],'MZ' - mov word [edx+4],1 - mov word [edx+2],ax - mov word [edx+8],4 - mov word [edx+0Ah],10h - mov word [edx+0Ch],0FFFFh - mov word [edx+10h],cx - mov word [edx+3Ch],ax - mov word [edx+18h],40h - lea edi,[edx+40h] - mov esi,default_stub - mov ecx,default_stub_end-default_stub - rep movs byte [edi],[esi] - pop esi - jmp stub_ok - default_stub: - use16 - push cs - pop ds - mov dx,stub_message-default_stub - mov ah,9 - int 21h - mov ax,4C01h - int 21h - stub_message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h - rq 1 - default_stub_end: - use32 - stub_from_file: - push esi - mov esi,edx - call open_binary_file - mov edx,edi - mov ecx,1Ch - mov esi,edx - call read - jc binary_stub - cmp word [esi],'MZ' - jne binary_stub - add edi,1Ch - movzx ecx,word [esi+6] - dec ecx - sar ecx,3 - inc ecx - shl ecx,2 - add ecx,(40h-1Ch) shr 2 - lea eax,[edi+ecx*4] - cmp edi,[display_buffer] - jae out_of_memory - xor eax,eax - rep stos dword [edi] - mov edx,40h - xchg dx,[esi+18h] - xor al,al - call lseek - movzx ecx,word [esi+6] - shl ecx,2 - lea edx,[esi+40h] - call read - mov edx,edi - sub edx,esi - shr edx,4 - xchg dx,[esi+8] - shl edx,4 - xor al,al - call lseek - movzx ecx,word [esi+4] - dec ecx - shl ecx,9 - movzx edx,word [esi+2] - add ecx,edx - mov edx,edi - sub ecx,eax - je read_stub_code - jb stub_code_ok - push ecx - dec ecx - shr ecx,3 - inc ecx - shl ecx,1 - lea eax,[edi+ecx*4] - cmp eax,[display_buffer] - jae out_of_memory - xor eax,eax - rep stos dword [edi] - pop ecx - read_stub_code: - call read - stub_code_ok: - call close - mov edx,edi - sub edx,esi - mov ax,dx - and ax,1FFh - mov [esi+2],ax - dec edx - shr edx,9 - inc edx - mov [esi+4],dx - mov eax,edi - sub eax,esi - mov [esi+3Ch],eax - pop esi - stub_ok: - ret - binary_stub: - mov esi,edi - mov ecx,40h shr 2 - xor eax,eax - rep stos dword [edi] - mov al,2 - xor edx,edx - call lseek - push eax - xor al,al - xor edx,edx - call lseek - mov ecx,[esp] - add ecx,40h+111b - and ecx,not 111b - mov ax,cx - and ax,1FFh - mov [esi+2],ax - lea eax,[ecx+1FFh] - and eax,not 1FFh - mov [esi+4],ax - mov [esi+3Ch],ecx - sub ecx,40h - mov eax,10000h - sub eax,ecx - jbe binary_heap_ok - shr eax,4 - mov [esi+0Ah],ax - binary_heap_ok: - mov word [esi],'MZ' - mov word [esi+8],4 - mov ax,0FFFFh - mov [esi+0Ch],ax - dec ax - mov [esi+10h],ax - sub ax,0Eh - mov [esi+0Eh],ax - mov [esi+16h],ax - mov word [esi+14h],100h - mov word [esi+18h],40h - mov eax,[display_buffer] - sub eax,ecx - cmp edi,eax - jae out_of_memory - mov edx,edi - shr ecx,2 - xor eax,eax - rep stos dword [edi] - pop ecx - call read - call close - pop esi - ret - -format_pe: - xor edx,edx - mov [machine],14Ch - mov [subsystem],3 - mov [subsystem_version],3 + 10 shl 16 - mov [image_base],400000h - test [format_flags],8 - jz pe_settings - mov [machine],8664h - mov [subsystem_version],5 + 0 shl 16 - mov [image_base_high],0 - pe_settings: - cmp byte [esi],84h - je get_stub_name - cmp byte [esi],80h - je get_pe_base - cmp byte [esi],1Bh - jne pe_settings_ok - lods byte [esi] - lods byte [esi] - test al,80h+40h - jz subsystem_setting - cmp al,80h - je dll_flag - cmp al,81h - je wdm_flag - jmp pe_settings - dll_flag: - bts [format_flags],8 - jc setting_already_specified - jmp pe_settings - wdm_flag: - bts [format_flags],9 - jc setting_already_specified - jmp pe_settings - subsystem_setting: - bts [format_flags],7 - jc setting_already_specified - and ax,3Fh - mov [subsystem],ax - cmp byte [esi],'(' - jne pe_settings - inc esi - cmp byte [esi],'.' - jne invalid_value - inc esi - push edx - cmp byte [esi+11],0 - jne invalid_value - cmp byte [esi+10],2 - ja invalid_value - mov dx,[esi+8] - cmp dx,8000h - je zero_version - mov eax,[esi+4] - cmp dx,7 - jg invalid_value - mov cx,7 - sub cx,dx - mov eax,[esi+4] - shr eax,cl - mov ebx,eax - shr ebx,24 - cmp bl,100 - jae invalid_value - and eax,0FFFFFFh - mov ecx,100 - mul ecx - shrd eax,edx,24 - jnc version_value_ok - inc eax - version_value_ok: - shl eax,16 - mov ax,bx - jmp subsystem_version_ok - zero_version: - xor eax,eax - subsystem_version_ok: - pop edx - add esi,13 - mov [subsystem_version],eax - jmp pe_settings - get_pe_base: - bts [format_flags],10 - jc setting_already_specified - lods word [esi] - cmp ah,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - push edx edi - add edi,[stub_size] - test [format_flags],8 - jnz get_pe64_base - call get_dword_value - mov [image_base],eax - jmp pe_base_ok - get_pe64_base: - call get_qword_value - mov [image_base],eax - mov [image_base_high],edx - pe_base_ok: - pop edi edx - cmp [value_type],0 - jne invalid_use_of_symbol - cmp byte [esi],84h - jne pe_settings_ok - get_stub_name: - lods byte [esi] - lods word [esi] - cmp ax,'(' - jne invalid_argument - lods dword [esi] - mov edx,esi - add esi,eax - inc esi - pe_settings_ok: - mov ebp,[stub_size] - or ebp,ebp - jz make_pe_stub - cmp edx,[stub_file] - je pe_stub_ok - sub edi,[stub_size] - mov [code_start],edi - make_pe_stub: - call make_stub - mov eax,edi - sub eax,[code_start] - mov [stub_size],eax - mov [code_start],edi - mov ebp,eax - pe_stub_ok: - mov edx,edi - mov ecx,18h+0E0h - test [format_flags],8 - jz zero_pe_header - add ecx,10h - zero_pe_header: - add ebp,ecx - shr ecx,2 - xor eax,eax - rep stos dword [edi] - mov word [edx],'PE' ; signature - mov ax,[machine] - mov word [edx+4],ax - mov dword [edx+38h],1000h ; section alignment - mov dword [edx+3Ch],200h ; file alignment - mov word [edx+40h],1 ; OS version - mov eax,[subsystem_version] - mov [edx+48h],eax - mov ax,[subsystem] - mov [edx+5Ch],ax - cmp ax,1 - jne pe_alignment_ok - mov eax,20h - mov dword [edx+38h],eax - mov dword [edx+3Ch],eax - pe_alignment_ok: - mov word [edx+1Ah],VERSION_MAJOR + VERSION_MINOR shl 8 - test [format_flags],8 - jnz init_pe64_specific - mov dword [edx+14h],0E0h ; size of optional header - mov dword [edx+16h],10B010Eh; flags and magic value - mov eax,[image_base] - mov dword [edx+34h],eax - mov dword [edx+60h],1000h ; stack reserve - mov dword [edx+64h],1000h ; stack commit - mov dword [edx+68h],10000h ; heap reserve - mov dword [edx+6Ch],0 ; heap commit - mov dword [edx+74h],16 ; number of directories - jmp pe_header_ok - init_pe64_specific: - mov dword [edx+14h],0F0h ; size of optional header - mov dword [edx+16h],20B002Eh; flags and magic value - mov eax,[image_base] - mov dword [edx+30h],eax - mov eax,[image_base_high] - mov dword [edx+34h],eax - mov dword [edx+60h],1000h ; stack reserve - mov dword [edx+68h],1000h ; stack commit - mov dword [edx+70h],10000h ; heap reserve - mov dword [edx+78h],0 ; heap commit - mov dword [edx+84h],16 ; number of directories - pe_header_ok: - bsf ecx,[edx+3Ch] - imul ebx,[number_of_sections],28h - or ebx,ebx - jnz reserve_space_for_section_headers - mov ebx,28h - reserve_space_for_section_headers: - add ebx,ebp - dec ebx - shr ebx,cl - inc ebx - shl ebx,cl - sub ebx,ebp - mov ecx,ebx - mov eax,[display_buffer] - sub eax,ecx - cmp edi,eax - jae out_of_memory - shr ecx,2 - xor eax,eax - rep stos dword [edi] - mov eax,edi - sub eax,[code_start] - add eax,[stub_size] - mov [edx+54h],eax ; size of headers - mov ecx,[edx+38h] - dec ecx - add eax,ecx - not ecx - and eax,ecx - bt [format_flags],8 - jc pe_entry_init_ok - mov [edx+28h],eax ; entry point rva - pe_entry_init_ok: - mov [number_of_sections],0 - movzx ebx,word [edx+14h] - lea ebx,[edx+18h+ebx] - mov [current_section],ebx - mov dword [ebx],'.fla' - mov dword [ebx+4],'t' - mov [ebx+14h],edi - mov [ebx+0Ch],eax - mov dword [ebx+24h],0E0000060h - xor ecx,ecx - not eax - not ecx - add eax,1 - adc ecx,0 - add eax,edi - adc ecx,0 - test [format_flags],8 - jnz pe64_org - sub eax,[edx+34h] - sbb ecx,0 - mov [labels_type],2 - mov [code_type],32 - jmp pe_org_ok - pe64_org: - sub eax,[edx+30h] - sbb ecx,[edx+34h] - mov [labels_type],4 - mov [code_type],64 - pe_org_ok: - mov dword [org_origin],eax - mov dword [org_origin+4],ecx - mov [org_registers],0 - mov [org_start],edi - bt [format_flags],8 - jnc dll_flag_ok - or dword [edx+16h],2000h - dll_flag_ok: - bt [format_flags],9 - jnc wdm_flag_ok - or word [edx+5Eh],2000h - wdm_flag_ok: - jmp instruction_assembled -pe_section: - call close_pe_section - bts [format_flags],5 - lea ecx,[ebx+28h] - add edx,[edx+54h] - sub edx,[stub_size] - cmp ecx,edx - jbe new_section - lea ebx,[edx-28h] - or [next_pass_needed],-1 - push edi - mov edi,ebx - mov ecx,28h shr 4 - xor eax,eax - rep stos dword [edi] - pop edi - new_section: - mov [ebx+0Ch],eax - lods word [esi] - cmp ax,'(' - jne invalid_argument - lea edx,[esi+4] - mov ecx,[esi] - lea esi,[esi+4+ecx+1] - cmp ecx,8 - ja name_too_long - xor eax,eax - mov [ebx],eax - mov [ebx+4],eax - push esi edi - mov edi,ebx - mov esi,edx - rep movs byte [edi],[esi] - pop edi esi - mov dword [ebx+24h],0 - mov [ebx+14h],edi - mov edx,[code_start] - mov eax,edi - xor ecx,ecx - sub eax,[ebx+0Ch] - sbb ecx,0 - test [format_flags],8 - jnz pe64_section_org - sub eax,[edx+34h] - sbb ecx,0 - mov [labels_type],2 - mov [code_type],32 - jmp pe_section_org_ok - pe64_section_org: - sub eax,[edx+30h] - sbb ecx,[edx+34h] - mov [labels_type],4 - mov [code_type],64 - pe_section_org_ok: - mov dword [org_origin],eax - mov dword [org_origin+4],ecx - mov [org_registers],0 - mov [org_start],edi - get_section_flags: - lods byte [esi] - cmp al,1Ah - je set_directory - cmp al,19h - je section_flag - dec esi - jmp instruction_assembled - set_directory: - movzx eax,byte [esi] - inc esi - mov ecx,ebx - test [format_flags],8 - jnz pe64_directory - xchg ecx,[edx+78h+eax*8] - mov dword [edx+78h+eax*8+4],-1 - jmp pe_directory_set - pe64_directory: - xchg ecx,[edx+88h+eax*8] - mov dword [edx+88h+eax*8+4],-1 - pe_directory_set: - or ecx,ecx - jnz data_already_defined - push ebx edx - call generate_pe_data - pop edx ebx - jmp get_section_flags - section_flag: - lods byte [esi] - mov cl,al - mov eax,1 - shl eax,cl - test dword [ebx+24h],eax - jnz setting_already_specified - or dword [ebx+24h],eax - jmp get_section_flags - close_pe_section: - mov ebx,[current_section] - mov edx,[code_start] - mov eax,edi - sub eax,[ebx+14h] - jnz finish_section - bt [format_flags],5 - jc finish_section - mov eax,[ebx+0Ch] - ret - finish_section: - mov [ebx+8],eax - cmp edi,[undefined_data_end] - jne align_section - cmp dword [edx+38h],1000h - jb align_section - mov edi,[undefined_data_start] - align_section: - mov [undefined_data_end],0 - mov ebp,edi - sub ebp,[ebx+14h] - mov ecx,[edx+3Ch] - dec ecx - lea eax,[ebp+ecx] - not ecx - and eax,ecx - mov [ebx+10h],eax - sub eax,ebp - mov ecx,eax - xor al,al - rep stos byte [edi] - mov eax,[code_start] - sub eax,[stub_size] - sub [ebx+14h],eax - mov eax,[ebx+8] - or eax,eax - jz udata_ok - cmp dword [ebx+10h],0 - jne udata_ok - or byte [ebx+24h],80h - udata_ok: - mov ecx,[edx+38h] - dec ecx - add eax,ecx - not ecx - and eax,ecx - add eax,[ebx+0Ch] - add ebx,28h - mov [current_section],ebx - inc word [number_of_sections] - jz format_limitations_exceeded - ret -data_directive: - cmp [output_format],3 - jne illegal_instruction - lods byte [esi] - cmp al,1Ah - je predefined_data_type - cmp al,'(' - jne invalid_argument - call get_byte_value - cmp al,16 - jb data_type_ok - jmp invalid_value - predefined_data_type: - movzx eax,byte [esi] - inc esi - data_type_ok: - mov ebx,[current_section] - mov ecx,edi - sub ecx,[ebx+14h] - add ecx,[ebx+0Ch] - mov edx,[code_start] - test [format_flags],8 - jnz pe64_data - xchg ecx,[edx+78h+eax*8] - jmp init_pe_data - pe64_data: - xchg ecx,[edx+88h+eax*8] - init_pe_data: - or ecx,ecx - jnz data_already_defined - call allocate_structure_data - mov word [ebx],data_directive-assembler - mov [ebx+2],al - mov edx,[current_line] - mov [ebx+4],edx - call generate_pe_data - jmp instruction_assembled - end_data: - cmp [output_format],3 - jne illegal_instruction - call find_structure_data - jc unexpected_instruction - movzx eax,byte [ebx+2] - mov edx,[current_section] - mov ecx,edi - sub ecx,[edx+14h] - add ecx,[edx+0Ch] - mov edx,[code_start] - test [format_flags],8 - jnz end_pe64_data - sub ecx,[edx+78h+eax*8] - mov [edx+78h+eax*8+4],ecx - jmp remove_structure_data - end_pe64_data: - sub ecx,[edx+88h+eax*8] - mov [edx+88h+eax*8+4],ecx - jmp remove_structure_data -pe_entry: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - test [format_flags],8 - jnz pe64_entry - call get_dword_value - cmp [value_type],2 - je pe_entry_ok - cmp [error_line],0 - jne pe_entry_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_address - pe_entry_ok: - mov edx,[code_start] - sub eax,[edx+34h] - mov [edx+28h],eax - jmp instruction_assembled - pe64_entry: - call get_qword_value - cmp [value_type],4 - je pe64_entry_ok - cmp [error_line],0 - jne pe64_entry_ok - mov eax,[current_line] - mov [error_line],eax - mov [error],invalid_address - pe64_entry_ok: - mov ecx,[code_start] - sub eax,[ecx+30h] - sbb edx,[ecx+34h] - jnz value_out_of_range - mov [ecx+28h],eax - jmp instruction_assembled -pe_stack: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - test [format_flags],8 - jnz pe64_stack - call get_dword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[code_start] - mov [edx+60h],eax - cmp byte [esi],',' - jne default_stack_commit - lods byte [esi] - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[code_start] - mov [edx+64h],eax - cmp eax,[edx+60h] - ja value_out_of_range - jmp instruction_assembled - default_stack_commit: - mov dword [edx+64h],1000h - mov eax,[edx+60h] - cmp eax,1000h - ja instruction_assembled - mov dword [edx+64h],eax - jmp instruction_assembled - pe64_stack: - call get_qword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov ecx,[code_start] - mov [ecx+60h],eax - mov [ecx+64h],edx - cmp byte [esi],',' - jne default_pe64_stack_commit - lods byte [esi] - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_qword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov ecx,[code_start] - mov [ecx+68h],eax - mov [ecx+6Ch],edx - cmp edx,[ecx+64h] - ja value_out_of_range - jb instruction_assembled - cmp eax,[edx+60h] - ja value_out_of_range - jmp instruction_assembled - default_pe64_stack_commit: - mov dword [edx+68h],1000h - cmp dword [edx+64h],0 - jne instruction_assembled - mov eax,[edx+60h] - cmp eax,1000h - ja instruction_assembled - mov dword [edx+68h],eax - jmp instruction_assembled -pe_heap: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - test [format_flags],8 - jnz pe64_heap - call get_dword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[code_start] - mov [edx+68h],eax - cmp byte [esi],',' - jne instruction_assembled - lods byte [esi] - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_dword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[code_start] - mov [edx+6Ch],eax - cmp eax,[edx+68h] - ja value_out_of_range - jmp instruction_assembled - pe64_heap: - call get_qword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov ecx,[code_start] - mov [ecx+70h],eax - mov [ecx+74h],edx - cmp byte [esi],',' - jne instruction_assembled - lods byte [esi] - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - call get_qword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov ecx,[code_start] - mov [ecx+78h],eax - mov [ecx+7Ch],edx - cmp edx,[ecx+74h] - ja value_out_of_range - jb instruction_assembled - cmp eax,[edx+70h] - ja value_out_of_range - jmp instruction_assembled -mark_pe_relocation: - push eax ebx - mov ebx,[current_section] - mov eax,edi - sub eax,[ebx+14h] - add eax,[ebx+0Ch] - mov ebx,[free_additional_memory] - inc [number_of_relocations] - jz invalid_use_of_symbol - mov [ebx],eax - add ebx,4 - cmp ebx,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],ebx - pop ebx eax - ret -generate_pe_data: - cmp al,2 - je make_pe_resource - cmp al,5 - je make_pe_fixups - ret -make_pe_resource: - cmp byte [esi],82h - jne resource_done - inc esi - lods word [esi] - cmp ax,'(' - jne invalid_argument - lods dword [esi] - mov edx,esi - lea esi,[esi+eax+1] - cmp [next_pass_needed],0 - je resource_from_file - cmp [current_pass],0 - jne reserve_space_for_resource - mov [resource_size],0 - reserve_space_for_resource: - add edi,[resource_size] - cmp edi,[display_buffer] - ja out_of_memory - jmp resource_done - resource_from_file: - push esi - mov esi,edx - call open_binary_file - push ebx - mov esi,[free_additional_memory] - lea eax,[esi+20h] - cmp eax,[structures_buffer] - ja out_of_memory - mov edx,esi - mov ecx,20h - call read - jc invalid_file_format - xor eax,eax - cmp [esi],eax - jne invalid_file_format - mov ax,0FFFFh - cmp [esi+8],eax - jne invalid_file_format - cmp [esi+12],eax - jne invalid_file_format - mov eax,20h - cmp [esi+4],eax - jne invalid_file_format - read_resource_headers: - test eax,11b - jz resource_file_alignment_ok - mov edx,4 - and eax,11b - sub edx,eax - mov al,1 - call lseek - resource_file_alignment_ok: - mov [esi],eax - lea edx,[esi+12] - mov ecx,8 - call read - jc resource_headers_ok - mov ecx,[esi+16] - add [esi],ecx - lea edx,[esi+20] - sub ecx,8 - mov [esi+16],ecx - lea eax,[edx+ecx] - cmp eax,[structures_buffer] - ja out_of_memory - call read - jc invalid_file_format - mov edx,[esi] - add edx,[esi+12] - mov eax,[esi+16] - lea ecx,[esi+20] - lea esi,[ecx+eax] - add ecx,2 - cmp word [ecx-2],0FFFFh - je resource_header_type_ok - check_resource_header_type: - cmp ecx,esi - jae invalid_file_format - cmp word [ecx],0 - je resource_header_type_ok - add ecx,2 - jmp check_resource_header_type - resource_header_type_ok: - add ecx,2 - cmp word [ecx],0FFFFh - je resource_header_name_ok - check_resource_header_name: - cmp ecx,esi - jae invalid_file_format - cmp word [ecx],0 - je resource_header_name_ok - add ecx,2 - jmp check_resource_header_name - resource_header_name_ok: - xor al,al - call lseek - jmp read_resource_headers - resource_headers_ok: - xor eax,eax - mov [esi],eax - mov [resource_data],edi - lea eax,[edi+16] - cmp eax,[display_buffer] - jae out_of_memory - xor eax,eax - stos dword [edi] - call make_timestamp - stos dword [edi] - xor eax,eax - stos dword [edi] - stos dword [edi] - xor ebx,ebx - make_type_name_directory: - mov esi,[free_additional_memory] - xor edx,edx - find_type_name: - cmp dword [esi],0 - je type_name_ok - add esi,20 - cmp word [esi],0FFFFh - je check_next_type_name - or ebx,ebx - jz check_this_type_name - xor ecx,ecx - compare_with_previous_type_name: - mov ax,[esi+ecx] - cmp ax,[ebx+ecx] - ja check_this_type_name - jb check_next_type_name - add ecx,2 - mov ax,[esi+ecx] - or ax,[ebx+ecx] - jnz compare_with_previous_type_name - jmp check_next_type_name - check_this_type_name: - or edx,edx - jz type_name_found - xor ecx,ecx - compare_with_current_type_name: - mov ax,[esi+ecx] - cmp ax,[edx+ecx] - ja check_next_type_name - jb type_name_found - add ecx,2 - mov ax,[esi+ecx] - or ax,[edx+ecx] - jnz compare_with_current_type_name - jmp same_type_name - type_name_found: - mov edx,esi - same_type_name: - mov [esi-16],edi - check_next_type_name: - mov eax,[esi-4] - add esi,eax - jmp find_type_name - type_name_ok: - or edx,edx - jz type_name_directory_done - mov ebx,edx - make_type_name_entry: - mov eax,[resource_data] - inc word [eax+12] - lea eax,[edi+8] - cmp eax,[display_buffer] - jae out_of_memory - mov eax,ebx - stos dword [edi] - xor eax,eax - stos dword [edi] - jmp make_type_name_directory - type_name_directory_done: - mov ebx,-1 - make_type_id_directory: - mov esi,[free_additional_memory] - mov edx,10000h - find_type_id: - cmp dword [esi],0 - je type_id_ok - add esi,20 - cmp word [esi],0FFFFh - jne check_next_type_id - movzx eax,word [esi+2] - cmp eax,ebx - jle check_next_type_id - cmp eax,edx - jg check_next_type_id - mov edx,eax - mov [esi-16],edi - check_next_type_id: - mov eax,[esi-4] - add esi,eax - jmp find_type_id - type_id_ok: - cmp edx,10000h - je type_id_directory_done - mov ebx,edx - make_type_id_entry: - mov eax,[resource_data] - inc word [eax+14] - lea eax,[edi+8] - cmp eax,[display_buffer] - jae out_of_memory - mov eax,ebx - stos dword [edi] - xor eax,eax - stos dword [edi] - jmp make_type_id_directory - type_id_directory_done: - mov esi,[resource_data] - add esi,10h - mov ecx,[esi-4] - or cx,cx - jz resource_directories_ok - make_resource_directories: - push ecx - push edi - mov edx,edi - sub edx,[resource_data] - bts edx,31 - mov [esi+4],edx - lea eax,[edi+16] - cmp eax,[display_buffer] - jae out_of_memory - xor eax,eax - stos dword [edi] - call make_timestamp - stos dword [edi] - xor eax,eax - stos dword [edi] - stos dword [edi] - mov ebp,esi - xor ebx,ebx - make_resource_name_directory: - mov esi,[free_additional_memory] - xor edx,edx - find_resource_name: - cmp dword [esi],0 - je resource_name_ok - push esi - cmp [esi+4],ebp - jne check_next_resource_name - add esi,20 - call skip_resource_name - cmp word [esi],0FFFFh - je check_next_resource_name - or ebx,ebx - jz check_this_resource_name - xor ecx,ecx - compare_with_previous_resource_name: - mov ax,[esi+ecx] - cmp ax,[ebx+ecx] - ja check_this_resource_name - jb check_next_resource_name - add ecx,2 - mov ax,[esi+ecx] - or ax,[ebx+ecx] - jnz compare_with_previous_resource_name - jmp check_next_resource_name - skip_resource_name: - cmp word [esi],0FFFFh - jne skip_unicode_string - add esi,4 - ret - skip_unicode_string: - add esi,2 - cmp word [esi-2],0 - jne skip_unicode_string - ret - check_this_resource_name: - or edx,edx - jz resource_name_found - xor ecx,ecx - compare_with_current_resource_name: - mov ax,[esi+ecx] - cmp ax,[edx+ecx] - ja check_next_resource_name - jb resource_name_found - add ecx,2 - mov ax,[esi+ecx] - or ax,[edx+ecx] - jnz compare_with_current_resource_name - jmp same_resource_name - resource_name_found: - mov edx,esi - same_resource_name: - mov eax,[esp] - mov [eax+8],edi - check_next_resource_name: - pop esi - mov eax,[esi+16] - lea esi,[esi+20+eax] - jmp find_resource_name - resource_name_ok: - or edx,edx - jz resource_name_directory_done - mov ebx,edx - make_resource_name_entry: - mov eax,[esp] - inc word [eax+12] - lea eax,[edi+8] - cmp eax,[display_buffer] - jae out_of_memory - mov eax,ebx - stos dword [edi] - xor eax,eax - stos dword [edi] - jmp make_resource_name_directory - resource_name_directory_done: - mov ebx,-1 - make_resource_id_directory: - mov esi,[free_additional_memory] - mov edx,10000h - find_resource_id: - cmp dword [esi],0 - je resource_id_ok - push esi - cmp [esi+4],ebp - jne check_next_resource_id - add esi,20 - call skip_resource_name - cmp word [esi],0FFFFh - jne check_next_resource_id - movzx eax,word [esi+2] - cmp eax,ebx - jle check_next_resource_id - cmp eax,edx - jg check_next_resource_id - mov edx,eax - mov eax,[esp] - mov [eax+8],edi - check_next_resource_id: - pop esi - mov eax,[esi+16] - lea esi,[esi+20+eax] - jmp find_resource_id - resource_id_ok: - cmp edx,10000h - je resource_id_directory_done - mov ebx,edx - make_resource_id_entry: - mov eax,[esp] - inc word [eax+14] - lea eax,[edi+8] - cmp eax,[display_buffer] - jae out_of_memory - mov eax,ebx - stos dword [edi] - xor eax,eax - stos dword [edi] - jmp make_resource_id_directory - resource_id_directory_done: - pop eax - mov esi,ebp - pop ecx - add esi,8 - dec cx - jnz make_resource_directories - resource_directories_ok: - shr ecx,16 - jnz make_resource_directories - mov esi,[resource_data] - add esi,10h - movzx eax,word [esi-4] - movzx edx,word [esi-2] - add eax,edx - lea esi,[esi+eax*8] - push edi ; address of language directories - update_resource_directories: - cmp esi,[esp] - je resource_directories_updated - add esi,10h - mov ecx,[esi-4] - or cx,cx - jz language_directories_ok - make_language_directories: - push ecx - push edi - mov edx,edi - sub edx,[resource_data] - bts edx,31 - mov [esi+4],edx - lea eax,[edi+16] - cmp eax,[display_buffer] - jae out_of_memory - xor eax,eax - stos dword [edi] - call make_timestamp - stos dword [edi] - xor eax,eax - stos dword [edi] - stos dword [edi] - mov ebp,esi - mov ebx,-1 - make_language_id_directory: - mov esi,[free_additional_memory] - mov edx,10000h - find_language_id: - cmp dword [esi],0 - je language_id_ok - push esi - cmp [esi+8],ebp - jne check_next_language_id - add esi,20 - mov eax,esi - call skip_resource_name - call skip_resource_name - neg eax - add eax,esi - and eax,11b - add esi,eax - get_language_id: - movzx eax,word [esi+6] - cmp eax,ebx - jle check_next_language_id - cmp eax,edx - jge check_next_language_id - mov edx,eax - mov eax,[esp] - mov [current_offset],eax - check_next_language_id: - pop esi - mov eax,[esi+16] - lea esi,[esi+20+eax] - jmp find_language_id - language_id_ok: - cmp edx,10000h - je language_id_directory_done - mov ebx,edx - make_language_id_entry: - mov eax,[esp] - inc word [eax+14] - lea eax,[edi+8] - cmp eax,[display_buffer] - jae out_of_memory - mov eax,ebx - stos dword [edi] - mov eax,[current_offset] - stos dword [edi] - jmp make_language_id_directory - language_id_directory_done: - pop eax - mov esi,ebp - pop ecx - add esi,8 - dec cx - jnz make_language_directories - language_directories_ok: - shr ecx,16 - jnz make_language_directories - jmp update_resource_directories - resource_directories_updated: - mov esi,[resource_data] - push edi - make_name_strings: - add esi,10h - movzx eax,word [esi-2] - movzx ecx,word [esi-4] - add eax,ecx - lea eax,[esi+eax*8] - push eax - or ecx,ecx - jz string_entries_processed - process_string_entries: - push ecx - mov edx,edi - sub edx,[resource_data] - bts edx,31 - xchg [esi],edx - mov ebx,edi - xor ax,ax - stos word [edi] - copy_string_data: - lea eax,[edi+2] - cmp eax,[display_buffer] - jae out_of_memory - mov ax,[edx] - or ax,ax - jz string_data_copied - stos word [edi] - inc word [ebx] - add edx,2 - jmp copy_string_data - string_data_copied: - add esi,8 - pop ecx - loop process_string_entries - string_entries_processed: - pop esi - cmp esi,[esp] - jb make_name_strings - mov eax,edi - sub eax,[resource_data] - test al,11b - jz resource_strings_alignment_ok - xor ax,ax - stos word [edi] - resource_strings_alignment_ok: - pop edx - pop ebx ; address of language directories - mov ebp,edi - update_language_directories: - add ebx,10h - movzx eax,word [ebx-2] - movzx ecx,word [ebx-4] - add ecx,eax - make_data_records: - push ecx - mov esi,edi - sub esi,[resource_data] - xchg esi,[ebx+4] - lea eax,[edi+16] - cmp eax,[display_buffer] - jae out_of_memory - mov eax,esi - stos dword [edi] - mov eax,[esi+12] - stos dword [edi] - xor eax,eax - stos dword [edi] - stos dword [edi] - pop ecx - add ebx,8 - loop make_data_records - cmp ebx,edx - jb update_language_directories - pop ebx ; file handle - mov esi,ebp - mov ebp,edi - update_data_records: - push ebp - mov ecx,edi - mov eax,[current_section] - sub ecx,[eax+14h] - add ecx,[eax+0Ch] - xchg ecx,[esi] - mov edx,[ecx] - xor al,al - call lseek - mov edx,edi - mov ecx,[esi+4] - add edi,ecx - cmp edi,[display_buffer] - ja out_of_memory - call read - mov eax,edi - sub eax,[resource_data] - and eax,11b - jz resource_data_alignment_ok - mov ecx,4 - sub ecx,eax - xor al,al - rep stos byte [edi] - resource_data_alignment_ok: - pop ebp - add esi,16 - cmp esi,ebp - jb update_data_records - pop esi - call close - mov eax,edi - sub eax,[resource_data] - mov [resource_size],eax - resource_done: - ret -make_pe_fixups: - push esi - mov ecx,[number_of_relocations] - jecxz fixups_done - mov esi,[free_additional_memory] - mov eax,ecx - shl eax,2 - sub esi,eax - mov [free_additional_memory],esi - or [number_of_relocations],-1 - xor edx,edx - mov ebp,edi - make_fixups: - cmp [esi],edx - jb store_fixup - mov eax,edi - sub eax,ebp - test eax,11b - jz fixups_block - xor ax,ax - stos word [edi] - add dword [ebx],2 - fixups_block: - mov eax,edx - add edx,1000h - cmp [esi],edx - jae fixups_block - stos dword [edi] - mov ebx,edi - mov eax,8 - stos dword [edi] - store_fixup: - add dword [ebx],2 - mov eax,[esi] - and ax,0FFFh - test [format_flags],8 - jnz fixup_64bit - or ax,3000h - jmp fixup_ok - fixup_64bit: - or ax,0A000h - fixup_ok: - stos word [edi] - add esi,4 - loop make_fixups - fixups_done: - pop esi - ret -close_pe: - call close_pe_section - mov edx,[code_start] - mov [edx+50h],eax - call make_timestamp - mov edx,[code_start] - mov [edx+8],eax - mov eax,[number_of_relocations] - cmp eax,0 - jle pe_flags_ok - or word [edx+16h],1 - shl eax,2 - sub [free_additional_memory],eax - pe_flags_ok: - mov eax,[number_of_sections] - mov [edx+6],ax - imul eax,28h - movzx ecx,word [edx+14h] - lea eax,[eax+18h+ecx] - add eax,[stub_size] - mov ecx,[edx+3Ch] - dec ecx - add eax,ecx - not ecx - and eax,ecx - cmp eax,[edx+54h] - je pe_sections_ok - or [next_pass_needed],-1 - pe_sections_ok: - xor ecx,ecx - add edx,78h - test [format_flags],8 - jz process_directories - add edx,10h - process_directories: - mov eax,[edx+ecx*8] - or eax,eax - jz directory_ok - cmp dword [edx+ecx*8+4],-1 - jne directory_ok - section_data: - mov ebx,[edx+ecx*8] - mov eax,[ebx+0Ch] - mov [edx+ecx*8],eax ; directory rva - mov eax,[ebx+8] - mov [edx+ecx*8+4],eax ; directory size - directory_ok: - inc cl - cmp cl,10h - jb process_directories - mov ebx,[code_start] - sub ebx,[stub_size] - mov ecx,edi - sub ecx,ebx - mov ebp,ecx - shr ecx,1 - xor eax,eax - cdq - calculate_checksum: - mov dx,[ebx] - add eax,edx - mov dx,ax - shr eax,16 - add eax,edx - add ebx,2 - loop calculate_checksum - add eax,ebp - mov ebx,[code_start] - mov [ebx+58h],eax - ret - -format_coff: - mov eax,[additional_memory] - mov [symbols_stream],eax - mov ebx,eax - add eax,18h - cmp eax,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],eax - xor eax,eax - mov [ebx],al - mov [ebx+4],eax - mov [ebx+8],edi - mov al,4 - mov [ebx+10h],eax - mov al,60h - bt [format_flags],0 - jnc flat_section_flags_ok - or eax,0E0000000h - flat_section_flags_ok: - mov dword [ebx+14h],eax - mov [current_section],ebx - mov [number_of_sections],0 - mov dword [org_origin],edi - mov dword [org_origin+4],0 - mov [org_registers],0 - mov [org_start],edi - mov [org_symbol],ebx - mov [labels_type],2 - mov [code_type],32 - test [format_flags],8 - jz instruction_assembled - mov [labels_type],4 - mov [code_type],64 - jmp instruction_assembled -coff_section: - call close_coff_section - mov ebx,[free_additional_memory] - lea eax,[ebx+18h] - cmp eax,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],eax - mov [current_section],ebx - inc [number_of_sections] - xor eax,eax - mov [ebx],al - mov [ebx+8],edi - mov dword [org_origin],edi - mov dword [org_origin+4],0 - mov [org_registers],0 - mov [org_start],edi - mov [org_symbol],ebx - mov [labels_type],2 - test [format_flags],8 - jz coff_labels_type_ok - mov [labels_type],4 - coff_labels_type_ok: - mov [ebx+10h],eax - mov [ebx+14h],eax - lods word [esi] - cmp ax,'(' - jne invalid_argument - mov [ebx+4],esi - mov ecx,[esi] - lea esi,[esi+4+ecx+1] - cmp ecx,8 - ja name_too_long - coff_section_flags: - cmp byte [esi],1Ch - je coff_section_alignment - cmp byte [esi],19h - jne coff_section_settings_ok - inc esi - lods byte [esi] - bt [format_flags],0 - jc coff_section_flag_ok - cmp al,7 - ja invalid_argument - coff_section_flag_ok: - mov cl,al - mov eax,1 - shl eax,cl - test dword [ebx+14h],eax - jnz setting_already_specified - or dword [ebx+14h],eax - jmp coff_section_flags - coff_section_alignment: - bt [format_flags],0 - jnc invalid_argument - inc esi - lods byte [esi] - or al,al - jnz invalid_argument - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - push ebx - call get_dword_value - pop ebx - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,eax - dec edx - test eax,edx - jnz invalid_value - or eax,eax - jz invalid_value - cmp eax,2000h - ja invalid_value - bsf edx,eax - inc edx - shl edx,20 - or [ebx+14h],edx - xchg [ebx+10h],eax - or eax,eax - jnz setting_already_specified - jmp coff_section_flags - coff_section_settings_ok: - cmp dword [ebx+10h],0 - jne instruction_assembled - mov dword [ebx+10h],4 - bt [format_flags],0 - jnc instruction_assembled - or dword [ebx+14h],300000h - jmp instruction_assembled - close_coff_section: - mov ebx,[current_section] - mov eax,edi - mov edx,[ebx+8] - sub eax,edx - mov [ebx+0Ch],eax - xor eax,eax - xchg [undefined_data_end],eax - cmp eax,edi - jne coff_section_ok - cmp edx,[undefined_data_start] - jne coff_section_ok - mov edi,edx - or byte [ebx+14h],80h - coff_section_ok: - ret -mark_coff_relocation: - cmp [value_type],3 - je coff_relocation_relative - push ebx eax - test [format_flags],8 - jnz coff_64bit_relocation - mov al,6 - jmp coff_relocation - coff_64bit_relocation: - mov al,1 - jmp coff_relocation - coff_relocation_relative: - push ebx - bt [format_flags],0 - jnc relative_ok - mov ebx,[current_section] - mov ebx,[ebx+8] - sub ebx,edi - sub eax,ebx - add eax,4 - relative_ok: - push eax - mov al,20 - test [format_flags],8 - jnz relative_coff_64bit_relocation - cmp [labels_type],2 - jne invalid_use_of_symbol - jmp coff_relocation - relative_coff_64bit_relocation: - mov al,4 - cmp [labels_type],4 - jne invalid_use_of_symbol - coff_relocation: - mov ebx,[free_additional_memory] - add ebx,0Ch - cmp ebx,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],ebx - mov byte [ebx-0Ch],al - mov eax,[current_section] - mov eax,[eax+8] - neg eax - add eax,edi - mov [ebx-0Ch+4],eax - mov eax,[symbol_identifier] - mov [ebx-0Ch+8],eax - pop eax ebx - ret -close_coff: - call close_coff_section - cmp [next_pass_needed],0 - je coff_closed - mov eax,[symbols_stream] - mov [free_additional_memory],eax - coff_closed: - ret -coff_formatter: - sub edi,[code_start] - mov [code_size],edi - call prepare_default_section - mov edi,[free_additional_memory] - mov ebx,edi - mov ecx,28h shr 2 - imul ecx,[number_of_sections] - add ecx,14h shr 2 - lea eax,[edi+ecx*4] - cmp eax,[structures_buffer] - jae out_of_memory - xor eax,eax - rep stos dword [edi] - mov word [ebx],14Ch - test [format_flags],8 - jz coff_magic_ok - mov word [ebx],8664h - coff_magic_ok: - mov word [ebx+12h],104h - bt [format_flags],0 - jnc coff_flags_ok - or byte [ebx+12h],80h - coff_flags_ok: - push ebx - call make_timestamp - pop ebx - mov [ebx+4],eax - mov eax,[number_of_sections] - mov [ebx+2],ax - mov esi,[symbols_stream] - xor ecx,ecx - enumerate_symbols: - cmp esi,[free_additional_memory] - je symbols_enumerated - mov dl,[esi] - or dl,dl - jz enumerate_section - cmp dl,80h - je enumerate_public - ja enumerate_extrn - add esi,0Ch - jmp enumerate_symbols - enumerate_section: - mov edx,ecx - shl edx,8 - mov [esi],edx - inc ecx - add esi,18h - jmp enumerate_symbols - enumerate_public: - mov edx,eax - shl edx,8 - mov dl,80h - mov [esi],edx - mov edx,[esi+8] - add esi,10h - inc eax - cmp byte [edx+11],2 - jne enumerate_symbols - mov edx,[edx+20] - cmp byte [edx],81h - jne enumerate_symbols - inc eax - jmp enumerate_symbols - enumerate_extrn: - mov edx,eax - shl edx,8 - mov dl,81h - mov [esi],edx - add esi,0Ch - inc eax - jmp enumerate_symbols - prepare_default_section: - mov ebx,[symbols_stream] - cmp dword [ebx+0Ch],0 - jne default_section_ok - cmp [number_of_sections],0 - je default_section_ok - mov edx,ebx - find_references_to_default_section: - cmp ebx,[free_additional_memory] - jne check_reference - add [symbols_stream],18h - ret - check_reference: - mov al,[ebx] - or al,al - jz skip_other_section - cmp al,80h - je check_public_reference - ja next_reference - cmp edx,[ebx+8] - je default_section_ok - next_reference: - add ebx,0Ch - jmp find_references_to_default_section - check_public_reference: - mov eax,[ebx+8] - add ebx,10h - test byte [eax+8],1 - jz find_references_to_default_section - mov cx,[current_pass] - cmp cx,[eax+16] - jne find_references_to_default_section - cmp edx,[eax+20] - je default_section_ok - jmp find_references_to_default_section - skip_other_section: - add ebx,18h - jmp find_references_to_default_section - default_section_ok: - inc [number_of_sections] - ret - symbols_enumerated: - mov [ebx+0Ch],eax - mov ebp,edi - sub ebp,ebx - push ebp - lea edi,[ebx+14h] - mov esi,[symbols_stream] - find_section: - cmp esi,[free_additional_memory] - je sections_finished - mov al,[esi] - or al,al - jz section_found - add esi,0Ch - cmp al,80h - jne find_section - add esi,4 - jmp find_section - section_found: - push esi edi - mov esi,[esi+4] - or esi,esi - jz default_section - mov ecx,[esi] - add esi,4 - rep movs byte [edi],[esi] - jmp section_name_ok - default_section: - mov al,'.' - stos byte [edi] - mov eax,'flat' - stos dword [edi] - section_name_ok: - pop edi esi - mov eax,[esi+0Ch] - mov [edi+10h],eax - mov eax,[esi+14h] - mov [edi+24h],eax - test al,80h - jnz section_ptr_ok - mov eax,[esi+8] - sub eax,[code_start] - add eax,ebp - mov [edi+14h],eax - section_ptr_ok: - mov ebx,[code_start] - mov edx,[code_size] - add ebx,edx - add edx,ebp - xor ecx,ecx - add esi,18h - find_relocations: - cmp esi,[free_additional_memory] - je section_relocations_done - mov al,[esi] - or al,al - jz section_relocations_done - cmp al,80h - jb add_relocation - ja next_relocation - add esi,10h - jmp find_relocations - add_relocation: - lea eax,[ebx+0Ah] - cmp eax,[display_buffer] - ja out_of_memory - mov eax,[esi+4] - mov [ebx],eax - mov eax,[esi+8] - mov eax,[eax] - shr eax,8 - mov [ebx+4],eax - movzx ax,byte [esi] - mov [ebx+8],ax - add ebx,0Ah - inc ecx - next_relocation: - add esi,0Ch - jmp find_relocations - section_relocations_done: - cmp ecx,10000h - jb section_relocations_count_16bit - bt [format_flags],0 - jnc format_limitations_exceeded - mov word [edi+20h],0FFFFh - or dword [edi+24h],1000000h - mov [edi+18h],edx - push esi edi - push ecx - lea esi,[ebx-1] - add ebx,0Ah - lea edi,[ebx-1] - imul ecx,0Ah - std - rep movs byte [edi],[esi] - cld - pop ecx - inc esi - inc ecx - mov [esi],ecx - xor eax,eax - mov [esi+4],eax - mov [esi+8],ax - pop edi esi - jmp section_relocations_ok - section_relocations_count_16bit: - mov [edi+20h],cx - jcxz section_relocations_ok - mov [edi+18h],edx - section_relocations_ok: - sub ebx,[code_start] - mov [code_size],ebx - add edi,28h - jmp find_section - sections_finished: - mov edx,[free_additional_memory] - mov ebx,[code_size] - add ebp,ebx - mov [edx+8],ebp - add ebx,[code_start] - mov edi,ebx - mov ecx,[edx+0Ch] - imul ecx,12h shr 1 - xor eax,eax - shr ecx,1 - jnc zero_symbols_table - stos word [edi] - zero_symbols_table: - rep stos dword [edi] - mov edx,edi - stos dword [edi] - mov esi,[symbols_stream] - make_section_symbols: - cmp esi,[free_additional_memory] - je section_symbols_ok - mov al,[esi] - or al,al - jz add_section_symbol - add esi,0Ch - cmp al,80h - jne make_section_symbols - add esi,4 - jmp make_section_symbols - add_section_symbol: - call store_symbol_name - mov eax,[esi] - shr eax,8 - inc eax - mov [ebx+0Ch],ax - mov byte [ebx+10h],3 - add esi,18h - add ebx,12h - jmp make_section_symbols - section_symbols_ok: - mov esi,[symbols_stream] - make_symbols_table: - cmp esi,[free_additional_memory] - je symbols_table_ok - mov al,[esi] - cmp al,80h - je add_public_symbol - ja add_extrn_symbol - add esi,0Ch - or al,al - jnz make_symbols_table - add esi,0Ch - jmp make_symbols_table - add_extrn_symbol: - call store_symbol_name - mov byte [ebx+10h],2 - add esi,0Ch - add ebx,12h - jmp make_symbols_table - add_public_symbol: - call store_symbol_name - mov eax,[esi+0Ch] - mov [current_line],eax - mov eax,[esi+8] - test byte [eax+8],1 - jz undefined_symbol - mov cx,[current_pass] - cmp cx,[eax+16] - jne undefined_symbol - mov cl,[eax+11] - or cl,cl - jz public_constant - test [format_flags],8 - jnz check_64bit_public_symbol - cmp cl,2 - je public_symbol_type_ok - jmp invalid_use_of_symbol - check_64bit_public_symbol: - cmp cl,4 - jne invalid_use_of_symbol - public_symbol_type_ok: - mov ecx,[eax+20] - mov ecx,[ecx] - cmp cl,81h - je alias_symbol - or cl,cl - jnz invalid_use_of_symbol - shr ecx,8 - inc cx - mov [ebx+0Ch],cx - public_symbol_section_ok: - cmp dword [eax+4],0 - je store_public_symbol - cmp dword [eax+4],-1 - jne value_out_of_range - bt dword [eax],31 - jnc value_out_of_range - store_public_symbol: - mov eax,[eax] - mov [ebx+8],eax - mov byte [ebx+10h],2 - add esi,10h - add ebx,12h - jmp make_symbols_table - alias_symbol: - bt [format_flags],0 - jnc invalid_use_of_symbol - mov ecx,[eax] - or ecx,[eax+4] - jnz invalid_use_of_symbol - mov byte [ebx+10h],69h - mov byte [ebx+11h],1 - add ebx,12h - mov ecx,[eax+20] - mov ecx,[ecx] - shr ecx,8 - mov [ebx],ecx - mov byte [ebx+4],3 - add esi,10h - add ebx,12h - jmp make_symbols_table - public_constant: - mov word [ebx+0Ch],0FFFFh - jmp public_symbol_section_ok - symbols_table_ok: - mov eax,edi - sub eax,edx - mov [edx],eax - sub edi,[code_start] - mov [code_size],edi - mov [written_size],0 - mov edx,[output_file] - call create - jc write_failed - mov edx,[free_additional_memory] - pop ecx - add [written_size],ecx - call write - jc write_failed - jmp write_output - store_symbol_name: - push esi - mov esi,[esi+4] - or esi,esi - jz default_name - lods dword [esi] - mov ecx,eax - cmp ecx,8 - ja add_string - push edi - mov edi,ebx - rep movs byte [edi],[esi] - pop edi esi - ret - default_name: - mov dword [ebx],'.fla' - mov dword [ebx+4],'t' - pop esi - ret - add_string: - mov eax,edi - sub eax,edx - mov [ebx+4],eax - inc ecx - rep movs byte [edi],[esi] - pop esi - ret - -format_elf: - test [format_flags],8 - jnz format_elf64 - mov edx,edi - mov ecx,34h shr 2 - lea eax,[edi+ecx*4] - cmp eax,[display_buffer] - jae out_of_memory - xor eax,eax - rep stos dword [edi] - mov dword [edx],7Fh + 'ELF' shl 8 - mov al,1 - mov [edx+4],al - mov [edx+5],al - mov [edx+6],al - mov [edx+14h],al - mov byte [edx+12h],3 - mov byte [edx+28h],34h - mov byte [edx+2Eh],28h - mov [code_type],32 - cmp word [esi],1D19h - je format_elf_exe - mov [labels_type],2 - elf_header_ok: - mov byte [edx+10h],1 - mov eax,[additional_memory] - mov [symbols_stream],eax - mov ebx,eax - add eax,18h - cmp eax,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],eax - xor eax,eax - mov [current_section],ebx - mov [number_of_sections],eax - mov dword [org_origin],edi - mov dword [org_origin+4],eax - mov [org_registers],eax - mov [org_start],edi - mov [org_symbol],ebx - mov [ebx],al - mov [ebx+4],eax - mov [ebx+8],edi - mov al,111b - mov [ebx+14h],eax - mov al,4 - mov [ebx+10h],eax - test [format_flags],8 - jz instruction_assembled - mov byte [ebx+10h],8 - jmp instruction_assembled - format_elf64: - mov edx,edi - mov ecx,40h shr 2 - lea eax,[edi+ecx*4] - cmp eax,[display_buffer] - jae out_of_memory - xor eax,eax - rep stos dword [edi] - mov dword [edx],7Fh + 'ELF' shl 8 - mov al,1 - mov [edx+5],al - mov [edx+6],al - mov [edx+14h],al - mov byte [edx+4],2 - mov byte [edx+12h],62 - mov byte [edx+34h],40h - mov byte [edx+3Ah],40h - mov [code_type],64 - cmp word [esi],1D19h - je format_elf64_exe - mov [labels_type],4 - jmp elf_header_ok -elf_section: - bt [format_flags],0 - jc elf_exe_section - call close_coff_section - mov ebx,[free_additional_memory] - lea eax,[ebx+18h] - cmp eax,[structures_buffer] - jae out_of_memory - mov [free_additional_memory],eax - mov [current_section],ebx - inc word [number_of_sections] - jz format_limitations_exceeded - xor eax,eax - mov [ebx],al - mov [ebx+8],edi - mov dword [org_origin],edi - mov dword [org_origin+4],0 - mov [org_registers],0 - mov [org_start],edi - mov [org_symbol],ebx - test [format_flags],8 - jnz elf64_labels_type - mov [labels_type],2 - jmp elf_labels_type_ok - elf64_labels_type: - mov [labels_type],4 - elf_labels_type_ok: - mov [ebx+10h],eax - mov al,10b - mov [ebx+14h],eax - lods word [esi] - cmp ax,'(' - jne invalid_argument - mov [ebx+4],esi - mov ecx,[esi] - lea esi,[esi+4+ecx+1] - elf_section_flags: - cmp byte [esi],1Ch - je elf_section_alignment - cmp byte [esi],19h - jne elf_section_settings_ok - inc esi - lods byte [esi] - sub al,28 - xor al,11b - test al,not 10b - jnz invalid_argument - mov cl,al - mov al,1 - shl al,cl - test byte [ebx+14h],al - jnz setting_already_specified - or byte [ebx+14h],al - jmp elf_section_flags - elf_section_alignment: - inc esi - lods byte [esi] - or al,al - jnz invalid_argument - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - push ebx - call get_dword_value - pop ebx - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,eax - dec edx - test eax,edx - jnz invalid_value - or eax,eax - jz invalid_value - xchg [ebx+10h],eax - or eax,eax - jnz setting_already_specified - jmp elf_section_flags - elf_section_settings_ok: - cmp dword [ebx+10h],0 - jne instruction_assembled - mov dword [ebx+10h],4 - test [format_flags],8 - jz instruction_assembled - mov byte [ebx+10h],8 - jmp instruction_assembled -mark_elf_relocation: - cmp [value_type],3 - je elf_relocation_relative - push ebx eax - mov al,1 - jmp coff_relocation - elf_relocation_relative: - cmp [labels_type],0 - je invalid_use_of_symbol - push ebx - mov ebx,[current_section] - mov ebx,[ebx+8] - sub ebx,edi - sub eax,ebx - push eax - mov al,2 - jmp coff_relocation -close_elf: - bt [format_flags],0 - jc close_elf_exe - call close_coff_section - cmp [next_pass_needed],0 - je elf_closed - mov eax,[symbols_stream] - mov [free_additional_memory],eax - elf_closed: - ret -elf_formatter: - push edi - call prepare_default_section - mov esi,[symbols_stream] - mov edi,[free_additional_memory] - xor eax,eax - mov ecx,4 - rep stos dword [edi] - test [format_flags],8 - jz find_first_section - mov ecx,2 - rep stos dword [edi] - find_first_section: - mov al,[esi] - or al,al - jz first_section_found - cmp al,80h - jne skip_other_symbol - add esi,4 - skip_other_symbol: - add esi,0Ch - jmp find_first_section - first_section_found: - mov ebx,esi - mov ebp,esi - add esi,18h - xor ecx,ecx - xor edx,edx - find_next_section: - cmp esi,[free_additional_memory] - je make_section_symbol - mov al,[esi] - or al,al - jz make_section_symbol - cmp al,80h - je skip_public - ja skip_extrn - or byte [ebx+14h],40h - skip_extrn: - add esi,0Ch - jmp find_next_section - skip_public: - add esi,10h - jmp find_next_section - make_section_symbol: - mov eax,edi - xchg eax,[ebx+4] - stos dword [edi] - test [format_flags],8 - jnz elf64_section_symbol - xor eax,eax - stos dword [edi] - stos dword [edi] - call store_section_index - jmp section_symbol_ok - store_section_index: - inc ecx - mov eax,ecx - shl eax,8 - mov [ebx],eax - inc dx - jz format_limitations_exceeded - mov eax,edx - shl eax,16 - mov al,3 - test byte [ebx+14h],40h - jz section_index_ok - or ah,-1 - inc dx - jz format_limitations_exceeded - section_index_ok: - stos dword [edi] - ret - elf64_section_symbol: - call store_section_index - xor eax,eax - stos dword [edi] - stos dword [edi] - stos dword [edi] - stos dword [edi] - section_symbol_ok: - mov ebx,esi - add esi,18h - cmp ebx,[free_additional_memory] - jne find_next_section - inc dx - jz format_limitations_exceeded - mov [current_section],edx - mov esi,[symbols_stream] - find_other_symbols: - cmp esi,[free_additional_memory] - je elf_symbol_table_ok - mov al,[esi] - or al,al - jz skip_section - cmp al,80h - je make_public_symbol - ja make_extrn_symbol - add esi,0Ch - jmp find_other_symbols - skip_section: - add esi,18h - jmp find_other_symbols - make_public_symbol: - mov eax,[esi+0Ch] - mov [current_line],eax - mov ebx,[esi+8] - test byte [ebx+8],1 - jz undefined_symbol - mov ax,[current_pass] - cmp ax,[ebx+16] - jne undefined_symbol - mov dl,[ebx+11] - or dl,dl - jz public_absolute - mov eax,[ebx+20] - cmp byte [eax],0 - jne invalid_use_of_symbol - mov eax,[eax+4] - test [format_flags],8 - jnz elf64_public - cmp dl,2 - jne invalid_use_of_symbol - mov dx,[eax+0Eh] - jmp section_for_public_ok - elf64_public: - cmp dl,4 - jne invalid_use_of_symbol - mov dx,[eax+6] - jmp section_for_public_ok - public_absolute: - mov dx,0FFF1h - section_for_public_ok: - mov eax,[esi+4] - stos dword [edi] - test [format_flags],8 - jnz elf64_public_symbol - call get_public_value - stos dword [edi] - xor eax,eax - mov al,[ebx+10] - stos dword [edi] - mov eax,edx - shl eax,16 - mov al,10h - stos dword [edi] - jmp public_symbol_ok - elf64_public_symbol: - mov eax,edx - shl eax,16 - mov al,10h - stos dword [edi] - call get_public_value - stos dword [edi] - xor eax,eax - stos dword [edi] - mov al,[ebx+10] - stos dword [edi] - xor al,al - stos dword [edi] - public_symbol_ok: - inc ecx - mov eax,ecx - shl eax,8 - mov al,80h - mov [esi],eax - add esi,10h - jmp find_other_symbols - get_public_value: - mov eax,[ebx] - cmp dword [ebx+4],0 - je public_value_ok - cmp dword [ebx+4],-1 - jne value_out_of_range - bt eax,31 - jnc value_out_of_range - public_value_ok: - ret - make_extrn_symbol: - mov eax,[esi+4] - stos dword [edi] - test [format_flags],8 - jnz elf64_extrn_symbol - xor eax,eax - stos dword [edi] - mov eax,[esi+8] - stos dword [edi] - mov eax,10h - stos dword [edi] - jmp extrn_symbol_ok - elf64_extrn_symbol: - mov eax,10h - stos dword [edi] - xor al,al - stos dword [edi] - stos dword [edi] - mov eax,[esi+8] - stos dword [edi] - xor eax,eax - stos dword [edi] - extrn_symbol_ok: - inc ecx - mov eax,ecx - shl eax,8 - mov al,81h - mov [esi],eax - add esi,0Ch - jmp find_other_symbols - elf_symbol_table_ok: - mov edx,edi - mov ebx,[free_additional_memory] - xor al,al - stos byte [edi] - add edi,16 - mov [edx+1],edx - add ebx,10h - test [format_flags],8 - jz make_string_table - add ebx,8 - make_string_table: - cmp ebx,edx - je elf_string_table_ok - test [format_flags],8 - jnz make_elf64_string - cmp byte [ebx+0Dh],0 - je rel_prefix_ok - mov byte [ebx+0Dh],0 - mov eax,'.rel' - stos dword [edi] - rel_prefix_ok: - mov esi,edi - sub esi,edx - xchg esi,[ebx] - add ebx,10h - make_elf_string: - or esi,esi - jz default_string - lods dword [esi] - mov ecx,eax - rep movs byte [edi],[esi] - xor al,al - stos byte [edi] - jmp make_string_table - make_elf64_string: - cmp byte [ebx+5],0 - je elf64_rel_prefix_ok - mov byte [ebx+5],0 - mov eax,'.rel' - stos dword [edi] - mov al,'a' - stos byte [edi] - elf64_rel_prefix_ok: - mov esi,edi - sub esi,edx - xchg esi,[ebx] - add ebx,18h - jmp make_elf_string - default_string: - mov eax,'.fla' - stos dword [edi] - mov ax,'t' - stos word [edi] - jmp make_string_table - elf_string_table_ok: - mov [edx+1+8],edi - mov ebx,[code_start] - mov eax,edi - sub eax,[free_additional_memory] - test [format_flags],8 - jnz finish_elf64_header - mov [ebx+20h],eax - mov eax,[current_section] - inc ax - jz format_limitations_exceeded - mov [ebx+32h],ax - inc ax - jz format_limitations_exceeded - mov [ebx+30h],ax - jmp elf_header_finished - finish_elf64_header: - mov [ebx+28h],eax - mov eax,[current_section] - inc ax - jz format_limitations_exceeded - mov [ebx+3Eh],ax - inc ax - jz format_limitations_exceeded - mov [ebx+3Ch],ax - elf_header_finished: - xor eax,eax - mov ecx,10 - rep stos dword [edi] - test [format_flags],8 - jz elf_null_section_ok - mov ecx,6 - rep stos dword [edi] - elf_null_section_ok: - mov esi,ebp - xor ecx,ecx - make_section_entry: - mov ebx,edi - mov eax,[esi+4] - mov eax,[eax] - stos dword [edi] - mov eax,1 - cmp dword [esi+0Ch],0 - je bss_section - test byte [esi+14h],80h - jz section_type_ok - bss_section: - mov al,8 - section_type_ok: - stos dword [edi] - mov eax,[esi+14h] - and al,3Fh - call store_elf_machine_word - xor eax,eax - call store_elf_machine_word - mov eax,[esi+8] - mov [image_base],eax - sub eax,[code_start] - call store_elf_machine_word - mov eax,[esi+0Ch] - call store_elf_machine_word - xor eax,eax - stos dword [edi] - stos dword [edi] - mov eax,[esi+10h] - call store_elf_machine_word - xor eax,eax - call store_elf_machine_word - inc ecx - add esi,18h - xchg edi,[esp] - mov ebp,edi - convert_relocations: - cmp esi,[free_additional_memory] - je relocations_converted - mov al,[esi] - or al,al - jz relocations_converted - cmp al,80h - jb make_relocation_entry - ja relocation_entry_ok - add esi,10h - jmp convert_relocations - make_relocation_entry: - test [format_flags],8 - jnz make_elf64_relocation_entry - mov eax,[esi+4] - stos dword [edi] - mov eax,[esi+8] - mov eax,[eax] - mov al,[esi] - stos dword [edi] - jmp relocation_entry_ok - make_elf64_relocation_entry: - mov eax,[esi+4] - stos dword [edi] - xor eax,eax - stos dword [edi] - movzx eax,byte [esi] - stos dword [edi] - mov eax,[esi+8] - mov eax,[eax] - shr eax,8 - stos dword [edi] - xor eax,eax - stos dword [edi] - stos dword [edi] - relocation_entry_ok: - add esi,0Ch - jmp convert_relocations - store_elf_machine_word: - stos dword [edi] - test [format_flags],8 - jz elf_machine_word_ok - mov dword [edi],0 - add edi,4 - elf_machine_word_ok: - ret - relocations_converted: - cmp edi,ebp - xchg edi,[esp] - je rel_section_ok - mov eax,[ebx] - sub eax,4 - test [format_flags],8 - jz store_relocations_name_offset - dec eax - store_relocations_name_offset: - stos dword [edi] - test [format_flags],8 - jnz rela_section - mov eax,9 - jmp store_relocations_type - rela_section: - mov eax,4 - store_relocations_type: - stos dword [edi] - xor al,al - call store_elf_machine_word - call store_elf_machine_word - mov eax,ebp - sub eax,[code_start] - call store_elf_machine_word - mov eax,[esp] - sub eax,ebp - call store_elf_machine_word - mov eax,[current_section] - stos dword [edi] - mov eax,ecx - stos dword [edi] - inc ecx - test [format_flags],8 - jnz finish_elf64_rela_section - mov eax,4 - stos dword [edi] - mov al,8 - stos dword [edi] - jmp rel_section_ok - finish_elf64_rela_section: - mov eax,8 - stos dword [edi] - xor al,al - stos dword [edi] - mov al,24 - stos dword [edi] - xor al,al - stos dword [edi] - rel_section_ok: - cmp esi,[free_additional_memory] - jne make_section_entry - pop eax - mov ebx,[code_start] - sub eax,ebx - mov [code_size],eax - mov ecx,20h - test [format_flags],8 - jz adjust_elf_section_headers_offset - mov ecx,28h - adjust_elf_section_headers_offset: - add [ebx+ecx],eax - mov eax,1 - stos dword [edi] - mov al,2 - stos dword [edi] - xor al,al - call store_elf_machine_word - call store_elf_machine_word - mov eax,[code_size] - call store_elf_machine_word - mov eax,[edx+1] - sub eax,[free_additional_memory] - call store_elf_machine_word - mov eax,[current_section] - inc eax - stos dword [edi] - mov eax,[number_of_sections] - inc eax - stos dword [edi] - test [format_flags],8 - jnz finish_elf64_sym_section - mov eax,4 - stos dword [edi] - mov al,10h - stos dword [edi] - jmp sym_section_ok - finish_elf64_sym_section: - mov eax,8 - stos dword [edi] - xor al,al - stos dword [edi] - mov al,18h - stos dword [edi] - xor al,al - stos dword [edi] - sym_section_ok: - mov al,1+8 - stos dword [edi] - mov al,3 - stos dword [edi] - xor al,al - call store_elf_machine_word - call store_elf_machine_word - mov eax,[edx+1] - sub eax,[free_additional_memory] - add eax,[code_size] - call store_elf_machine_word - mov eax,[edx+1+8] - sub eax,[edx+1] - call store_elf_machine_word - xor eax,eax - stos dword [edi] - stos dword [edi] - mov al,1 - call store_elf_machine_word - xor eax,eax - call store_elf_machine_word - mov eax,'tab' - mov dword [edx+1],'.sym' - mov [edx+1+4],eax - mov dword [edx+1+8],'.str' - mov [edx+1+8+4],eax - mov [written_size],0 - mov edx,[output_file] - call create - jc write_failed - call write_code - mov ecx,edi - mov edx,[free_additional_memory] - sub ecx,edx - add [written_size],ecx - call write - jc write_failed - jmp output_written - -format_elf_exe: - add esi,2 - or [format_flags],1 - mov [image_base],8048000h - cmp byte [esi],80h - jne elf_exe_base_ok - lods word [esi] - cmp ah,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - push edx - call get_dword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov [image_base],eax - pop edx - elf_exe_base_ok: - mov byte [edx+10h],2 - mov byte [edx+2Ah],20h - mov ebx,edi - mov ecx,20h shr 2 - cmp [current_pass],0 - je init_elf_exe_sections - imul ecx,[number_of_sections] - init_elf_exe_sections: - xor eax,eax - rep stos dword [edi] - mov [number_of_sections],0 - mov byte [ebx],1 - mov word [ebx+1Ch],1000h - mov byte [ebx+18h],111b - mov eax,edi - sub eax,[code_start] - mov [ebx+4],eax - add eax,[image_base] - mov [ebx+8],eax - mov [ebx+0Ch],eax - mov [edx+18h],eax - xor edx,edx - not eax - not edx - add eax,1 - adc edx,0 - add eax,edi - adc edx,0 - mov dword [org_origin],eax - mov dword [org_origin+4],edx - mov [org_registers],0 - mov [org_start],edi - mov [symbols_stream],edi - jmp instruction_assembled - format_elf64_exe: - add esi,2 - or [format_flags],1 - mov [image_base],400000h - mov [image_base_high],0 - cmp byte [esi],80h - jne elf64_exe_base_ok - lods word [esi] - cmp ah,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - push edx - call get_qword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov [image_base],eax - mov [image_base_high],edx - pop edx - elf64_exe_base_ok: - mov byte [edx+10h],2 - mov byte [edx+36h],38h - mov ebx,edi - mov ecx,38h shr 2 - cmp [current_pass],0 - je init_elf64_exe_sections - imul ecx,[number_of_sections] - init_elf64_exe_sections: - xor eax,eax - rep stos dword [edi] - mov [number_of_sections],0 - mov byte [ebx],1 - mov word [ebx+30h],1000h - mov byte [ebx+4],111b - push edx - mov eax,edi - sub eax,[code_start] - mov [ebx+8],eax - xor edx,edx - add eax,[image_base] - adc edx,[image_base_high] - mov [ebx+10h],eax - mov [ebx+10h+4],edx - mov [ebx+18h],eax - mov [ebx+18h+4],edx - pop ebx - mov [ebx+18h],eax - mov [ebx+18h+4],edx - not eax - not edx - add eax,1 - adc edx,0 - add eax,edi - adc edx,0 - mov dword [org_origin],eax - mov dword [org_origin+4],edx - mov [org_registers],0 - mov [org_start],edi - mov [symbols_stream],edi - jmp instruction_assembled -elf_entry: - lods byte [esi] - cmp al,'(' - jne invalid_argument - cmp byte [esi],'.' - je invalid_value - test [format_flags],8 - jnz elf64_entry - call get_dword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov edx,[code_start] - mov [edx+18h],eax - jmp instruction_assembled - elf64_entry: - call get_qword_value - cmp [value_type],0 - jne invalid_use_of_symbol - mov ebx,[code_start] - mov [ebx+18h],eax - mov [ebx+1Ch],edx - jmp instruction_assembled -elf_exe_section: - test [format_flags],8 - jnz elf64_exe_section - call close_elf_exe_section - push eax - mov ebx,[number_of_sections] - shl ebx,5 - add ebx,[code_start] - add ebx,34h - cmp ebx,[symbols_stream] - jb new_elf_exe_section - mov ebx,[symbols_stream] - sub ebx,20h - push edi - mov edi,ebx - mov ecx,20h shr 2 - xor eax,eax - rep stos dword [edi] - pop edi - or [next_pass_needed],-1 - new_elf_exe_section: - mov byte [ebx],1 - mov word [ebx+1Ch],1000h - elf_exe_section_flags: - cmp byte [esi],19h - jne elf_exe_section_flags_ok - lods word [esi] - sub ah,28 - jbe invalid_argument - cmp ah,1 - je mark_elf_exe_section_flag - cmp ah,3 - ja invalid_argument - xor ah,1 - cmp ah,2 - je mark_elf_exe_section_flag - inc ah - mark_elf_exe_section_flag: - test [ebx+18h],ah - jnz setting_already_specified - or [ebx+18h],ah - jmp elf_exe_section_flags - elf_exe_section_flags_ok: - mov eax,edi - sub eax,[code_start] - mov [ebx+4],eax - pop edx - and eax,0FFFh - add edx,eax - mov [ebx+8],edx - mov [ebx+0Ch],edx - mov eax,edx - xor edx,edx - not eax - not edx - add eax,1 - adc edx,0 - add eax,edi - adc edx,0 - mov dword [org_origin],eax - mov dword [org_origin+4],edx - mov [org_registers],0 - mov [org_start],edi - inc [number_of_sections] - jmp instruction_assembled - close_elf_exe_section: - cmp [number_of_sections],0 - jne finish_elf_exe_section - cmp edi,[symbols_stream] - jne first_elf_exe_section_ok - push edi - mov edi,[code_start] - add edi,34h - mov ecx,20h shr 2 - xor eax,eax - rep stos dword [edi] - pop edi - mov eax,[image_base] - ret - first_elf_exe_section_ok: - inc [number_of_sections] - finish_elf_exe_section: - mov ebx,[number_of_sections] - dec ebx - shl ebx,5 - add ebx,[code_start] - add ebx,34h - mov eax,edi - sub eax,[code_start] - sub eax,[ebx+4] - mov edx,edi - cmp edi,[undefined_data_end] - jne elf_exe_section_size_ok - mov edi,[undefined_data_start] - elf_exe_section_size_ok: - mov [ebx+14h],eax - add eax,edi - sub eax,edx - mov [ebx+10h],eax - mov eax,[ebx+8] - add eax,[ebx+14h] - add eax,0FFFh - and eax,not 0FFFh - ret - elf64_exe_section: - call close_elf64_exe_section - push eax edx - mov ebx,[number_of_sections] - imul ebx,38h - add ebx,[code_start] - add ebx,40h - cmp ebx,[symbols_stream] - jb new_elf64_exe_section - mov ebx,[symbols_stream] - sub ebx,38h - push edi - mov edi,ebx - mov ecx,38h shr 2 - xor eax,eax - rep stos dword [edi] - pop edi - or [next_pass_needed],-1 - new_elf64_exe_section: - mov byte [ebx],1 - mov word [ebx+30h],1000h - elf64_exe_section_flags: - cmp byte [esi],19h - jne elf64_exe_section_flags_ok - lods word [esi] - sub ah,28 - jbe invalid_argument - cmp ah,1 - je mark_elf64_exe_section_flag - cmp ah,3 - ja invalid_argument - xor ah,1 - cmp ah,2 - je mark_elf64_exe_section_flag - inc ah - mark_elf64_exe_section_flag: - test [ebx+4],ah - jnz setting_already_specified - or [ebx+4],ah - jmp elf64_exe_section_flags - elf64_exe_section_flags_ok: - mov ecx,edi - sub ecx,[code_start] - mov [ebx+8],ecx - pop edx eax - and ecx,0FFFh - add eax,ecx - adc edx,0 - mov [ebx+10h],eax - mov [ebx+10h+4],edx - mov [ebx+18h],eax - mov [ebx+18h+4],edx - not eax - not edx - add eax,1 - adc edx,0 - add eax,edi - adc edx,0 - mov dword [org_origin],eax - mov dword [org_origin+4],edx - mov [org_registers],0 - mov [org_start],edi - inc [number_of_sections] - jmp instruction_assembled - close_elf64_exe_section: - cmp [number_of_sections],0 - jne finish_elf64_exe_section - cmp edi,[symbols_stream] - jne first_elf64_exe_section_ok - push edi - mov edi,[code_start] - add edi,40h - mov ecx,38h shr 2 - xor eax,eax - rep stos dword [edi] - pop edi - mov eax,[image_base] - mov edx,[image_base_high] - ret - first_elf64_exe_section_ok: - inc [number_of_sections] - finish_elf64_exe_section: - mov ebx,[number_of_sections] - dec ebx - imul ebx,38h - add ebx,[code_start] - add ebx,40h - mov eax,edi - sub eax,[code_start] - sub eax,[ebx+8] - mov edx,edi - cmp edi,[undefined_data_end] - jne elf64_exe_section_size_ok - mov edi,[undefined_data_start] - elf64_exe_section_size_ok: - mov [ebx+28h],eax - add eax,edi - sub eax,edx - mov [ebx+20h],eax - mov eax,[ebx+10h] - mov edx,[ebx+10h+4] - add eax,[ebx+28h] - adc edx,0 - sub eax,1 - sbb edx,0 - shrd eax,edx,12 - shr edx,12 - add eax,1 - adc edx,0 - shld edx,eax,12 - shl eax,12 - ret -close_elf_exe: - test [format_flags],8 - jnz close_elf64_exe - call close_elf_exe_section - mov edx,[code_start] - mov eax,[number_of_sections] - mov byte [edx+1Ch],34h - mov [edx+2Ch],ax - shl eax,5 - add eax,edx - add eax,34h - cmp eax,[symbols_stream] - je elf_exe_ok - or [next_pass_needed],-1 - elf_exe_ok: - ret - close_elf64_exe: - call close_elf64_exe_section - mov edx,[code_start] - mov eax,[number_of_sections] - mov byte [edx+20h],40h - mov [edx+38h],ax - imul eax,38h - add eax,edx - add eax,40h - cmp eax,[symbols_stream] - je elf64_exe_ok - or [next_pass_needed],-1 - elf64_exe_ok: - ret - -formatter_symbols: - db 5,'align',1Ch,0 - db 6,'binary',18h,10h - db 4,'code',19h,5 - db 4,'coff',18h,40h - db 7,'console',1Bh,3 - db 4,'data',19h,6 - db 11,'discardable',19h,25 - db 3,'dll',1Bh,80h - db 3,'elf',18h,50h - db 5,'elf64',18h,58h - db 10,'executable',19h,29 - db 6,'export',1Ah,0 - db 6,'fixups',1Ah,5 - db 3,'gui',1Bh,2 - db 6,'import',1Ah,1 - db 2,'ms',17h,41h - db 4,'ms64',17h,49h - db 2,'mz',18h,20h - db 6,'native',1Bh,1 - db 11,'notpageable',19h,27 - db 2,'pe',18h,30h - db 4,'pe64',18h,38h - db 8,'readable',19h,30 - db 8,'resource',1Ah,2 - db 9,'shareable',19h,28 - db 3,'wdm',1Bh,81h - db 8,'writable',19h,31 - db 9,'writeable',19h,31 - db 0 diff --git a/programs/fasm/trunk/parser.inc b/programs/fasm/trunk/parser.inc deleted file mode 100644 index 437aae1d5f..0000000000 --- a/programs/fasm/trunk/parser.inc +++ /dev/null @@ -1,1022 +0,0 @@ - -; flat assembler core -; Copyright (c) 1999-2005, Tomasz Grysztar. -; All rights reserved. - -parser: - mov eax,[memory_end] - mov [labels_list],eax - mov eax,[additional_memory] - mov [free_additional_memory],eax - xor eax,eax - mov [current_locals_prefix],eax - mov [anonymous_reverse],eax - mov [anonymous_forward],eax - mov [hash_tree],eax - push [memory_end] - mov esi,[memory_start] - mov edi,[source_start] - parser_loop: - mov [current_line],esi - lea eax,[edi+100h] - cmp eax,[memory_end] - jae out_of_memory - cmp byte [esi+16],0 - je empty_line - mov al,0Fh - stos byte [edi] - mov eax,esi - stos dword [edi] - add esi,16 - call parse_line - parse_next_line: - cmp esi,[source_start] - jb parser_loop - xor al,al - stos byte [edi] - mov eax,[error_line] - mov [current_line],eax - cmp [anonymous_forward],0 - jne invalid_value - add edi,0Fh - and edi,not 0Fh - mov [code_start],edi - pop [memory_end] - ret - empty_line: - add esi,17 - jmp parse_next_line - -parse_line: - mov [parenthesis_stack],0 - instruction_start: - cmp byte [esi],1Ah - jne empty_instruction - push edi - add esi,2 - movzx ecx,byte [esi-1] - cmp byte [esi+ecx],':' - je simple_label - cmp byte [esi+ecx],'=' - je constant_label - cmp byte [esi+ecx],1Ah - jne get_main_instruction - push esi ecx - lea esi,[esi+ecx+2] - movzx ecx,byte [esi-1] - mov edi,data_directives - call get_symbol - jnc data_label - pop ecx esi - get_main_instruction: - call get_instruction - jnc parse_instruction - mov edi,data_directives - call get_symbol - jnc data_instruction - mov edi,symbols - call get_symbol - pop edi - jc unknown_instruction - stos word [edi] - jmp parse_arguments - data_instruction: - movzx ebx,ah - mov bx,[data_handlers+ebx*2] - jmp parse_instruction - unknown_instruction: - sub esi,2 - jmp parse_arguments - constant_label: - pop edi - call get_label_id - mov byte [edi],3 - inc edi - stos dword [edi] - xor al,al - stos byte [edi] - inc esi - jmp parse_arguments - data_label: - pop ecx ebx - pop edi - push eax esi - mov esi,ebx - movzx ecx,byte [esi-1] - call identify_label - mov byte [edi],2 - inc edi - stos dword [edi] - pop esi eax - stos byte [edi] - push edi - jmp data_instruction - simple_label: - pop edi - call identify_label - mov byte [edi],2 - inc edi - stos dword [edi] - inc esi - xor al,al - stos byte [edi] - jmp instruction_start - identify_label: - cmp byte [esi],'.' - je local_label_name - call get_label_id - cmp eax,10h - jb label_identified - or ebx,ebx - jz anonymous_label_name - dec ebx - mov [current_locals_prefix],ebx - label_identified: - ret - anonymous_label_name: - cmp byte [esi-1],'@' - je anonymous_label_name_ok - mov eax,0Fh - anonymous_label_name_ok: - ret - local_label_name: - call get_label_id - ret - parse_label_directive: - cmp byte [esi],1Ah - jne argument_parsed - inc esi - movzx ecx,byte [esi] - inc esi - mov al,2 - stos byte [edi] - call identify_label - stos dword [edi] - xor al,al - stos byte [edi] - jmp argument_parsed - parse_load_directive: - cmp byte [esi],1Ah - jne argument_parsed - inc esi - movzx ecx,byte [esi] - inc esi - mov al,2 - stos byte [edi] - call get_label_id - stos dword [edi] - xor al,al - stos byte [edi] - jmp argument_parsed - parse_prefix_instruction: - cmp byte [esi],1Ah - jne parse_arguments - push edi - inc esi - movzx ecx,byte [esi] - inc esi - jmp get_main_instruction - parse_instruction: - pop edi - mov dl,al - mov al,1 - stos byte [edi] - mov ax,bx - stos word [edi] - mov al,dl - stos byte [edi] - cmp bx,prefix_instruction-assembler - je parse_prefix_instruction - cmp bx,end_directive-assembler - je parse_prefix_instruction - cmp bx,label_directive-assembler - je parse_label_directive - cmp bx,segment_directive-assembler - je parse_label_directive - cmp bx,load_directive-assembler - je parse_load_directive - cmp bx,extrn_directive-assembler - je parse_extrn_directive - cmp bx,public_directive-assembler - je parse_public_directive - parse_arguments: - lods byte [esi] - cmp al,':' - je instruction_separator - cmp al,',' - je separator - cmp al,'=' - je separator - cmp al,'|' - je separator - cmp al,'&' - je separator - cmp al,'~' - je separator - cmp al,'>' - je greater - cmp al,'<' - je less - cmp al,')' - je close_parenthesis - or al,al - jz line_parsed - cmp al,'[' - je address_argument - cmp al,']' - je separator - cmp al,'{' - je unallowed_character - cmp al,'}' - je unallowed_character - cmp al,'#' - je unallowed_character - cmp al,'`' - je unallowed_character - dec esi - cmp al,1Ah - jne expression_argument - push edi - mov edi,directive_operators - call get_operator - or al,al - jnz operator_argument - inc esi - movzx ecx,byte [esi] - inc esi - mov edi,symbols - call get_symbol - jnc symbol_argument - mov edi,formatter_symbols - call get_symbol - jnc symbol_argument - cmp ecx,1 - jne check_argument - cmp byte [esi],'?' - jne check_argument - pop edi - movs byte [edi],[esi] - jmp argument_parsed - symbol_argument: - pop edi - stos word [edi] - jmp argument_parsed - operator_argument: - pop edi - cmp al,85h - je ptr_argument - stos byte [edi] - cmp al,80h - je forced_expression - cmp al,81h - je forced_parenthesis - cmp al,82h - je parse_from_operator - cmp al,89h - je parse_label_operator - jmp argument_parsed - parse_public_directive: - cmp byte [esi],1Ah - jne parse_arguments - inc esi - push esi - movzx ecx,byte [esi] - inc esi - mov al,2 - stos byte [edi] - call get_label_id - stos dword [edi] - mov ax,8600h - stos word [edi] - pop ebx - push ebx esi edi - mov edi,directive_operators - call get_operator - pop edi edx ebx - cmp al,86h - je argument_parsed - mov esi,edx - xchg esi,ebx - movzx ecx,byte [esi] - inc esi - mov ax,'(' - stos word [edi] - mov eax,ecx - stos dword [edi] - rep movs byte [edi],[esi] - xor al,al - stos byte [edi] - xchg esi,ebx - jmp argument_parsed - parse_extrn_directive: - cmp byte [esi],22h - je parse_quoted_extrn - cmp byte [esi],1Ah - jne parse_arguments - push esi - movzx ecx,byte [esi+1] - add esi,2 - mov ax,'(' - stos word [edi] - mov eax,ecx - stos dword [edi] - rep movs byte [edi],[esi] - mov ax,8600h - stos word [edi] - pop esi - parse_label_operator: - cmp byte [esi],1Ah - jne argument_parsed - inc esi - movzx ecx,byte [esi] - inc esi - mov al,2 - stos byte [edi] - call get_label_id - stos dword [edi] - xor al,al - stos byte [edi] - jmp argument_parsed - parse_from_operator: - cmp byte [esi],22h - jne forced_expression - jmp argument_parsed - parse_quoted_extrn: - inc esi - mov ax,'(' - stos word [edi] - lods dword [esi] - mov ecx,eax - stos dword [edi] - rep movs byte [edi],[esi] - xor al,al - stos byte [edi] - push esi edi - mov edi,directive_operators - call get_operator - mov edx,esi - pop edi esi - cmp al,86h - jne argument_parsed - stos byte [edi] - mov esi,edx - jmp parse_label_operator - ptr_argument: - call parse_address - jmp address_parsed - check_argument: - push esi ecx - sub esi,2 - mov edi,single_operand_operators - call get_operator - pop ecx esi - or al,al - jnz not_instruction - call get_instruction - jnc parse_instruction - mov edi,data_directives - call get_symbol - jnc data_instruction - not_instruction: - pop edi - sub esi,2 - expression_argument: - cmp byte [esi],22h - jne not_string - mov eax,[esi+1] - lea ebx,[esi+5+eax] - push ebx ecx esi edi - mov al,'(' - stos byte [edi] - call convert_expression - mov al,')' - stos byte [edi] - pop eax edx ecx ebx - cmp esi,ebx - jne expression_parsed - mov edi,eax - mov esi,edx - string_argument: - inc esi - mov ax,'(' - stos word [edi] - lods dword [esi] - mov ecx,eax - stos dword [edi] - shr ecx,1 - jnc string_movsb_ok - movs byte [edi],[esi] - string_movsb_ok: - shr ecx,1 - jnc string_movsw_ok - movs word [edi],[esi] - string_movsw_ok: - rep movs dword [edi],[esi] - xor al,al - stos byte [edi] - jmp expression_parsed - not_string: - cmp byte [esi],'(' - jne expression - mov eax,esp - sub eax,100h - jc stack_overflow - cmp eax,[stack_limit] - jb stack_overflow - push esi edi - inc esi - mov al,'{' - stos byte [edi] - inc [parenthesis_stack] - jmp parse_arguments - expression: - mov al,'(' - stos byte [edi] - call convert_expression - mov al,')' - stos byte [edi] - jmp expression_parsed - forced_expression: - mov al,'(' - stos byte [edi] - call convert_expression - mov al,')' - stos byte [edi] - jmp argument_parsed - address_argument: - call parse_address - lods byte [esi] - cmp al,']' - jne invalid_address - address_parsed: - mov al,']' - stos byte [edi] - jmp argument_parsed - parse_address: - mov al,'[' - stos byte [edi] - cmp word [esi],021Ah - jne convert_address - push esi - add esi,4 - lea ebx,[esi+1] - cmp byte [esi],':' - pop esi - jne convert_address - add esi,2 - mov ecx,2 - push ebx edi - mov edi,symbols - call get_symbol - pop edi esi - jc invalid_address - cmp al,10h - jne invalid_address - mov al,ah - and ah,11110000b - cmp ah,60h - jne invalid_address - stos byte [edi] - convert_address: - cmp byte [esi],1Ah - jne convert_expression - push esi - lods word [esi] - movzx ecx,ah - push edi - mov edi,address_sizes - call get_symbol - pop edi - jc no_size_prefix - mov al,ah - add al,70h - stos byte [edi] - add esp,4 - jmp convert_expression - no_size_prefix: - pop esi - jmp convert_expression - forced_parenthesis: - cmp byte [esi],'(' - jne argument_parsed - inc esi - mov al,'{' - jmp separator - unallowed_character: - mov al,0FFh - jmp separator - close_parenthesis: - mov al,'}' - separator: - stos byte [edi] - jmp argument_parsed - instruction_separator: - stos byte [edi] - jmp instruction_start - greater: - cmp byte [esi],'=' - jne separator - inc esi - mov al,0F2h - jmp separator - less: - cmp byte [edi-1],0F6h - je separator - cmp byte [esi],'>' - je not_equal - cmp byte [esi],'=' - jne separator - inc esi - mov al,0F3h - jmp separator - not_equal: - inc esi - mov al,0F1h - jmp separator - argument_parsed: - cmp [parenthesis_stack],0 - je parse_arguments - dec [parenthesis_stack] - add esp,8 - jmp argument_parsed - expression_parsed: - cmp [parenthesis_stack],0 - je parse_arguments - cmp byte [esi],')' - jne argument_parsed - dec [parenthesis_stack] - pop edi esi - jmp expression - empty_instruction: - lods byte [esi] - or al,al - jz line_parsed - cmp al,':' - je invalid_name - cmp al,3Bh - je skip_preprocessed_symbol - dec esi - jmp parse_arguments - skip_preprocessed_symbol: - lods byte [esi] - movzx eax,al - add esi,eax - skip_next: - lods byte [esi] - or al,al - jz line_parsed - cmp al,1Ah - je skip_preprocessed_symbol - cmp al,3Bh - je skip_preprocessed_symbol - cmp al,22h - je skip_preprocessed_string - jmp skip_next - skip_preprocessed_string: - lods dword [esi] - add esi,eax - jmp skip_next - line_parsed: - cmp [parenthesis_stack],0 - jne invalid_expression - ret - -get_operator: - cmp byte [esi],1Ah - jne get_simple_operator - mov edx,esi - push ebp - inc esi - lods byte [esi] - movzx ebp,al - push edi - mov ecx,ebp - call lower_case - pop edi - check_operator: - mov esi,converted - movzx ecx,byte [edi] - jecxz no_operator - inc edi - mov ebx,edi - add ebx,ecx - cmp ecx,ebp - jne next_operator - repe cmps byte [esi],[edi] - je operator_found - next_operator: - mov edi,ebx - inc edi - jmp check_operator - no_operator: - mov esi,edx - mov ecx,ebp - pop ebp - no_simple_operator: - xor al,al - ret - operator_found: - lea esi,[edx+2+ebp] - mov ecx,ebp - pop ebp - mov al,[edi] - ret - get_simple_operator: - mov al,[esi] - cmp al,22h - je no_simple_operator - simple_operator: - cmp byte [edi],1 - jb no_simple_operator - ja simple_next_operator - cmp al,[edi+1] - je simple_operator_found - simple_next_operator: - movzx ecx,byte [edi] - lea edi,[edi+1+ecx+1] - jmp simple_operator - simple_operator_found: - inc esi - mov al,[edi+2] - ret - - -get_symbol: - mov edx,esi - mov ebp,ecx - push edi - call lower_case - pop edi - scan_symbols: - mov esi,converted - movzx eax,byte [edi] - or al,al - jz no_symbol - mov ecx,ebp - inc edi - mov ebx,edi - add ebx,eax - mov ah,[esi] - cmp ah,[edi] - jb no_symbol - ja next_symbol - cmp cl,al - jne next_symbol - repe cmps byte [esi],[edi] - jb no_symbol - je symbol_ok - next_symbol: - mov edi,ebx - add edi,2 - jmp scan_symbols - no_symbol: - mov esi,edx - mov ecx,ebp - stc - ret - symbol_ok: - lea esi,[edx+ebp] - mov ax,[ebx] - clc - ret - -get_instruction: - mov edx,esi - mov ebp,ecx - call lower_case - mov ecx,ebp - cmp cl,11 - ja no_instruction - sub cl,2 - jc no_instruction - movzx edi,word [instructions+ecx*2] - add edi,instructions - scan_instructions: - mov esi,converted - mov al,[edi] - or al,al - jz no_instruction - mov ecx,ebp - mov ebx,edi - add ebx,ecx - repe cmps byte [esi],[edi] - jb no_instruction - je instruction_ok - next_instruction: - mov edi,ebx - add edi,3 - jmp scan_instructions - no_instruction: - mov esi,edx - mov ecx,ebp - stc - ret - lower_case: - mov edi,converted - mov ebx,characters - convert_case: - lods byte [esi] - xlat byte [ebx] - stos byte [edi] - loop convert_case - case_ok: - ret - instruction_ok: - lea esi,[edx+ebp] - mov al,[ebx] - mov bx,[ebx+1] - clc - ret - -get_label_id: - cmp ecx,100h - jae name_too_long - cmp byte [esi],'@' - je anonymous_label - cmp byte [esi],'.' - jne standard_label - cmp byte [esi+1],'.' - je standard_label - cmp [current_locals_prefix],0 - je standard_label - push edi - mov edi,[memory_end] - sub edi,2 - sub edi,ecx - push ecx esi - mov esi,[current_locals_prefix] - lods byte [esi] - movzx ecx,al - sub edi,ecx - cmp edi,[esp+8] - jb out_of_memory - mov [memory_end],edi - mov word [edi],0 - add edi,2 - mov ebx,edi - rep movs byte [edi],[esi] - pop esi ecx - add al,cl - jc name_too_long - rep movs byte [edi],[esi] - pop edi - push esi - movzx ecx,al - mov byte [ebx-1],al - mov esi,ebx - call get_label_id - pop esi - ret - anonymous_label: - cmp ecx,2 - jne standard_label - mov al,[esi+1] - mov ebx,characters - xlat byte [ebx] - cmp al,'@' - je new_anonymous - cmp al,'b' - je anonymous_back - cmp al,'r' - je anonymous_back - cmp al,'f' - jne standard_label - add esi,2 - mov eax,[anonymous_forward] - or eax,eax - jnz anonymous_ok - mov eax,[current_line] - mov [error_line],eax - mov eax,[labels_list] - sub eax,24 - mov [labels_list],eax - mov [anonymous_forward],eax - anonymous_ok: - xor ebx,ebx - ret - anonymous_back: - add esi,2 - mov eax,[anonymous_reverse] - or eax,eax - jz invalid_value - jmp anonymous_ok - new_anonymous: - add esi,2 - mov eax,[anonymous_forward] - or eax,eax - jnz new_anonymous_ok - mov eax,[labels_list] - sub eax,24 - mov [labels_list],eax - new_anonymous_ok: - mov [anonymous_reverse],eax - mov [anonymous_forward],0 - jmp anonymous_ok - standard_label: - cmp byte [esi],'%' - je get_predefined_id - cmp byte [esi],'$' - jne find_label - cmp ecx,2 - ja find_label - inc esi - jb get_current_offset_id - inc esi - cmp byte [esi-1],'$' - je get_org_origin_id - sub esi,ecx - jmp find_label - get_current_offset_id: - xor eax,eax - ret - get_counter_id: - mov eax,1 - ret - get_timestamp_id: - mov eax,2 - ret - get_org_origin_id: - mov eax,3 - ret - get_predefined_id: - cmp ecx,2 - ja find_label - inc esi - cmp cl,1 - je get_counter_id - lods byte [esi] - mov ebx,characters - xlat [ebx] - cmp al,'t' - je get_timestamp_id - sub esi,2 - find_label: - xor ebx,ebx - mov eax,2166136261 - mov ebp,16777619 - hash_label: - xor al,[esi+ebx] - mul ebp - inc bl - cmp bl,cl - jb hash_label - mov ebp,eax - shl eax,8 - and ebp,0FFh shl 24 - xor ebp,eax - or ebp,ebx - mov [label_hash],ebp - push edi esi - push ecx - mov ecx,32 - mov ebx,hash_tree - follow_tree: - mov edx,[ebx] - or edx,edx - jz extend_tree - xor eax,eax - shl ebp,1 - adc eax,0 - lea ebx,[edx+eax*4] - dec ecx - jnz follow_tree - mov [label_leaf],ebx - pop edx - mov eax,[ebx] - or eax,eax - jz add_label - mov ebx,esi - mov ebp,[label_hash] - compare_labels: - mov esi,ebx - mov ecx,edx - mov edi,[eax+4] - repe cmps byte [esi],[edi] - je label_found - mov eax,[eax] - or eax,eax - jnz compare_labels - jmp add_label - label_found: - add esp,4 - pop edi - mov ebx,[eax+4] - mov eax,[eax+8] - ret - extend_tree: - mov edx,[free_additional_memory] - lea eax,[edx+8] - cmp eax,[additional_memory_end] - ja out_of_memory - mov [free_additional_memory],eax - xor eax,eax - mov [edx],eax - mov [edx+4],eax - shl ebp,1 - adc eax,0 - mov [ebx],edx - lea ebx,[edx+eax*4] - dec ecx - jnz extend_tree - mov [label_leaf],ebx - pop edx - add_label: - mov ecx,edx - pop esi - cmp byte [esi-2],0 - je label_name_ok - mov al,[esi] - cmp al,30h - jb name_first_char_ok - cmp al,39h - jbe invalid_name - name_first_char_ok: - cmp ecx,1 - jne check_for_reserved_word - cmp al,'$' - je reserved_word - check_for_reserved_word: - call get_instruction - jnc reserved_word - mov edi,data_directives - call get_symbol - jnc reserved_word - mov edi,symbols - call get_symbol - jnc reserved_word - mov edi,formatter_symbols - call get_symbol - jnc reserved_word - sub esi,2 - mov edi,operators - call get_operator - or al,al - jnz reserved_word - mov edi,single_operand_operators - call get_operator - or al,al - jnz reserved_word - mov edi,directive_operators - call get_operator - or al,al - jnz reserved_word - inc esi - movzx ecx,byte [esi] - inc esi - label_name_ok: - mov edx,[free_additional_memory] - lea eax,[edx+12] - cmp eax,[additional_memory_end] - ja out_of_memory - mov [free_additional_memory],eax - mov [edx+4],esi - mov ebx,esi - add esi,ecx - mov eax,[label_leaf] - mov edi,[eax] - mov [edx],edi - mov [eax],edx - mov eax,[labels_list] - sub eax,24 - mov [labels_list],eax - mov [edx+8],eax - pop edi - ret - reserved_word: - mov eax,0Fh - pop edi - ret - -operators: - db 1,'+',80h - db 1,'-',81h - db 1,'*',90h - db 1,'/',91h - db 3,'mod',0A0h - db 3,'and',0B0h - db 2,'or',0B1h - db 3,'xor',0B2h - db 3,'shl',0C0h - db 3,'shr',0C1h - db 0 - -single_operand_operators: - db 1,'+',0 - db 1,'-',0D1h - db 3,'not',0D0h - db 3,'rva',0E0h - db 0 - -directive_operators: - db 2,'as',86h - db 2,'at',80h - db 7,'defined',88h - db 3,'dup',81h - db 2,'eq',0F0h - db 6,'eqtype',0F7h - db 4,'from',82h - db 2,'in',0F6h - db 2,'on',84h - db 3,'ptr',85h - db 4,'used',89h - db 0 diff --git a/programs/fasm/trunk/preproce.inc b/programs/fasm/trunk/preproce.inc deleted file mode 100644 index c63ce26b04..0000000000 --- a/programs/fasm/trunk/preproce.inc +++ /dev/null @@ -1,2422 +0,0 @@ - -; flat assembler core -; Copyright (c) 1999-2005, Tomasz Grysztar. -; All rights reserved. - -preprocessor: - mov edi,characters - mov ecx,100h - xor al,al - make_characters_table: - stosb - inc al - loop make_characters_table - mov esi,characters+'a' - mov edi,characters+'A' - mov ecx,26 - rep movsb - mov edi,characters - mov esi,symbol_characters+1 - movzx ecx,byte [esi-1] - xor eax,eax - mark_symbol_characters: - lodsb - mov byte [edi+eax],0 - loop mark_symbol_characters - mov edi,locals_counter - mov al,7 - stos byte [edi] - movzx ecx,al - mov al,'0' - rep stos byte [edi] - mov edi,[memory_start] - mov [include_paths],edi - mov esi,include_variable - call get_environment_variable - xor al,al - stosb - mov [memory_start],edi - mov eax,[additional_memory] - mov [free_additional_memory],eax - mov eax,[additional_memory_end] - mov [labels_list],eax - xor eax,eax - mov [display_buffer],eax - mov [hash_tree],eax - mov [macro_status],al - mov esi,[input_file] - mov edx,esi - call open - jc main_file_not_found - mov edi,[memory_start] - call preprocess_file - mov eax,[error_line] - mov [current_line],eax - cmp [macro_status],0 - jne incomplete_macro - mov [source_start],edi - ret - -preprocess_file: - push [memory_end] - push esi - mov al,2 - xor edx,edx - call lseek - push eax - xor al,al - xor edx,edx - call lseek - pop ecx - mov edx,[memory_end] - dec edx - mov byte [edx],1Ah - sub edx,ecx - jc out_of_memory - mov esi,edx - cmp edx,edi - jbe out_of_memory - mov [memory_end],edx - call read - call close - pop edx - xor ecx,ecx - mov ebx,esi - preprocess_source: - inc ecx - mov [current_line],edi - mov eax,edx - stos dword [edi] - mov eax,ecx - stos dword [edi] - mov eax,esi - sub eax,ebx - stos dword [edi] - xor eax,eax - stos dword [edi] - push ebx edx - call convert_line - call preprocess_line - pop edx ebx - next_line: - cmp byte [esi-1],1Ah - jne preprocess_source - file_end: - pop [memory_end] - clc - ret - -convert_line: - push ecx - test [macro_status],0Fh - jz convert_line_data - mov ax,3Bh - stos word [edi] - convert_line_data: - cmp edi,[memory_end] - jae out_of_memory - lods byte [esi] - cmp al,20h - je convert_line_data - cmp al,9 - je convert_line_data - mov ah,al - mov ebx,characters - xlat byte [ebx] - or al,al - jz convert_separator - cmp ah,27h - je convert_string - cmp ah,22h - je convert_string - mov byte [edi],1Ah - scas word [edi] - xchg al,ah - stos byte [edi] - mov ebx,characters - xor ecx,ecx - convert_symbol: - lods byte [esi] - stos byte [edi] - xlat byte [ebx] - or al,al - loopnzd convert_symbol - neg ecx - cmp ecx,255 - ja name_too_long - mov ebx,edi - sub ebx,ecx - mov byte [ebx-2],cl - found_separator: - dec edi - mov ah,[esi-1] - convert_separator: - xchg al,ah - cmp al,20h - jb control_character - je convert_line_data - symbol_character: - cmp al,3Bh - je ignore_comment - cmp al,5Ch - je backslash_character - stos byte [edi] - jmp convert_line_data - control_character: - cmp al,1Ah - je line_end - cmp al,0Dh - je cr_character - cmp al,0Ah - je lf_character - cmp al,9 - je convert_line_data - or al,al - jnz symbol_character - jmp line_end - lf_character: - lods byte [esi] - cmp al,0Dh - je line_end - dec esi - jmp line_end - cr_character: - lods byte [esi] - cmp al,0Ah - je line_end - dec esi - jmp line_end - convert_string: - mov al,22h - stos byte [edi] - scas dword [edi] - mov ebx,edi - copy_string: - lods byte [esi] - stos byte [edi] - cmp al,0Ah - je missing_end_quote - cmp al,0Dh - je missing_end_quote - or al,al - jz missing_end_quote - cmp al,1Ah - je missing_end_quote - cmp al,ah - jne copy_string - lods byte [esi] - cmp al,ah - je copy_string - dec esi - dec edi - mov eax,edi - sub eax,ebx - mov [ebx-4],eax - jmp convert_line_data - backslash_character: - mov byte [edi],0 - lods byte [esi] - cmp al,20h - je concatenate_lines - cmp al,9 - je concatenate_lines - cmp al,1Ah - je unexpected_end_of_file - cmp al,0Ah - je concatenate_lf - cmp al,0Dh - je concatenate_cr - cmp al,3Bh - je find_concatenated_line - mov al,1Ah - stos byte [edi] - mov ecx,edi - mov ax,5C01h - stos word [edi] - dec esi - group_backslashes: - lods byte [esi] - cmp al,5Ch - jne backslashed_symbol - stos byte [edi] - inc byte [ecx] - jmp group_backslashes - backslashed_symbol: - cmp al,1Ah - je unexpected_end_of_file - cmp al,0Ah - je extra_characters_on_line - cmp al,0Dh - je extra_characters_on_line - cmp al,20h - je extra_characters_on_line - cmp al,9 - je extra_characters_on_line - cmp al,22h - je extra_characters_on_line - cmp al,27h - je extra_characters_on_line - cmp al,3Bh - je extra_characters_on_line - mov ah,al - mov ebx,characters - xlat byte [ebx] - or al,al - jz backslashed_symbol_character - mov al,ah - convert_backslashed_symbol: - stos byte [edi] - xlat byte [ebx] - or al,al - jz found_separator - inc byte [ecx] - jz name_too_long - lods byte [esi] - jmp convert_backslashed_symbol - backslashed_symbol_character: - mov al,ah - stos byte [edi] - inc byte [ecx] - jmp convert_line_data - concatenate_lines: - lods byte [esi] - cmp al,20h - je concatenate_lines - cmp al,9 - je concatenate_lines - cmp al,1Ah - je unexpected_end_of_file - cmp al,0Ah - je concatenate_lf - cmp al,0Dh - je concatenate_cr - cmp al,3Bh - jne extra_characters_on_line - find_concatenated_line: - lods byte [esi] - cmp al,0Ah - je concatenate_lf - cmp al,0Dh - je concatenate_cr - or al,al - jz concatenate_ok - cmp al,1Ah - jne find_concatenated_line - jmp unexpected_end_of_file - concatenate_lf: - lods byte [esi] - cmp al,0Dh - je concatenate_ok - dec esi - jmp concatenate_ok - concatenate_cr: - lods byte [esi] - cmp al,0Ah - je concatenate_ok - dec esi - concatenate_ok: - inc dword [esp] - jmp convert_line_data - ignore_comment: - lods byte [esi] - cmp al,0Ah - je lf_character - cmp al,0Dh - je cr_character - or al,al - jz line_end - cmp al,1Ah - jne ignore_comment - line_end: - xor al,al - stos byte [edi] - pop ecx - ret - -preprocess_line: - mov eax,esp - sub eax,100h - jc stack_overflow - cmp eax,[stack_limit] - jb stack_overflow - push ecx esi - preprocess_current_line: - mov esi,[current_line] - add esi,16 - cmp word [esi],3Bh - jne line_start_ok - add esi,2 - line_start_ok: - test [macro_status],0F0h - jnz macro_preprocessing - cmp byte [esi],1Ah - jne not_fix_constant - movzx edx,byte [esi+1] - lea edx,[esi+2+edx] - cmp word [edx],031Ah - jne not_fix_constant - mov ebx,characters - movzx eax,byte [edx+2] - xlat byte [ebx] - ror eax,8 - mov al,[edx+3] - xlat byte [ebx] - ror eax,8 - mov al,[edx+4] - xlat byte [ebx] - ror eax,16 - cmp eax,'fix' - je define_fix_constant - not_fix_constant: - call process_fix_constants - jmp initial_preprocessing_ok - macro_preprocessing: - call process_macro_operators - initial_preprocessing_ok: - mov esi,[current_line] - add esi,16 - mov al,[macro_status] - test al,2 - jnz skip_macro_block - test al,1 - jnz find_macro_block - preprocess_instruction: - mov [current_offset],esi - lods byte [esi] - movzx ecx,byte [esi] - inc esi - cmp al,1Ah - jne not_preprocessor_symbol - cmp cl,3 - jb not_preprocessor_directive - push edi - mov edi,preprocessor_directives - call get_symbol - pop edi - jc not_preprocessor_directive - mov byte [edx-2],3Bh - movzx ebx,ax - add ebx,preprocessor - jmp near ebx - not_preprocessor_directive: - xor ch,ch - call get_preprocessor_symbol - jc not_macro - mov byte [ebx-2],3Bh - mov [struc_name],0 - jmp use_macro - not_macro: - mov [struc_name],esi - add esi,ecx - lods byte [esi] - cmp al,':' - je preprocess_label - cmp al,1Ah - jne not_preprocessor_symbol - lods byte [esi] - cmp al,3 - jne not_symbolic_constant - mov ebx,characters - movzx eax,byte [esi] - xlat byte [ebx] - ror eax,8 - mov al,[esi+1] - xlat byte [ebx] - ror eax,8 - mov al,[esi+2] - xlat byte [ebx] - ror eax,16 - cmp eax,'equ' - je define_equ_constant - mov al,3 - not_symbolic_constant: - mov ch,1 - mov cl,al - call get_preprocessor_symbol - jc not_preprocessor_symbol - push edx esi - mov esi,[struc_name] - mov [struc_label],esi - sub [struc_label],2 - mov cl,[esi-1] - mov ch,10b - call get_preprocessor_symbol - jc struc_name_ok - mov ecx,[edx+12] - add ecx,3 - lea ebx,[edi+ecx] - mov ecx,edi - sub ecx,[struc_label] - lea esi,[edi-1] - lea edi,[ebx-1] - std - rep movs byte [edi],[esi] - cld - mov edi,[struc_label] - mov esi,[edx+8] - mov ecx,[edx+12] - add [struc_name],ecx - add [struc_name],3 - call move_data - mov al,3Ah - stos byte [edi] - mov ax,3Bh - stos word [edi] - mov edi,ebx - pop esi - add esi,[edx+12] - add esi,3 - pop edx - jmp use_macro - struc_name_ok: - mov edx,[struc_name] - movzx eax,byte [edx-1] - add edx,eax - mov al,3Ah - mov [edx],al - inc al - xchg al,[edx+1] - dec al - mov [edx+2],al - pop esi edx - jmp use_macro - preprocess_label: - dec esi - sub esi,ecx - lea ebp,[esi-2] - mov ch,10b - call get_preprocessor_symbol - jnc symbolic_constant_in_label - lea esi,[esi+ecx+1] - jmp preprocess_instruction - symbolic_constant_in_label: - mov ebx,[edx+8] - mov ecx,[edx+12] - add ecx,ebx - check_for_broken_label: - cmp ebx,ecx - je label_broken - cmp byte [ebx],1Ah - jne label_broken - movzx eax,byte [ebx+1] - lea ebx,[ebx+2+eax] - cmp ebx,ecx - je label_constant_ok - cmp byte [ebx],':' - jne label_broken - inc ebx - jmp check_for_broken_label - label_broken: - push line_preprocessed - jmp replace_symbolic_constant - label_constant_ok: - mov ecx,edi - sub ecx,esi - mov edi,[edx+12] - add edi,ebp - push edi - lea eax,[edi+ecx] - push eax - cmp esi,edi - je replace_label - jb move_rest_of_line_up - rep movs byte [edi],[esi] - jmp replace_label - move_rest_of_line_up: - lea esi,[esi+ecx-1] - lea edi,[edi+ecx-1] - std - rep movs byte [edi],[esi] - cld - replace_label: - mov ecx,[edx+12] - mov edi,[esp+4] - sub edi,ecx - mov esi,[edx+8] - rep movs byte [edi],[esi] - pop edi esi - inc esi - jmp preprocess_instruction - not_preprocessor_symbol: - mov esi,[current_offset] - call process_equ_constants - line_preprocessed: - pop esi ecx - ret - -get_preprocessor_symbol: - push ebp edi esi - mov ebp,ecx - shl ebp,22 - movzx ecx,cl - mov ebx,hash_tree - mov edi,10 - follow_hashes_roots: - mov edx,[ebx] - or edx,edx - jz preprocessor_symbol_not_found - xor eax,eax - shl ebp,1 - adc eax,0 - lea ebx,[edx+eax*4] - dec edi - jnz follow_hashes_roots - mov edi,ebx - call calculate_hash - mov ebp,eax - and ebp,3FFh - shl ebp,10 - xor ebp,eax - mov ebx,edi - mov edi,22 - follow_hashes_tree: - mov edx,[ebx] - or edx,edx - jz preprocessor_symbol_not_found - xor eax,eax - shl ebp,1 - adc eax,0 - lea ebx,[edx+eax*4] - dec edi - jnz follow_hashes_tree - mov al,cl - mov edx,[ebx] - or edx,edx - jz preprocessor_symbol_not_found - compare_with_preprocessor_symbol: - mov edi,[edx+4] - cmp edi,1 - jbe next_equal_hash - repe cmps byte [esi],[edi] - je preprocessor_symbol_found - mov cl,al - mov esi,[esp] - next_equal_hash: - mov edx,[edx] - or edx,edx - jnz compare_with_preprocessor_symbol - preprocessor_symbol_not_found: - pop esi edi ebp - stc - ret - preprocessor_symbol_found: - pop ebx edi ebp - clc - ret - calculate_hash: - xor ebx,ebx - mov eax,2166136261 - mov ebp,16777619 - fnv1a_hash: - xor al,[esi+ebx] - mul ebp - inc bl - cmp bl,cl - jb fnv1a_hash - ret -add_preprocessor_symbol: - push edi esi - call calculate_hash - mov ebp,eax - and ebp,3FFh - shr eax,10 - xor ebp,eax - shl ecx,22 - or ebp,ecx - mov ebx,hash_tree - mov ecx,32 - find_leave_for_symbol: - mov edx,[ebx] - or edx,edx - jz extend_hashes_tree - xor eax,eax - rol ebp,1 - adc eax,0 - lea ebx,[edx+eax*4] - dec ecx - jnz find_leave_for_symbol - mov edx,[ebx] - or edx,edx - jz add_symbol_entry - shr ebp,30 - cmp ebp,11b - je reuse_symbol_entry - cmp dword [edx+4],0 - jne add_symbol_entry - find_entry_to_reuse: - mov edi,[edx] - or edi,edi - jz reuse_symbol_entry - cmp dword [edi+4],0 - jne reuse_symbol_entry - mov edx,edi - jmp find_entry_to_reuse - add_symbol_entry: - mov eax,edx - mov edx,[labels_list] - sub edx,16 - cmp edx,[free_additional_memory] - jb out_of_memory - mov [labels_list],edx - mov [edx],eax - mov [ebx],edx - reuse_symbol_entry: - pop esi edi - mov [edx+4],esi - ret - extend_hashes_tree: - mov edx,[labels_list] - sub edx,8 - cmp edx,[free_additional_memory] - jb out_of_memory - mov [labels_list],edx - xor eax,eax - mov [edx],eax - mov [edx+4],eax - shl ebp,1 - adc eax,0 - mov [ebx],edx - lea ebx,[edx+eax*4] - dec ecx - jnz extend_hashes_tree - mov edx,[labels_list] - sub edx,16 - cmp edx,[free_additional_memory] - jb out_of_memory - mov [labels_list],edx - mov dword [edx],0 - mov [ebx],edx - pop esi edi - mov [edx+4],esi - ret - -define_fix_constant: - add edx,5 - add esi,2 - push edx esi - mov esi,edx - call process_fix_constants - xchg esi,[esp] - mov ch,11b - jmp define_symbolic_constant -define_equ_constant: - add esi,3 - push esi - call process_equ_constants - push esi - mov esi,[struc_name] - mov ch,10b - define_symbolic_constant: - mov byte [esi-2],3Bh - mov cl,[esi-1] - call add_preprocessor_symbol - pop esi ebx - mov ecx,edi - dec ecx - sub ecx,ebx - mov [edx+8],ebx - mov [edx+12],ecx - jmp line_preprocessed -define_struc: - mov ch,1 - jmp make_macro -define_macro: - xor ch,ch - make_macro: - lods byte [esi] - cmp al,1Ah - jne invalid_name - lods byte [esi] - mov cl,al - call add_preprocessor_symbol - mov eax,[current_line] - mov [edx+12],eax - movzx eax,byte [esi-1] - add esi,eax - mov [edx+8],esi - mov al,[macro_status] - and al,0F0h - or al,1 - mov [macro_status],al - mov eax,[current_line] - mov [error_line],eax - xor bl,bl - lods byte [esi] - or al,al - jz line_preprocessed - cmp al,'{' - je found_macro_block - dec esi - skip_macro_arguments: - lods byte [esi] - cmp al,1Ah - je skip_macro_argument - cmp al,'[' - jne invalid_macro_arguments - xor bl,-1 - jz invalid_macro_arguments - lods byte [esi] - cmp al,1Ah - jne invalid_macro_arguments - skip_macro_argument: - movzx eax,byte [esi] - inc esi - add esi,eax - lods byte [esi] - cmp al,'*' - jne macro_argument_end - lods byte [esi] - macro_argument_end: - cmp al,',' - je skip_macro_arguments - cmp al,']' - jne end_macro_arguments - lods byte [esi] - not bl - end_macro_arguments: - or bl,bl - jnz invalid_macro_arguments - or al,al - jz line_preprocessed - cmp al,'{' - je found_macro_block - jmp invalid_macro_arguments - find_macro_block: - add esi,2 - lods byte [esi] - or al,al - jz line_preprocessed - cmp al,'{' - jne unexpected_characters - found_macro_block: - or [macro_status],2 - skip_macro_block: - lods byte [esi] - cmp al,1Ah - je skip_macro_symbol - cmp al,3Bh - je skip_macro_symbol - cmp al,22h - je skip_macro_string - or al,al - jz line_preprocessed - cmp al,'}' - jne skip_macro_block - mov al,[macro_status] - and [macro_status],0F0h - test al,8 - jnz use_instant_macro - cmp byte [esi],0 - je line_preprocessed - mov ecx,edi - sub ecx,esi - mov edx,esi - lea esi,[esi+ecx-1] - lea edi,[edi+1+16] - mov ebx,edi - dec edi - std - rep movs byte [edi],[esi] - cld - mov edi,edx - xor al,al - stos byte [edi] - mov esi,[current_line] - mov [current_line],edi - mov ecx,4 - rep movs dword [edi],[esi] - mov edi,ebx - jmp preprocess_current_line - skip_macro_symbol: - movzx eax,byte [esi] - inc esi - add esi,eax - jmp skip_macro_block - skip_macro_string: - lods dword [esi] - add esi,eax - jmp skip_macro_block -rept_directive: - mov [base_code],0 - jmp define_instant_macro -irp_directive: - mov [base_code],1 - jmp define_instant_macro -irps_directive: - mov [base_code],2 - jmp define_instant_macro -match_directive: - mov [base_code],10h -define_instant_macro: - mov al,[macro_status] - and al,0F0h - or al,8+1 - mov [macro_status],al - mov eax,[current_line] - mov [error_line],eax - mov [instant_macro_start],esi - cmp [base_code],10h - je prepare_match - skip_parameters: - lods byte [esi] - or al,al - jz instant_macro_parameters_end - cmp al,'{' - je instant_macro_parameters_end - cmp al,22h - je skip_quoted_parameter - cmp al,1Ah - jne skip_parameters - lods byte [esi] - movzx eax,al - add esi,eax - jmp skip_parameters - skip_quoted_parameter: - lods dword [esi] - add esi,eax - jmp skip_parameters - instant_macro_parameters_end: - dec esi - mov [parameters_end],esi - lods byte [esi] - cmp al,'{' - je found_macro_block - or al,al - jnz invalid_macro_arguments - jmp line_preprocessed -prepare_match: - call skip_pattern - mov [value_type],80h+10b - call process_symbolic_constants - jmp instant_macro_parameters_end - skip_pattern: - lods byte [esi] - or al,al - jz invalid_macro_arguments - cmp al,',' - je pattern_skipped - cmp al,22h - je skip_quoted_string_in_pattern - cmp al,1Ah - je skip_symbol_in_pattern - cmp al,'=' - jne skip_pattern - mov al,[esi] - cmp al,1Ah - je skip_pattern - cmp al,22h - je skip_pattern - inc esi - jmp skip_pattern - skip_symbol_in_pattern: - lods byte [esi] - movzx eax,al - add esi,eax - jmp skip_pattern - skip_quoted_string_in_pattern: - lods dword [esi] - add esi,eax - jmp skip_pattern - pattern_skipped: - ret - -purge_macro: - xor ch,ch - jmp restore_preprocessor_symbol -purge_struc: - mov ch,1 - jmp restore_preprocessor_symbol -restore_equ_constant: - mov ch,10b - restore_preprocessor_symbol: - push ecx - lods byte [esi] - cmp al,1Ah - jne invalid_name - lods byte [esi] - mov cl,al - call get_preprocessor_symbol - jc no_symbol_to_restore - mov dword [edx+4],0 - jmp symbol_restored - no_symbol_to_restore: - add esi,ecx - symbol_restored: - pop ecx - lods byte [esi] - cmp al,',' - je restore_preprocessor_symbol - or al,al - jnz extra_characters_on_line - jmp line_preprocessed - -process_fix_constants: - mov [value_type],11b - jmp process_symbolic_constants -process_equ_constants: - mov [value_type],10b - process_symbolic_constants: - mov ebp,esi - lods byte [esi] - cmp al,1Ah - je check_symbol - cmp al,22h - je ignore_string - cmp al,'{' - je check_brace - or al,al - jnz process_symbolic_constants - ret - ignore_string: - lods dword [esi] - add esi,eax - jmp process_symbolic_constants - check_brace: - test [value_type],80h - jz process_symbolic_constants - ret - no_replacing: - movzx ecx,byte [esi-1] - add esi,ecx - jmp process_symbolic_constants - check_symbol: - mov cl,[esi] - inc esi - mov ch,[value_type] - call get_preprocessor_symbol - jc no_replacing - mov [current_section],edi - replace_symbolic_constant: - mov ecx,[edx+12] - mov edx,[edx+8] - xchg esi,edx - call move_data - mov esi,edx - process_after_replaced: - lods byte [esi] - cmp al,1Ah - je symbol_after_replaced - stos byte [edi] - cmp al,22h - je string_after_replaced - cmp al,'{' - je brace_after_replaced - or al,al - jnz process_after_replaced - mov ecx,edi - sub ecx,esi - mov edi,ebp - call move_data - mov esi,edi - ret - move_data: - shr ecx,1 - jnc movsb_ok - movs byte [edi],[esi] - movsb_ok: - shr ecx,1 - jnc movsw_ok - movs word [edi],[esi] - movsw_ok: - rep movs dword [edi],[esi] - ret - string_after_replaced: - lods dword [esi] - stos dword [edi] - mov ecx,eax - call move_data - jmp process_after_replaced - brace_after_replaced: - test [value_type],80h - jz process_after_replaced - mov edx,edi - mov ecx,[current_section] - sub edx,ecx - sub ecx,esi - rep movs byte [edi],[esi] - mov ecx,edi - sub ecx,esi - mov edi,ebp - call move_data - lea esi,[ebp+edx] - ret - symbol_after_replaced: - mov cl,[esi] - inc esi - mov ch,[value_type] - call get_preprocessor_symbol - jnc replace_symbolic_constant - movzx ecx,byte [esi-1] - mov al,1Ah - mov ah,cl - stos word [edi] - call move_data - jmp process_after_replaced -process_macro_operators: - xor dl,dl - mov ebp,edi - before_macro_operators: - mov edi,esi - lods byte [esi] - cmp al,'`' - je symbol_conversion - cmp al,'#' - je concatenation - cmp al,1Ah - je symbol_before_macro_operators - cmp al,3Bh - je no_more_macro_operators - cmp al,22h - je string_before_macro_operators - xor dl,dl - or al,al - jnz before_macro_operators - mov edi,esi - ret - no_more_macro_operators: - mov edi,ebp - ret - symbol_before_macro_operators: - mov dl,1Ah - mov ebx,esi - lods byte [esi] - movzx ecx,al - jecxz symbol_before_macro_operators_ok - mov edi,esi - cmp byte [esi],'\' - je escaped_symbol - symbol_before_macro_operators_ok: - add esi,ecx - jmp before_macro_operators - string_before_macro_operators: - mov dl,22h - mov ebx,esi - lods dword [esi] - add esi,eax - jmp before_macro_operators - escaped_symbol: - dec byte [edi-1] - dec ecx - inc esi - cmp ecx,1 - rep movs byte [edi],[esi] - jne after_macro_operators - mov al,[esi-1] - mov ecx,ebx - mov ebx,characters - xlat byte [ebx] - mov ebx,ecx - or al,al - jnz after_macro_operators - sub edi,3 - mov al,[esi-1] - stos byte [edi] - xor dl,dl - jmp after_macro_operators - symbol_conversion: - cmp byte [esi],1Ah - jne unexpected_characters - lea eax,[edi+3] - sub eax,esi - ja shift_line_data - mov al,22h - mov dl,al - stos byte [edi] - lods word [esi] - movzx eax,ah - mov ecx,eax - mov ebx,edi - stos dword [edi] - rep movs byte [edi],[esi] - cmp edi,esi - je before_macro_operators - jmp after_macro_operators - shift_line_data: - lea edx,[esi+2] - lea esi,[ebp-1] - add ebp,eax - lea edi,[ebp-1] - lea ecx,[esi+1] - sub ecx,edx - std - rep movs byte [edi],[esi] - cld - movzx eax,byte [edx-1] - sub edi,3 - mov dl,22h - mov [edi-1],dl - mov ebx,edi - mov [edi],eax - lea esi,[edi+4+eax] - jmp before_macro_operators - concatenation: - cmp byte [esi],'#' - je reduce_concatenation_symbol - cmp dl,1Ah - je symbol_concatenation - cmp dl,22h - je string_concatenation - no_concatenation: - cmp esi,edi - je before_macro_operators - jmp after_macro_operators - reduce_concatenation_symbol: - movs byte [edi],[esi] - cmp byte [esi],'#' - je reduce_concatenation_symbol - jmp no_concatenation - symbol_concatenation: - cmp byte [esi],1Ah - jne no_concatenation - inc esi - lods byte [esi] - movzx ecx,al - jecxz do_symbol_concatenation - cmp byte [esi],'\' - jne do_symbol_concatenation - sub esi,2 - jmp no_concatenation - do_symbol_concatenation: - add [ebx],al - jc name_too_long - rep movs byte [edi],[esi] - jmp after_macro_operators - string_concatenation: - cmp byte [esi],22h - je do_string_concatenation - cmp byte [esi],'`' - jne no_concatenation - inc esi - cmp byte [esi],1Ah - jne unexpected_characters - inc esi - lods byte [esi] - movzx ecx,al - add [ebx],ecx - rep movs byte [edi],[esi] - jmp after_macro_operators - do_string_concatenation: - inc esi - lods dword [esi] - mov ecx,eax - add [ebx],eax - rep movs byte [edi],[esi] - after_macro_operators: - lods byte [esi] - cmp al,'`' - je symbol_conversion - cmp al,'#' - je concatenation - stos byte [edi] - cmp al,1Ah - je symbol_after_macro_operators - cmp al,3Bh - je no_more_macro_operators - cmp al,22h - je string_after_macro_operators - xor dl,dl - or al,al - jnz after_macro_operators - ret - symbol_after_macro_operators: - mov dl,1Ah - mov ebx,edi - lods byte [esi] - stos byte [edi] - movzx ecx,al - jecxz symbol_after_macro_operatorss_ok - cmp byte [esi],'\' - je escaped_symbol - symbol_after_macro_operatorss_ok: - rep movs byte [edi],[esi] - jmp after_macro_operators - string_after_macro_operators: - mov dl,22h - mov ebx,edi - lods dword [esi] - stos dword [edi] - mov ecx,eax - rep movs byte [edi],[esi] - jmp after_macro_operators - -use_macro: - push [free_additional_memory] - push [macro_symbols] - mov [macro_symbols],0 - push [counter_limit] - push dword [edx+4] - mov dword [edx+4],1 - push edx - mov ebx,esi - mov esi,[edx+8] - mov eax,[edx+12] - mov [macro_line],eax - mov [counter_limit],0 - process_macro_arguments: - mov al,[esi] - or al,al - jz arguments_end - cmp al,'{' - je arguments_end - inc esi - cmp al,'[' - jne get_macro_arguments - mov ebp,esi - inc esi - inc [counter_limit] - get_macro_arguments: - call get_macro_argument - lods byte [esi] - cmp al,',' - je next_argument - cmp al,']' - je next_arguments_group - dec esi - jmp arguments_end - next_argument: - cmp byte [ebx],',' - jne process_macro_arguments - inc ebx - jmp process_macro_arguments - next_arguments_group: - cmp byte [ebx],',' - jne arguments_end - inc ebx - inc [counter_limit] - mov esi,ebp - jmp process_macro_arguments - get_macro_argument: - lods byte [esi] - movzx ecx,al - mov eax,[counter_limit] - call add_macro_symbol - add esi,ecx - xchg esi,ebx - mov [edx+12],esi - cmp byte [esi],'<' - jne simple_argument - inc esi - mov [edx+12],esi - mov ecx,1 - enclosed_argument: - lods byte [esi] - or al,al - jz invalid_macro_arguments - cmp al,1Ah - je enclosed_symbol - cmp al,22h - je enclosed_string - cmp al,'>' - je enclosed_argument_end - cmp al,'<' - jne enclosed_argument - inc ecx - jmp enclosed_argument - enclosed_symbol: - movzx eax,byte [esi] - inc esi - add esi,eax - jmp enclosed_argument - enclosed_string: - lods dword [esi] - add esi,eax - jmp enclosed_argument - enclosed_argument_end: - loop enclosed_argument - mov al,[esi] - or al,al - jz enclosed_argument_ok - cmp al,',' - jne invalid_macro_arguments - enclosed_argument_ok: - mov eax,esi - sub eax,[edx+12] - dec eax - or eax,80000000h - mov [edx+8],eax - jmp argument_value_ok - simple_argument: - lods byte [esi] - or al,al - jz argument_value_end - cmp al,',' - je argument_value_end - cmp al,22h - je argument_string - cmp al,1Ah - jne simple_argument - movzx eax,byte [esi] - inc esi - add esi,eax - jmp simple_argument - argument_string: - lods dword [esi] - add esi,eax - jmp simple_argument - argument_value_end: - dec esi - mov eax,esi - sub eax,[edx+12] - mov [edx+8],eax - argument_value_ok: - xchg esi,ebx - cmp byte [esi],'*' - jne macro_argument_ok - cmp dword [edx+8],0 - je invalid_macro_arguments - inc esi - macro_argument_ok: - ret - arguments_end: - cmp byte [ebx],0 - jne invalid_macro_arguments - mov eax,[esp+4] - dec eax - call process_macro - pop edx - pop dword [edx+4] - pop [counter_limit] - pop [macro_symbols] - pop [free_additional_memory] - jmp line_preprocessed -use_instant_macro: - push edi [current_line] esi - mov eax,[error_line] - mov [current_line],eax - mov [macro_line],eax - mov esi,[instant_macro_start] - cmp [base_code],10h - jae do_match - cmp [base_code],0 - jne do_irp - call get_number - jc invalid_value - or ebp,ebp - jnz invalid_value - cmp dword [edi+4],0 - jne value_out_of_range - mov eax,[edi] - or eax,eax - jz instant_macro_done - cmp eax,80000000h - jae value_out_of_range - push [free_additional_memory] - push [macro_symbols] - mov [macro_symbols],0 - push [counter_limit] - mov [struc_name],0 - mov [counter_limit],eax - lods byte [esi] - or al,al - jz rept_counters_ok - cmp al,'{' - je rept_counters_ok - cmp al,1Ah - jne invalid_macro_arguments - add_rept_counter: - lods byte [esi] - movzx ecx,al - xor eax,eax - call add_macro_symbol - add esi,ecx - xor eax,eax - mov dword [edx+12],eax - inc eax - mov dword [edx+8],eax - lods byte [esi] - cmp al,':' - jne rept_counter_added - push edx - call get_number - jc invalid_value - or ebp,ebp - jnz invalid_value - cmp dword [edi+4],0 - jne value_out_of_range - mov eax,[edi] - mov edx,eax - add edx,[counter_limit] - jc value_out_of_range - pop edx - mov dword [edx+8],eax - lods byte [esi] - rept_counter_added: - cmp al,',' - jne rept_counters_ok - lods byte [esi] - cmp al,1Ah - jne invalid_macro_arguments - jmp add_rept_counter - rept_counters_ok: - dec esi - instant_macro_parameters_ok: - xor eax,eax - call process_macro - pop [counter_limit] - pop [macro_symbols] - pop [free_additional_memory] - instant_macro_done: - pop ebx esi edx - cmp byte [ebx],0 - je line_preprocessed - mov [current_line],edi - mov ecx,4 - rep movs dword [edi],[esi] - test [macro_status],0Fh - jz instant_macro_attached_line - mov ax,3Bh - stos word [edi] - instant_macro_attached_line: - mov esi,ebx - sub edx,ebx - mov ecx,edx - call move_data - jmp preprocess_current_line -do_irp: - cmp byte [esi],1Ah - jne invalid_macro_arguments - movzx eax,byte [esi+1] - lea esi,[esi+2+eax] - lods byte [esi] - cmp [base_code],1 - ja irps_name_ok - cmp al,'*' - jne irp_name_ok - lods byte [esi] - irp_name_ok: - cmp al,',' - jne invalid_macro_arguments - jmp irp_parameters_start - irps_name_ok: - cmp al,',' - jne invalid_macro_arguments - mov al,[esi] - or al,al - jz instant_macro_done - cmp al,'{' - je instant_macro_done - irp_parameters_start: - xor eax,eax - push [free_additional_memory] - push [macro_symbols] - mov [macro_symbols],eax - push [counter_limit] - mov [counter_limit],eax - mov [struc_name],eax - mov ebx,esi - cmp [base_code],1 - ja get_irps_parameter - mov edx,[parameters_end] - mov al,[edx] - push eax - mov byte [edx],0 - get_irp_parameter: - inc [counter_limit] - mov esi,[instant_macro_start] - inc esi - call get_macro_argument - cmp byte [ebx],',' - jne irp_parameters_end - inc ebx - jmp get_irp_parameter - irp_parameters_end: - mov esi,ebx - pop eax - mov [esi],al - jmp instant_macro_parameters_ok - get_irps_parameter: - mov esi,[instant_macro_start] - inc esi - lods byte [esi] - movzx ecx,al - inc [counter_limit] - mov eax,[counter_limit] - call add_macro_symbol - mov [edx+12],ebx - cmp byte [ebx],1Ah - je irps_symbol - cmp byte [ebx],22h - je irps_quoted_string - mov eax,1 - jmp irps_parameter_ok - irps_quoted_string: - mov eax,[ebx+1] - add eax,1+4 - irps_symbol: - movzx eax,byte [ebx+1] - add eax,1+1 - irps_parameter_ok: - mov [edx+8],eax - add ebx,eax - cmp byte [ebx],0 - je irps_parameters_end - cmp byte [ebx],'{' - jne get_irps_parameter - irps_parameters_end: - mov esi,ebx - jmp instant_macro_parameters_ok -do_match: - mov ebx,esi - call skip_pattern - call exact_match - mov edx,edi - mov al,[ebx] - cmp al,1Ah - je free_match - cmp al,',' - jne instant_macro_done - cmp esi,[parameters_end] - je matched_pattern - jmp instant_macro_done - free_match: - add edx,12 - cmp edx,[memory_end] - ja out_of_memory - mov [edx-12],ebx - mov [edx-8],esi - call skip_match_element - jc try_different_matching - mov [edx-4],esi - movzx eax,byte [ebx+1] - lea ebx,[ebx+2+eax] - cmp byte [ebx],1Ah - je free_match - find_exact_match: - call exact_match - cmp esi,[parameters_end] - je end_matching - cmp byte [ebx],1Ah - je free_match - mov ebx,[edx-12] - movzx eax,byte [ebx+1] - lea ebx,[ebx+2+eax] - mov esi,[edx-4] - jmp match_more_elements - try_different_matching: - sub edx,12 - cmp edx,edi - je instant_macro_done - mov ebx,[edx-12] - movzx eax,byte [ebx+1] - lea ebx,[ebx+2+eax] - cmp byte [ebx],1Ah - je try_different_matching - mov esi,[edx-4] - match_more_elements: - call skip_match_element - jc try_different_matching - mov [edx-4],esi - jmp find_exact_match - skip_match_element: - cmp esi,[parameters_end] - je cannot_match - mov al,[esi] - cmp al,1Ah - je skip_match_symbol - cmp al,22h - je skip_match_quoted_string - add esi,1 - ret - skip_match_quoted_string: - mov eax,[esi+1] - add esi,5 - jmp skip_match_ok - skip_match_symbol: - movzx eax,byte [esi+1] - add esi,2 - skip_match_ok: - add esi,eax - ret - cannot_match: - stc - ret - exact_match: - cmp esi,[parameters_end] - je exact_match_complete - mov ah,[esi] - mov al,[ebx] - cmp al,',' - je exact_match_complete - cmp al,1Ah - je exact_match_complete - cmp al,'=' - je match_verbatim - call match_elements - je exact_match - exact_match_complete: - ret - match_verbatim: - inc ebx - call match_elements - je exact_match - dec ebx - ret - match_elements: - mov al,[ebx] - cmp al,1Ah - je match_symbols - cmp al,22h - je match_quoted_strings - cmp al,ah - je symbol_characters_matched - ret - symbol_characters_matched: - lea ebx,[ebx+1] - lea esi,[esi+1] - ret - match_quoted_strings: - mov ecx,[ebx+1] - add ecx,5 - jmp compare_elements - match_symbols: - movzx ecx,byte [ebx+1] - add ecx,2 - compare_elements: - mov eax,esi - mov ebp,edi - mov edi,ebx - repe cmps byte [esi],[edi] - jne elements_mismatch - mov ebx,edi - mov edi,ebp - ret - elements_mismatch: - mov esi,eax - mov edi,ebp - ret - end_matching: - cmp byte [ebx],',' - jne instant_macro_done - matched_pattern: - xor eax,eax - push [free_additional_memory] - push [macro_symbols] - mov [macro_symbols],eax - push [counter_limit] - mov [counter_limit],eax - mov [struc_name],eax - push esi edi edx - add_matched_symbol: - cmp edi,[esp] - je matched_symbols_ok - mov esi,[edi] - inc esi - lods byte [esi] - movzx ecx,al - xor eax,eax - call add_macro_symbol - mov eax,[edi+4] - mov dword [edx+12],eax - mov ecx,[edi+8] - sub ecx,eax - mov dword [edx+8],ecx - add edi,12 - jmp add_matched_symbol - matched_symbols_ok: - pop edx edi esi - jmp instant_macro_parameters_ok - -process_macro: - push dword [macro_status] - or [macro_status],10h - push [counter] - push [macro_block] - push [macro_block_line] - push [macro_block_line_number] - push [struc_label] - push [struc_name] - push eax - push [current_line] - lods byte [esi] - cmp al,'{' - je macro_instructions_start - or al,al - jnz unexpected_characters - find_macro_instructions: - mov [macro_line],esi - add esi,16+2 - lods byte [esi] - or al,al - jz find_macro_instructions - cmp al,'{' - je macro_instructions_start - cmp al,3Bh - jne unexpected_characters - call skip_foreign_symbol - jmp find_macro_instructions - macro_instructions_start: - mov ecx,80000000h - mov [macro_block],esi - mov eax,[macro_line] - mov [macro_block_line],eax - mov [macro_block_line_number],ecx - xor eax,eax - mov [counter],eax - cmp [counter_limit],eax - je process_macro_line - inc [counter] - process_macro_line: - mov [current_line],edi - cmp edi,[memory_end] - jae out_of_memory - mov eax,[esp+4] - or eax,eax - jz instant_macro_line_header - stos dword [edi] - mov eax,ecx - stos dword [edi] - mov eax,[esp] - stos dword [edi] - mov eax,[macro_line] - stos dword [edi] - jmp macro_line_header_ok - instant_macro_line_header: - mov edx,[macro_line] - mov eax,[edx] - stos dword [edi] - mov eax,[edx+4] - stos dword [edi] - mov eax,[edx+8] - stos dword [edi] - mov eax,[edx+12] - stos dword [edi] - macro_line_header_ok: - or [macro_status],20h - push ebx ecx - test [macro_status],0Fh - jz process_macro_line_element - mov ax,3Bh - stos word [edi] - process_macro_line_element: - lods byte [esi] - cmp al,'}' - je macro_line_processed - or al,al - jz macro_line_processed - cmp al,1Ah - je process_macro_symbol - cmp al,3Bh - je macro_foreign_line - and [macro_status],not 20h - stos byte [edi] - cmp al,22h - jne process_macro_line_element - copy_macro_string: - mov ecx,[esi] - add ecx,4 - rep movs byte [edi],[esi] - jmp process_macro_line_element - process_macro_symbol: - push esi edi - test [macro_status],20h - jz not_macro_directive - movzx ecx,byte [esi] - inc esi - mov edi,macro_directives - call get_symbol - jnc process_macro_directive - dec esi - jmp not_macro_directive - process_macro_directive: - movzx edx,ax - add edx,preprocessor - pop edi eax - mov byte [edi],0 - inc edi - pop ecx ebx - jmp near edx - not_macro_directive: - and [macro_status],not 20h - movzx ecx,byte [esi] - inc esi - mov eax,[counter] - call get_macro_symbol - jnc group_macro_symbol - xor eax,eax - cmp [counter],eax - je multiple_macro_symbol_values - call get_macro_symbol - jc not_macro_symbol - replace_macro_symbol: - pop edi eax - mov ecx,[edx+8] - and ecx,not 80000000h - mov edx,[edx+12] - or edx,edx - jz replace_macro_counter - xchg esi,edx - rep movs byte [edi],[esi] - mov esi,edx - jmp process_macro_line_element - group_macro_symbol: - xor eax,eax - cmp [counter],eax - je replace_macro_symbol - push esi edx - sub esi,ecx - call get_macro_symbol - mov ebx,edx - pop edx esi - jc replace_macro_symbol - cmp edx,ebx - ja replace_macro_symbol - mov edx,ebx - jmp replace_macro_symbol - multiple_macro_symbol_values: - inc eax - push eax - call get_macro_symbol - pop eax - jc not_macro_symbol - pop edi - push ecx - mov ecx,[edx+8] - mov edx,[edx+12] - xchg esi,edx - btr ecx,31 - jc enclose_macro_symbol_value - rep movs byte [edi],[esi] - jmp macro_symbol_value_ok - enclose_macro_symbol_value: - mov byte [edi],'<' - inc edi - rep movs byte [edi],[esi] - mov byte [edi],'>' - inc edi - macro_symbol_value_ok: - cmp eax,[counter_limit] - je multiple_macro_symbol_values_ok - mov byte [edi],',' - inc edi - mov esi,edx - pop ecx - push edi - sub esi,ecx - jmp multiple_macro_symbol_values - multiple_macro_symbol_values_ok: - pop ecx eax - mov esi,edx - jmp process_macro_line_element - replace_macro_counter: - mov eax,[counter] - and eax,not 80000000h - jz group_macro_counter - add ecx,eax - dec ecx - call store_number_symbol - jmp process_macro_line_element - group_macro_counter: - mov edx,ecx - xor ecx,ecx - multiple_macro_counter_values: - push ecx edx - add ecx,edx - call store_number_symbol - pop edx ecx - inc ecx - cmp ecx,[counter_limit] - je process_macro_line_element - mov byte [edi],',' - inc edi - jmp multiple_macro_counter_values - store_number_symbol: - mov ax,1Ah - stos word [edi] - push edi - mov eax,ecx - mov ecx,1000000000 - xor edx,edx - xor bl,bl - store_number_digits: - div ecx - push edx - or bl,bl - jnz store_number_digit - cmp ecx,1 - je store_number_digit - or al,al - jz number_digit_ok - not bl - store_number_digit: - add al,30h - stos byte [edi] - number_digit_ok: - mov eax,ecx - xor edx,edx - mov ecx,10 - div ecx - mov ecx,eax - pop eax - or ecx,ecx - jnz store_number_digits - pop ebx - mov eax,edi - sub eax,ebx - mov [ebx-1],al - ret - not_macro_symbol: - pop edi esi - mov al,1Ah - stos byte [edi] - mov al,[esi] - inc esi - stos byte [edi] - cmp byte [esi],'.' - jne copy_raw_symbol - mov ebx,[esp+8+8] - or ebx,ebx - jz copy_raw_symbol - cmp al,1 - je copy_struc_name - xchg esi,ebx - movzx ecx,byte [esi-1] - add [edi-1],cl - jc name_too_long - rep movs byte [edi],[esi] - xchg esi,ebx - copy_raw_symbol: - movzx ecx,al - rep movs byte [edi],[esi] - jmp process_macro_line_element - copy_struc_name: - inc esi - xchg esi,ebx - movzx ecx,byte [esi-1] - mov [edi-1],cl - rep movs byte [edi],[esi] - xchg esi,ebx - mov eax,[esp+8+12] - cmp byte [eax],3Bh - je process_macro_line_element - cmp byte [eax],1Ah - jne disable_replaced_struc_name - mov byte [eax],3Bh - jmp process_macro_line_element - disable_replaced_struc_name: - mov ebx,[esp+8+8] - push esi edi - lea edi,[ebx-3] - lea esi,[edi-2] - lea ecx,[esi+1] - sub ecx,eax - std - rep movs byte [edi],[esi] - cld - mov word [eax],3Bh - pop edi esi - jmp process_macro_line_element - skip_foreign_symbol: - lods byte [esi] - movzx eax,al - add esi,eax - skip_foreign_line: - lods byte [esi] - cmp al,1Ah - je skip_foreign_symbol - cmp al,3Bh - je skip_foreign_symbol - cmp al,22h - je skip_foreign_string - or al,al - jnz skip_foreign_line - ret - skip_foreign_string: - lods dword [esi] - add esi,eax - jmp skip_foreign_line - macro_foreign_line: - call skip_foreign_symbol - macro_line_processed: - mov byte [edi],0 - inc edi - push eax - call preprocess_line - pop eax - pop ecx ebx - cmp al,'}' - je macro_block_processed - process_next_line: - inc ecx - mov [macro_line],esi - add esi,16+2 - jmp process_macro_line - macro_block_processed: - call close_macro_block - jc process_macro_line - pop [current_line] - add esp,12 - pop [macro_block_line_number] - pop [macro_block_line] - pop [macro_block] - pop [counter] - pop eax - and al,0F0h - and [macro_status],0Fh - or [macro_status],al - ret - -local_symbols: - lods byte [esi] - cmp al,1Ah - jne invalid_argument - mov byte [edi-1],3Bh - xor al,al - stos byte [edi] - make_local_symbol: - push ecx - lods byte [esi] - movzx ecx,al - mov eax,[counter] - call add_macro_symbol - mov [edx+12],edi - movzx eax,[locals_counter] - add eax,ecx - inc eax - cmp eax,100h - jae name_too_long - lea ebp,[edi+2+eax] - cmp ebp,[memory_end] - jae out_of_memory - mov ah,al - mov al,1Ah - stos word [edi] - rep movs byte [edi],[esi] - mov al,'?' - stos byte [edi] - push esi - mov esi,locals_counter+1 - movzx ecx,[locals_counter] - rep movs byte [edi],[esi] - pop esi - mov eax,edi - sub eax,[edx+12] - mov [edx+8],eax - xor al,al - stos byte [edi] - mov eax,locals_counter - movzx ecx,byte [eax] - counter_loop: - inc byte [eax+ecx] - cmp byte [eax+ecx],':' - jb counter_ok - jne letter_digit - mov byte [eax+ecx],'A' - jmp counter_ok - letter_digit: - cmp byte [eax+ecx],'F' - jbe counter_ok - mov byte [eax+ecx],'0' - loop counter_loop - counter_ok: - pop ecx - lods byte [esi] - cmp al,'}' - je macro_block_processed - or al,al - jz process_next_line - cmp al,',' - jne extra_characters_on_line - dec edi - lods byte [esi] - cmp al,1Ah - je make_local_symbol - jmp invalid_argument -common_block: - call close_macro_block - jc process_macro_line - mov [counter],0 - jmp new_macro_block -forward_block: - cmp [counter_limit],0 - je common_block - call close_macro_block - jc process_macro_line - mov [counter],1 - jmp new_macro_block -reverse_block: - cmp [counter_limit],0 - je common_block - call close_macro_block - jc process_macro_line - mov eax,[counter_limit] - or eax,80000000h - mov [counter],eax - new_macro_block: - mov [macro_block],esi - mov eax,[macro_line] - mov [macro_block_line],eax - mov [macro_block_line_number],ecx - jmp process_macro_line -close_macro_block: - cmp [counter],0 - je block_closed - jl reverse_counter - mov eax,[counter] - cmp eax,[counter_limit] - je block_closed - inc [counter] - jmp continue_block - reverse_counter: - mov eax,[counter] - dec eax - cmp eax,80000000h - je block_closed - mov [counter],eax - continue_block: - mov esi,[macro_block] - mov eax,[macro_block_line] - mov [macro_line],eax - mov ecx,[macro_block_line_number] - stc - ret - block_closed: - clc - ret -get_macro_symbol: - push ecx - call find_macro_symbol_leaf - jc macro_symbol_not_found - mov edx,[ebx] - mov ebx,esi - try_macro_symbol: - or edx,edx - jz macro_symbol_not_found - mov ecx,[esp] - mov edi,[edx+4] - repe cmps byte [esi],[edi] - je macro_symbol_found - mov esi,ebx - mov edx,[edx] - jmp try_macro_symbol - macro_symbol_found: - pop ecx - clc - ret - macro_symbol_not_found: - pop ecx - stc - ret - find_macro_symbol_leaf: - shl eax,8 - mov al,cl - mov ebp,eax - mov ebx,macro_symbols - follow_macro_symbols_tree: - mov edx,[ebx] - or edx,edx - jz no_such_macro_symbol - xor eax,eax - shr ebp,1 - adc eax,0 - lea ebx,[edx+eax*4] - or ebp,ebp - jnz follow_macro_symbols_tree - add ebx,8 - clc - ret - no_such_macro_symbol: - stc - ret -add_macro_symbol: - push ebx ebp - call find_macro_symbol_leaf - jc extend_macro_symbol_tree - mov eax,[ebx] - make_macro_symbol: - mov edx,[free_additional_memory] - add edx,16 - cmp edx,[labels_list] - ja out_of_memory - xchg edx,[free_additional_memory] - mov [ebx],edx - mov [edx],eax - mov [edx+4],esi - pop ebp ebx - ret - extend_macro_symbol_tree: - mov edx,[free_additional_memory] - add edx,16 - cmp edx,[labels_list] - ja out_of_memory - xchg edx,[free_additional_memory] - xor eax,eax - mov [edx],eax - mov [edx+4],eax - mov [edx+8],eax - mov [edx+12],eax - shr ebp,1 - adc eax,0 - mov [ebx],edx - lea ebx,[edx+eax*4] - or ebp,ebp - jnz extend_macro_symbol_tree - add ebx,8 - xor eax,eax - jmp make_macro_symbol - -include_file: - lods byte [esi] - cmp al,22h - jne invalid_argument - lods dword [esi] - cmp byte [esi+eax],0 - jne extra_characters_on_line - push esi - push edi - mov ebx,[current_line] - find_current_file_path: - mov esi,[ebx] - test byte [ebx+7],80h - jz copy_current_file_path - mov ebx,[ebx+8] - jmp find_current_file_path - copy_current_file_path: - lods byte [esi] - stos byte [edi] - or al,al - jnz copy_current_file_path - cut_current_file_name: - cmp edi,[esp] - je current_file_path_ok - cmp byte [edi-1],'\' - je current_file_path_ok - cmp byte [edi-1],'/' - je current_file_path_ok - dec edi - jmp cut_current_file_name - current_file_path_ok: - mov esi,[esp+4] - call preprocess_path - pop edx - mov esi,edx - call open - jnc include_path_ok - mov ebp,[include_paths] - try_include_directories: - mov edi,esi - mov esi,ebp - cmp byte [esi],0 - je try_in_current_directory - push ebp - push edi - copy_include_directory: - lods byte [esi] - cmp al,';' - je include_directory_ok - stos byte [edi] - or al,al - jnz copy_include_directory - dec esi - dec edi - include_directory_ok: - cmp byte [edi-1],'/' - je path_separator_ok - cmp byte [edi-1],'\' - je path_separator_ok - mov al,'/' - stos byte [edi] - path_separator_ok: - mov [esp+4],esi - mov esi,[esp+8] - call preprocess_path - pop edx - mov esi,edx - call open - pop ebp - jnc include_path_ok - jmp try_include_directories - mov edi,esi - try_in_current_directory: - mov esi,[esp] - push edi - call preprocess_path - pop edx - mov esi,edx - call open - jc file_not_found - include_path_ok: - mov edi,[esp] - copy_preprocessed_path: - lods byte [esi] - stos byte [edi] - or al,al - jnz copy_preprocessed_path - pop esi - lea ecx,[edi-1] - sub ecx,esi - mov [esi-4],ecx - push dword [macro_status] - and [macro_status],0Fh - call preprocess_file - pop eax - mov [macro_status],al - jmp line_preprocessed - preprocess_path: - lods byte [esi] - cmp al,'%' - je environment_variable - stos byte [edi] - or al,al - jnz preprocess_path - cmp edi,[memory_end] - ja out_of_memory - ret - environment_variable: - mov ebx,esi - find_variable_end: - lods byte [esi] - or al,al - jz not_environment_variable - cmp al,'%' - jne find_variable_end - mov byte [esi-1],0 - push esi - mov esi,ebx - call get_environment_variable - pop esi - mov byte [esi-1],'%' - jmp preprocess_path - not_environment_variable: - mov al,'%' - stos byte [edi] - mov esi,ebx - jmp preprocess_path - -include_variable db 'INCLUDE',0 - -symbol_characters db 27 - db 9,0Ah,0Dh,1Ah,20h,'+-/*=<>()[]{}:,|&~#`;\' - -preprocessor_directives: - db 7,'include' - dw include_file-preprocessor - db 3,'irp' - dw irp_directive-preprocessor - db 4,'irps' - dw irps_directive-preprocessor - db 5,'macro' - dw define_macro-preprocessor - db 5,'match' - dw match_directive-preprocessor - db 5,'purge' - dw purge_macro-preprocessor - db 4,'rept' - dw rept_directive-preprocessor - db 7,'restore' - dw restore_equ_constant-preprocessor - db 7,'restruc' - dw purge_struc-preprocessor - db 5,'struc' - dw define_struc-preprocessor - db 0 - -macro_directives: - db 6,'common' - dw common_block-preprocessor - db 7,'forward' - dw forward_block-preprocessor - db 5,'local' - dw local_symbols-preprocessor - db 7,'reverse' - dw reverse_block-preprocessor - db 0 diff --git a/programs/fasm/trunk/x86_64.inc b/programs/fasm/trunk/x86_64.inc deleted file mode 100644 index a9a0c8d400..0000000000 --- a/programs/fasm/trunk/x86_64.inc +++ /dev/null @@ -1,7923 +0,0 @@ - -; flat assembler core -; Copyright (c) 1999-2005, Tomasz Grysztar. -; All rights reserved. - -simple_instruction_except64: - cmp [code_type],64 - je illegal_instruction -simple_instruction: - stos byte [edi] - jmp instruction_assembled -simple_instruction_only64: - cmp [code_type],64 - jne illegal_instruction - jmp simple_instruction -simple_instruction_16bit_except64: - cmp [code_type],64 - je illegal_instruction -simple_instruction_16bit: - cmp [code_type],16 - jne size_prefix - stos byte [edi] - jmp instruction_assembled - size_prefix: - mov ah,al - mov al,66h - stos word [edi] - jmp instruction_assembled -simple_instruction_32bit_except64: - cmp [code_type],64 - je illegal_instruction -simple_instruction_32bit: - cmp [code_type],16 - je size_prefix - stos byte [edi] - jmp instruction_assembled -simple_instruction_64bit: - cmp [code_type],64 - jne illegal_instruction - mov ah,al - mov al,48h - stos word [edi] - jmp instruction_assembled -simple_extended_instruction: - mov ah,al - mov al,0Fh - stos word [edi] - jmp instruction_assembled -prefix_instruction: - stos byte [edi] - or [prefixed_instruction],-1 - jmp continue_line -segment_prefix: - mov ah,al - shr ah,4 - cmp ah,6 - jne illegal_instruction - and al,1111b - mov [segment_register],al - call store_segment_prefix - or [prefixed_instruction],-1 - jmp continue_line -int_instruction: - lods byte [esi] - call get_size_operator - cmp ah,1 - ja invalid_operand_size - cmp al,'(' - jne invalid_operand - call get_byte_value - mov ah,al - mov al,0CDh - stos word [edi] - jmp instruction_assembled -iret_instruction: - cmp [code_type],64 - jne simple_instruction - call operand_64bit - jmp simple_instruction -aa_instruction: - cmp [code_type],64 - je illegal_instruction - push eax - mov bl,10 - cmp byte [esi],'(' - jne aa_store - inc esi - xor al,al - xchg al,[operand_size] - cmp al,1 - ja invalid_operand_size - call get_byte_value - mov bl,al - aa_store: - cmp [operand_size],0 - jne invalid_operand - pop eax - mov ah,bl - stos word [edi] - jmp instruction_assembled - -basic_instruction: - mov [base_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - je basic_reg - cmp al,'[' - jne invalid_operand - basic_mem: - call get_address - push edx bx cx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'(' - je basic_mem_imm - cmp al,10h - jne invalid_operand - basic_mem_reg: - lods byte [esi] - call convert_register - mov [postbyte_register],al - pop cx bx edx - mov al,ah - cmp al,1 - je basic_mem_reg_8bit - call operand_autodetect - inc [base_code] - basic_mem_reg_8bit: - call store_instruction - jmp instruction_assembled - basic_mem_imm: - mov al,[operand_size] - cmp al,1 - je basic_mem_imm_8bit - cmp al,2 - je basic_mem_imm_16bit - cmp al,4 - je basic_mem_imm_32bit - cmp al,8 - je basic_mem_imm_64bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne basic_mem_imm_8bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - basic_mem_imm_8bit: - call get_byte_value - mov byte [value],al - mov al,[base_code] - shr al,3 - mov [postbyte_register],al - pop cx bx edx - mov [base_code],80h - call store_instruction_with_imm8 - jmp instruction_assembled - basic_mem_imm_16bit: - call operand_16bit - call get_word_value - mov word [value],ax - mov al,[base_code] - shr al,3 - mov [postbyte_register],al - pop cx bx edx - cmp [value_type],0 - jne basic_mem_imm_16bit_store - cmp [size_declared],0 - jne basic_mem_imm_16bit_store - cmp word [value],80h - jb basic_mem_simm_8bit - cmp word [value],-80h - jae basic_mem_simm_8bit - basic_mem_imm_16bit_store: - mov [base_code],81h - call store_instruction_with_imm16 - jmp instruction_assembled - basic_mem_simm_8bit: - mov [base_code],83h - call store_instruction_with_imm8 - jmp instruction_assembled - basic_mem_imm_32bit: - call operand_32bit - call get_dword_value - basic_mem_imm_32bit_ok: - mov dword [value],eax - mov al,[base_code] - shr al,3 - mov [postbyte_register],al - pop cx bx edx - cmp [value_type],0 - jne basic_mem_imm_32bit_store - cmp [size_declared],0 - jne basic_mem_imm_32bit_store - cmp dword [value],80h - jb basic_mem_simm_8bit - cmp dword [value],-80h - jae basic_mem_simm_8bit - basic_mem_imm_32bit_store: - mov [base_code],81h - call store_instruction_with_imm32 - jmp instruction_assembled - basic_mem_imm_64bit: - cmp [size_declared],0 - jne long_immediate_not_encodable - call operand_64bit - call get_simm32 - cmp [value_type],4 - jae long_immediate_not_encodable - jmp basic_mem_imm_32bit_ok - get_simm32: - call get_qword_value - mov ecx,edx - cdq - cmp ecx,edx - jne value_out_of_range - ret - basic_reg: - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je basic_reg_reg - cmp al,'(' - je basic_reg_imm - cmp al,'[' - jne invalid_operand - basic_reg_mem: - call get_address - mov al,[operand_size] - cmp al,1 - je basic_reg_mem_8bit - call operand_autodetect - add [base_code],3 - call store_instruction - jmp instruction_assembled - basic_reg_mem_8bit: - add [base_code],2 - call store_instruction - jmp instruction_assembled - basic_reg_reg: - lods byte [esi] - call convert_register - mov bl,[postbyte_register] - mov [postbyte_register],al - mov al,ah - cmp al,1 - je basic_reg_reg_8bit - call operand_autodetect - inc [base_code] - basic_reg_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled - basic_reg_imm: - mov al,[operand_size] - cmp al,1 - je basic_reg_imm_8bit - cmp al,2 - je basic_reg_imm_16bit - cmp al,4 - je basic_reg_imm_32bit - cmp al,8 - je basic_reg_imm_64bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne basic_reg_imm_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp basic_reg_imm_32bit - basic_reg_imm_8bit: - call get_byte_value - mov dl,al - mov bl,[base_code] - shr bl,3 - xchg bl,[postbyte_register] - or bl,bl - jz basic_al_imm - mov [base_code],80h - call store_nomem_instruction - mov al,dl - stos byte [edi] - jmp instruction_assembled - basic_al_imm: - mov al,[base_code] - add al,4 - stos byte [edi] - mov al,dl - stos byte [edi] - jmp instruction_assembled - basic_reg_imm_16bit: - call operand_16bit - call get_word_value - mov dx,ax - mov bl,[base_code] - shr bl,3 - xchg bl,[postbyte_register] - cmp [value_type],0 - jne basic_reg_imm_16bit_store - cmp [size_declared],0 - jne basic_reg_imm_16bit_store - cmp dx,80h - jb basic_reg_simm_8bit - cmp dx,-80h - jae basic_reg_simm_8bit - basic_reg_imm_16bit_store: - or bl,bl - jz basic_ax_imm - mov [base_code],81h - call store_nomem_instruction - mov ax,dx - call mark_relocation - stos word [edi] - jmp instruction_assembled - basic_reg_simm_8bit: - mov [base_code],83h - call store_nomem_instruction - mov al,dl - stos byte [edi] - jmp instruction_assembled - basic_ax_imm: - add [base_code],5 - call store_instruction_code - mov ax,dx - call mark_relocation - stos word [edi] - jmp instruction_assembled - basic_reg_imm_32bit: - call operand_32bit - call get_dword_value - basic_reg_imm_32bit_ok: - mov edx,eax - mov bl,[base_code] - shr bl,3 - xchg bl,[postbyte_register] - cmp [value_type],0 - jne basic_reg_imm_32bit_store - cmp [size_declared],0 - jne basic_reg_imm_32bit_store - cmp edx,80h - jb basic_reg_simm_8bit - cmp edx,-80h - jae basic_reg_simm_8bit - basic_reg_imm_32bit_store: - or bl,bl - jz basic_eax_imm - mov [base_code],81h - call store_nomem_instruction - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - basic_eax_imm: - add [base_code],5 - call store_instruction_code - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - basic_reg_imm_64bit: - cmp [size_declared],0 - jne long_immediate_not_encodable - call operand_64bit - call get_simm32 - cmp [value_type],4 - jae long_immediate_not_encodable - jmp basic_reg_imm_32bit_ok -single_operand_instruction: - mov [base_code],0F6h - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - je single_reg - cmp al,'[' - jne invalid_operand - single_mem: - call get_address - mov al,[operand_size] - cmp al,1 - je single_mem_8bit - jb single_mem_nosize - call operand_autodetect - inc [base_code] - call store_instruction - jmp instruction_assembled - single_mem_nosize: - cmp [error_line],0 - jne single_mem_8bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - single_mem_8bit: - call store_instruction - jmp instruction_assembled - single_reg: - lods byte [esi] - call convert_register - mov bl,al - mov al,ah - cmp al,1 - je single_reg_8bit - call operand_autodetect - inc [base_code] - single_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled -mov_instruction: - mov [base_code],88h - lods byte [esi] - call get_size_operator - cmp al,10h - je mov_reg - cmp al,'[' - jne invalid_operand - mov_mem: - call get_address - push edx bx cx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'(' - je mov_mem_imm - cmp al,10h - jne invalid_operand - mov_mem_reg: - lods byte [esi] - cmp al,60h - jb mov_mem_general_reg - cmp al,70h - jb mov_mem_sreg - mov_mem_general_reg: - call convert_register - mov [postbyte_register],al - pop cx bx edx - cmp ah,1 - je mov_mem_reg_8bit - mov al,ah - call operand_autodetect - mov al,[postbyte_register] - or al,bl - or al,bh - jz mov_mem_ax - inc [base_code] - call store_instruction - jmp instruction_assembled - mov_mem_reg_8bit: - or al,bl - or al,bh - jz mov_mem_al - call store_instruction - jmp instruction_assembled - mov_mem_al: - test ch,22h - jnz mov_mem_address16_al - test ch,44h - jnz mov_mem_address32_al - test ch,88h - jnz mov_mem_address64_al - or ch,ch - jnz invalid_address_size - cmp [code_type],64 - je mov_mem_address64_al - cmp [code_type],32 - je mov_mem_address32_al - cmp edx,10000h - jb mov_mem_address16_al - mov_mem_address32_al: - call store_segment_prefix_if_necessary - call address_32bit_prefix - mov [base_code],0A2h - store_mov_address32: - call store_instruction_code - push instruction_assembled - jmp store_address_32bit_value - mov_mem_address16_al: - call store_segment_prefix_if_necessary - call address_16bit_prefix - mov [base_code],0A2h - store_mov_address16: - cmp [code_type],64 - je invalid_address - call store_instruction_code - mov eax,edx - stos word [edi] - cmp edx,10000h - jge value_out_of_range - jmp instruction_assembled - mov_mem_address64_al: - call store_segment_prefix_if_necessary - mov [base_code],0A2h - store_mov_address64: - call store_instruction_code - push instruction_assembled - jmp store_address_64bit_value - mov_mem_ax: - test ch,22h - jnz mov_mem_address16_ax - test ch,44h - jnz mov_mem_address32_ax - test ch,88h - jnz mov_mem_address64_ax - or ch,ch - jnz invalid_address_size - cmp [code_type],64 - je mov_mem_address64_ax - cmp [code_type],32 - je mov_mem_address32_ax - cmp edx,10000h - jb mov_mem_address16_ax - mov_mem_address32_ax: - call store_segment_prefix_if_necessary - call address_32bit_prefix - mov [base_code],0A3h - jmp store_mov_address32 - mov_mem_address16_ax: - call store_segment_prefix_if_necessary - call address_16bit_prefix - mov [base_code],0A3h - jmp store_mov_address16 - mov_mem_address64_ax: - call store_segment_prefix_if_necessary - mov [base_code],0A3h - jmp store_mov_address64 - mov_mem_sreg: - sub al,61h - mov [postbyte_register],al - pop cx bx edx - mov ah,[operand_size] - or ah,ah - jz mov_mem_sreg_store - cmp ah,2 - jne invalid_operand_size - mov_mem_sreg_store: - mov [base_code],8Ch - call store_instruction - jmp instruction_assembled - mov_mem_imm: - mov al,[operand_size] - cmp al,1 - je mov_mem_imm_8bit - cmp al,2 - je mov_mem_imm_16bit - cmp al,4 - je mov_mem_imm_32bit - cmp al,8 - je mov_mem_imm_64bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne mov_mem_imm_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp mov_mem_imm_32bit - mov_mem_imm_8bit: - call get_byte_value - mov byte [value],al - mov [postbyte_register],0 - mov [base_code],0C6h - pop cx bx edx - call store_instruction_with_imm8 - jmp instruction_assembled - mov_mem_imm_16bit: - call operand_16bit - call get_word_value - mov word [value],ax - mov [postbyte_register],0 - mov [base_code],0C7h - pop cx bx edx - call store_instruction_with_imm16 - jmp instruction_assembled - mov_mem_imm_32bit: - call operand_32bit - call get_dword_value - mov_mem_imm_32bit_store: - mov dword [value],eax - mov [postbyte_register],0 - mov [base_code],0C7h - pop cx bx edx - call store_instruction_with_imm32 - jmp instruction_assembled - mov_mem_imm_64bit: - cmp [size_declared],0 - jne long_immediate_not_encodable - call operand_64bit - call get_simm32 - cmp [value_type],4 - jae long_immediate_not_encodable - jmp mov_mem_imm_32bit_store - mov_reg: - lods byte [esi] - mov ah,al - sub ah,10h - and ah,al - test ah,0F0h - jnz mov_sreg - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - je mov_reg_mem - cmp al,'(' - je mov_reg_imm - cmp al,10h - jne invalid_operand - mov_reg_reg: - lods byte [esi] - mov ah,al - sub ah,10h - and ah,al - test ah,0F0h - jnz mov_reg_sreg - call convert_register - mov bl,[postbyte_register] - mov [postbyte_register],al - mov al,ah - cmp al,1 - je mov_reg_reg_8bit - call operand_autodetect - inc [base_code] - mov_reg_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled - mov_reg_sreg: - mov bl,[postbyte_register] - mov ah,al - and al,1111b - mov [postbyte_register],al - shr ah,4 - cmp ah,5 - je mov_reg_creg - cmp ah,7 - je mov_reg_dreg - ja mov_reg_treg - dec [postbyte_register] - cmp [operand_size],8 - je mov_reg_sreg64 - cmp [operand_size],4 - je mov_reg_sreg32 - cmp [operand_size],2 - jne invalid_operand_size - call operand_16bit - jmp mov_reg_sreg_store - mov_reg_sreg64: - call operand_64bit - jmp mov_reg_sreg_store - mov_reg_sreg32: - call operand_32bit - mov_reg_sreg_store: - mov [base_code],8Ch - call store_nomem_instruction - jmp instruction_assembled - mov_reg_treg: - cmp ah,9 - jne invalid_operand - mov [extended_code],24h - jmp mov_reg_xrx - mov_reg_dreg: - mov [extended_code],21h - jmp mov_reg_xrx - mov_reg_creg: - mov [extended_code],20h - mov_reg_xrx: - mov [base_code],0Fh - cmp [code_type],64 - je mov_reg_xrx_64bit - cmp [operand_size],4 - jne invalid_operand_size - call store_nomem_instruction - jmp instruction_assembled - mov_reg_xrx_64bit: - cmp [operand_size],8 - jne invalid_operand_size - call store_nomem_instruction - jmp instruction_assembled - mov_reg_mem: - call get_address - mov al,[operand_size] - cmp al,1 - je mov_reg_mem_8bit - call operand_autodetect - mov al,[postbyte_register] - or al,bl - or al,bh - jz mov_ax_mem - add [base_code],3 - call store_instruction - jmp instruction_assembled - mov_reg_mem_8bit: - mov al,[postbyte_register] - or al,bl - or al,bh - jz mov_al_mem - add [base_code],2 - call store_instruction - jmp instruction_assembled - mov_al_mem: - test ch,22h - jnz mov_al_mem_address16 - test ch,44h - jnz mov_al_mem_address32 - test ch,88h - jnz mov_al_mem_address64 - or ch,ch - jnz invalid_address_size - cmp [code_type],64 - je mov_al_mem_address64 - cmp [code_type],32 - je mov_al_mem_address32 - cmp edx,10000h - jb mov_al_mem_address16 - mov_al_mem_address32: - call store_segment_prefix_if_necessary - call address_32bit_prefix - mov [base_code],0A0h - jmp store_mov_address32 - mov_al_mem_address16: - call store_segment_prefix_if_necessary - call address_16bit_prefix - mov [base_code],0A0h - jmp store_mov_address16 - mov_al_mem_address64: - call store_segment_prefix_if_necessary - mov [base_code],0A0h - jmp store_mov_address64 - mov_ax_mem: - test ch,22h - jnz mov_ax_mem_address16 - test ch,44h - jnz mov_ax_mem_address32 - test ch,88h - jnz mov_ax_mem_address64 - or ch,ch - jnz invalid_address_size - cmp [code_type],64 - je mov_ax_mem_address64 - cmp [code_type],32 - je mov_ax_mem_address32 - cmp edx,10000h - jb mov_ax_mem_address16 - mov_ax_mem_address32: - call store_segment_prefix_if_necessary - call address_32bit_prefix - mov [base_code],0A1h - jmp store_mov_address32 - mov_ax_mem_address16: - call store_segment_prefix_if_necessary - mov [base_code],0A1h - jmp store_mov_address16 - mov_ax_mem_address64: - call store_segment_prefix_if_necessary - mov [base_code],0A1h - jmp store_mov_address64 - mov_reg_imm: - mov al,[operand_size] - cmp al,1 - je mov_reg_imm_8bit - cmp al,2 - je mov_reg_imm_16bit - cmp al,4 - je mov_reg_imm_32bit - cmp al,8 - je mov_reg_imm_64bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne mov_reg_imm_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp mov_reg_imm_32bit - mov_reg_imm_8bit: - call get_byte_value - mov dl,al - mov al,0B0h - call store_mov_reg_imm_code - mov al,dl - stos byte [edi] - jmp instruction_assembled - mov_reg_imm_16bit: - call get_word_value - mov dx,ax - call operand_16bit - mov al,0B8h - call store_mov_reg_imm_code - mov ax,dx - call mark_relocation - stos word [edi] - jmp instruction_assembled - mov_reg_imm_32bit: - call operand_32bit - call get_dword_value - mov edx,eax - mov al,0B8h - call store_mov_reg_imm_code - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - mov_reg_imm_64bit: - call operand_64bit - call get_qword_value - mov ecx,edx - cmp [size_declared],0 - jne mov_reg_imm_64bit_store - cmp [value_type],4 - jae mov_reg_imm_64bit_store - cdq - cmp ecx,edx - je mov_reg_64bit_imm_32bit - mov_reg_imm_64bit_store: - push eax ecx - mov al,0B8h - call store_mov_reg_imm_code - pop edx eax - call mark_relocation - stos dword [edi] - mov eax,edx - stos dword [edi] - jmp instruction_assembled - store_mov_reg_imm_code: - mov ah,[postbyte_register] - test ah,1000b - jz mov_reg_imm_prefix_ok - or [rex_prefix],41h - mov_reg_imm_prefix_ok: - and ah,111b - add al,ah - mov [base_code],al - call store_instruction_code - ret - mov_reg_64bit_imm_32bit: - mov edx,eax - mov bl,[postbyte_register] - mov [postbyte_register],0 - mov [base_code],0C7h - call store_nomem_instruction - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - mov_sreg: - mov ah,al - and al,111b - mov [postbyte_register],al - shr ah,4 - cmp ah,5 - je mov_creg - cmp ah,7 - je mov_dreg - ja mov_treg - cmp al,2 - je illegal_instruction - dec [postbyte_register] - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - je mov_sreg_mem - cmp al,10h - jne invalid_operand - mov_sreg_reg: - lods byte [esi] - call convert_register - or ah,ah - jz mov_sreg_reg_size_ok - cmp ah,2 - jne invalid_operand_size - mov bl,al - mov_sreg_reg_size_ok: - mov [base_code],8Eh - call store_nomem_instruction - jmp instruction_assembled - mov_sreg_mem: - call get_address - mov al,[operand_size] - or al,al - jz mov_sreg_mem_size_ok - cmp al,2 - jne invalid_operand_size - mov_sreg_mem_size_ok: - mov [base_code],8Eh - call store_instruction - jmp instruction_assembled - mov_treg: - cmp ah,9 - jne invalid_operand - mov [extended_code],26h - jmp mov_xrx - mov_dreg: - mov [extended_code],23h - jmp mov_xrx - mov_creg: - mov [extended_code],22h - mov_xrx: - mov [base_code],0Fh - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov bl,al - cmp [code_type],64 - je mov_xrx_64bit - cmp ah,4 - jne invalid_operand_size - call store_nomem_instruction - jmp instruction_assembled - mov_xrx_64bit: - cmp ah,8 - jne invalid_operand_size - call store_nomem_instruction - jmp instruction_assembled -cmov_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - je cmov_reg_mem - cmp al,10h - jne invalid_operand - cmov_reg_reg: - lods byte [esi] - call convert_register - mov bl,al - mov al,ah - call operand_autodetect - call store_nomem_instruction - jmp instruction_assembled - cmov_reg_mem: - call get_address - mov al,[operand_size] - call operand_autodetect - call store_instruction - jmp instruction_assembled -test_instruction: - mov [base_code],84h - lods byte [esi] - call get_size_operator - cmp al,10h - je test_reg - cmp al,'[' - jne invalid_operand - test_mem: - call get_address - push edx bx cx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'(' - je test_mem_imm - cmp al,10h - jne invalid_operand - test_mem_reg: - lods byte [esi] - call convert_register - mov [postbyte_register],al - pop cx bx edx - mov al,ah - cmp al,1 - je test_mem_reg_8bit - call operand_autodetect - inc [base_code] - test_mem_reg_8bit: - call store_instruction - jmp instruction_assembled - test_mem_imm: - mov al,[operand_size] - cmp al,1 - je test_mem_imm_8bit - cmp al,2 - je test_mem_imm_16bit - cmp al,4 - je test_mem_imm_32bit - cmp al,8 - je test_mem_imm_64bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne test_mem_imm_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp test_mem_imm_32bit - test_mem_imm_8bit: - call get_byte_value - mov byte [value],al - mov [postbyte_register],0 - mov [base_code],0F6h - pop cx bx edx - call store_instruction_with_imm8 - jmp instruction_assembled - test_mem_imm_16bit: - call operand_16bit - call get_word_value - mov word [value],ax - mov [postbyte_register],0 - mov [base_code],0F7h - pop cx bx edx - call store_instruction_with_imm16 - jmp instruction_assembled - test_mem_imm_32bit: - call operand_32bit - call get_dword_value - test_mem_imm_32bit_store: - mov dword [value],eax - mov [postbyte_register],0 - mov [base_code],0F7h - pop cx bx edx - call store_instruction_with_imm32 - jmp instruction_assembled - test_mem_imm_64bit: - cmp [size_declared],0 - jne long_immediate_not_encodable - call operand_64bit - call get_simm32 - cmp [value_type],4 - jae long_immediate_not_encodable - jmp test_mem_imm_32bit_store - test_reg: - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - je test_reg_mem - cmp al,'(' - je test_reg_imm - cmp al,10h - jne invalid_operand - test_reg_reg: - lods byte [esi] - call convert_register - mov bl,[postbyte_register] - mov [postbyte_register],al - mov al,ah - cmp al,1 - je test_reg_reg_8bit - call operand_autodetect - inc [base_code] - test_reg_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled - test_reg_imm: - mov al,[operand_size] - cmp al,1 - je test_reg_imm_8bit - cmp al,2 - je test_reg_imm_16bit - cmp al,4 - je test_reg_imm_32bit - cmp al,8 - je test_reg_imm_64bit - jmp invalid_operand_size - test_reg_imm_8bit: - call get_byte_value - mov dl,al - mov bl,[postbyte_register] - mov [postbyte_register],0 - mov [base_code],0F6h - or bl,bl - jz test_al_imm - call store_nomem_instruction - mov al,dl - stos byte [edi] - jmp instruction_assembled - test_al_imm: - mov [base_code],0A8h - call store_instruction_code - mov al,dl - stos byte [edi] - jmp instruction_assembled - test_reg_imm_16bit: - call operand_16bit - call get_word_value - mov dx,ax - mov bl,[postbyte_register] - mov [postbyte_register],0 - mov [base_code],0F7h - or bl,bl - jz test_ax_imm - call store_nomem_instruction - mov ax,dx - call mark_relocation - stos word [edi] - jmp instruction_assembled - test_ax_imm: - mov [base_code],0A9h - call store_instruction_code - mov ax,dx - stos word [edi] - jmp instruction_assembled - test_reg_imm_32bit: - call operand_32bit - call get_dword_value - test_reg_imm_32bit_store: - mov edx,eax - mov bl,[postbyte_register] - mov [postbyte_register],0 - mov [base_code],0F7h - or bl,bl - jz test_eax_imm - call store_nomem_instruction - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - test_eax_imm: - mov [base_code],0A9h - call store_instruction_code - mov eax,edx - stos dword [edi] - jmp instruction_assembled - test_reg_imm_64bit: - cmp [size_declared],0 - jne long_immediate_not_encodable - call operand_64bit - call get_simm32 - cmp [value_type],4 - jae long_immediate_not_encodable - jmp test_reg_imm_32bit_store - test_reg_mem: - call get_address - mov al,[operand_size] - cmp al,1 - je test_reg_mem_8bit - call operand_autodetect - inc [base_code] - test_reg_mem_8bit: - call store_instruction - jmp instruction_assembled -xchg_instruction: - mov [base_code],86h - lods byte [esi] - call get_size_operator - cmp al,10h - je xchg_reg - cmp al,'[' - jne invalid_operand - xchg_mem: - call get_address - push edx bx cx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je test_mem_reg - jmp invalid_operand - xchg_reg: - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - je test_reg_mem - cmp al,10h - jne invalid_operand - xchg_reg_reg: - lods byte [esi] - call convert_register - mov bl,al - mov al,ah - cmp al,1 - je xchg_reg_reg_8bit - call operand_autodetect - cmp [postbyte_register],0 - je xchg_ax_reg - or bl,bl - jnz xchg_reg_reg_store - mov bl,[postbyte_register] - xchg_ax_reg: - cmp [code_type],64 - jne xchg_ax_reg_ok - cmp ah,4 - jne xchg_ax_reg_ok - or bl,bl - jz xchg_reg_reg_store - xchg_ax_reg_ok: - test bl,1000b - jz xchg_ax_reg_store - or [rex_prefix],41h - and bl,111b - xchg_ax_reg_store: - add bl,90h - mov [base_code],bl - call store_instruction_code - jmp instruction_assembled - xchg_reg_reg_store: - inc [base_code] - xchg_reg_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled -push_instruction: - mov [extended_code],al - push_next: - lods byte [esi] - call get_size_operator - cmp al,10h - je push_reg - cmp al,'(' - je push_imm - cmp al,'[' - jne invalid_operand - push_mem: - call get_address - mov al,[operand_size] - mov ah,[extended_code] - cmp al,2 - je push_mem_16bit - cmp al,4 - je push_mem_32bit - cmp al,8 - je push_mem_64bit - or al,al - jnz invalid_operand_size - cmp ah,2 - je push_mem_16bit - cmp ah,4 - je push_mem_32bit - cmp ah,8 - je push_mem_64bit - cmp [error_line],0 - jne push_mem_store - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp push_mem_store - push_mem_16bit: - test ah,not 2 - jnz invalid_operand_size - call operand_16bit - jmp push_mem_store - push_mem_32bit: - test ah,not 4 - jnz invalid_operand_size - cmp [code_type],64 - je illegal_instruction - call operand_32bit - jmp push_mem_store - push_mem_64bit: - test ah,not 8 - jnz invalid_operand_size - cmp [code_type],64 - jne illegal_instruction - push_mem_store: - mov [base_code],0FFh - mov [postbyte_register],110b - call store_instruction - jmp push_done - push_reg: - lods byte [esi] - mov ah,al - sub ah,10h - and ah,al - test ah,0F0h - jnz push_sreg - call convert_register - test al,1000b - jz push_reg_ok - or [rex_prefix],41h - and al,111b - push_reg_ok: - add al,50h - mov [base_code],al - mov al,ah - mov ah,[extended_code] - cmp al,2 - je push_reg_16bit - cmp al,4 - je push_reg_32bit - cmp al,8 - jne invalid_operand_size - push_reg_64bit: - test ah,not 8 - jnz invalid_operand_size - cmp [code_type],64 - jne illegal_instruction - jmp push_reg_store - push_reg_32bit: - test ah,not 4 - jnz invalid_operand_size - cmp [code_type],64 - je illegal_instruction - call operand_32bit - jmp push_reg_store - push_reg_16bit: - test ah,not 2 - jnz invalid_operand_size - call operand_16bit - push_reg_store: - call store_instruction_code - jmp push_done - push_sreg: - mov bl,al - mov dl,[operand_size] - mov dh,[extended_code] - cmp dl,2 - je push_sreg16 - cmp dl,4 - je push_sreg32 - cmp dl,8 - je push_sreg64 - or dl,dl - jnz invalid_operand_size - cmp dh,2 - je push_sreg16 - cmp dh,4 - je push_sreg32 - cmp dh,8 - je push_sreg64 - jmp push_sreg_store - push_sreg16: - test dh,not 2 - jnz invalid_operand_size - call operand_16bit - jmp push_sreg_store - push_sreg32: - test dh,not 4 - jnz invalid_operand_size - cmp [code_type],64 - je illegal_instruction - call operand_32bit - jmp push_sreg_store - push_sreg64: - test dh,not 8 - jnz invalid_operand_size - cmp [code_type],64 - jne illegal_instruction - push_sreg_store: - mov al,bl - cmp al,70h - jae invalid_operand - sub al,61h - cmp al,4 - jae push_sreg_386 - shl al,3 - add al,6 - mov [base_code],al - cmp [code_type],64 - je illegal_instruction - jmp push_reg_store - push_sreg_386: - sub al,4 - shl al,3 - add al,0A0h - mov [extended_code],al - mov [base_code],0Fh - jmp push_reg_store - push_imm: - mov al,[operand_size] - mov ah,[extended_code] - or al,al - je push_imm_size_ok - or ah,ah - je push_imm_size_ok - cmp al,ah - jne invalid_operand_size - push_imm_size_ok: - cmp al,2 - je push_imm_16bit - cmp al,4 - je push_imm_32bit - cmp al,8 - je push_imm_64bit - cmp ah,2 - je push_imm_optimized_16bit - cmp ah,4 - je push_imm_optimized_32bit - cmp ah,8 - je push_imm_optimized_64bit - or al,al - jnz invalid_operand_size - cmp [code_type],16 - je push_imm_optimized_16bit - cmp [code_type],32 - je push_imm_optimized_32bit - push_imm_optimized_64bit: - cmp [code_type],64 - jne illegal_instruction - call get_simm32 - mov edx,eax - cmp [value_type],0 - jne push_imm_32bit_store - cmp eax,-80h - jl push_imm_32bit_store - cmp eax,80h - jge push_imm_32bit_store - jmp push_imm_8bit - push_imm_optimized_32bit: - cmp [code_type],64 - je illegal_instruction - call get_dword_value - mov edx,eax - cmp [value_type],0 - jne push_imm_32bit_store - cmp eax,-80h - jl push_imm_32bit_store - cmp eax,80h - jge push_imm_32bit_store - call operand_32bit - jmp push_imm_8bit - push_imm_optimized_16bit: - call get_word_value - mov dx,ax - cmp [value_type],0 - jne push_imm_16bit_store - cmp ax,-80h - jl push_imm_16bit_store - cmp ax,80h - jge push_imm_16bit_store - call operand_16bit - push_imm_8bit: - mov ah,al - mov al,6Ah - stos word [edi] - jmp push_done - push_imm_16bit: - call get_word_value - mov dx,ax - call operand_16bit - push_imm_16bit_store: - mov [base_code],68h - call store_instruction_code - mov ax,dx - call mark_relocation - stos word [edi] - jmp push_done - push_imm_64bit: - cmp [code_type],64 - jne illegal_instruction - call get_simm32 - mov edx,eax - jmp push_imm_32bit_store - push_imm_32bit: - cmp [code_type],64 - je illegal_instruction - call get_dword_value - mov edx,eax - call operand_32bit - push_imm_32bit_store: - mov [base_code],68h - call store_instruction_code - mov eax,edx - call mark_relocation - stos dword [edi] - push_done: - lods byte [esi] - dec esi - cmp al,0Fh - je instruction_assembled - or al,al - jz instruction_assembled - mov [operand_size],0 - mov [size_override],0 - mov [operand_prefix],0 - mov [rex_prefix],0 - jmp push_next -pop_instruction: - mov [extended_code],al - pop_next: - lods byte [esi] - call get_size_operator - cmp al,10h - je pop_reg - cmp al,'[' - jne invalid_operand - pop_mem: - call get_address - mov al,[operand_size] - mov ah,[extended_code] - cmp al,2 - je pop_mem_16bit - cmp al,4 - je pop_mem_32bit - cmp al,8 - je pop_mem_64bit - or al,al - jnz invalid_operand_size - cmp ah,2 - je pop_mem_16bit - cmp ah,4 - je pop_mem_32bit - cmp ah,8 - je pop_mem_64bit - cmp [error_line],0 - jne pop_mem_store - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp pop_mem_store - pop_mem_16bit: - test ah,not 2 - jnz invalid_operand_size - call operand_16bit - jmp pop_mem_store - pop_mem_32bit: - test ah,not 4 - jnz invalid_operand_size - cmp [code_type],64 - je illegal_instruction - call operand_32bit - jmp pop_mem_store - pop_mem_64bit: - test ah,not 8 - jnz invalid_operand_size - cmp [code_type],64 - jne illegal_instruction - pop_mem_store: - mov [base_code],08Fh - mov [postbyte_register],0 - call store_instruction - jmp pop_done - pop_reg: - lods byte [esi] - mov ah,al - sub ah,10h - and ah,al - test ah,0F0h - jnz pop_sreg - call convert_register - test al,1000b - jz pop_reg_ok - or [rex_prefix],41h - and al,111b - pop_reg_ok: - add al,58h - mov [base_code],al - mov al,ah - mov ah,[extended_code] - cmp al,2 - je pop_reg_16bit - cmp al,4 - je pop_reg_32bit - cmp al,8 - je pop_reg_64bit - jmp invalid_operand_size - pop_reg_64bit: - test ah,not 8 - jnz invalid_operand_size - cmp [code_type],64 - jne illegal_instruction - jmp pop_reg_store - pop_reg_32bit: - test ah,not 4 - jnz invalid_operand_size - cmp [code_type],64 - je illegal_instruction - call operand_32bit - jmp pop_reg_store - pop_reg_16bit: - test ah,not 2 - jnz invalid_operand_size - call operand_16bit - pop_reg_store: - call store_instruction_code - pop_done: - lods byte [esi] - dec esi - cmp al,0Fh - je instruction_assembled - or al,al - jz instruction_assembled - mov [operand_size],0 - mov [size_override],0 - mov [operand_prefix],0 - mov [rex_prefix],0 - jmp pop_next - pop_sreg: - mov bl,al - mov dl,[operand_size] - mov dh,[extended_code] - cmp dl,2 - je pop_sreg16 - cmp dl,4 - je pop_sreg32 - cmp dl,8 - je pop_sreg64 - or dl,dl - jnz invalid_operand_size - cmp dh,2 - je pop_sreg16 - cmp dh,4 - je pop_sreg32 - cmp dh,8 - je pop_sreg64 - jmp pop_sreg_store - pop_sreg16: - test dh,not 2 - jnz invalid_operand_size - call operand_16bit - jmp pop_sreg_store - pop_sreg32: - test dh,not 4 - jnz invalid_operand_size - cmp [code_type],64 - je illegal_instruction - call operand_32bit - jmp pop_sreg_store - pop_sreg64: - test dh,not 8 - jnz invalid_operand_size - cmp [code_type],64 - jne illegal_instruction - pop_sreg_store: - mov al,bl - cmp al,70h - jae invalid_operand - sub al,61h - cmp al,4 - jae pop_sreg_386 - shl al,3 - add al,7 - mov [base_code],al - cmp [code_type],64 - je illegal_instruction - jmp pop_reg_store - pop_sreg_386: - sub al,4 - shl al,3 - add al,0A1h - mov [extended_code],al - mov [base_code],0Fh - jmp pop_reg_store -inc_instruction: - mov [base_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - je inc_reg - cmp al,'[' - je inc_mem - jne invalid_operand - inc_mem: - call get_address - mov al,[operand_size] - cmp al,1 - je inc_mem_8bit - jb inc_mem_nosize - call operand_autodetect - mov al,0FFh - xchg al,[base_code] - mov [postbyte_register],al - call store_instruction - jmp instruction_assembled - inc_mem_nosize: - cmp [error_line],0 - jne inc_mem_8bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - inc_mem_8bit: - mov al,0FEh - xchg al,[base_code] - mov [postbyte_register],al - call store_instruction - jmp instruction_assembled - inc_reg: - lods byte [esi] - call convert_register - mov bl,al - mov al,0FEh - xchg al,[base_code] - mov [postbyte_register],al - mov al,ah - cmp al,1 - je inc_reg_8bit - call operand_autodetect - cmp [code_type],64 - je inc_reg_long_form - mov al,[postbyte_register] - shl al,3 - add al,bl - add al,40h - mov [base_code],al - call store_instruction_code - jmp instruction_assembled - inc_reg_long_form: - inc [base_code] - inc_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled -set_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - je set_reg - cmp al,'[' - jne invalid_operand - set_mem: - call get_address - cmp [operand_size],1 - ja invalid_operand_size - mov [postbyte_register],0 - call store_instruction - jmp instruction_assembled - set_reg: - lods byte [esi] - call convert_register - cmp ah,1 - jne invalid_operand_size - mov bl,al - mov [postbyte_register],0 - call store_nomem_instruction - jmp instruction_assembled -arpl_instruction: - cmp [code_type],64 - je illegal_instruction - mov [base_code],63h - lods byte [esi] - call get_size_operator - cmp al,10h - je arpl_reg - cmp al,'[' - jne invalid_operand - call get_address - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - cmp ah,2 - jne invalid_operand_size - call store_instruction - jmp instruction_assembled - arpl_reg: - lods byte [esi] - call convert_register - cmp ah,2 - jne invalid_operand_size - mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp ah,2 - jne invalid_operand_size - mov [postbyte_register],al - call store_nomem_instruction - jmp instruction_assembled -bound_instruction: - cmp [code_type],64 - je illegal_instruction - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - cmp al,2 - je bound_16bit - cmp al,4 - je bound_32bit - jmp invalid_operand_size - bound_32bit: - call operand_32bit - mov [base_code],62h - call store_instruction - jmp instruction_assembled - bound_16bit: - call operand_16bit - mov [base_code],62h - call store_instruction - jmp instruction_assembled -enter_instruction: - lods byte [esi] - call get_size_operator - cmp ah,2 - je enter_imm16_size_ok - or ah,ah - jnz invalid_operand_size - enter_imm16_size_ok: - cmp al,'(' - jne invalid_operand - call get_word_value - cmp [next_pass_needed],0 - jne enter_imm16_ok - cmp [value_type],0 - jne invalid_use_of_symbol - enter_imm16_ok: - push eax - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp ah,1 - je enter_imm8_size_ok - or ah,ah - jnz invalid_operand_size - enter_imm8_size_ok: - cmp al,'(' - jne invalid_operand - call get_byte_value - mov dl,al - pop ebx - mov al,0C8h - stos byte [edi] - mov ax,bx - stos word [edi] - mov al,dl - stos byte [edi] - jmp instruction_assembled -ret_instruction_only64: - cmp [code_type],64 - jne illegal_instruction - jmp ret_instruction -ret_instruction_32bit_except64: - cmp [code_type],64 - je illegal_instruction -ret_instruction_32bit: - call operand_32bit - jmp ret_instruction -ret_instruction_16bit: - call operand_16bit - jmp ret_instruction -retf_instruction: - cmp [code_type],64 - jne ret_instruction -ret_instruction_64bit: - call operand_64bit -ret_instruction: - mov [base_code],al - lods byte [esi] - dec esi - or al,al - jz simple_ret - cmp al,0Fh - je simple_ret - lods byte [esi] - call get_size_operator - or ah,ah - jz ret_imm - cmp ah,2 - je ret_imm - jmp invalid_operand_size - ret_imm: - cmp al,'(' - jne invalid_operand - call get_word_value - cmp [next_pass_needed],0 - jne ret_imm_ok - cmp [value_type],0 - jne invalid_use_of_symbol - ret_imm_ok: - mov dx,ax - call store_instruction_code - mov ax,dx - stos word [edi] - jmp instruction_assembled - simple_ret: - inc [base_code] - call store_instruction_code - jmp instruction_assembled -lea_instruction: - mov [base_code],8Dh - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - xor al,al - xchg al,[operand_size] - push eax - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - pop eax - call operand_autodetect - call store_instruction - jmp instruction_assembled -ls_instruction: - or al,al - jz les_instruction - cmp al,3 - jz lds_instruction - add al,0B0h - mov [extended_code],al - mov [base_code],0Fh - jmp ls_code_ok - les_instruction: - mov [base_code],0C4h - jmp ls_short_code - lds_instruction: - mov [base_code],0C5h - ls_short_code: - cmp [code_type],64 - je illegal_instruction - ls_code_ok: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - add [operand_size],2 - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - cmp al,4 - je ls_16bit - cmp al,6 - je ls_32bit - cmp al,10 - je ls_64bit - jmp invalid_operand_size - ls_16bit: - call operand_16bit - call store_instruction - jmp instruction_assembled - ls_32bit: - call operand_32bit - call store_instruction - jmp instruction_assembled - ls_64bit: - call operand_64bit - call store_instruction - jmp instruction_assembled -sh_instruction: - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - je sh_reg - cmp al,'[' - jne invalid_operand - sh_mem: - call get_address - push edx bx cx - mov al,[operand_size] - push eax - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'(' - je sh_mem_imm - cmp al,10h - jne invalid_operand - sh_mem_reg: - lods byte [esi] - cmp al,11h - jne invalid_operand - pop eax cx bx edx - cmp al,1 - je sh_mem_cl_8bit - jb sh_mem_cl_nosize - call operand_autodetect - mov [base_code],0D3h - call store_instruction - jmp instruction_assembled - sh_mem_cl_nosize: - cmp [error_line],0 - jne sh_mem_cl_8bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - sh_mem_cl_8bit: - mov [base_code],0D2h - call store_instruction - jmp instruction_assembled - sh_mem_imm: - mov al,[operand_size] - or al,al - jz sh_mem_imm_size_ok - cmp al,1 - jne invalid_operand_size - sh_mem_imm_size_ok: - call get_byte_value - mov byte [value],al - pop eax cx bx edx - cmp al,1 - je sh_mem_imm_8bit - jb sh_mem_imm_nosize - call operand_autodetect - cmp byte [value],1 - je sh_mem_1 - mov [base_code],0C1h - call store_instruction_with_imm8 - jmp instruction_assembled - sh_mem_1: - mov [base_code],0D1h - call store_instruction - jmp instruction_assembled - sh_mem_imm_nosize: - cmp [error_line],0 - jne sh_mem_imm_8bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - sh_mem_imm_8bit: - cmp byte [value],1 - je sh_mem_1_8bit - mov [base_code],0C0h - call store_instruction_with_imm8 - jmp instruction_assembled - sh_mem_1_8bit: - mov [base_code],0D0h - call store_instruction - jmp instruction_assembled - sh_reg: - lods byte [esi] - call convert_register - mov bx,ax - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'(' - je sh_reg_imm - cmp al,10h - jne invalid_operand - sh_reg_reg: - lods byte [esi] - cmp al,11h - jne invalid_operand - mov al,bh - cmp al,1 - je sh_reg_cl_8bit - call operand_autodetect - mov [base_code],0D3h - call store_nomem_instruction - jmp instruction_assembled - sh_reg_cl_8bit: - mov [base_code],0D2h - call store_nomem_instruction - jmp instruction_assembled - sh_reg_imm: - mov al,[operand_size] - or al,al - jz sh_reg_imm_size_ok - cmp al,1 - jne invalid_operand_size - sh_reg_imm_size_ok: - push ebx - call get_byte_value - mov dl,al - pop ebx - mov al,bh - cmp al,1 - je sh_reg_imm_8bit - call operand_autodetect - cmp dl,1 - je sh_reg_1 - mov [base_code],0C1h - call store_nomem_instruction - mov al,dl - stos byte [edi] - jmp instruction_assembled - sh_reg_1: - mov [base_code],0D1h - call store_nomem_instruction - jmp instruction_assembled - sh_reg_imm_8bit: - cmp dl,1 - je sh_reg_1_8bit - mov [base_code],0C0h - call store_nomem_instruction - mov al,dl - stos byte [edi] - jmp instruction_assembled - sh_reg_1_8bit: - mov [base_code],0D0h - call store_nomem_instruction - jmp instruction_assembled -shd_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - je shd_reg - cmp al,'[' - jne invalid_operand - shd_mem: - call get_address - push edx bx cx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - mov al,ah - mov [operand_size],0 - push eax - lods byte [esi] - call get_size_operator - cmp al,'(' - je shd_mem_reg_imm - cmp al,10h - jne invalid_operand - lods byte [esi] - cmp al,11h - jne invalid_operand - pop eax cx bx edx - call operand_autodetect - inc [extended_code] - call store_instruction - jmp instruction_assembled - shd_mem_reg_imm: - mov al,[operand_size] - or al,al - jz shd_mem_reg_imm_size_ok - cmp al,1 - jne invalid_operand_size - shd_mem_reg_imm_size_ok: - call get_byte_value - mov byte [value],al - pop eax cx bx edx - call operand_autodetect - call store_instruction_with_imm8 - jmp instruction_assembled - shd_reg: - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov bl,[postbyte_register] - mov [postbyte_register],al - mov al,ah - push eax ebx - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,'(' - je shd_reg_reg_imm - cmp al,10h - jne invalid_operand - lods byte [esi] - cmp al,11h - jne invalid_operand - pop ebx eax - call operand_autodetect - inc [extended_code] - call store_nomem_instruction - jmp instruction_assembled - shd_reg_reg_imm: - mov al,[operand_size] - or al,al - jz shd_reg_reg_imm_size_ok - cmp al,1 - jne invalid_operand_size - shd_reg_reg_imm_size_ok: - call get_byte_value - mov dl,al - pop ebx eax - call operand_autodetect - call store_nomem_instruction - mov al,dl - stos byte [edi] - jmp instruction_assembled -movx_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - mov al,ah - push eax - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - je movx_reg - cmp al,'[' - jne invalid_operand - call get_address - pop eax - mov ah,[operand_size] - cmp ah,al - jae invalid_operand_size - cmp ah,1 - je movx_mem_8bit - cmp ah,2 - je movx_mem_16bit - or ah,ah - jnz invalid_operand_size - cmp [error_line],0 - jne movx_mem_8bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - movx_mem_8bit: - call operand_autodetect - call store_instruction - jmp instruction_assembled - movx_mem_16bit: - inc [extended_code] - call operand_autodetect - call store_instruction - jmp instruction_assembled - movx_reg: - lods byte [esi] - call convert_register - pop ebx - xchg bl,al - cmp ah,al - jae invalid_operand_size - cmp ah,1 - je movx_reg_8bit - cmp ah,2 - je movx_reg_16bit - jmp invalid_operand_size - movx_reg_8bit: - call operand_autodetect - call store_nomem_instruction - jmp instruction_assembled - movx_reg_16bit: - call operand_autodetect - inc [extended_code] - call store_nomem_instruction - jmp instruction_assembled -movsxd_instruction: - mov [base_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - cmp ah,8 - jne invalid_operand_size - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - je movsxd_reg - cmp al,'[' - jne invalid_operand - call get_address - cmp [operand_size],4 - je movsxd_mem_store - cmp [operand_size],0 - jne invalid_operand_size - movsxd_mem_store: - call operand_64bit - call store_instruction - jmp instruction_assembled - movsxd_reg: - lods byte [esi] - call convert_register - cmp ah,4 - jne invalid_operand_size - call operand_64bit - call store_nomem_instruction - jmp instruction_assembled -bt_instruction: - mov [postbyte_register],al - shl al,3 - add al,83h - mov [extended_code],al - mov [base_code],0Fh - lods byte [esi] - call get_size_operator - cmp al,10h - je bt_reg - cmp al,'[' - jne invalid_operand - call get_address - push eax bx cx - lods byte [esi] - cmp al,',' - jne invalid_operand - cmp byte [esi],'(' - je bt_mem_imm - cmp byte [esi],11h - jne bt_mem_reg - cmp byte [esi+2],'(' - je bt_mem_imm - bt_mem_reg: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - pop cx bx edx - mov al,ah - call operand_autodetect - call store_instruction - jmp instruction_assembled - bt_mem_imm: - xor al,al - xchg al,[operand_size] - push eax - lods byte [esi] - call get_size_operator - cmp al,'(' - jne invalid_operand - mov al,[operand_size] - or al,al - jz bt_mem_imm_size_ok - cmp al,1 - jne invalid_operand_size - bt_mem_imm_size_ok: - call get_byte_value - mov byte [value],al - pop eax - or al,al - jz bt_mem_imm_nosize - call operand_autodetect - bt_mem_imm_store: - pop cx bx edx - mov [extended_code],0BAh - call store_instruction_with_imm8 - jmp instruction_assembled - bt_mem_imm_nosize: - cmp [error_line],0 - jne bt_mem_imm_store - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp bt_mem_imm_store - bt_reg: - lods byte [esi] - call convert_register - mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - cmp byte [esi],'(' - je bt_reg_imm - cmp byte [esi],11h - jne bt_reg_reg - cmp byte [esi+2],'(' - je bt_reg_imm - bt_reg_reg: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - mov al,ah - call operand_autodetect - call store_nomem_instruction - jmp instruction_assembled - bt_reg_imm: - xor al,al - xchg al,[operand_size] - push eax - lods byte [esi] - call get_size_operator - cmp al,'(' - jne invalid_operand - mov al,[operand_size] - or al,al - jz bt_reg_imm_size_ok - cmp al,1 - jne invalid_operand_size - bt_reg_imm_size_ok: - call get_byte_value - mov byte [value],al - pop eax - call operand_autodetect - bt_reg_imm_store: - mov [extended_code],0BAh - call store_nomem_instruction - mov al,byte [value] - stos byte [edi] - jmp instruction_assembled -bs_instruction: - mov [extended_code],al - mov [base_code],0Fh - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je bs_reg_reg - cmp al,'[' - jne invalid_argument - call get_address - mov al,[operand_size] - call operand_autodetect - call store_instruction - jmp instruction_assembled - bs_reg_reg: - lods byte [esi] - call convert_register - mov bl,al - mov al,ah - call operand_autodetect - call store_nomem_instruction - jmp instruction_assembled -imul_instruction: - mov [base_code],0F6h - mov [postbyte_register],5 - lods byte [esi] - call get_size_operator - cmp al,10h - je imul_reg - cmp al,'[' - jne invalid_operand - imul_mem: - call get_address - mov al,[operand_size] - cmp al,1 - je imul_mem_8bit - jb imul_mem_nosize - call operand_autodetect - inc [base_code] - call store_instruction - jmp instruction_assembled - imul_mem_nosize: - cmp [error_line],0 - jne imul_mem_8bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - imul_mem_8bit: - call store_instruction - jmp instruction_assembled - imul_reg: - lods byte [esi] - call convert_register - cmp byte [esi],',' - je imul_reg_ - mov bl,al - mov al,ah - cmp al,1 - je imul_reg_8bit - call operand_autodetect - inc [base_code] - call store_nomem_instruction - jmp instruction_assembled - imul_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled - imul_reg_: - mov [postbyte_register],al - inc esi - cmp byte [esi],'(' - je imul_reg_imm - cmp byte [esi],11h - jne imul_reg_noimm - cmp byte [esi+2],'(' - je imul_reg_imm - imul_reg_noimm: - lods byte [esi] - call get_size_operator - cmp al,10h - je imul_reg_reg - cmp al,'[' - jne invalid_operand - imul_reg_mem: - call get_address - push edx bx cx - cmp byte [esi],',' - je imul_reg_mem_imm - mov al,[operand_size] - call operand_autodetect - pop cx bx edx - mov [base_code],0Fh - mov [extended_code],0AFh - call store_instruction - jmp instruction_assembled - imul_reg_mem_imm: - inc esi - lods byte [esi] - call get_size_operator - cmp al,'(' - jne invalid_operand - mov al,[operand_size] - cmp al,2 - je imul_reg_mem_imm_16bit - cmp al,4 - je imul_reg_mem_imm_32bit - cmp al,8 - je imul_reg_mem_imm_64bit - jmp invalid_operand_size - imul_reg_mem_imm_16bit: - call operand_16bit - call get_word_value - mov word [value],ax - cmp [value_type],0 - jne imul_reg_mem_imm_16bit_store - cmp [size_declared],0 - jne imul_reg_mem_imm_16bit_store - cmp ax,-80h - jl imul_reg_mem_imm_16bit_store - cmp ax,80h - jl imul_reg_mem_imm_8bit_store - imul_reg_mem_imm_16bit_store: - pop cx bx edx - mov [base_code],69h - call store_instruction_with_imm16 - jmp instruction_assembled - imul_reg_mem_imm_32bit: - call operand_32bit - call get_dword_value - imul_reg_mem_imm_32bit_ok: - mov dword [value],eax - cmp [value_type],0 - jne imul_reg_mem_imm_32bit_store - cmp [size_declared],0 - jne imul_reg_mem_imm_32bit_store - cmp eax,-80h - jl imul_reg_mem_imm_32bit_store - cmp eax,80h - jl imul_reg_mem_imm_8bit_store - imul_reg_mem_imm_32bit_store: - pop cx bx edx - mov [base_code],69h - call store_instruction_with_imm32 - jmp instruction_assembled - imul_reg_mem_imm_64bit: - cmp [size_declared],0 - jne long_immediate_not_encodable - call operand_64bit - call get_simm32 - cmp [value_type],4 - jae long_immediate_not_encodable - jmp imul_reg_mem_imm_32bit_ok - imul_reg_mem_imm_8bit_store: - pop cx bx edx - mov [base_code],6Bh - call store_instruction_with_imm8 - jmp instruction_assembled - imul_reg_imm: - mov bl,[postbyte_register] - dec esi - jmp imul_reg_reg_imm - imul_reg_reg: - lods byte [esi] - call convert_register - mov bl,al - cmp byte [esi],',' - je imul_reg_reg_imm - mov al,ah - call operand_autodetect - mov [base_code],0Fh - mov [extended_code],0AFh - call store_nomem_instruction - jmp instruction_assembled - imul_reg_reg_imm: - inc esi - lods byte [esi] - call get_size_operator - cmp al,'(' - jne invalid_operand - mov al,[operand_size] - cmp al,2 - je imul_reg_reg_imm_16bit - cmp al,4 - je imul_reg_reg_imm_32bit - cmp al,8 - je imul_reg_reg_imm_64bit - jmp invalid_operand_size - imul_reg_reg_imm_16bit: - call operand_16bit - push ebx - call get_word_value - pop ebx - mov dx,ax - cmp [value_type],0 - jne imul_reg_reg_imm_16bit_store - cmp [size_declared],0 - jne imul_reg_reg_imm_16bit_store - cmp ax,-80h - jl imul_reg_reg_imm_16bit_store - cmp ax,80h - jl imul_reg_reg_imm_8bit_store - imul_reg_reg_imm_16bit_store: - mov [base_code],69h - call store_nomem_instruction - mov ax,dx - call mark_relocation - stos word [edi] - jmp instruction_assembled - imul_reg_reg_imm_32bit: - call operand_32bit - push ebx - call get_dword_value - imul_reg_reg_imm_32bit_ok: - pop ebx - mov edx,eax - cmp [value_type],0 - jne imul_reg_reg_imm_32bit_store - cmp [size_declared],0 - jne imul_reg_reg_imm_32bit_store - cmp eax,-80h - jl imul_reg_reg_imm_32bit_store - cmp eax,80h - jl imul_reg_reg_imm_8bit_store - imul_reg_reg_imm_32bit_store: - mov [base_code],69h - call store_nomem_instruction - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - imul_reg_reg_imm_64bit: - cmp [size_declared],0 - jne long_immediate_not_encodable - call operand_64bit - push ebx - call get_simm32 - cmp [value_type],4 - jae long_immediate_not_encodable - jmp imul_reg_reg_imm_32bit_ok - imul_reg_reg_imm_8bit_store: - mov [base_code],6Bh - call store_nomem_instruction - mov al,dl - stos byte [edi] - jmp instruction_assembled -in_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - or al,al - jnz invalid_operand - lods byte [esi] - cmp al,',' - jne invalid_operand - mov al,ah - push eax - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,'(' - je in_imm - cmp al,10h - je in_reg - jmp invalid_operand - in_reg: - lods byte [esi] - cmp al,22h - jne invalid_operand - pop eax - cmp al,1 - je in_al_dx - cmp al,2 - je in_ax_dx - cmp al,4 - je in_eax_dx - jmp invalid_operand_size - in_al_dx: - mov al,0ECh - stos byte [edi] - jmp instruction_assembled - in_ax_dx: - call operand_16bit - mov [base_code],0EDh - call store_instruction_code - jmp instruction_assembled - in_eax_dx: - call operand_32bit - mov [base_code],0EDh - call store_instruction_code - jmp instruction_assembled - in_imm: - mov al,[operand_size] - or al,al - jz in_imm_size_ok - cmp al,1 - jne invalid_operand_size - in_imm_size_ok: - call get_byte_value - mov dl,al - pop eax - cmp al,1 - je in_al_imm - cmp al,2 - je in_ax_imm - cmp al,4 - je in_eax_imm - jmp invalid_operand_size - in_al_imm: - mov al,0E4h - stos byte [edi] - mov al,dl - stos byte [edi] - jmp instruction_assembled - in_ax_imm: - call operand_16bit - mov [base_code],0E5h - call store_instruction_code - mov al,dl - stos byte [edi] - jmp instruction_assembled - in_eax_imm: - call operand_32bit - mov [base_code],0E5h - call store_instruction_code - mov al,dl - stos byte [edi] - jmp instruction_assembled -out_instruction: - lods byte [esi] - call get_size_operator - cmp al,'(' - je out_imm - cmp al,10h - jne invalid_operand - lods byte [esi] - cmp al,22h - jne invalid_operand - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - or al,al - jnz invalid_operand - mov al,ah - cmp al,1 - je out_dx_al - cmp al,2 - je out_dx_ax - cmp al,4 - je out_dx_eax - jmp invalid_operand_size - out_dx_al: - mov al,0EEh - stos byte [edi] - jmp instruction_assembled - out_dx_ax: - call operand_16bit - mov [base_code],0EFh - call store_instruction_code - jmp instruction_assembled - out_dx_eax: - call operand_32bit - mov [base_code],0EFh - call store_instruction_code - jmp instruction_assembled - out_imm: - mov al,[operand_size] - or al,al - jz out_imm_size_ok - cmp al,1 - jne invalid_operand_size - out_imm_size_ok: - call get_byte_value - mov dl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - or al,al - jnz invalid_operand - mov al,ah - cmp al,1 - je out_imm_al - cmp al,2 - je out_imm_ax - cmp al,4 - je out_imm_eax - jmp invalid_operand_size - out_imm_al: - mov al,0E6h - stos byte [edi] - mov al,dl - stos byte [edi] - jmp instruction_assembled - out_imm_ax: - call operand_16bit - mov [base_code],0E7h - call store_instruction_code - mov al,dl - stos byte [edi] - jmp instruction_assembled - out_imm_eax: - call operand_32bit - mov [base_code],0E7h - call store_instruction_code - mov al,dl - stos byte [edi] - jmp instruction_assembled - -conditional_jump: - mov [base_code],al - lods byte [esi] - call get_jump_operator - cmp [jump_type],2 - je invalid_operand - call get_size_operator - cmp al,'(' - jne invalid_operand - cmp byte [esi],'.' - je invalid_value - call get_relative_offset - sub eax,2 - jo jump_out_of_range - cmp [next_pass_needed],0 - jne conditional_jump_value_ok - cmp [value_type],1 - je invalid_use_of_symbol - ja conditional_jump_32bit - conditional_jump_value_ok: - mov bl,[operand_size] - cmp bl,1 - je conditional_jump_8bit - cmp bl,2 - je conditional_jump_16bit - cmp bl,4 - je conditional_jump_32bit - or bl,bl - jnz invalid_operand_size - cmp eax,80h - jb conditional_jump_8bit - cmp eax,-80h - jae conditional_jump_8bit - cmp [code_type],16 - je conditional_jump_16bit - conditional_jump_32bit: - sub eax,2 - jo jump_out_of_range - mov edx,eax - mov ecx,edi - call operand_32bit - mov al,[base_code] - add al,10h - mov [extended_code],al - mov [base_code],0Fh - call store_instruction_code - mov eax,edi - sub eax,ecx - sub edx,eax - jo jump_out_of_range - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - conditional_jump_16bit: - mov edx,eax - mov ecx,edi - call operand_16bit - mov al,[base_code] - add al,10h - mov [extended_code],al - mov [base_code],0Fh - call store_instruction_code - mov eax,edi - sub eax,ecx - sub edx,eax - jo jump_out_of_range - mov eax,edx - stos word [edi] - cmp eax,10000h - jge jump_out_of_range - cmp eax,-10000h - jl jump_out_of_range - jmp instruction_assembled - conditional_jump_8bit: - mov edx,eax - mov ah,al - mov al,[base_code] - stos word [edi] - cmp edx,80h - jge jump_out_of_range - cmp edx,-80h - jl jump_out_of_range - jmp instruction_assembled - jump_out_of_range: - cmp [error_line],0 - jne instruction_assembled - mov eax,[current_line] - mov [error_line],eax - mov [error],relative_jump_out_of_range - jmp instruction_assembled -loop_instruction_16bit: - cmp [code_type],64 - je illegal_instruction - mov dl,al - call address_16bit_prefix - mov al,dl - jmp loop_instruction -loop_instruction_32bit: - mov dl,al - call address_32bit_prefix - mov al,dl - jmp loop_instruction -loop_instruction_64bit: - cmp [code_type],64 - jne illegal_instruction -loop_instruction: - mov [base_code],al - lods byte [esi] - call get_jump_operator - cmp [jump_type],2 - je invalid_operand - call get_size_operator - cmp al,'(' - jne invalid_operand - cmp byte [esi],'.' - je invalid_value - call get_relative_offset - cmp [next_pass_needed],0 - jne loop_value_ok - cmp [value_type],0 - jne invalid_use_of_symbol - loop_value_ok: - mov bl,[operand_size] - cmp bl,1 - je loop_8bit - or bl,bl - jnz invalid_operand_size - loop_8bit: - sub eax,2 - jo jump_out_of_range - mov edx,eax - mov al,[base_code] - stos byte [edi] - mov al,dl - stos byte [edi] - cmp edx,80h - jge jump_out_of_range - cmp edx,-80h - jl jump_out_of_range - jmp instruction_assembled -call_instruction: - mov [postbyte_register],10b - mov [base_code],0E8h - mov [extended_code],9Ah - jmp process_jmp -jmp_instruction: - mov [postbyte_register],100b - mov [base_code],0E9h - mov [extended_code],0EAh - process_jmp: - lods byte [esi] - call get_jump_operator - call get_size_operator - cmp al,'(' - je jmp_imm - mov [base_code],0FFh - cmp al,10h - je jmp_reg - cmp al,'[' - jne invalid_operand - jmp_mem: - call get_address - mov edx,eax - mov al,[operand_size] - or al,al - jz jmp_mem_size_not_specified - cmp al,2 - je jmp_mem_16bit - cmp al,4 - je jmp_mem_32bit - cmp al,6 - je jmp_mem_48bit - cmp al,8 - je jmp_mem_64bit - cmp al,10 - je jmp_mem_80bit - jmp invalid_operand_size - jmp_mem_size_not_specified: - cmp [jump_type],2 - je jmp_mem_far - cmp [jump_type],1 - je jmp_mem_near - cmp [error_line],0 - jne jmp_mem_near - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - jmp_mem_near: - cmp [code_type],16 - je jmp_mem_16bit - cmp [code_type],32 - je jmp_mem_near_32bit - jmp_mem_64bit: - cmp [jump_type],2 - je invalid_operand_size - cmp [code_type],64 - jne illegal_instruction - call store_instruction - jmp instruction_assembled - jmp_mem_far: - cmp [code_type],16 - je jmp_mem_far_32bit - jmp_mem_48bit: - call operand_32bit - jmp_mem_far_store: - cmp [jump_type],1 - je invalid_operand_size - inc [postbyte_register] - call store_instruction - jmp instruction_assembled - jmp_mem_80bit: - call operand_64bit - jmp jmp_mem_far_store - jmp_mem_far_32bit: - call operand_16bit - jmp jmp_mem_far_store - jmp_mem_32bit: - cmp [jump_type],2 - je jmp_mem_far_32bit - cmp [jump_type],1 - je jmp_mem_near_32bit - cmp [code_type],16 - je jmp_mem_far_32bit - jmp_mem_near_32bit: - cmp [code_type],64 - je illegal_instruction - call operand_32bit - call store_instruction - jmp instruction_assembled - jmp_mem_16bit: - cmp [jump_type],2 - je invalid_operand_size - call operand_16bit - call store_instruction - jmp instruction_assembled - jmp_reg: - cmp [jump_type],2 - je invalid_operand - lods byte [esi] - call convert_register - mov bl,al - mov al,ah - cmp al,2 - je jmp_reg_16bit - cmp al,4 - je jmp_reg_32bit - cmp al,8 - jne invalid_operand_size - jmp_reg_64bit: - cmp [code_type],64 - jne illegal_instruction - call store_nomem_instruction - jmp instruction_assembled - jmp_reg_32bit: - cmp [code_type],64 - je illegal_instruction - call store_nomem_instruction - jmp instruction_assembled - jmp_reg_16bit: - call operand_16bit - call store_nomem_instruction - jmp instruction_assembled - jmp_imm: - cmp byte [esi],'.' - je invalid_value - mov ebx,esi - dec esi - call skip_symbol - xchg esi,ebx - cmp byte [ebx],':' - je jmp_far - call get_relative_offset - cmp [jump_type],2 - je invalid_operand - sub eax,2 - jo jump_out_of_range - cmp [next_pass_needed],0 - jne jmp_value_ok - cmp [value_type],1 - je invalid_use_of_symbol - ja jmp_32bit - jmp_value_ok: - mov bl,[operand_size] - cmp bl,1 - je jmp_8bit - cmp bl,2 - je jmp_16bit - cmp bl,4 - je jmp_32bit - or bl,bl - jnz invalid_operand_size - cmp [base_code],0E9h - jne jmp_no8bit - cmp eax,80h - jb jmp_8bit - cmp eax,-80h - jae jmp_8bit - jmp_no8bit: - cmp [code_type],16 - je jmp_16bit - jmp_32bit: - test [operand_size],not 4 - jnz invalid_operand_size - sub eax,2 - jo jump_out_of_range - mov edx,eax - mov ecx,edi - call operand_32bit - call store_instruction_code - mov eax,edi - sub eax,ecx - sub edx,eax - jo jump_out_of_range - mov eax,edx - call mark_relocation - stos dword [edi] - jmp instruction_assembled - jmp_16bit: - mov edx,eax - mov ecx,edi - call operand_16bit - call store_instruction_code - mov eax,edi - sub eax,ecx - sub edx,eax - jo jump_out_of_range - mov eax,edx - stos word [edi] - cmp eax,10000h - jge jump_out_of_range - cmp eax,-10000h - jl jump_out_of_range - jmp instruction_assembled - jmp_8bit: - cmp [base_code],0E9h - jne invalid_operand_size - mov edx,eax - mov ah,al - mov al,0EBh - stos word [edi] - cmp edx,80h - jge jump_out_of_range - cmp edx,-80h - jl jump_out_of_range - jmp instruction_assembled - jmp_far: - cmp [jump_type],1 - je invalid_operand - cmp [code_type],64 - je illegal_instruction - mov al,[extended_code] - mov [base_code],al - call get_word_value - push eax - inc esi - lods byte [esi] - cmp al,'(' - jne invalid_operand - mov al,[value_type] - push eax [symbol_identifier] - cmp byte [esi],'.' - je invalid_value - mov al,[operand_size] - cmp al,4 - je jmp_far_16bit - cmp al,6 - je jmp_far_32bit - or al,al - jnz invalid_operand_size - cmp [code_type],16 - jne jmp_far_32bit - jmp_far_16bit: - call get_word_value - mov ebx,eax - call operand_16bit - call store_instruction_code - mov ax,bx - call mark_relocation - stos word [edi] - jmp_far_segment: - pop [symbol_identifier] eax - mov [value_type],al - pop eax - call mark_relocation - stos word [edi] - jmp instruction_assembled - jmp_far_32bit: - call get_dword_value - mov ebx,eax - call operand_32bit - call store_instruction_code - mov eax,ebx - call mark_relocation - stos dword [edi] - jmp jmp_far_segment - -movs_instruction: - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - cmp [segment_register],1 - ja invalid_address - push ebx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - pop edx - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - mov al,dh - mov ah,bh - shr al,4 - shr ah,4 - cmp al,ah - jne address_sizes_do_not_agree - and bh,111b - and dh,111b - cmp bh,6 - jne invalid_address - cmp dh,7 - jne invalid_address - cmp al,2 - je movs_address_16bit - cmp al,4 - je movs_address_32bit - cmp [code_type],64 - jne invalid_address_size - jmp movs_store - movs_address_32bit: - call address_32bit_prefix - jmp movs_store - movs_address_16bit: - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - movs_store: - cmp [segment_register],4 - je movs_segment_ok - call store_segment_prefix - movs_segment_ok: - mov al,0A4h - mov bl,[operand_size] - cmp bl,1 - je simple_instruction - inc al - cmp bl,2 - je simple_instruction_16bit - cmp bl,4 - je simple_instruction_32bit - cmp bl,8 - je simple_instruction_64bit - or bl,bl - jz operand_size_not_specified - jmp invalid_operand_size -lods_instruction: - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - cmp bh,26h - je lods_address_16bit - cmp bh,46h - je lods_address_32bit - cmp bh,86h - jne invalid_address - cmp [code_type],64 - jne invalid_address_size - jmp lods_store - lods_address_32bit: - call address_32bit_prefix - jmp lods_store - lods_address_16bit: - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - lods_store: - cmp [segment_register],4 - je lods_segment_ok - call store_segment_prefix - lods_segment_ok: - mov al,0ACh - mov bl,[operand_size] - cmp bl,1 - je simple_instruction - inc al - cmp bl,2 - je simple_instruction_16bit - cmp bl,4 - je simple_instruction_32bit - cmp bl,8 - je simple_instruction_64bit - or bl,bl - jz operand_size_not_specified - jmp invalid_operand_size -stos_instruction: - mov [base_code],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - cmp bh,27h - je stos_address_16bit - cmp bh,47h - je stos_address_32bit - cmp bh,87h - jne invalid_address - cmp [code_type],64 - jne invalid_address_size - jmp stos_store - stos_address_32bit: - call address_32bit_prefix - jmp stos_store - stos_address_16bit: - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - stos_store: - cmp [segment_register],1 - ja invalid_address - mov al,[base_code] - mov bl,[operand_size] - cmp bl,1 - je simple_instruction - inc al - cmp bl,2 - je simple_instruction_16bit - cmp bl,4 - je simple_instruction_32bit - cmp bl,8 - je simple_instruction_64bit - or bl,bl - jz operand_size_not_specified - jmp invalid_operand_size -cmps_instruction: - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - mov al,[segment_register] - push ax bx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - pop dx ax - cmp [segment_register],1 - ja invalid_address - mov [segment_register],al - mov al,dh - mov ah,bh - shr al,4 - shr ah,4 - cmp al,ah - jne address_sizes_do_not_agree - and bh,111b - and dh,111b - cmp bh,7 - jne invalid_address - cmp dh,6 - jne invalid_address - cmp al,2 - je cmps_address_16bit - cmp al,4 - je cmps_address_32bit - cmp [code_type],64 - jne invalid_address_size - jmp cmps_store - cmps_address_32bit: - call address_32bit_prefix - jmp cmps_store - cmps_address_16bit: - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - cmps_store: - cmp [segment_register],4 - je cmps_segment_ok - call store_segment_prefix - cmps_segment_ok: - mov al,0A6h - mov bl,[operand_size] - cmp bl,1 - je simple_instruction - inc al - cmp bl,2 - je simple_instruction_16bit - cmp bl,4 - je simple_instruction_32bit - cmp bl,8 - je simple_instruction_64bit - or bl,bl - jz operand_size_not_specified - jmp invalid_operand_size -ins_instruction: - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - cmp bh,27h - je ins_address_16bit - cmp bh,47h - je ins_address_32bit - cmp bh,87h - jne invalid_address - cmp [code_type],64 - jne invalid_address_size - jmp ins_store - ins_address_32bit: - call address_32bit_prefix - jmp ins_store - ins_address_16bit: - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - ins_store: - cmp [segment_register],1 - ja invalid_address - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - cmp al,22h - jne invalid_operand - mov al,6Ch - mov bl,[operand_size] - cmp bl,1 - je simple_instruction - inc al - cmp bl,2 - je simple_instruction_16bit - cmp bl,4 - je simple_instruction_32bit - or bl,bl - jz operand_size_not_specified - jmp invalid_operand_size -outs_instruction: - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - cmp al,22h - jne invalid_operand - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - cmp bh,26h - je outs_address_16bit - cmp bh,46h - je outs_address_32bit - cmp bh,86h - jne invalid_address - cmp [code_type],64 - jne invalid_address_size - jmp outs_store - outs_address_32bit: - call address_32bit_prefix - jmp outs_store - outs_address_16bit: - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - outs_store: - cmp [segment_register],4 - je outs_segment_ok - call store_segment_prefix - outs_segment_ok: - mov al,6Eh - mov bl,[operand_size] - cmp bl,1 - je simple_instruction - inc al - cmp bl,2 - je simple_instruction_16bit - cmp bl,4 - je simple_instruction_32bit - or bl,bl - jz operand_size_not_specified - jmp invalid_operand_size -xlat_instruction: - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - or eax,eax - jnz invalid_address - or bl,ch - jnz invalid_address - cmp bh,23h - je xlat_address_16bit - cmp bh,43h - je xlat_address_32bit - cmp bh,83h - jne invalid_address - cmp [code_type],64 - jne invalid_address_size - jmp xlat_store - xlat_address_32bit: - call address_32bit_prefix - jmp xlat_store - xlat_address_16bit: - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - xlat_store: - call store_segment_prefix_if_necessary - mov al,0D7h - cmp [operand_size],1 - jbe simple_instruction - jmp invalid_operand_size - -pm_word_instruction: - mov ah,al - shr ah,4 - and al,111b - mov [base_code],0Fh - mov [extended_code],ah - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - je pm_reg - pm_mem: - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - cmp al,2 - je pm_mem_store - or al,al - jnz invalid_operand_size - pm_mem_store: - call store_instruction - jmp instruction_assembled - pm_reg: - lods byte [esi] - call convert_register - mov bl,al - cmp ah,2 - jne invalid_operand_size - call store_nomem_instruction - jmp instruction_assembled -pm_store_word_instruction: - mov ah,al - shr ah,4 - and al,111b - mov [base_code],0Fh - mov [extended_code],ah - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne pm_mem - lods byte [esi] - call convert_register - mov bl,al - mov al,ah - call operand_autodetect - call store_nomem_instruction - jmp instruction_assembled -lgdt_instruction: - mov [base_code],0Fh - mov [extended_code],1 - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - cmp al,6 - je lgdt_mem_48bit - cmp al,10 - je lgdt_mem_80bit - or al,al - jnz invalid_operand_size - cmp [code_type],64 - je lgdt_mem_80bit - lgdt_mem_48bit: - cmp [code_type],64 - je illegal_instruction - call store_instruction - jmp instruction_assembled - lgdt_mem_80bit: - cmp [code_type],64 - jne illegal_instruction - call store_instruction - jmp instruction_assembled -lar_instruction: - mov [extended_code],al - mov [base_code],0Fh - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - xor al,al - xchg al,[operand_size] - call operand_autodetect - lods byte [esi] - call get_size_operator - cmp al,10h - je lar_reg_reg - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - or al,al - jz lar_reg_mem - cmp al,2 - jne invalid_operand_size - lar_reg_mem: - call store_instruction - jmp instruction_assembled - lar_reg_reg: - lods byte [esi] - call convert_register - cmp ah,2 - jne invalid_operand_size - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -invlpg_instruction: - mov [base_code],0Fh - mov [extended_code],1 - mov [postbyte_register],7 - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - call store_instruction - jmp instruction_assembled -swapgs_instruction: - mov [base_code],0Fh - mov [extended_code],1 - mov [postbyte_register],7 - mov bl,al - call store_nomem_instruction - jmp instruction_assembled - -basic_486_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - je basic_486_reg - cmp al,'[' - jne invalid_operand - call get_address - push edx bx cx - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - pop cx bx edx - mov al,ah - cmp al,1 - je basic_486_mem_reg_8bit - call operand_autodetect - inc [extended_code] - basic_486_mem_reg_8bit: - call store_instruction - jmp instruction_assembled - basic_486_reg: - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov bl,[postbyte_register] - mov [postbyte_register],al - mov al,ah - cmp al,1 - je basic_486_reg_reg_8bit - call operand_autodetect - inc [extended_code] - basic_486_reg_reg_8bit: - call store_nomem_instruction - jmp instruction_assembled -bswap_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - add al,0C8h - mov [extended_code],al - mov [base_code],0Fh - cmp ah,8 - je bswap_reg64 - cmp ah,4 - jne invalid_operand_size - call operand_32bit - call store_instruction_code - jmp instruction_assembled - bswap_reg64: - call operand_64bit - call store_instruction_code - jmp instruction_assembled -cmpxchgx_instruction: - mov [base_code],0Fh - mov [extended_code],0C7h - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov ah,1 - xchg [postbyte_register],ah - mov al,[operand_size] - or al,al - jz cmpxchgx_size_ok - cmp al,ah - jne invalid_operand_size - cmpxchgx_size_ok: - cmp ah,16 - jne cmpxchgx_store - call operand_64bit - cmpxchgx_store: - call store_instruction - jmp instruction_assembled - -basic_fpu_instruction: - mov [postbyte_register],al - mov [base_code],0D8h - lods byte [esi] - call get_size_operator - cmp al,10h - je basic_fpu_streg - cmp al,'[' - je basic_fpu_mem - dec esi - mov ah,[postbyte_register] - cmp ah,2 - jb invalid_operand - cmp ah,3 - ja invalid_operand - mov bl,1 - call store_nomem_instruction - jmp instruction_assembled - basic_fpu_mem: - call get_address - mov al,[operand_size] - cmp al,4 - je basic_fpu_mem_32bit - cmp al,8 - je basic_fpu_mem_64bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne basic_fpu_mem_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - basic_fpu_mem_32bit: - call store_instruction - jmp instruction_assembled - basic_fpu_mem_64bit: - mov [base_code],0DCh - call store_instruction - jmp instruction_assembled - basic_fpu_streg: - lods byte [esi] - call convert_fpu_register - mov bl,al - mov ah,[postbyte_register] - cmp ah,2 - je basic_fpu_single_streg - cmp ah,3 - je basic_fpu_single_streg - or al,al - jz basic_fpu_st0 - test ah,110b - jz basic_fpu_streg_st0 - xor [postbyte_register],1 - basic_fpu_streg_st0: - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_fpu_register - or al,al - jnz invalid_operand - mov [base_code],0DCh - call store_nomem_instruction - jmp instruction_assembled - basic_fpu_st0: - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_fpu_register - mov bl,al - basic_fpu_single_streg: - mov [base_code],0D8h - call store_nomem_instruction - jmp instruction_assembled -simple_fpu_instruction: - mov ah,al - or ah,11000000b - mov al,0D9h - stos word [edi] - jmp instruction_assembled -fi_instruction: - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - cmp al,2 - je fi_mem_16bit - cmp al,4 - je fi_mem_32bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne fi_mem_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - fi_mem_32bit: - mov [base_code],0DAh - call store_instruction - jmp instruction_assembled - fi_mem_16bit: - mov [base_code],0DEh - call store_instruction - jmp instruction_assembled -fld_instruction: - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - je fld_streg - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - cmp al,4 - je fld_mem_32bit - cmp al,8 - je fld_mem_64bit - cmp al,10 - je fld_mem_80bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne fld_mem_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - fld_mem_32bit: - mov [base_code],0D9h - call store_instruction - jmp instruction_assembled - fld_mem_64bit: - mov [base_code],0DDh - call store_instruction - jmp instruction_assembled - fld_mem_80bit: - mov al,[postbyte_register] - cmp al,0 - je fld_mem_80bit_store - dec [postbyte_register] - cmp al,3 - je fld_mem_80bit_store - jmp invalid_operand_size - fld_mem_80bit_store: - add [postbyte_register],5 - mov [base_code],0DBh - call store_instruction - jmp instruction_assembled - fld_streg: - lods byte [esi] - call convert_fpu_register - mov bl,al - cmp [postbyte_register],2 - jae fst_streg - mov [base_code],0D9h - call store_nomem_instruction - jmp instruction_assembled - fst_streg: - mov [base_code],0DDh - call store_nomem_instruction - jmp instruction_assembled -fild_instruction: - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - cmp al,2 - je fild_mem_16bit - cmp al,4 - je fild_mem_32bit - cmp al,8 - je fild_mem_64bit - or al,al - jnz invalid_operand_size - cmp [error_line],0 - jne fild_mem_32bit - mov eax,[current_line] - mov [error_line],eax - mov [error],operand_size_not_specified - fild_mem_32bit: - mov [base_code],0DBh - call store_instruction - jmp instruction_assembled - fild_mem_16bit: - mov [base_code],0DFh - call store_instruction - jmp instruction_assembled - fild_mem_64bit: - mov al,[postbyte_register] - cmp al,1 - je fisttp_64bit_store - jb fild_mem_64bit_store - dec [postbyte_register] - cmp al,3 - je fild_mem_64bit_store - jmp invalid_operand_size - fild_mem_64bit_store: - add [postbyte_register],5 - mov [base_code],0DFh - call store_instruction - jmp instruction_assembled - fisttp_64bit_store: - mov [base_code],0DDh - call store_instruction - jmp instruction_assembled -fbld_instruction: - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - or al,al - jz fbld_mem_80bit - cmp al,10 - je fbld_mem_80bit - jmp invalid_operand_size - fbld_mem_80bit: - mov [base_code],0DFh - call store_instruction - jmp instruction_assembled -faddp_instruction: - mov [postbyte_register],al - mov [base_code],0DEh - mov edx,esi - lods byte [esi] - call get_size_operator - cmp al,10h - je faddp_streg - mov esi,edx - mov bl,1 - call store_nomem_instruction - jmp instruction_assembled - faddp_streg: - lods byte [esi] - call convert_fpu_register - mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_fpu_register - or al,al - jnz invalid_operand - call store_nomem_instruction - jmp instruction_assembled -fcompp_instruction: - mov ax,0D9DEh - stos word [edi] - jmp instruction_assembled -fucompp_instruction: - mov ax,0E9DAh - stos word [edi] - jmp instruction_assembled -fxch_instruction: - mov dx,01D9h - jmp fpu_single_operand -ffreep_instruction: - mov dx,00DFh - jmp fpu_single_operand -ffree_instruction: - mov dl,0DDh - mov dh,al - fpu_single_operand: - mov ebx,esi - lods byte [esi] - call get_size_operator - cmp al,10h - je fpu_streg - or dh,dh - jz invalid_operand - mov esi,ebx - shl dh,3 - or dh,11000001b - mov ax,dx - stos word [edi] - jmp instruction_assembled - fpu_streg: - lods byte [esi] - call convert_fpu_register - shl dh,3 - or dh,al - or dh,11000000b - mov ax,dx - stos word [edi] - jmp instruction_assembled -fstenv_instruction: - mov byte [edi],9Bh - inc edi -fldenv_instruction: - mov [base_code],0D9h - jmp fpu_mem -fsave_instruction: - mov byte [edi],9Bh - inc edi -fnsave_instruction: - mov [base_code],0DDh - fpu_mem: - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - cmp [operand_size],0 - jne invalid_operand_size - call store_instruction - jmp instruction_assembled -fstcw_instruction: - mov byte [edi],9Bh - inc edi -fldcw_instruction: - mov [postbyte_register],al - mov [base_code],0D9h - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - or al,al - jz fldcw_mem_16bit - cmp al,2 - je fldcw_mem_16bit - jmp invalid_operand_size - fldcw_mem_16bit: - call store_instruction - jmp instruction_assembled -fstsw_instruction: - mov al,9Bh - stos byte [edi] -fnstsw_instruction: - mov [base_code],0DDh - mov [postbyte_register],7 - lods byte [esi] - call get_size_operator - cmp al,10h - je fstsw_reg - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - or al,al - jz fstsw_mem_16bit - cmp al,2 - je fstsw_mem_16bit - jmp invalid_operand_size - fstsw_mem_16bit: - call store_instruction - jmp instruction_assembled - fstsw_reg: - lods byte [esi] - call convert_register - cmp ax,0200h - jne invalid_operand - mov ax,0E0DFh - stos word [edi] - jmp instruction_assembled -finit_instruction: - mov byte [edi],9Bh - inc edi -fninit_instruction: - mov ah,al - mov al,0DBh - stos word [edi] - jmp instruction_assembled -fcmov_instruction: - mov dh,0DAh - jmp fcomi_streg -fcomi_instruction: - mov dh,0DBh - jmp fcomi_streg -fcomip_instruction: - mov dh,0DFh - fcomi_streg: - mov dl,al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_fpu_register - mov ah,al - cmp byte [esi],',' - je fcomi_st0_streg - add ah,dl - mov al,dh - stos word [edi] - jmp instruction_assembled - fcomi_st0_streg: - or ah,ah - jnz invalid_operand - inc esi - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_fpu_register - mov ah,al - add ah,dl - mov al,dh - stos word [edi] - jmp instruction_assembled - -mmx_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - call make_mmx_prefix - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je mmx_mmreg_mmreg - cmp al,'[' - jne invalid_operand - mmx_mmreg_mem: - call get_address - call store_instruction - jmp instruction_assembled - mmx_mmreg_mmreg: - lods byte [esi] - call convert_mmx_register - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -mmx_ps_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - call make_mmx_prefix - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - je mmx_mmreg_mmreg - cmp al,'(' - je mmx_ps_mmreg_imm8 - cmp al,'[' - je mmx_mmreg_mem - jmp invalid_operand - mmx_ps_mmreg_imm8: - call get_byte_value - mov byte [value],al - test [operand_size],not 1 - jnz invalid_value - mov bl,[extended_code] - mov al,bl - shr bl,4 - and al,1111b - add al,70h - mov [extended_code],al - sub bl,0Ch - shl bl,1 - xchg bl,[postbyte_register] - call store_nomem_instruction - mov al,byte [value] - stos byte [edi] - jmp instruction_assembled -pextrw_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp ah,4 - jnz invalid_operand_size - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - mov bl,al - call make_mmx_prefix - cmp [extended_code],0C5h - je mmx_nomem_imm8 - call store_nomem_instruction - jmp instruction_assembled - mmx_imm8: - push bx cx edx - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - test ah,not 1 - jnz invalid_operand_size - cmp al,'(' - jne invalid_operand - call get_byte_value - mov byte [value],al - pop edx cx bx - call store_instruction_with_imm8 - jmp instruction_assembled - mmx_nomem_imm8: - call store_nomem_instruction - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - test ah,not 1 - jnz invalid_operand_size - cmp al,'(' - jne invalid_operand - call get_byte_value - stosb - jmp instruction_assembled -pinsrw_instruction: - mov [extended_code],al - mov [base_code],0Fh - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - call make_mmx_prefix - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je pinsrw_mmreg_reg - cmp al,'[' - jne invalid_operand - call get_address - cmp [operand_size],0 - je mmx_imm8 - cmp [operand_size],2 - jne invalid_operand_size - jmp mmx_imm8 - pinsrw_mmreg_reg: - lods byte [esi] - call convert_register - cmp ah,4 - jne invalid_operand_size - mov bl,al - jmp mmx_nomem_imm8 -pshufw_instruction: - mov [mmx_size],8 - mov [operand_prefix],al - jmp pshuf_instruction -pshufd_instruction: - mov [mmx_size],16 - mov [operand_prefix],al - pshuf_instruction: - mov [base_code],0Fh - mov [extended_code],70h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,[mmx_size] - jne invalid_operand_size - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je pshuf_mmreg_mmreg - cmp al,'[' - jne invalid_operand - call get_address - jmp mmx_imm8 - pshuf_mmreg_mmreg: - lods byte [esi] - call convert_mmx_register - mov bl,al - jmp mmx_nomem_imm8 -movd_instruction: - mov [base_code],0Fh - mov [extended_code],7Eh - lods byte [esi] - call get_size_operator - cmp al,10h - je movd_reg - cmp al,'[' - jne invalid_operand - call get_address - test [operand_size],not 4 - jnz invalid_operand_size - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - call make_mmx_prefix - mov [postbyte_register],al - call store_instruction - jmp instruction_assembled - movd_reg: - lods byte [esi] - cmp al,0B0h - jae movd_mmreg - call convert_register - cmp ah,4 - jne invalid_operand_size - mov [operand_size],0 - mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - mov [postbyte_register],al - call make_mmx_prefix - call store_nomem_instruction - jmp instruction_assembled - movd_mmreg: - mov [extended_code],6Eh - call convert_mmx_register - call make_mmx_prefix - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je movd_mmreg_reg - cmp al,'[' - jne invalid_operand - call get_address - test [operand_size],not 4 - jnz invalid_operand_size - call store_instruction - jmp instruction_assembled - movd_mmreg_reg: - lods byte [esi] - call convert_register - cmp ah,4 - jne invalid_operand_size - mov bl,al - call store_nomem_instruction - jmp instruction_assembled - make_mmx_prefix: - cmp [operand_size],16 - jne no_mmx_prefix - mov [operand_prefix],66h - no_mmx_prefix: - ret -movq_instruction: - mov [base_code],0Fh - lods byte [esi] - call get_size_operator - cmp al,10h - je movq_reg - cmp al,'[' - jne invalid_operand - call get_address - test [operand_size],not 8 - jnz invalid_operand_size - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - mov [postbyte_register],al - cmp ah,16 - je movq_mem_xmmreg - mov [extended_code],7Fh - call store_instruction - jmp instruction_assembled - movq_mem_xmmreg: - mov [extended_code],0D6h - mov [operand_prefix],66h - call store_instruction - jmp instruction_assembled - movq_reg: - lods byte [esi] - cmp al,0B0h - jae movq_mmreg - call convert_register - cmp ah,8 - jne invalid_operand_size - mov [operand_size],0 - mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - mov [postbyte_register],al - call make_mmx_prefix - mov [extended_code],7Eh - call operand_64bit - call store_nomem_instruction - jmp instruction_assembled - movq_mmreg: - call convert_mmx_register - mov [postbyte_register],al - mov [extended_code],6Fh - cmp ah,16 - jne movq_mmreg_ - mov [extended_code],7Eh - mov [operand_prefix],0F3h - movq_mmreg_: - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - je movq_mmreg_reg - call get_address - test [operand_size],not 8 - jnz invalid_operand_size - call store_instruction - jmp instruction_assembled - movq_mmreg_reg: - lods byte [esi] - cmp al,0B0h - jae movq_mmreg_mmreg - mov [operand_size],0 - call convert_register - cmp ah,8 - jne invalid_operand_size - mov [extended_code],6Eh - mov [operand_prefix],0 - mov bl,al - call make_mmx_prefix - call operand_64bit - call store_nomem_instruction - jmp instruction_assembled - movq_mmreg_mmreg: - call convert_mmx_register - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -movdq_instruction: - mov [operand_prefix],al - mov [base_code],0Fh - mov [extended_code],6Fh - lods byte [esi] - call get_size_operator - cmp al,10h - je movdq_mmreg - cmp al,'[' - jne invalid_operand - call get_address - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - mov [extended_code],7Fh - call store_instruction - jmp instruction_assembled - movdq_mmreg: - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je movdq_mmreg_mmreg - cmp al,'[' - jne invalid_operand - call get_address - call store_instruction - jmp instruction_assembled - movdq_mmreg_mmreg: - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -lddqu_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - push eax - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - pop eax - mov [postbyte_register],al - mov [operand_prefix],0F2h - mov [base_code],0Fh - mov [extended_code],0F0h - call store_instruction - jmp instruction_assembled -movq2dq_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,8 - jne invalid_operand_size - mov bl,al - mov [operand_prefix],0F3h - mov [base_code],0Fh - mov [extended_code],0D6h - call store_nomem_instruction - jmp instruction_assembled -movdq2q_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,8 - jne invalid_operand_size - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov bl,al - mov [operand_prefix],0F2h - mov [base_code],0Fh - mov [extended_code],0D6h - call store_nomem_instruction - jmp instruction_assembled - -sse_ps_instruction: - mov [mmx_size],16 - jmp sse_instruction -sse_pd_instruction: - mov [mmx_size],16 - mov [operand_prefix],66h - jmp sse_instruction -sse_ss_instruction: - mov [mmx_size],4 - mov [operand_prefix],0F3h - jmp sse_instruction -sse_sd_instruction: - mov [mmx_size],8 - mov [operand_prefix],0F2h - jmp sse_instruction -comiss_instruction: - mov [mmx_size],4 - jmp sse_instruction -comisd_instruction: - mov [mmx_size],8 - mov [operand_prefix],66h - jmp sse_instruction -cvtps2pd_instruction: - mov [mmx_size],8 - jmp sse_instruction -cvtpd2dq_instruction: - mov [mmx_size],16 - mov [operand_prefix],0F2h - jmp sse_instruction -cvtdq2pd_instruction: - mov [mmx_size],16 - mov [operand_prefix],0F3h -sse_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - sse_xmmreg: - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - sse_reg: - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je sse_xmmreg_xmmreg - sse_reg_mem: - cmp al,'[' - jne invalid_operand - call get_address - cmp [operand_size],0 - je sse_mem_size_ok - mov al,[mmx_size] - cmp [operand_size],al - jne invalid_operand_size - sse_mem_size_ok: - cmp [extended_code],0C6h - je mmx_imm8 - call store_instruction - jmp instruction_assembled - sse_xmmreg_xmmreg: - cmp [operand_prefix],66h - jne sse_xmmreg_xmmreg_ok - cmp [extended_code],12h - je invalid_operand - cmp [extended_code],16h - je invalid_operand - sse_xmmreg_xmmreg_ok: - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov bl,al - cmp [extended_code],0C6h - je mmx_nomem_imm8 - call store_nomem_instruction - jmp instruction_assembled -ps_dq_instruction: - mov [postbyte_register],al - mov [operand_prefix],66h - mov [base_code],0Fh - mov [extended_code],73h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov bl,al - jmp mmx_nomem_imm8 -movpd_instruction: - mov [operand_prefix],66h -movps_instruction: - mov [base_code],0Fh - mov [extended_code],al - mov [mmx_size],16 - jmp sse_mov_instruction -movss_instruction: - mov [mmx_size],4 - mov [operand_prefix],0F3h - jmp sse_movs -movsd_instruction: - mov al,0A5h - mov ah,[esi] - or ah,ah - jz simple_instruction_32bit - cmp ah,0Fh - je simple_instruction_32bit - mov [mmx_size],8 - mov [operand_prefix],0F2h - sse_movs: - mov [base_code],0Fh - mov [extended_code],10h - jmp sse_mov_instruction -sse_mov_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - je sse_xmmreg - sse_mem: - cmp al,'[' - jne invalid_operand - inc [extended_code] - call get_address - cmp [operand_size],0 - je sse_mem_xmmreg - mov al,[mmx_size] - cmp [operand_size],al - jne invalid_operand_size - mov [operand_size],0 - sse_mem_xmmreg: - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - call store_instruction - jmp instruction_assembled -movlpd_instruction: - mov [operand_prefix],66h -movlps_instruction: - mov [base_code],0Fh - mov [extended_code],al - mov [mmx_size],8 - lods byte [esi] - call get_size_operator - cmp al,10h - jne sse_mem - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - jmp sse_reg_mem -movhlps_instruction: - mov [base_code],0Fh - mov [extended_code],al - mov [mmx_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je sse_xmmreg_xmmreg_ok - jmp invalid_operand -maskmovq_instruction: - mov cl,8 - jmp maskmov_instruction -maskmovdqu_instruction: - mov cl,16 - mov [operand_prefix],66h - maskmov_instruction: - mov [base_code],0Fh - mov [extended_code],0F7h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,cl - jne invalid_operand_size - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -movmskpd_instruction: - mov [operand_prefix],66h -movmskps_instruction: - mov [base_code],0Fh - mov [extended_code],50h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp ah,4 - jne invalid_operand_size - mov [operand_size],0 - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -cmppd_instruction: - mov [operand_prefix],66h -cmpps_instruction: - mov [base_code],0Fh - mov [extended_code],0C2h - mov [mmx_size],16 - mov byte [value],-1 - jmp sse_cmp_instruction -cmp_pd_instruction: - mov [operand_prefix],66h -cmp_ps_instruction: - mov [base_code],0Fh - mov [extended_code],0C2h - mov [mmx_size],16 - mov byte [value],al - jmp sse_cmp_instruction -cmpss_instruction: - mov [mmx_size],4 - mov [operand_prefix],0F3h - jmp cmpsx_instruction -cmpsd_instruction: - mov al,0A7h - mov ah,[esi] - or ah,ah - jz simple_instruction_32bit - cmp ah,0Fh - je simple_instruction_32bit - mov [mmx_size],8 - mov [operand_prefix],0F2h - cmpsx_instruction: - mov [base_code],0Fh - mov [extended_code],0C2h - mov byte [value],-1 - jmp sse_cmp_instruction -cmp_ss_instruction: - mov [mmx_size],4 - mov [operand_prefix],0F3h - jmp cmp_sx_instruction -cmp_sd_instruction: - mov [mmx_size],8 - mov [operand_prefix],0F2h - cmp_sx_instruction: - mov [base_code],0Fh - mov [extended_code],0C2h - mov byte [value],al -sse_cmp_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call get_size_operator - cmp al,10h - je sse_cmp_xmmreg_xmmreg - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - or al,al - jz sse_cmp_size_ok - cmp al,[mmx_size] - jne invalid_operand_size - sse_cmp_size_ok: - push bx cx edx - call get_nextbyte - pop edx cx bx - call store_instruction_with_imm8 - jmp instruction_assembled - sse_cmp_xmmreg_xmmreg: - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov bl,al - call store_nomem_instruction - call get_nextbyte - mov al,byte [value] - stos byte [edi] - jmp instruction_assembled - get_nextbyte: - cmp byte [value],-1 - jne nextbyte_ok - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - test [operand_size],not 1 - jnz invalid_value - cmp al,'(' - jne invalid_operand - call get_byte_value - cmp al,7 - ja invalid_value - mov byte [value],al - nextbyte_ok: - ret -cvtpi2pd_instruction: - mov [operand_prefix],66h -cvtpi2ps_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je cvtpi_xmmreg_xmmreg - cmp al,'[' - jne invalid_operand - call get_address - cmp [operand_size],0 - je cvtpi_size_ok - cmp [operand_size],8 - jne invalid_operand_size - cvtpi_size_ok: - call store_instruction - jmp instruction_assembled - cvtpi_xmmreg_xmmreg: - lods byte [esi] - call convert_mmx_register - cmp ah,8 - jne invalid_operand_size - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -cvtsi2ss_instruction: - mov [operand_prefix],0F3h - jmp cvtsi_instruction -cvtsi2sd_instruction: - mov [operand_prefix],0F2h - cvtsi_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,16 - jne invalid_operand_size - mov [postbyte_register],al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je cvtsi_xmmreg_reg - cmp al,'[' - jne invalid_operand - call get_address - cmp [operand_size],0 - je cvtsi_size_ok - cmp [operand_size],4 - jne invalid_operand_size - cvtsi_size_ok: - call store_instruction - jmp instruction_assembled - cvtsi_xmmreg_reg: - lods byte [esi] - call convert_register - cmp ah,4 - je cvtsi_xmmreg_reg_store - cmp ah,8 - jne invalid_operand_size - call operand_64bit - cvtsi_xmmreg_reg_store: - mov bl,al - call store_nomem_instruction - jmp instruction_assembled -cvtps2pi_instruction: - mov [mmx_size],8 - jmp cvtpd_instruction -cvtpd2pi_instruction: - mov [operand_prefix],66h - mov [mmx_size],16 - cvtpd_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,8 - jne invalid_operand_size - mov [operand_size],0 - jmp sse_reg -cvtss2si_instruction: - mov [operand_prefix],0F3h - mov [mmx_size],4 - jmp cvt2si_instruction -cvtsd2si_instruction: - mov [operand_prefix],0F2h - mov [mmx_size],8 - cvt2si_instruction: - mov [extended_code],al - mov [base_code],0Fh - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [operand_size],0 - cmp ah,4 - je sse_reg - cmp ah,8 - jne invalid_operand_size - call operand_64bit - jmp sse_reg -amd3dnow_instruction: - mov [base_code],0Fh - mov [extended_code],0Fh - mov byte [value],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,8 - jne invalid_operand_size - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - je amd3dnow_mmreg_mmreg - cmp al,'[' - jne invalid_operand - call get_address - call store_instruction_with_imm8 - jmp instruction_assembled - amd3dnow_mmreg_mmreg: - lods byte [esi] - call convert_mmx_register - cmp ah,8 - jne invalid_operand_size - mov bl,al - call store_nomem_instruction - mov al,byte [value] - stos byte [edi] - jmp instruction_assembled - -fxsave_instruction: - mov [extended_code],0AEh - mov [base_code],0Fh - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov ah,[operand_size] - or ah,ah - jz fxsave_size_ok - mov al,[postbyte_register] - cmp al,111b - je clflush_size_check - cmp al,10b - jb invalid_operand_size - cmp al,11b - ja invalid_operand_size - cmp ah,4 - jne invalid_operand_size - jmp fxsave_size_ok - clflush_size_check: - cmp ah,1 - jne invalid_operand_size - fxsave_size_ok: - call store_instruction - jmp instruction_assembled -prefetch_instruction: - mov [extended_code],18h - prefetch_mem_8bit: - mov [base_code],0Fh - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - or ah,ah - jz prefetch_size_ok - cmp ah,1 - jne invalid_operand_size - prefetch_size_ok: - call get_address - call store_instruction - jmp instruction_assembled -amd_prefetch_instruction: - mov [extended_code],0Dh - jmp prefetch_mem_8bit -fence_instruction: - mov bl,al - mov ax,0AE0Fh - stos word [edi] - mov al,bl - stos byte [edi] - jmp instruction_assembled -pause_instruction: - mov ax,90F3h - stos word [edi] - jmp instruction_assembled -movntq_instruction: - mov [mmx_size],8 - jmp movnt_instruction -movntps_instruction: - mov [mmx_size],16 - jmp movnt_instruction -movntdq_instruction: - mov [operand_prefix],66h - mov [mmx_size],16 - movnt_instruction: - mov [extended_code],al - mov [base_code],0Fh - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - cmp ah,[mmx_size] - jne invalid_operand_size - mov [postbyte_register],al - call store_instruction - jmp instruction_assembled -movnti_instruction: - mov [base_code],0Fh - mov [extended_code],al - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp ah,4 - je movnti_store - cmp ah,8 - jne invalid_operand_size - call operand_64bit - movnti_store: - mov [postbyte_register],al - call store_instruction - jmp instruction_assembled -monitor_instruction: - mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp ax,0400h - jne invalid_operand - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp ax,0401h - jne invalid_operand - cmp [postbyte_register],0C8h - jne monitor_instruction_store - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - cmp ax,0402h - jne invalid_operand - monitor_instruction_store: - mov ax,010Fh - stos word [edi] - mov al,[postbyte_register] - stos byte [edi] - jmp instruction_assembled - -simple_vmx_instruction: - mov ah,al - mov al,0Fh - stos byte [edi] - mov al,1 - stos word [edi] - jmp instruction_assembled -vmclear_instruction: - mov [operand_prefix],66h - jmp vmx_instruction -vmxon_instruction: - mov [operand_prefix],0F3h -vmx_instruction: - mov [postbyte_register],al - mov [extended_code],0C7h - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - mov al,[operand_size] - or al,al - jz vmx_size_ok - cmp al,8 - jne invalid_operand_size - vmx_size_ok: - mov [base_code],0Fh - call store_instruction - jmp instruction_assembled -vmread_instruction: - mov [extended_code],78h - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - vmread_check_size: - cmp [code_type],64 - je vmread_long - cmp [operand_size],4 - je vmx_size_ok - jmp invalid_operand_size - vmread_long: - cmp [operand_size],8 - je vmx_size_ok - jmp invalid_operand_size -vmwrite_instruction: - mov [extended_code],79h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register - mov [postbyte_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,'[' - jne invalid_operand - call get_address - jmp vmread_check_size - -convert_register: - mov ah,al - shr ah,4 - and al,0Fh - cmp ah,8 - je match_register_size - cmp ah,4 - ja invalid_operand - cmp ah,1 - ja match_register_size - cmp al,4 - jb match_register_size - or ah,ah - jz high_byte_register - or [rex_prefix],40h - match_register_size: - cmp ah,[operand_size] - je register_size_ok - cmp [operand_size],0 - jne operand_sizes_do_not_match - mov [operand_size],ah - register_size_ok: - ret - high_byte_register: - mov ah,1 - or [rex_prefix],80h - jmp match_register_size -convert_fpu_register: - mov ah,al - shr ah,4 - and al,111b - cmp ah,10 - jne invalid_operand - jmp match_register_size -convert_mmx_register: - mov ah,al - shr ah,4 - cmp ah,0Ch - je xmm_register - ja invalid_operand - and al,111b - cmp ah,0Bh - jne invalid_operand - mov ah,8 - jmp match_register_size - xmm_register: - and al,0Fh - mov ah,16 - cmp al,8 - jb match_register_size - cmp [code_type],64 - jne invalid_operand - jmp match_register_size -get_size_operator: - xor ah,ah - cmp al,11h - jne no_size_operator - mov [size_declared],1 - lods word [esi] - xchg al,ah - mov [size_override],1 - cmp ah,[operand_size] - je size_operator_ok - cmp [operand_size],0 - jne operand_sizes_do_not_match - mov [operand_size],ah - size_operator_ok: - ret - no_size_operator: - mov [size_declared],0 - cmp al,'[' - jne size_operator_ok - mov [size_override],0 - ret -get_jump_operator: - mov [jump_type],0 - cmp al,12h - jne jump_operator_ok - lods word [esi] - mov [jump_type],al - mov al,ah - jump_operator_ok: - ret -get_address: - mov [segment_register],0 - mov [address_size],0 - mov al,[code_type] - shr al,3 - mov [value_size],al - mov al,[esi] - and al,11110000b - cmp al,60h - jne get_size_prefix - lods byte [esi] - sub al,60h - mov [segment_register],al - mov al,[esi] - and al,11110000b - get_size_prefix: - cmp al,70h - jne address_size_prefix_ok - lods byte [esi] - sub al,70h - cmp al,2 - jb invalid_address_size - cmp al,8 - ja invalid_address_size - mov [address_size],al - mov [value_size],al - address_size_prefix_ok: - call calculate_address - mov [address_high],edx - mov edx,eax - cmp [code_type],64 - jne address_ok - or bx,bx - jnz address_ok - test ch,0Fh - jnz address_ok - calculate_relative_address: - call calculate_relative_offset - mov [address_high],edx - mov edx,[symbol_identifier] - mov [address_symbol],edx - mov edx,eax - mov ch,[value_type] - mov bx,0FF00h - xor cl,cl - address_ok: - ret - -operand_16bit: - cmp [code_type],16 - je size_prefix_ok - mov [operand_prefix],66h - ret -operand_32bit: - cmp [code_type],16 - jne size_prefix_ok - mov [operand_prefix],66h - size_prefix_ok: - ret -operand_64bit: - cmp [code_type],64 - jne invalid_operand_size - or [rex_prefix],48h - ret -operand_autodetect: - cmp al,2 - je operand_16bit - cmp al,4 - je operand_32bit - cmp al,8 - je operand_64bit - jmp invalid_operand_size -store_segment_prefix_if_necessary: - mov al,[segment_register] - or al,al - jz segment_prefix_ok - cmp al,3 - je ss_prefix - cmp al,4 - ja segment_prefix_386 - jb segment_prefix_86 - cmp bl,25h - je segment_prefix_86 - cmp bh,25h - je segment_prefix_86 - cmp bh,45h - je segment_prefix_86 - cmp bh,44h - je segment_prefix_86 - ret - ss_prefix: - cmp bl,25h - je segment_prefix_ok - cmp bh,25h - je segment_prefix_ok - cmp bh,45h - je segment_prefix_ok - cmp bh,44h - je segment_prefix_ok - jmp segment_prefix_86 -store_segment_prefix: - mov al,[segment_register] - or al,al - jz segment_prefix_ok - cmp al,5 - jae segment_prefix_386 - segment_prefix_86: - dec al - shl al,3 - add al,26h - stos byte [edi] - jmp segment_prefix_ok - segment_prefix_386: - add al,64h-5 - stos byte [edi] - segment_prefix_ok: - ret -store_instruction_code: - mov al,[operand_prefix] - or al,al - jz operand_prefix_ok - stos byte [edi] - operand_prefix_ok: - mov al,[rex_prefix] - test al,40h - jz rex_prefix_ok - cmp [code_type],64 - jne invalid_operand - test al,0B0h - jnz prefix_conflict - stos byte [edi] - rex_prefix_ok: - mov al,[base_code] - stos byte [edi] - cmp al,0Fh - jne instruction_code_ok - store_extended_code: - mov al,[extended_code] - stos byte [edi] - instruction_code_ok: - ret -store_nomem_instruction: - test [postbyte_register],1000b - jz nomem_reg_code_ok - or [rex_prefix],44h - and [postbyte_register],111b - nomem_reg_code_ok: - test bl,1000b - jz nomem_rm_code_ok - or [rex_prefix],41h - and bl,111b - nomem_rm_code_ok: - call store_instruction_code - mov al,[postbyte_register] - shl al,3 - or al,bl - or al,11000000b - stos byte [edi] - ret -store_instruction: - mov [current_offset],edi - test [postbyte_register],1000b - jz reg_code_ok - or [rex_prefix],44h - and [postbyte_register],111b - reg_code_ok: - call store_segment_prefix_if_necessary - or bx,bx - jz address_immediate - cmp bx,0F000h - je address_rip_based - cmp bx,0FF00h - je address_relative - mov al,bl - or al,bh - and al,11110000b - cmp al,80h - je postbyte_64bit - cmp al,40h - je postbyte_32bit - cmp al,20h - jne invalid_address - cmp [code_type],64 - je invalid_address_size - call address_16bit_prefix - call store_instruction_code - cmp bx,2326h - je address_bx_si - cmp bx,2623h - je address_bx_si - cmp bx,2327h - je address_bx_di - cmp bx,2723h - je address_bx_di - cmp bx,2526h - je address_bp_si - cmp bx,2625h - je address_bp_si - cmp bx,2527h - je address_bp_di - cmp bx,2725h - je address_bp_di - cmp bx,2600h - je address_si - cmp bx,2700h - je address_di - cmp bx,2300h - je address_bx - cmp bx,2500h - je address_bp - jmp invalid_address - address_bx_si: - xor al,al - jmp postbyte_16bit - address_bx_di: - mov al,1 - jmp postbyte_16bit - address_bp_si: - mov al,10b - jmp postbyte_16bit - address_bp_di: - mov al,11b - jmp postbyte_16bit - address_si: - mov al,100b - jmp postbyte_16bit - address_di: - mov al,101b - jmp postbyte_16bit - address_bx: - mov al,111b - jmp postbyte_16bit - address_bp: - mov al,110b - postbyte_16bit: - test ch,22h - jnz address_16bit_value - or ch,ch - jnz address_sizes_do_not_agree - cmp edx,10000h - jge value_out_of_range - cmp edx,-8000h - jl value_out_of_range - or dx,dx - jz address - cmp dx,80h - jb address_8bit_value - cmp dx,-80h - jae address_8bit_value - address_16bit_value: - or al,10000000b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - mov eax,edx - stos word [edi] - ret - address_8bit_value: - or al,01000000b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - mov al,dl - stos byte [edi] - cmp dx,80h - jge value_out_of_range - cmp dx,-80h - jl value_out_of_range - ret - address: - cmp al,110b - je address_8bit_value - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - ret - postbyte_32bit: - call address_32bit_prefix - call store_instruction_code - cmp bl,44h - je invalid_address - or cl,cl - jz only_base_register - jmp base_and_index - postbyte_64bit: - cmp [code_type],64 - jne invalid_address_size - test bh,1000b - jz base_code_ok - or [rex_prefix],41h - base_code_ok: - test bl,1000b - jz index_code_ok - or [rex_prefix],42h - index_code_ok: - call store_instruction_code - or cl,cl - jz only_base_register - base_and_index: - mov al,100b - xor ah,ah - cmp cl,1 - je scale_ok - cmp cl,2 - je scale_1 - cmp cl,4 - je scale_2 - or ah,11000000b - jmp scale_ok - scale_2: - or ah,10000000b - jmp scale_ok - scale_1: - or ah,01000000b - scale_ok: - or bh,bh - jz only_index_register - and bl,111b - shl bl,3 - or ah,bl - and bh,111b - or ah,bh - test ch,44h - jnz sib_address_32bit_value - or ch,ch - jnz address_sizes_do_not_agree - cmp bh,5 - je address_value - or edx,edx - jz sib_address - address_value: - cmp edx,80h - jb sib_address_8bit_value - cmp edx,-80h - jae sib_address_8bit_value - sib_address_32bit_value: - or al,10000000b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos word [edi] - jmp store_address_32bit_value - sib_address_8bit_value: - or al,01000000b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos word [edi] - mov al,dl - stos byte [edi] - cmp edx,80h - jge value_out_of_range - cmp edx,-80h - jl value_out_of_range - ret - sib_address: - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos word [edi] - ret - only_index_register: - or ah,101b - and bl,111b - shl bl,3 - or ah,bl - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos word [edi] - test ch,44h - jnz store_address_32bit_value - or ch,ch - jnz invalid_address_size - jmp store_address_32bit_value - zero_index_register: - mov bl,4 - mov cl,1 - jmp base_and_index - only_base_register: - mov al,bh - and al,111b - cmp al,4 - je zero_index_register - test ch,44h - jnz simple_address_32bit_value - or ch,ch - jnz address_sizes_do_not_agree - or edx,edx - jz simple_address - cmp edx,80h - jb simple_address_8bit_value - cmp edx,-80h - jae simple_address_8bit_value - simple_address_32bit_value: - or al,10000000b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - jmp store_address_32bit_value - simple_address_8bit_value: - or al,01000000b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - mov al,dl - stos byte [edi] - cmp edx,80h - jge value_out_of_range - cmp edx,-80h - jl value_out_of_range - ret - simple_address: - cmp al,5 - je simple_address_8bit_value - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - ret - address_immediate: - cmp [code_type],64 - je address_immediate_sib - test ch,44h - jnz address_immediate_32bit - test ch,22h - jnz address_immediate_16bit - or ch,ch - jnz invalid_address_size - cmp [code_type],16 - je addressing_16bit - address_immediate_32bit: - call address_32bit_prefix - call store_instruction_code - store_immediate_address: - mov al,101b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - store_address_32bit_value: - test ch,0F0h - jz address_32bit_relocation_ok - mov al,2 - xchg [value_type],al - mov ebx,[address_symbol] - xchg ebx,[symbol_identifier] - call mark_relocation - mov [value_type],al - mov [symbol_identifier],ebx - address_32bit_relocation_ok: - mov eax,edx - stos dword [edi] - ret - store_address_64bit_value: - test ch,0F0h - jz address_64bit_relocation_ok - mov al,4 - xchg [value_type],al - mov ebx,[address_symbol] - xchg ebx,[symbol_identifier] - call mark_relocation - mov [value_type],al - mov [symbol_identifier],ebx - address_64bit_relocation_ok: - mov eax,edx - stos dword [edi] - mov eax,[address_high] - stos dword [edi] - ret - address_immediate_sib: - test ch,not 44h - jnz invalid_address_size - call address_32bit_prefix - call store_instruction_code - mov al,100b - mov ah,100101b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos word [edi] - jmp store_address_32bit_value - address_rip_based: - cmp [code_type],64 - jne invalid_address - call store_instruction_code - jmp store_immediate_address - address_relative: - call store_instruction_code - movzx eax,[immediate_size] - add eax,edi - sub eax,[current_offset] - add eax,5 - sub edx,eax - jo value_out_of_range - mov al,101b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - xchg [value_type],ch - mov ebx,[address_symbol] - xchg ebx,[symbol_identifier] - mov eax,edx - call mark_relocation - mov [value_type],ch - mov [symbol_identifier],ebx - stos dword [edi] - ret - addressing_16bit: - cmp edx,10000h - jge address_immediate_32bit - cmp edx,-8000h - jl address_immediate_32bit - movzx edx,dx - address_immediate_16bit: - call address_16bit_prefix - call store_instruction_code - mov al,110b - mov cl,[postbyte_register] - shl cl,3 - or al,cl - stos byte [edi] - mov eax,edx - stos word [edi] - cmp edx,10000h - jge value_out_of_range - cmp edx,-8000h - jl value_out_of_range - ret - address_16bit_prefix: - cmp [code_type],16 - je instruction_prefix_ok - mov al,67h - stos byte [edi] - ret - address_32bit_prefix: - cmp [code_type],32 - je instruction_prefix_ok - mov al,67h - stos byte [edi] - instruction_prefix_ok: - ret -store_instruction_with_imm8: - mov [immediate_size],1 - call store_instruction - mov al,byte [value] - stos byte [edi] - ret -store_instruction_with_imm16: - mov [immediate_size],2 - call store_instruction - mov ax,word [value] - call mark_relocation - stos word [edi] - ret -store_instruction_with_imm32: - mov [immediate_size],4 - call store_instruction - mov eax,dword [value] - call mark_relocation - stos dword [edi] - ret - -address_registers: - db 2,'bp',0,25h - db 2,'bx',0,23h - db 2,'di',0,27h - db 3,'eax',0,40h - db 3,'ebp',0,45h - db 3,'ebx',0,43h - db 3,'ecx',0,41h - db 3,'edi',0,47h - db 3,'edx',0,42h - db 3,'esi',0,46h - db 3,'esp',0,44h - db 3,'r10',10h,8Ah - db 3,'r11',10h,8Bh - db 3,'r12',10h,8Ch - db 3,'r13',10h,8Dh - db 3,'r14',10h,8Eh - db 3,'r15',10h,8Fh - db 2,'r8',10h,88h - db 2,'r9',10h,89h - db 3,'rax',0,80h - db 3,'rbp',0,85h - db 3,'rbx',0,83h - db 3,'rcx',0,81h - db 3,'rdi',0,87h - db 3,'rdx',0,82h - db 3,'rip',0,0F0h - db 3,'rsi',0,86h - db 3,'rsp',0,84h - db 2,'si',0,26h - db 0 - -address_sizes: - db 4,'byte',0,1 - db 5,'dword',0,4 - db 5,'qword',0,8 - db 4,'word',0,2 - db 0 - -symbols: - db 2,'ah',10h,04h - db 2,'al',10h,10h - db 2,'ax',10h,20h - db 2,'bh',10h,07h - db 2,'bl',10h,13h - db 2,'bp',10h,25h - db 3,'bpl',10h,15h - db 2,'bx',10h,23h - db 4,'byte',11h,1 - db 2,'ch',10h,05h - db 2,'cl',10h,11h - db 3,'cr0',10h,50h - db 3,'cr1',10h,51h - db 3,'cr2',10h,52h - db 3,'cr3',10h,53h - db 3,'cr4',10h,54h - db 3,'cr5',10h,55h - db 3,'cr6',10h,56h - db 3,'cr7',10h,57h - db 3,'cr8',10h,58h - db 3,'cr9',10h,59h - db 4,'cr10',10h,5Ah - db 4,'cr11',10h,5Bh - db 4,'cr12',10h,5Ch - db 4,'cr13',10h,5Dh - db 4,'cr14',10h,5Eh - db 4,'cr15',10h,5Fh - db 2,'cs',10h,62h - db 2,'cx',10h,21h - db 2,'dh',10h,06h - db 2,'di',10h,27h - db 3,'dil',10h,17h - db 2,'dl',10h,12h - db 6,'dqword',11h,16 - db 3,'dr0',10h,70h - db 3,'dr1',10h,71h - db 3,'dr2',10h,72h - db 3,'dr3',10h,73h - db 3,'dr4',10h,74h - db 3,'dr5',10h,75h - db 3,'dr6',10h,76h - db 3,'dr7',10h,77h - db 3,'dr8',10h,78h - db 3,'dr9',10h,79h - db 4,'dr10',10h,7Ah - db 4,'dr11',10h,7Bh - db 4,'dr12',10h,7Ch - db 4,'dr13',10h,7Dh - db 4,'dr14',10h,7Eh - db 4,'dr15',10h,7Fh - db 2,'ds',10h,64h - db 5,'dword',11h,4 - db 2,'dx',10h,22h - db 3,'eax',10h,40h - db 3,'ebp',10h,45h - db 3,'ebx',10h,43h - db 3,'ecx',10h,41h - db 3,'edi',10h,47h - db 3,'edx',10h,42h - db 2,'es',10h,61h - db 3,'esi',10h,46h - db 3,'esp',10h,44h - db 3,'far',12h,2 - db 2,'fs',10h,65h - db 5,'fword',11h,6 - db 2,'gs',10h,66h - db 3,'mm0',10h,0B0h - db 3,'mm1',10h,0B1h - db 3,'mm2',10h,0B2h - db 3,'mm3',10h,0B3h - db 3,'mm4',10h,0B4h - db 3,'mm5',10h,0B5h - db 3,'mm6',10h,0B6h - db 3,'mm7',10h,0B7h - db 4,'near',12h,1 - db 5,'pword',11h,6 - db 5,'qword',11h,8 - db 3,'r10',10h,8Ah - db 4,'r10b',10h,1Ah - db 4,'r10d',10h,4Ah - db 4,'r10w',10h,2Ah - db 3,'r11',10h,8Bh - db 4,'r11b',10h,1Bh - db 4,'r11d',10h,4Bh - db 4,'r11w',10h,2Bh - db 3,'r12',10h,8Ch - db 4,'r12b',10h,1Ch - db 4,'r12d',10h,4Ch - db 4,'r12w',10h,2Ch - db 3,'r13',10h,8Dh - db 4,'r13b',10h,1Dh - db 4,'r13d',10h,4Dh - db 4,'r13w',10h,2Dh - db 3,'r14',10h,8Eh - db 4,'r14b',10h,1Eh - db 4,'r14d',10h,4Eh - db 4,'r14w',10h,2Eh - db 3,'r15',10h,8Fh - db 4,'r15b',10h,1Fh - db 4,'r15d',10h,4Fh - db 4,'r15w',10h,2Fh - db 2,'r8',10h,88h - db 3,'r8b',10h,18h - db 3,'r8d',10h,48h - db 3,'r8w',10h,28h - db 2,'r9',10h,89h - db 3,'r9b',10h,19h - db 3,'r9d',10h,49h - db 3,'r9w',10h,29h - db 3,'rax',10h,80h - db 3,'rbp',10h,85h - db 3,'rbx',10h,83h - db 3,'rcx',10h,81h - db 3,'rdi',10h,87h - db 3,'rdx',10h,82h - db 3,'rsi',10h,86h - db 3,'rsp',10h,84h - db 2,'si',10h,26h - db 3,'sil',10h,16h - db 2,'sp',10h,24h - db 3,'spl',10h,14h - db 2,'ss',10h,63h - db 2,'st',10h,0A0h - db 3,'st0',10h,0A0h - db 3,'st1',10h,0A1h - db 3,'st2',10h,0A2h - db 3,'st3',10h,0A3h - db 3,'st4',10h,0A4h - db 3,'st5',10h,0A5h - db 3,'st6',10h,0A6h - db 3,'st7',10h,0A7h - db 5,'tbyte',11h,0Ah - db 3,'tr0',10h,90h - db 3,'tr1',10h,91h - db 3,'tr2',10h,92h - db 3,'tr3',10h,93h - db 3,'tr4',10h,94h - db 3,'tr5',10h,95h - db 3,'tr6',10h,96h - db 3,'tr7',10h,97h - db 5,'tword',11h,0Ah - db 5,'use16',13h,16 - db 5,'use32',13h,32 - db 5,'use64',13h,64 - db 4,'word',11h,2 - db 4,'xmm0',10h,0C0h - db 4,'xmm1',10h,0C1h - db 5,'xmm10',10h,0CAh - db 5,'xmm11',10h,0CBh - db 5,'xmm12',10h,0CCh - db 5,'xmm13',10h,0CDh - db 5,'xmm14',10h,0CEh - db 5,'xmm15',10h,0CFh - db 4,'xmm2',10h,0C2h - db 4,'xmm3',10h,0C3h - db 4,'xmm4',10h,0C4h - db 4,'xmm5',10h,0C5h - db 4,'xmm6',10h,0C6h - db 4,'xmm7',10h,0C7h - db 4,'xmm8',10h,0C8h - db 4,'xmm9',10h,0C9h - db 0 - -data_handlers: - dw data_bytes-assembler - dw data_file-assembler - dw reserve_bytes-assembler - dw data_words-assembler - dw data_unicode-assembler - dw reserve_words-assembler - dw data_dwords-assembler - dw reserve_dwords-assembler - dw data_pwords-assembler - dw reserve_pwords-assembler - dw data_qwords-assembler - dw reserve_qwords-assembler - dw data_twords-assembler - dw reserve_twords-assembler - -data_directives: - db 2,'db',1,0 - db 2,'dd',4,6 - db 2,'df',6,8 - db 2,'dp',6,8 - db 2,'dq',8,10 - db 2,'dt',10,12 - db 2,'du',2,4 - db 2,'dw',2,3 - db 4,'file',1,1 - db 2,'rb',1,2 - db 2,'rd',4,7 - db 2,'rf',6,9 - db 2,'rp',6,9 - db 2,'rq',8,11 - db 2,'rt',10,13 - db 2,'rw',2,5 - db 0 - -instructions: - dw instructions_2-instructions - dw instructions_3-instructions - dw instructions_4-instructions - dw instructions_5-instructions - dw instructions_6-instructions - dw instructions_7-instructions - dw instructions_8-instructions - dw instructions_9-instructions - dw instructions_10-instructions - dw instructions_11-instructions - -instructions_2: - db 'bt',4 - dw bt_instruction-assembler - db 'if',0 - dw if_directive-assembler - db 'in',0 - dw in_instruction-assembler - db 'ja',77h - dw conditional_jump-assembler - db 'jb',72h - dw conditional_jump-assembler - db 'jc',72h - dw conditional_jump-assembler - db 'je',74h - dw conditional_jump-assembler - db 'jg',7Fh - dw conditional_jump-assembler - db 'jl',7Ch - dw conditional_jump-assembler - db 'jo',70h - dw conditional_jump-assembler - db 'jp',7Ah - dw conditional_jump-assembler - db 'js',78h - dw conditional_jump-assembler - db 'jz',74h - dw conditional_jump-assembler - db 'or',08h - dw basic_instruction-assembler - db 0 -instructions_3: - db 'aaa',37h - dw simple_instruction_except64-assembler - db 'aad',0D5h - dw aa_instruction-assembler - db 'aam',0D4h - dw aa_instruction-assembler - db 'aas',3Fh - dw simple_instruction_except64-assembler - db 'adc',10h - dw basic_instruction-assembler - db 'add',00h - dw basic_instruction-assembler - db 'and',20h - dw basic_instruction-assembler - db 'bsf',0BCh - dw bs_instruction-assembler - db 'bsr',0BDh - dw bs_instruction-assembler - db 'btc',7 - dw bt_instruction-assembler - db 'btr',6 - dw bt_instruction-assembler - db 'bts',5 - dw bt_instruction-assembler - db 'cbw',98h - dw simple_instruction_16bit-assembler - db 'cdq',99h - dw simple_instruction_32bit-assembler - db 'clc',0F8h - dw simple_instruction-assembler - db 'cld',0FCh - dw simple_instruction-assembler - db 'cli',0FAh - dw simple_instruction-assembler - db 'cmc',0F5h - dw simple_instruction-assembler - db 'cmp',38h - dw basic_instruction-assembler - db 'cqo',99h - dw simple_instruction_64bit-assembler - db 'cwd',99h - dw simple_instruction_16bit-assembler - db 'daa',27h - dw simple_instruction_except64-assembler - db 'das',2Fh - dw simple_instruction_except64-assembler - db 'dec',1 - dw inc_instruction-assembler - db 'div',6 - dw single_operand_instruction-assembler - db 'end',0 - dw end_directive-assembler - db 'fld',0 - dw fld_instruction-assembler - db 'fst',2 - dw fld_instruction-assembler - db 'hlt',0F4h - dw simple_instruction-assembler - db 'inc',0 - dw inc_instruction-assembler - db 'ins',6Ch - dw ins_instruction-assembler - db 'int',0CDh - dw int_instruction-assembler - db 'jae',73h - dw conditional_jump-assembler - db 'jbe',76h - dw conditional_jump-assembler - db 'jge',7Dh - dw conditional_jump-assembler - db 'jle',7Eh - dw conditional_jump-assembler - db 'jmp',0 - dw jmp_instruction-assembler - db 'jna',76h - dw conditional_jump-assembler - db 'jnb',73h - dw conditional_jump-assembler - db 'jnc',73h - dw conditional_jump-assembler - db 'jne',75h - dw conditional_jump-assembler - db 'jng',7Eh - dw conditional_jump-assembler - db 'jnl',7Dh - dw conditional_jump-assembler - db 'jno',71h - dw conditional_jump-assembler - db 'jnp',7Bh - dw conditional_jump-assembler - db 'jns',79h - dw conditional_jump-assembler - db 'jnz',75h - dw conditional_jump-assembler - db 'jpe',7Ah - dw conditional_jump-assembler - db 'jpo',7Bh - dw conditional_jump-assembler - db 'lar',2 - dw lar_instruction-assembler - db 'lds',3 - dw ls_instruction-assembler - db 'lea',0 - dw lea_instruction-assembler - db 'les',0 - dw ls_instruction-assembler - db 'lfs',4 - dw ls_instruction-assembler - db 'lgs',5 - dw ls_instruction-assembler - db 'lsl',3 - dw lar_instruction-assembler - db 'lss',2 - dw ls_instruction-assembler - db 'ltr',3 - dw pm_word_instruction-assembler - db 'mov',0 - dw mov_instruction-assembler - db 'mul',4 - dw single_operand_instruction-assembler - db 'neg',3 - dw single_operand_instruction-assembler - db 'nop',90h - dw simple_instruction-assembler - db 'not',2 - dw single_operand_instruction-assembler - db 'org',0 - dw org_directive-assembler - db 'out',0 - dw out_instruction-assembler - db 'pop',0 - dw pop_instruction-assembler - db 'por',0EBh - dw mmx_instruction-assembler - db 'rcl',2 - dw sh_instruction-assembler - db 'rcr',3 - dw sh_instruction-assembler - db 'rep',0F3h - dw prefix_instruction-assembler - db 'ret',0C2h - dw ret_instruction-assembler - db 'rol',0 - dw sh_instruction-assembler - db 'ror',1 - dw sh_instruction-assembler - db 'rsm',0AAh - dw simple_extended_instruction-assembler - db 'sal',4 - dw sh_instruction-assembler - db 'sar',7 - dw sh_instruction-assembler - db 'sbb',18h - dw basic_instruction-assembler - db 'shl',4 - dw sh_instruction-assembler - db 'shr',5 - dw sh_instruction-assembler - db 'stc',0F9h - dw simple_instruction-assembler - db 'std',0FDh - dw simple_instruction-assembler - db 'sti',0FBh - dw simple_instruction-assembler - db 'str',1 - dw pm_store_word_instruction-assembler - db 'sub',28h - dw basic_instruction-assembler - db 'ud2',0Bh - dw simple_extended_instruction-assembler - db 'xor',30h - dw basic_instruction-assembler - db 0 -instructions_4: - db 'arpl',0 - dw arpl_instruction-assembler - db 'call',0 - dw call_instruction-assembler - db 'cdqe',98h - dw simple_instruction_64bit-assembler - db 'clts',6 - dw simple_extended_instruction-assembler - db 'cmps',0A6h - dw cmps_instruction-assembler - db 'cwde',98h - dw simple_instruction_32bit-assembler - db 'data',0 - dw data_directive-assembler - db 'else',0 - dw else_directive-assembler - db 'emms',77h - dw simple_extended_instruction-assembler - db 'fabs',100001b - dw simple_fpu_instruction-assembler - db 'fadd',0 - dw basic_fpu_instruction-assembler - db 'fbld',4 - dw fbld_instruction-assembler - db 'fchs',100000b - dw simple_fpu_instruction-assembler - db 'fcom',2 - dw basic_fpu_instruction-assembler - db 'fcos',111111b - dw simple_fpu_instruction-assembler - db 'fdiv',6 - dw basic_fpu_instruction-assembler - db 'feni',0E0h - dw finit_instruction-assembler - db 'fild',0 - dw fild_instruction-assembler - db 'fist',2 - dw fild_instruction-assembler - db 'fld1',101000b - dw simple_fpu_instruction-assembler - db 'fldz',101110b - dw simple_fpu_instruction-assembler - db 'fmul',1 - dw basic_fpu_instruction-assembler - db 'fnop',010000b - dw simple_fpu_instruction-assembler - db 'fsin',111110b - dw simple_fpu_instruction-assembler - db 'fstp',3 - dw fld_instruction-assembler - db 'fsub',4 - dw basic_fpu_instruction-assembler - db 'ftst',100100b - dw simple_fpu_instruction-assembler - db 'fxam',100101b - dw simple_fpu_instruction-assembler - db 'fxch',0 - dw fxch_instruction-assembler - db 'heap',0 - dw heap_directive-assembler - db 'idiv',7 - dw single_operand_instruction-assembler - db 'imul',0 - dw imul_instruction-assembler - db 'insb',6Ch - dw simple_instruction-assembler - db 'insd',6Dh - dw simple_instruction_32bit-assembler - db 'insw',6Dh - dw simple_instruction_16bit-assembler - db 'int1',0F1h - dw simple_instruction-assembler - db 'int3',0CCh - dw simple_instruction-assembler - db 'into',0CEh - dw simple_instruction_except64-assembler - db 'invd',8 - dw simple_extended_instruction-assembler - db 'iret',0CFh - dw iret_instruction-assembler - db 'jcxz',0E3h - dw loop_instruction_16bit-assembler - db 'jnae',72h - dw conditional_jump-assembler - db 'jnbe',77h - dw conditional_jump-assembler - db 'jnge',7Ch - dw conditional_jump-assembler - db 'jnle',7Fh - dw conditional_jump-assembler - db 'lahf',9Fh - dw simple_instruction_except64-assembler - db 'lgdt',2 - dw lgdt_instruction-assembler - db 'lidt',3 - dw lgdt_instruction-assembler - db 'lldt',2 - dw pm_word_instruction-assembler - db 'lmsw',16h - dw pm_word_instruction-assembler - db 'load',0 - dw load_directive-assembler - db 'lock',0F0h - dw prefix_instruction-assembler - db 'lods',0ACh - dw lods_instruction-assembler - db 'loop',0E2h - dw loop_instruction-assembler - db 'movd',0 - dw movd_instruction-assembler - db 'movq',0 - dw movq_instruction-assembler - db 'movs',0A4h - dw movs_instruction-assembler - db 'orpd',56h - dw sse_pd_instruction-assembler - db 'orps',56h - dw sse_ps_instruction-assembler - db 'outs',6Eh - dw outs_instruction-assembler - db 'pand',0DBh - dw mmx_instruction-assembler - db 'popa',61h - dw simple_instruction_except64-assembler - db 'popd',4 - dw pop_instruction-assembler - db 'popf',9Dh - dw simple_instruction-assembler - db 'popq',8 - dw pop_instruction-assembler - db 'popw',2 - dw pop_instruction-assembler - db 'push',0 - dw push_instruction-assembler - db 'pxor',0EFh - dw mmx_instruction-assembler - db 'repe',0F3h - dw prefix_instruction-assembler - db 'repz',0F3h - dw prefix_instruction-assembler - db 'retd',0C2h - dw ret_instruction_32bit_except64-assembler - db 'retf',0CAh - dw retf_instruction-assembler - db 'retn',0C2h - dw ret_instruction-assembler - db 'retq',0C2h - dw ret_instruction_only64-assembler - db 'retw',0C2h - dw ret_instruction_16bit-assembler - db 'sahf',9Eh - dw simple_instruction_except64-assembler - db 'salc',0D6h - dw simple_instruction_except64-assembler - db 'scas',0AEh - dw stos_instruction-assembler - db 'seta',97h - dw set_instruction-assembler - db 'setb',92h - dw set_instruction-assembler - db 'setc',92h - dw set_instruction-assembler - db 'sete',94h - dw set_instruction-assembler - db 'setg',9Fh - dw set_instruction-assembler - db 'setl',9Ch - dw set_instruction-assembler - db 'seto',90h - dw set_instruction-assembler - db 'setp',9Ah - dw set_instruction-assembler - db 'sets',98h - dw set_instruction-assembler - db 'setz',94h - dw set_instruction-assembler - db 'sgdt',0 - dw lgdt_instruction-assembler - db 'shld',0A4h - dw shd_instruction-assembler - db 'shrd',0ACh - dw shd_instruction-assembler - db 'sidt',1 - dw lgdt_instruction-assembler - db 'sldt',0 - dw pm_store_word_instruction-assembler - db 'smsw',14h - dw pm_store_word_instruction-assembler - db 'stos',0AAh - dw stos_instruction-assembler - db 'test',0 - dw test_instruction-assembler - db 'verr',4 - dw pm_word_instruction-assembler - db 'verw',5 - dw pm_word_instruction-assembler - db 'wait',9Bh - dw simple_instruction-assembler - db 'xadd',0C0h - dw basic_486_instruction-assembler - db 'xchg',0 - dw xchg_instruction-assembler - db 'xlat',0D7h - dw xlat_instruction-assembler - db 0 -instructions_5: - db 'addpd',58h - dw sse_pd_instruction-assembler - db 'addps',58h - dw sse_ps_instruction-assembler - db 'addsd',58h - dw sse_sd_instruction-assembler - db 'addss',58h - dw sse_ss_instruction-assembler - db 'align',0 - dw align_directive-assembler - db 'andpd',54h - dw sse_pd_instruction-assembler - db 'andps',54h - dw sse_ps_instruction-assembler - db 'bound',0 - dw bound_instruction-assembler - db 'break',0 - dw break_directive-assembler - db 'bswap',0 - dw bswap_instruction-assembler - db 'cmova',47h - dw cmov_instruction-assembler - db 'cmovb',42h - dw cmov_instruction-assembler - db 'cmovc',42h - dw cmov_instruction-assembler - db 'cmove',44h - dw cmov_instruction-assembler - db 'cmovg',4Fh - dw cmov_instruction-assembler - db 'cmovl',4Ch - dw cmov_instruction-assembler - db 'cmovo',40h - dw cmov_instruction-assembler - db 'cmovp',4Ah - dw cmov_instruction-assembler - db 'cmovs',48h - dw cmov_instruction-assembler - db 'cmovz',44h - dw cmov_instruction-assembler - db 'cmppd',0 - dw cmppd_instruction-assembler - db 'cmpps',0 - dw cmpps_instruction-assembler - db 'cmpsb',0A6h - dw simple_instruction-assembler - db 'cmpsd',0 - dw cmpsd_instruction-assembler - db 'cmpsq',0 - dw simple_instruction_64bit-assembler - db 'cmpss',0 - dw cmpss_instruction-assembler - db 'cmpsw',0A7h - dw simple_instruction_16bit-assembler - db 'cpuid',0A2h - dw simple_extended_instruction-assembler - db 'divpd',5Eh - dw sse_pd_instruction-assembler - db 'divps',5Eh - dw sse_ps_instruction-assembler - db 'divsd',5Eh - dw sse_sd_instruction-assembler - db 'divss',5Eh - dw sse_ss_instruction-assembler - db 'enter',0 - dw enter_instruction-assembler - db 'entry',0 - dw entry_directive-assembler - db 'extrn',0 - dw extrn_directive-assembler - db 'f2xm1',110000b - dw simple_fpu_instruction-assembler - db 'faddp',0 - dw faddp_instruction-assembler - db 'fbstp',6 - dw fbld_instruction-assembler - db 'fclex',0E2h - dw finit_instruction-assembler - db 'fcomi',0F0h - dw fcomi_instruction-assembler - db 'fcomp',3 - dw basic_fpu_instruction-assembler - db 'fdisi',0E1h - dw finit_instruction-assembler - db 'fdivp',7 - dw faddp_instruction-assembler - db 'fdivr',7 - dw basic_fpu_instruction-assembler - db 'femms',0Eh - dw simple_extended_instruction-assembler - db 'ffree',0 - dw ffree_instruction-assembler - db 'fiadd',0 - dw fi_instruction-assembler - db 'ficom',2 - dw fi_instruction-assembler - db 'fidiv',6 - dw fi_instruction-assembler - db 'fimul',1 - dw fi_instruction-assembler - db 'finit',0E3h - dw finit_instruction-assembler - db 'fistp',3 - dw fild_instruction-assembler - db 'fisub',4 - dw fi_instruction-assembler - db 'fldcw',5 - dw fldcw_instruction-assembler - db 'fldpi',101011b - dw simple_fpu_instruction-assembler - db 'fmulp',1 - dw faddp_instruction-assembler - db 'fneni',0E0h - dw fninit_instruction-assembler - db 'fprem',111000b - dw simple_fpu_instruction-assembler - db 'fptan',110010b - dw simple_fpu_instruction-assembler - db 'fsave',6 - dw fsave_instruction-assembler - db 'fsqrt',111010b - dw simple_fpu_instruction-assembler - db 'fstcw',7 - dw fstcw_instruction-assembler - db 'fstsw',0 - dw fstsw_instruction-assembler - db 'fsubp',5 - dw faddp_instruction-assembler - db 'fsubr',5 - dw basic_fpu_instruction-assembler - db 'fucom',4 - dw ffree_instruction-assembler - db 'fwait',9Bh - dw simple_instruction-assembler - db 'fyl2x',110001b - dw simple_fpu_instruction-assembler - db 'iretd',0CFh - dw simple_instruction_32bit-assembler - db 'iretq',0CFh - dw simple_instruction_64bit-assembler - db 'iretw',0CFh - dw simple_instruction_16bit-assembler - db 'jecxz',0E3h - dw loop_instruction_32bit-assembler - db 'jrcxz',0E3h - dw loop_instruction_64bit-assembler - db 'label',0 - dw label_directive-assembler - db 'lddqu',0 - dw lddqu_instruction-assembler - db 'leave',0C9h - dw simple_instruction-assembler - db 'lodsb',0ACh - dw simple_instruction-assembler - db 'lodsd',0ADh - dw simple_instruction_32bit-assembler - db 'lodsq',0ADh - dw simple_instruction_64bit-assembler - db 'lodsw',0ADh - dw simple_instruction_16bit-assembler - db 'loopd',0E2h - dw loop_instruction_32bit-assembler - db 'loope',0E1h - dw loop_instruction-assembler - db 'loopq',0E2h - dw loop_instruction_64bit-assembler - db 'loopw',0E2h - dw loop_instruction_16bit-assembler - db 'loopz',0E1h - dw loop_instruction-assembler - db 'maxpd',5Fh - dw sse_pd_instruction-assembler - db 'maxps',5Fh - dw sse_ps_instruction-assembler - db 'maxsd',5Fh - dw sse_sd_instruction-assembler - db 'maxss',5Fh - dw sse_ss_instruction-assembler - db 'minpd',5Dh - dw sse_pd_instruction-assembler - db 'minps',5Dh - dw sse_ps_instruction-assembler - db 'minsd',5Dh - dw sse_sd_instruction-assembler - db 'minss',5Dh - dw sse_ss_instruction-assembler - db 'movsb',0A4h - dw simple_instruction-assembler - db 'movsd',0 - dw movsd_instruction-assembler - db 'movsq',0A5h - dw simple_instruction_64bit-assembler - db 'movss',0 - dw movss_instruction-assembler - db 'movsw',0A5h - dw simple_instruction_16bit-assembler - db 'movsx',0BEh - dw movx_instruction-assembler - db 'movzx',0B6h - dw movx_instruction-assembler - db 'mulpd',59h - dw sse_pd_instruction-assembler - db 'mulps',59h - dw sse_ps_instruction-assembler - db 'mulsd',59h - dw sse_sd_instruction-assembler - db 'mulss',59h - dw sse_ss_instruction-assembler - db 'mwait',0C9h - dw monitor_instruction-assembler - db 'outsb',6Eh - dw simple_instruction-assembler - db 'outsd',6Fh - dw simple_instruction_32bit-assembler - db 'outsw',6Fh - dw simple_instruction_16bit-assembler - db 'paddb',0FCh - dw mmx_instruction-assembler - db 'paddd',0FEh - dw mmx_instruction-assembler - db 'paddq',0D4h - dw mmx_instruction-assembler - db 'paddw',0FDh - dw mmx_instruction-assembler - db 'pandn',0DFh - dw mmx_instruction-assembler - db 'pause',0 - dw pause_instruction-assembler - db 'pavgb',0E0h - dw mmx_instruction-assembler - db 'pavgw',0E3h - dw mmx_instruction-assembler - db 'pf2id',1Dh - dw amd3dnow_instruction-assembler - db 'pf2iw',1Ch - dw amd3dnow_instruction-assembler - db 'pfacc',0AEh - dw amd3dnow_instruction-assembler - db 'pfadd',9Eh - dw amd3dnow_instruction-assembler - db 'pfmax',0A4h - dw amd3dnow_instruction-assembler - db 'pfmin',94h - dw amd3dnow_instruction-assembler - db 'pfmul',0B4h - dw amd3dnow_instruction-assembler - db 'pfrcp',96h - dw amd3dnow_instruction-assembler - db 'pfsub',9Ah - dw amd3dnow_instruction-assembler - db 'pi2fd',0Dh - dw amd3dnow_instruction-assembler - db 'pi2fw',0Ch - dw amd3dnow_instruction-assembler - db 'popad',61h - dw simple_instruction_32bit_except64-assembler - db 'popaw',61h - dw simple_instruction_16bit_except64-assembler - db 'popfd',9Dh - dw simple_instruction_32bit_except64-assembler - db 'popfw',9Dh - dw simple_instruction_16bit-assembler - db 'popfq',9Dh - dw simple_instruction_only64-assembler - db 'pslld',0F2h - dw mmx_ps_instruction-assembler - db 'psllq',0F3h - dw mmx_ps_instruction-assembler - db 'psllw',0F1h - dw mmx_ps_instruction-assembler - db 'psrad',0E2h - dw mmx_ps_instruction-assembler - db 'psraw',0E1h - dw mmx_ps_instruction-assembler - db 'psrld',0D2h - dw mmx_ps_instruction-assembler - db 'psrlq',0D3h - dw mmx_ps_instruction-assembler - db 'psrlw',0D1h - dw mmx_ps_instruction-assembler - db 'psubb',0F8h - dw mmx_instruction-assembler - db 'psubd',0FAh - dw mmx_instruction-assembler - db 'psubq',0FBh - dw mmx_instruction-assembler - db 'psubw',0F9h - dw mmx_instruction-assembler - db 'pusha',60h - dw simple_instruction_except64-assembler - db 'pushd',4 - dw push_instruction-assembler - db 'pushf',9Ch - dw simple_instruction-assembler - db 'pushq',8 - dw push_instruction-assembler - db 'pushw',2 - dw push_instruction-assembler - db 'rcpps',53h - dw sse_ps_instruction-assembler - db 'rcpss',53h - dw sse_ss_instruction-assembler - db 'rdmsr',32h - dw simple_extended_instruction-assembler - db 'rdpmc',33h - dw simple_extended_instruction-assembler - db 'rdtsc',31h - dw simple_extended_instruction-assembler - db 'repne',0F2h - dw prefix_instruction-assembler - db 'repnz',0F2h - dw prefix_instruction-assembler - db 'retfd',0CAh - dw ret_instruction_32bit-assembler - db 'retfq',0CAh - dw ret_instruction_64bit-assembler - db 'retfw',0CAh - dw ret_instruction_16bit-assembler - db 'retnd',0C2h - dw ret_instruction_32bit_except64-assembler - db 'retnq',0C2h - dw ret_instruction_only64-assembler - db 'retnw',0C2h - dw ret_instruction_16bit-assembler - db 'scasb',0AEh - dw simple_instruction-assembler - db 'scasd',0AFh - dw simple_instruction_32bit-assembler - db 'scasq',0AFh - dw simple_instruction_64bit-assembler - db 'scasw',0AFh - dw simple_instruction_16bit-assembler - db 'setae',93h - dw set_instruction-assembler - db 'setbe',96h - dw set_instruction-assembler - db 'setge',9Dh - dw set_instruction-assembler - db 'setle',9Eh - dw set_instruction-assembler - db 'setna',96h - dw set_instruction-assembler - db 'setnb',93h - dw set_instruction-assembler - db 'setnc',93h - dw set_instruction-assembler - db 'setne',95h - dw set_instruction-assembler - db 'setng',9Eh - dw set_instruction-assembler - db 'setnl',9Dh - dw set_instruction-assembler - db 'setno',91h - dw set_instruction-assembler - db 'setnp',9Bh - dw set_instruction-assembler - db 'setns',99h - dw set_instruction-assembler - db 'setnz',95h - dw set_instruction-assembler - db 'setpe',9Ah - dw set_instruction-assembler - db 'setpo',9Bh - dw set_instruction-assembler - db 'stack',0 - dw stack_directive-assembler - db 'store',0 - dw store_directive-assembler - db 'stosb',0AAh - dw simple_instruction-assembler - db 'stosd',0ABh - dw simple_instruction_32bit-assembler - db 'stosq',0ABh - dw simple_instruction_64bit-assembler - db 'stosw',0ABh - dw simple_instruction_16bit-assembler - db 'subpd',5Ch - dw sse_pd_instruction-assembler - db 'subps',5Ch - dw sse_ps_instruction-assembler - db 'subsd',5Ch - dw sse_sd_instruction-assembler - db 'subss',5Ch - dw sse_ss_instruction-assembler - db 'times',0 - dw times_directive-assembler - db 'vmxon',6 - dw vmxon_instruction-assembler - db 'while',0 - dw while_directive-assembler - db 'wrmsr',30h - dw simple_extended_instruction-assembler - db 'xlatb',0D7h - dw simple_instruction-assembler - db 'xorpd',57h - dw sse_pd_instruction-assembler - db 'xorps',57h - dw sse_ps_instruction-assembler - db 0 -instructions_6: - db 'andnpd',55h - dw sse_pd_instruction-assembler - db 'andnps',55h - dw sse_ps_instruction-assembler - db 'cmovae',43h - dw cmov_instruction-assembler - db 'cmovbe',46h - dw cmov_instruction-assembler - db 'cmovge',4Dh - dw cmov_instruction-assembler - db 'cmovle',4Eh - dw cmov_instruction-assembler - db 'cmovna',46h - dw cmov_instruction-assembler - db 'cmovnb',43h - dw cmov_instruction-assembler - db 'cmovnc',43h - dw cmov_instruction-assembler - db 'cmovne',45h - dw cmov_instruction-assembler - db 'cmovng',4Eh - dw cmov_instruction-assembler - db 'cmovnl',4Dh - dw cmov_instruction-assembler - db 'cmovno',41h - dw cmov_instruction-assembler - db 'cmovnp',4Bh - dw cmov_instruction-assembler - db 'cmovns',49h - dw cmov_instruction-assembler - db 'cmovnz',45h - dw cmov_instruction-assembler - db 'cmovpe',4Ah - dw cmov_instruction-assembler - db 'cmovpo',4Bh - dw cmov_instruction-assembler - db 'comisd',2Fh - dw comisd_instruction-assembler - db 'comiss',2Fh - dw comiss_instruction-assembler - db 'fcmovb',0C0h - dw fcmov_instruction-assembler - db 'fcmove',0C8h - dw fcmov_instruction-assembler - db 'fcmovu',0D8h - dw fcmov_instruction-assembler - db 'fcomip',0F0h - dw fcomip_instruction-assembler - db 'fcompp',0 - dw fcompp_instruction-assembler - db 'fdivrp',6 - dw faddp_instruction-assembler - db 'ffreep',0 - dw ffreep_instruction-assembler - db 'ficomp',3 - dw fi_instruction-assembler - db 'fidivr',7 - dw fi_instruction-assembler - db 'fisttp',1 - dw fild_instruction-assembler - db 'fisubr',5 - dw fi_instruction-assembler - db 'fldenv',4 - dw fldenv_instruction-assembler - db 'fldl2e',101010b - dw simple_fpu_instruction-assembler - db 'fldl2t',101001b - dw simple_fpu_instruction-assembler - db 'fldlg2',101100b - dw simple_fpu_instruction-assembler - db 'fldln2',101101b - dw simple_fpu_instruction-assembler - db 'fnclex',0E2h - dw fninit_instruction-assembler - db 'fndisi',0E1h - dw fninit_instruction-assembler - db 'fninit',0E3h - dw fninit_instruction-assembler - db 'fnsave',6 - dw fnsave_instruction-assembler - db 'fnstcw',7 - dw fldcw_instruction-assembler - db 'fnstsw',0 - dw fnstsw_instruction-assembler - db 'format',0 - dw format_directive-assembler - db 'fpatan',110011b - dw simple_fpu_instruction-assembler - db 'fprem1',110101b - dw simple_fpu_instruction-assembler - db 'frstor',4 - dw fnsave_instruction-assembler - db 'frstpm',0E5h - dw fninit_instruction-assembler - db 'fscale',111101b - dw simple_fpu_instruction-assembler - db 'fsetpm',0E4h - dw fninit_instruction-assembler - db 'fstenv',6 - dw fstenv_instruction-assembler - db 'fsubrp',4 - dw faddp_instruction-assembler - db 'fucomi',0E8h - dw fcomi_instruction-assembler - db 'fucomp',5 - dw ffree_instruction-assembler - db 'fxsave',0 - dw fxsave_instruction-assembler - db 'haddpd',07Ch - dw sse_pd_instruction-assembler - db 'haddps',07Ch - dw cvtpd2dq_instruction-assembler - db 'hsubpd',07Dh - dw sse_pd_instruction-assembler - db 'hsubps',07Dh - dw cvtpd2dq_instruction-assembler - db 'invlpg',0 - dw invlpg_instruction-assembler - db 'lfence',0E8h - dw fence_instruction-assembler - db 'looped',0E1h - dw loop_instruction_32bit-assembler - db 'loopeq',0E1h - dw loop_instruction_64bit-assembler - db 'loopew',0E1h - dw loop_instruction_16bit-assembler - db 'loopne',0E0h - dw loop_instruction-assembler - db 'loopnz',0E0h - dw loop_instruction-assembler - db 'loopzd',0E1h - dw loop_instruction_32bit-assembler - db 'loopzq',0E1h - dw loop_instruction_64bit-assembler - db 'loopzw',0E1h - dw loop_instruction_16bit-assembler - db 'mfence',0F0h - dw fence_instruction-assembler - db 'movapd',28h - dw movpd_instruction-assembler - db 'movaps',28h - dw movps_instruction-assembler - db 'movdqa',66h - dw movdq_instruction-assembler - db 'movdqu',0F3h - dw movdq_instruction-assembler - db 'movhpd',16h - dw movlpd_instruction-assembler - db 'movhps',16h - dw movlps_instruction-assembler - db 'movlpd',12h - dw movlpd_instruction-assembler - db 'movlps',12h - dw movlps_instruction-assembler - db 'movnti',0C3h - dw movnti_instruction-assembler - db 'movntq',0E7h - dw movntq_instruction-assembler - db 'movsxd',63h - dw movsxd_instruction-assembler - db 'movupd',10h - dw movpd_instruction-assembler - db 'movups',10h - dw movps_instruction-assembler - db 'paddsb',0ECh - dw mmx_instruction-assembler - db 'paddsw',0EDh - dw mmx_instruction-assembler - db 'pextrw',0C5h - dw pextrw_instruction-assembler - db 'pfnacc',8Ah - dw amd3dnow_instruction-assembler - db 'pfsubr',0AAh - dw amd3dnow_instruction-assembler - db 'pinsrw',0C4h - dw pinsrw_instruction-assembler - db 'pmaxsw',0EEh - dw mmx_instruction-assembler - db 'pmaxub',0DEh - dw mmx_instruction-assembler - db 'pminsw',0EAh - dw mmx_instruction-assembler - db 'pminub',0DAh - dw mmx_instruction-assembler - db 'pmulhw',0E5h - dw mmx_instruction-assembler - db 'pmullw',0D5h - dw mmx_instruction-assembler - db 'psadbw',0F6h - dw mmx_instruction-assembler - db 'pshufd',66h - dw pshufd_instruction-assembler - db 'pshufw',0 - dw pshufw_instruction-assembler - db 'pslldq',111b - dw ps_dq_instruction-assembler - db 'psrldq',011b - dw ps_dq_instruction-assembler - db 'psubsb',0E8h - dw mmx_instruction-assembler - db 'psubsw',0E9h - dw mmx_instruction-assembler - db 'pswapd',0BBh - dw amd3dnow_instruction-assembler - db 'public',0 - dw public_directive-assembler - db 'pushad',60h - dw simple_instruction_32bit_except64-assembler - db 'pushaw',60h - dw simple_instruction_16bit_except64-assembler - db 'pushfd',9Ch - dw simple_instruction_32bit_except64-assembler - db 'pushfq',9Ch - dw simple_instruction_only64-assembler - db 'pushfw',9Ch - dw simple_instruction_16bit-assembler - db 'rdtscp',1 - dw swapgs_instruction-assembler - db 'repeat',0 - dw repeat_directive-assembler - db 'setalc',0D6h - dw simple_instruction_except64-assembler - db 'setnae',92h - dw set_instruction-assembler - db 'setnbe',97h - dw set_instruction-assembler - db 'setnge',9Ch - dw set_instruction-assembler - db 'setnle',9Fh - dw set_instruction-assembler - db 'sfence',0F8h - dw fence_instruction-assembler - db 'shufpd',0C6h - dw sse_pd_instruction-assembler - db 'shufps',0C6h - dw sse_ps_instruction-assembler - db 'sqrtpd',51h - dw sse_pd_instruction-assembler - db 'sqrtps',51h - dw sse_ps_instruction-assembler - db 'sqrtsd',51h - dw sse_sd_instruction-assembler - db 'sqrtss',51h - dw sse_ss_instruction-assembler - db 'sysret',07h - dw simple_extended_instruction-assembler - db 'swapgs',0 - dw swapgs_instruction-assembler - db 'vmcall',0C1h - dw simple_vmx_instruction-assembler - db 'vmread',0 - dw vmread_instruction-assembler - db 'vmxoff',0C4h - dw simple_vmx_instruction-assembler - db 'wbinvd',9 - dw simple_extended_instruction-assembler - db 0 -instructions_7: - db 'clflush',111b - dw fxsave_instruction-assembler - db 'cmovnae',42h - dw cmov_instruction-assembler - db 'cmovnbe',47h - dw cmov_instruction-assembler - db 'cmovnge',4Ch - dw cmov_instruction-assembler - db 'cmovnle',4Fh - dw cmov_instruction-assembler - db 'cmpeqpd',0 - dw cmp_pd_instruction-assembler - db 'cmpeqps',0 - dw cmp_ps_instruction-assembler - db 'cmpeqsd',0 - dw cmp_sd_instruction-assembler - db 'cmpeqss',0 - dw cmp_ss_instruction-assembler - db 'cmplepd',2 - dw cmp_pd_instruction-assembler - db 'cmpleps',2 - dw cmp_ps_instruction-assembler - db 'cmplesd',2 - dw cmp_sd_instruction-assembler - db 'cmpless',2 - dw cmp_ss_instruction-assembler - db 'cmpltpd',1 - dw cmp_pd_instruction-assembler - db 'cmpltps',1 - dw cmp_ps_instruction-assembler - db 'cmpltsd',1 - dw cmp_sd_instruction-assembler - db 'cmpltss',1 - dw cmp_ss_instruction-assembler - db 'cmpxchg',0B0h - dw basic_486_instruction-assembler - db 'display',0 - dw display_directive-assembler - db 'fcmovbe',0D0h - dw fcmov_instruction-assembler - db 'fcmovnb',0C0h - dw fcomi_instruction-assembler - db 'fcmovne',0C8h - dw fcomi_instruction-assembler - db 'fcmovnu',0D8h - dw fcomi_instruction-assembler - db 'fdecstp',110110b - dw simple_fpu_instruction-assembler - db 'fincstp',110111b - dw simple_fpu_instruction-assembler - db 'fnstenv',6 - dw fldenv_instruction-assembler - db 'frndint',111100b - dw simple_fpu_instruction-assembler - db 'fsincos',111011b - dw simple_fpu_instruction-assembler - db 'fucomip',0E8h - dw fcomip_instruction-assembler - db 'fucompp',0 - dw fucompp_instruction-assembler - db 'fxrstor',1 - dw fxsave_instruction-assembler - db 'fxtract',110100b - dw simple_fpu_instruction-assembler - db 'fyl2xp1',111001b - dw simple_fpu_instruction-assembler - db 'ldmxcsr',10b - dw fxsave_instruction-assembler - db 'loopned',0E0h - dw loop_instruction_32bit-assembler - db 'loopneq',0E0h - dw loop_instruction_64bit-assembler - db 'loopnew',0E0h - dw loop_instruction_16bit-assembler - db 'loopnzd',0E0h - dw loop_instruction_32bit-assembler - db 'loopnzq',0E0h - dw loop_instruction_64bit-assembler - db 'loopnzw',0E0h - dw loop_instruction_16bit-assembler - db 'monitor',0C8h - dw monitor_instruction-assembler - db 'movddup',12h - dw sse_sd_instruction-assembler - db 'movdq2q',0 - dw movdq2q_instruction-assembler - db 'movhlps',12h - dw movhlps_instruction-assembler - db 'movlhps',16h - dw movhlps_instruction-assembler - db 'movntdq',0E7h - dw movntdq_instruction-assembler - db 'movntpd',2Bh - dw movntdq_instruction-assembler - db 'movntps',2Bh - dw movntps_instruction-assembler - db 'movq2dq',0 - dw movq2dq_instruction-assembler - db 'paddusb',0DCh - dw mmx_instruction-assembler - db 'paddusw',0DDh - dw mmx_instruction-assembler - db 'pavgusb',0BFh - dw amd3dnow_instruction-assembler - db 'pcmpeqb',74h - dw mmx_instruction-assembler - db 'pcmpeqd',76h - dw mmx_instruction-assembler - db 'pcmpeqw',75h - dw mmx_instruction-assembler - db 'pcmpgtb',64h - dw mmx_instruction-assembler - db 'pcmpgtd',66h - dw mmx_instruction-assembler - db 'pcmpgtw',65h - dw mmx_instruction-assembler - db 'pfcmpeq',0B0h - dw amd3dnow_instruction-assembler - db 'pfcmpge',90h - dw amd3dnow_instruction-assembler - db 'pfcmpgt',0A0h - dw amd3dnow_instruction-assembler - db 'pfpnacc',8Eh - dw amd3dnow_instruction-assembler - db 'pfrsqrt',97h - dw amd3dnow_instruction-assembler - db 'pmaddwd',0F5h - dw mmx_instruction-assembler - db 'pmulhrw',0B7h - dw amd3dnow_instruction-assembler - db 'pmulhuw',0E4h - dw mmx_instruction-assembler - db 'pmuludq',0F4h - dw mmx_instruction-assembler - db 'pshufhw',0F3h - dw pshufd_instruction-assembler - db 'pshuflw',0F2h - dw pshufd_instruction-assembler - db 'psubusb',0D8h - dw mmx_instruction-assembler - db 'psubusw',0D9h - dw mmx_instruction-assembler - db 'rsqrtps',52h - dw sse_ps_instruction-assembler - db 'rsqrtss',52h - dw sse_ss_instruction-assembler - db 'section',0 - dw section_directive-assembler - db 'segment',0 - dw segment_directive-assembler - db 'stmxcsr',11b - dw fxsave_instruction-assembler - db 'syscall',05h - dw simple_extended_instruction-assembler - db 'sysexit',35h - dw simple_extended_instruction-assembler - db 'ucomisd',2Eh - dw comisd_instruction-assembler - db 'ucomiss',2Eh - dw comiss_instruction-assembler - db 'virtual',0 - dw virtual_directive-assembler - db 'vmclear',6 - dw vmclear_instruction-assembler - db 'vmptrld',6 - dw vmx_instruction-assembler - db 'vmptrst',7 - dw vmx_instruction-assembler - db 'vmwrite',0 - dw vmwrite_instruction-assembler - db 0 -instructions_8: - db 'addsubpd',0D0h - dw sse_pd_instruction-assembler - db 'addsubps',0D0h - dw cvtpd2dq_instruction-assembler - db 'cmpneqpd',4 - dw cmp_pd_instruction-assembler - db 'cmpneqps',4 - dw cmp_ps_instruction-assembler - db 'cmpneqsd',4 - dw cmp_sd_instruction-assembler - db 'cmpneqss',4 - dw cmp_ss_instruction-assembler - db 'cmpnlepd',6 - dw cmp_pd_instruction-assembler - db 'cmpnleps',6 - dw cmp_ps_instruction-assembler - db 'cmpnlesd',6 - dw cmp_sd_instruction-assembler - db 'cmpnless',6 - dw cmp_ss_instruction-assembler - db 'cmpnltpd',5 - dw cmp_pd_instruction-assembler - db 'cmpnltps',5 - dw cmp_ps_instruction-assembler - db 'cmpnltsd',5 - dw cmp_sd_instruction-assembler - db 'cmpnltss',5 - dw cmp_ss_instruction-assembler - db 'cmpordpd',7 - dw cmp_pd_instruction-assembler - db 'cmpordps',7 - dw cmp_ps_instruction-assembler - db 'cmpordsd',7 - dw cmp_sd_instruction-assembler - db 'cmpordss',7 - dw cmp_ss_instruction-assembler - db 'cvtdq2pd',0E6h - dw cvtdq2pd_instruction-assembler - db 'cvtdq2ps',5Bh - dw sse_ps_instruction-assembler - db 'cvtpd2dq',0E6h - dw cvtpd2dq_instruction-assembler - db 'cvtpd2pi',2Dh - dw cvtpd2pi_instruction-assembler - db 'cvtpd2ps',5Ah - dw sse_pd_instruction-assembler - db 'cvtpi2pd',2Ah - dw cvtpi2pd_instruction-assembler - db 'cvtpi2ps',2Ah - dw cvtpi2ps_instruction-assembler - db 'cvtps2dq',5Bh - dw sse_pd_instruction-assembler - db 'cvtps2pd',5Ah - dw cvtps2pd_instruction-assembler - db 'cvtps2pi',2Dh - dw cvtps2pi_instruction-assembler - db 'cvtsd2si',2Dh - dw cvtsd2si_instruction-assembler - db 'cvtsd2ss',5Ah - dw sse_sd_instruction-assembler - db 'cvtsi2sd',2Ah - dw cvtsi2sd_instruction-assembler - db 'cvtsi2ss',2Ah - dw cvtsi2ss_instruction-assembler - db 'cvtss2sd',5Ah - dw sse_ss_instruction-assembler - db 'cvtss2si',2Dh - dw cvtss2si_instruction-assembler - db 'fcmovnbe',0D0h - dw fcomi_instruction-assembler - db 'maskmovq',0 - dw maskmovq_instruction-assembler - db 'movmskpd',0 - dw movmskpd_instruction-assembler - db 'movmskps',0 - dw movmskps_instruction-assembler - db 'movshdup',16h - dw cvtdq2pd_instruction-assembler - db 'movsldup',12h - dw cvtdq2pd_instruction-assembler - db 'packssdw',6Bh - dw mmx_instruction-assembler - db 'packsswb',63h - dw mmx_instruction-assembler - db 'packuswb',67h - dw mmx_instruction-assembler - db 'pfrcpit1',0A6h - dw amd3dnow_instruction-assembler - db 'pfrcpit2',0B6h - dw amd3dnow_instruction-assembler - db 'pfrsqit1',0A7h - dw amd3dnow_instruction-assembler - db 'pmovmskb',0D7h - dw pextrw_instruction-assembler - db 'prefetch',0 - dw amd_prefetch_instruction-assembler - db 'sysenter',34h - dw simple_extended_instruction-assembler - db 'unpckhpd',15h - dw sse_pd_instruction-assembler - db 'unpckhps',15h - dw sse_ps_instruction-assembler - db 'unpcklpd',14h - dw sse_pd_instruction-assembler - db 'unpcklps',14h - dw sse_ps_instruction-assembler - db 'vmlaunch',0C2h - dw simple_vmx_instruction-assembler - db 'vmresume',0C3h - dw simple_vmx_instruction-assembler - db 0 -instructions_9: - db 'cmpxchg8b',8 - dw cmpxchgx_instruction-assembler - db 'cvttpd2dq',0E6h - dw sse_pd_instruction-assembler - db 'cvttpd2pi',2Ch - dw cvtpd2pi_instruction-assembler - db 'cvttps2dq',5Bh - dw cvtdq2pd_instruction-assembler - db 'cvttps2pi',2Ch - dw cvtps2pi_instruction-assembler - db 'cvttsd2si',2Ch - dw cvtsd2si_instruction-assembler - db 'cvttss2si',2Ch - dw cvtss2si_instruction-assembler - db 'prefetchw',1 - dw amd_prefetch_instruction-assembler - db 'punpckhbw',68h - dw mmx_instruction-assembler - db 'punpckhdq',6Ah - dw mmx_instruction-assembler - db 'punpckhwd',69h - dw mmx_instruction-assembler - db 'punpcklbw',60h - dw mmx_instruction-assembler - db 'punpckldq',62h - dw mmx_instruction-assembler - db 'punpcklwd',61h - dw mmx_instruction-assembler - db 0 -instructions_10: - db 'cmpunordpd',3 - dw cmp_pd_instruction-assembler - db 'cmpunordps',3 - dw cmp_ps_instruction-assembler - db 'cmpunordsd',3 - dw cmp_sd_instruction-assembler - db 'cmpunordss',3 - dw cmp_ss_instruction-assembler - db 'cmpxchg16b',16 - dw cmpxchgx_instruction-assembler - db 'loadall286',5 - dw simple_extended_instruction-assembler - db 'loadall386',7 - dw simple_extended_instruction-assembler - db 'maskmovdqu',0 - dw maskmovdqu_instruction-assembler - db 'prefetcht0',1 - dw prefetch_instruction-assembler - db 'prefetcht1',2 - dw prefetch_instruction-assembler - db 'prefetcht2',3 - dw prefetch_instruction-assembler - db 'punpckhqdq',6Dh - dw sse_pd_instruction-assembler - db 'punpcklqdq',6Ch - dw sse_pd_instruction-assembler - db 0 -instructions_11: - db 'prefetchnta',0 - dw prefetch_instruction-assembler - db 0 diff --git a/programs/copy2/trunk/build_en.bat b/programs/filemngrs/copy2/trunk/build_en.bat similarity index 100% rename from programs/copy2/trunk/build_en.bat rename to programs/filemngrs/copy2/trunk/build_en.bat diff --git a/programs/copy2/trunk/build_ru.bat b/programs/filemngrs/copy2/trunk/build_ru.bat similarity index 100% rename from programs/copy2/trunk/build_ru.bat rename to programs/filemngrs/copy2/trunk/build_ru.bat diff --git a/programs/copy2/trunk/copy2.asm b/programs/filemngrs/copy2/trunk/copy2.asm similarity index 100% rename from programs/copy2/trunk/copy2.asm rename to programs/filemngrs/copy2/trunk/copy2.asm diff --git a/programs/cdplay/trunk/macros.inc b/programs/filemngrs/copy2/trunk/macros.inc similarity index 100% rename from programs/cdplay/trunk/macros.inc rename to programs/filemngrs/copy2/trunk/macros.inc diff --git a/programs/arcanoid/trunk/ascl.inc b/programs/filemngrs/copyr/trunk/ascl.inc similarity index 100% rename from programs/arcanoid/trunk/ascl.inc rename to programs/filemngrs/copyr/trunk/ascl.inc diff --git a/programs/copyr/trunk/build_en.bat b/programs/filemngrs/copyr/trunk/build_en.bat similarity index 100% rename from programs/copyr/trunk/build_en.bat rename to programs/filemngrs/copyr/trunk/build_en.bat diff --git a/programs/copyr/trunk/build_ru.bat b/programs/filemngrs/copyr/trunk/build_ru.bat similarity index 100% rename from programs/copyr/trunk/build_ru.bat rename to programs/filemngrs/copyr/trunk/build_ru.bat diff --git a/programs/copyr/trunk/copyr.asm b/programs/filemngrs/copyr/trunk/copyr.asm similarity index 100% rename from programs/copyr/trunk/copyr.asm rename to programs/filemngrs/copyr/trunk/copyr.asm diff --git a/programs/chess/trunk/macros.inc b/programs/filemngrs/copyr/trunk/macros.inc similarity index 100% rename from programs/chess/trunk/macros.inc rename to programs/filemngrs/copyr/trunk/macros.inc diff --git a/programs/hexhd/trunk/build_en.bat b/programs/filemngrs/hexhd/trunk/build_en.bat similarity index 100% rename from programs/hexhd/trunk/build_en.bat rename to programs/filemngrs/hexhd/trunk/build_en.bat diff --git a/programs/hexhd/trunk/build_ru.bat b/programs/filemngrs/hexhd/trunk/build_ru.bat similarity index 100% rename from programs/hexhd/trunk/build_ru.bat rename to programs/filemngrs/hexhd/trunk/build_ru.bat diff --git a/programs/hexhd/trunk/hexhd.asm b/programs/filemngrs/hexhd/trunk/hexhd.asm similarity index 100% rename from programs/hexhd/trunk/hexhd.asm rename to programs/filemngrs/hexhd/trunk/hexhd.asm diff --git a/programs/hello/trunk/macros.inc b/programs/filemngrs/hexhd/trunk/macros.inc similarity index 100% rename from programs/hello/trunk/macros.inc rename to programs/filemngrs/hexhd/trunk/macros.inc diff --git a/programs/mfar/trunk/build_en.bat b/programs/filemngrs/mfar/trunk/build_en.bat similarity index 100% rename from programs/mfar/trunk/build_en.bat rename to programs/filemngrs/mfar/trunk/build_en.bat diff --git a/programs/mfar/trunk/build_ru.bat b/programs/filemngrs/mfar/trunk/build_ru.bat similarity index 100% rename from programs/mfar/trunk/build_ru.bat rename to programs/filemngrs/mfar/trunk/build_ru.bat diff --git a/programs/mfar/trunk/macros.inc b/programs/filemngrs/mfar/trunk/macros.inc similarity index 100% rename from programs/mfar/trunk/macros.inc rename to programs/filemngrs/mfar/trunk/macros.inc diff --git a/programs/mfar/trunk/menuet.inc b/programs/filemngrs/mfar/trunk/menuet.inc similarity index 100% rename from programs/mfar/trunk/menuet.inc rename to programs/filemngrs/mfar/trunk/menuet.inc diff --git a/programs/mfar/trunk/mf-copy.inc b/programs/filemngrs/mfar/trunk/mf-copy.inc similarity index 100% rename from programs/mfar/trunk/mf-copy.inc rename to programs/filemngrs/mfar/trunk/mf-copy.inc diff --git a/programs/mfar/trunk/mf-lang.inc b/programs/filemngrs/mfar/trunk/mf-lang.inc similarity index 100% rename from programs/mfar/trunk/mf-lang.inc rename to programs/filemngrs/mfar/trunk/mf-lang.inc diff --git a/programs/mfar/trunk/mf-sort.inc b/programs/filemngrs/mfar/trunk/mf-sort.inc similarity index 100% rename from programs/mfar/trunk/mf-sort.inc rename to programs/filemngrs/mfar/trunk/mf-sort.inc diff --git a/programs/mfar/trunk/mfar.asm b/programs/filemngrs/mfar/trunk/mfar.asm similarity index 100% rename from programs/mfar/trunk/mfar.asm rename to programs/filemngrs/mfar/trunk/mfar.asm diff --git a/programs/mfar/trunk/mfar.inc b/programs/filemngrs/mfar/trunk/mfar.inc similarity index 100% rename from programs/mfar/trunk/mfar.inc rename to programs/filemngrs/mfar/trunk/mfar.inc diff --git a/programs/mfar/trunk/readme.txt b/programs/filemngrs/mfar/trunk/readme.txt similarity index 100% rename from programs/mfar/trunk/readme.txt rename to programs/filemngrs/mfar/trunk/readme.txt diff --git a/programs/rdfdel/trunk/build_en.bat b/programs/filemngrs/rdfdel/trunk/build_en.bat similarity index 100% rename from programs/rdfdel/trunk/build_en.bat rename to programs/filemngrs/rdfdel/trunk/build_en.bat diff --git a/programs/rdfdel/trunk/build_ru.bat b/programs/filemngrs/rdfdel/trunk/build_ru.bat similarity index 100% rename from programs/rdfdel/trunk/build_ru.bat rename to programs/filemngrs/rdfdel/trunk/build_ru.bat diff --git a/programs/circle/trunk/macros.inc b/programs/filemngrs/rdfdel/trunk/macros.inc similarity index 100% rename from programs/circle/trunk/macros.inc rename to programs/filemngrs/rdfdel/trunk/macros.inc diff --git a/programs/rdfdel/trunk/rdfdel.asm b/programs/filemngrs/rdfdel/trunk/rdfdel.asm similarity index 100% rename from programs/rdfdel/trunk/rdfdel.asm rename to programs/filemngrs/rdfdel/trunk/rdfdel.asm diff --git a/programs/sysxtree/trunk/SYSTR12.GIF b/programs/filemngrs/sysxtree/trunk/SYSTR12.GIF similarity index 100% rename from programs/sysxtree/trunk/SYSTR12.GIF rename to programs/filemngrs/sysxtree/trunk/SYSTR12.GIF diff --git a/programs/sysxtree/trunk/ascgl.inc b/programs/filemngrs/sysxtree/trunk/ascgl.inc similarity index 100% rename from programs/sysxtree/trunk/ascgl.inc rename to programs/filemngrs/sysxtree/trunk/ascgl.inc diff --git a/programs/trantest/trunk/ascl.inc b/programs/filemngrs/sysxtree/trunk/ascl.inc similarity index 100% rename from programs/trantest/trunk/ascl.inc rename to programs/filemngrs/sysxtree/trunk/ascl.inc diff --git a/programs/sysxtree/trunk/build_en.bat b/programs/filemngrs/sysxtree/trunk/build_en.bat similarity index 100% rename from programs/sysxtree/trunk/build_en.bat rename to programs/filemngrs/sysxtree/trunk/build_en.bat diff --git a/programs/sysxtree/trunk/build_ru.bat b/programs/filemngrs/sysxtree/trunk/build_ru.bat similarity index 100% rename from programs/sysxtree/trunk/build_ru.bat rename to programs/filemngrs/sysxtree/trunk/build_ru.bat diff --git a/programs/thread/trunk/macros.inc b/programs/filemngrs/sysxtree/trunk/macros.inc similarity index 100% rename from programs/thread/trunk/macros.inc rename to programs/filemngrs/sysxtree/trunk/macros.inc diff --git a/programs/sysxtree/trunk/sysxtree.asm b/programs/filemngrs/sysxtree/trunk/sysxtree.asm similarity index 100% rename from programs/sysxtree/trunk/sysxtree.asm rename to programs/filemngrs/sysxtree/trunk/sysxtree.asm diff --git a/programs/15/trunk/15.ASM b/programs/games/15/trunk/15.ASM similarity index 100% rename from programs/15/trunk/15.ASM rename to programs/games/15/trunk/15.ASM diff --git a/programs/15/trunk/build_en.bat b/programs/games/15/trunk/build_en.bat similarity index 100% rename from programs/15/trunk/build_en.bat rename to programs/games/15/trunk/build_en.bat diff --git a/programs/15/trunk/build_ru.bat b/programs/games/15/trunk/build_ru.bat similarity index 100% rename from programs/15/trunk/build_ru.bat rename to programs/games/15/trunk/build_ru.bat diff --git a/programs/cmd/trunk/macros.inc b/programs/games/15/trunk/macros.inc similarity index 100% rename from programs/cmd/trunk/macros.inc rename to programs/games/15/trunk/macros.inc diff --git a/programs/arcanii/trunk/arcanii.asm b/programs/games/arcanii/trunk/arcanii.asm similarity index 100% rename from programs/arcanii/trunk/arcanii.asm rename to programs/games/arcanii/trunk/arcanii.asm diff --git a/programs/arcanii/trunk/arcanii.bmp b/programs/games/arcanii/trunk/arcanii.bmp similarity index 100% rename from programs/arcanii/trunk/arcanii.bmp rename to programs/games/arcanii/trunk/arcanii.bmp diff --git a/programs/arcanii/trunk/ascgl.inc b/programs/games/arcanii/trunk/ascgl.inc similarity index 100% rename from programs/arcanii/trunk/ascgl.inc rename to programs/games/arcanii/trunk/ascgl.inc diff --git a/programs/arcanii/trunk/ascl.inc b/programs/games/arcanii/trunk/ascl.inc similarity index 100% rename from programs/arcanii/trunk/ascl.inc rename to programs/games/arcanii/trunk/ascl.inc diff --git a/programs/arcanii/trunk/asjc.inc b/programs/games/arcanii/trunk/asjc.inc similarity index 100% rename from programs/arcanii/trunk/asjc.inc rename to programs/games/arcanii/trunk/asjc.inc diff --git a/programs/arcanii/trunk/build_en.bat b/programs/games/arcanii/trunk/build_en.bat similarity index 100% rename from programs/arcanii/trunk/build_en.bat rename to programs/games/arcanii/trunk/build_en.bat diff --git a/programs/arcanii/trunk/build_ru.bat b/programs/games/arcanii/trunk/build_ru.bat similarity index 100% rename from programs/arcanii/trunk/build_ru.bat rename to programs/games/arcanii/trunk/build_ru.bat diff --git a/programs/arcanoid/trunk/ARC.BMP b/programs/games/arcanoid/trunk/ARC.BMP similarity index 100% rename from programs/arcanoid/trunk/ARC.BMP rename to programs/games/arcanoid/trunk/ARC.BMP diff --git a/programs/arcanoid/trunk/arcanoid.asm b/programs/games/arcanoid/trunk/arcanoid.asm similarity index 100% rename from programs/arcanoid/trunk/arcanoid.asm rename to programs/games/arcanoid/trunk/arcanoid.asm diff --git a/programs/arcanoid/trunk/ascgl.inc b/programs/games/arcanoid/trunk/ascgl.inc similarity index 100% rename from programs/arcanoid/trunk/ascgl.inc rename to programs/games/arcanoid/trunk/ascgl.inc diff --git a/programs/arcanoid/trunk/ascgml.inc b/programs/games/arcanoid/trunk/ascgml.inc similarity index 100% rename from programs/arcanoid/trunk/ascgml.inc rename to programs/games/arcanoid/trunk/ascgml.inc diff --git a/programs/copyr/trunk/ascl.inc b/programs/games/arcanoid/trunk/ascl.inc similarity index 100% rename from programs/copyr/trunk/ascl.inc rename to programs/games/arcanoid/trunk/ascl.inc diff --git a/programs/arcanoid/trunk/build_en.bat b/programs/games/arcanoid/trunk/build_en.bat similarity index 100% rename from programs/arcanoid/trunk/build_en.bat rename to programs/games/arcanoid/trunk/build_en.bat diff --git a/programs/arcanoid/trunk/build_ru.bat b/programs/games/arcanoid/trunk/build_ru.bat similarity index 100% rename from programs/arcanoid/trunk/build_ru.bat rename to programs/games/arcanoid/trunk/build_ru.bat diff --git a/programs/c4/trunk/Readme.txt b/programs/games/c4/trunk/Readme.txt similarity index 100% rename from programs/c4/trunk/Readme.txt rename to programs/games/c4/trunk/Readme.txt diff --git a/programs/c4/trunk/ai.inc b/programs/games/c4/trunk/ai.inc similarity index 100% rename from programs/c4/trunk/ai.inc rename to programs/games/c4/trunk/ai.inc diff --git a/programs/c4/trunk/blue.pcx b/programs/games/c4/trunk/blue.pcx similarity index 100% rename from programs/c4/trunk/blue.pcx rename to programs/games/c4/trunk/blue.pcx diff --git a/programs/c4/trunk/board.inc b/programs/games/c4/trunk/board.inc similarity index 100% rename from programs/c4/trunk/board.inc rename to programs/games/c4/trunk/board.inc diff --git a/programs/c4/trunk/c4.asm b/programs/games/c4/trunk/c4.asm similarity index 100% rename from programs/c4/trunk/c4.asm rename to programs/games/c4/trunk/c4.asm diff --git a/programs/c4/trunk/mos.inc b/programs/games/c4/trunk/mos.inc similarity index 100% rename from programs/c4/trunk/mos.inc rename to programs/games/c4/trunk/mos.inc diff --git a/programs/c4/trunk/pcx.inc b/programs/games/c4/trunk/pcx.inc similarity index 100% rename from programs/c4/trunk/pcx.inc rename to programs/games/c4/trunk/pcx.inc diff --git a/programs/c4/trunk/randomai.inc b/programs/games/c4/trunk/randomai.inc similarity index 100% rename from programs/c4/trunk/randomai.inc rename to programs/games/c4/trunk/randomai.inc diff --git a/programs/c4/trunk/red.pcx b/programs/games/c4/trunk/red.pcx similarity index 100% rename from programs/c4/trunk/red.pcx rename to programs/games/c4/trunk/red.pcx diff --git a/programs/c4/trunk/rng.inc b/programs/games/c4/trunk/rng.inc similarity index 100% rename from programs/c4/trunk/rng.inc rename to programs/games/c4/trunk/rng.inc diff --git a/programs/c4/trunk/windows.inc b/programs/games/c4/trunk/windows.inc similarity index 100% rename from programs/c4/trunk/windows.inc rename to programs/games/c4/trunk/windows.inc diff --git a/programs/chess/trunk/build_en.bat b/programs/games/chess/trunk/build_en.bat similarity index 100% rename from programs/chess/trunk/build_en.bat rename to programs/games/chess/trunk/build_en.bat diff --git a/programs/chess/trunk/build_ru.bat b/programs/games/chess/trunk/build_ru.bat similarity index 100% rename from programs/chess/trunk/build_ru.bat rename to programs/games/chess/trunk/build_ru.bat diff --git a/programs/chess/trunk/chess.asm b/programs/games/chess/trunk/chess.asm similarity index 100% rename from programs/chess/trunk/chess.asm rename to programs/games/chess/trunk/chess.asm diff --git a/programs/colors/trunk/macros.inc b/programs/games/chess/trunk/macros.inc similarity index 100% rename from programs/colors/trunk/macros.inc rename to programs/games/chess/trunk/macros.inc diff --git a/programs/life/trunk/build_en.bat b/programs/games/life/trunk/build_en.bat similarity index 100% rename from programs/life/trunk/build_en.bat rename to programs/games/life/trunk/build_en.bat diff --git a/programs/life/trunk/build_ru.bat b/programs/games/life/trunk/build_ru.bat similarity index 100% rename from programs/life/trunk/build_ru.bat rename to programs/games/life/trunk/build_ru.bat diff --git a/programs/life/trunk/life.asm b/programs/games/life/trunk/life.asm similarity index 100% rename from programs/life/trunk/life.asm rename to programs/games/life/trunk/life.asm diff --git a/programs/iconedit/trunk/macros.inc b/programs/games/life/trunk/macros.inc similarity index 100% rename from programs/iconedit/trunk/macros.inc rename to programs/games/life/trunk/macros.inc diff --git a/programs/mblocks/trunk/build_en.bat b/programs/games/mblocks/trunk/build_en.bat similarity index 100% rename from programs/mblocks/trunk/build_en.bat rename to programs/games/mblocks/trunk/build_en.bat diff --git a/programs/mblocks/trunk/build_ru.bat b/programs/games/mblocks/trunk/build_ru.bat similarity index 100% rename from programs/mblocks/trunk/build_ru.bat rename to programs/games/mblocks/trunk/build_ru.bat diff --git a/programs/iconmngr/trunk/macros.inc b/programs/games/mblocks/trunk/macros.inc similarity index 100% rename from programs/iconmngr/trunk/macros.inc rename to programs/games/mblocks/trunk/macros.inc diff --git a/programs/mblocks/trunk/mblocks.asm b/programs/games/mblocks/trunk/mblocks.asm similarity index 100% rename from programs/mblocks/trunk/mblocks.asm rename to programs/games/mblocks/trunk/mblocks.asm diff --git a/programs/mine/trunk/access.h-- b/programs/games/mine/trunk/access.h-- similarity index 100% rename from programs/mine/trunk/access.h-- rename to programs/games/mine/trunk/access.h-- diff --git a/programs/mine/trunk/changelog.txt b/programs/games/mine/trunk/changelog.txt similarity index 100% rename from programs/mine/trunk/changelog.txt rename to programs/games/mine/trunk/changelog.txt diff --git a/programs/mine/trunk/draw.h-- b/programs/games/mine/trunk/draw.h-- similarity index 100% rename from programs/mine/trunk/draw.h-- rename to programs/games/mine/trunk/draw.h-- diff --git a/programs/mine/trunk/mine.c-- b/programs/games/mine/trunk/mine.c-- similarity index 100% rename from programs/mine/trunk/mine.c-- rename to programs/games/mine/trunk/mine.c-- diff --git a/programs/mine/trunk/msys.h-- b/programs/games/mine/trunk/msys.h-- similarity index 100% rename from programs/mine/trunk/msys.h-- rename to programs/games/mine/trunk/msys.h-- diff --git a/programs/mine/trunk/random.h-- b/programs/games/mine/trunk/random.h-- similarity index 100% rename from programs/mine/trunk/random.h-- rename to programs/games/mine/trunk/random.h-- diff --git a/programs/mine/trunk/timer.h-- b/programs/games/mine/trunk/timer.h-- similarity index 100% rename from programs/mine/trunk/timer.h-- rename to programs/games/mine/trunk/timer.h-- diff --git a/programs/mine/trunk/uf.h-- b/programs/games/mine/trunk/uf.h-- similarity index 100% rename from programs/mine/trunk/uf.h-- rename to programs/games/mine/trunk/uf.h-- diff --git a/programs/trantest/trunk/ascgl.inc b/programs/games/phenix/trunk/ascgl.inc similarity index 100% rename from programs/trantest/trunk/ascgl.inc rename to programs/games/phenix/trunk/ascgl.inc diff --git a/programs/phenix/trunk/ascgml.inc b/programs/games/phenix/trunk/ascgml.inc similarity index 100% rename from programs/phenix/trunk/ascgml.inc rename to programs/games/phenix/trunk/ascgml.inc diff --git a/programs/phenix/trunk/ascl.inc b/programs/games/phenix/trunk/ascl.inc similarity index 100% rename from programs/phenix/trunk/ascl.inc rename to programs/games/phenix/trunk/ascl.inc diff --git a/programs/phenix/trunk/ascml.inc b/programs/games/phenix/trunk/ascml.inc similarity index 100% rename from programs/phenix/trunk/ascml.inc rename to programs/games/phenix/trunk/ascml.inc diff --git a/programs/phenix/trunk/build_en.bat b/programs/games/phenix/trunk/build_en.bat similarity index 100% rename from programs/phenix/trunk/build_en.bat rename to programs/games/phenix/trunk/build_en.bat diff --git a/programs/phenix/trunk/build_ru.bat b/programs/games/phenix/trunk/build_ru.bat similarity index 100% rename from programs/phenix/trunk/build_ru.bat rename to programs/games/phenix/trunk/build_ru.bat diff --git a/programs/phenix/trunk/phenix.asm b/programs/games/phenix/trunk/phenix.asm similarity index 100% rename from programs/phenix/trunk/phenix.asm rename to programs/games/phenix/trunk/phenix.asm diff --git a/programs/phenix/trunk/phenix.gif b/programs/games/phenix/trunk/phenix.gif similarity index 100% rename from programs/phenix/trunk/phenix.gif rename to programs/games/phenix/trunk/phenix.gif diff --git a/programs/phenix/trunk/star2.gif b/programs/games/phenix/trunk/star2.gif similarity index 100% rename from programs/phenix/trunk/star2.gif rename to programs/games/phenix/trunk/star2.gif diff --git a/programs/pong/trunk/ascgl.inc b/programs/games/pong/trunk/ascgl.inc similarity index 100% rename from programs/pong/trunk/ascgl.inc rename to programs/games/pong/trunk/ascgl.inc diff --git a/programs/pong/trunk/ascl.inc b/programs/games/pong/trunk/ascl.inc similarity index 100% rename from programs/pong/trunk/ascl.inc rename to programs/games/pong/trunk/ascl.inc diff --git a/programs/pong/trunk/build_en.bat b/programs/games/pong/trunk/build_en.bat similarity index 100% rename from programs/pong/trunk/build_en.bat rename to programs/games/pong/trunk/build_en.bat diff --git a/programs/pong/trunk/build_ru.bat b/programs/games/pong/trunk/build_ru.bat similarity index 100% rename from programs/pong/trunk/build_ru.bat rename to programs/games/pong/trunk/build_ru.bat diff --git a/programs/pong/trunk/pong.asm b/programs/games/pong/trunk/pong.asm similarity index 100% rename from programs/pong/trunk/pong.asm rename to programs/games/pong/trunk/pong.asm diff --git a/programs/pong3/trunk/ascgl.inc b/programs/games/pong3/trunk/ascgl.inc similarity index 100% rename from programs/pong3/trunk/ascgl.inc rename to programs/games/pong3/trunk/ascgl.inc diff --git a/programs/pong3/trunk/ascgml.inc b/programs/games/pong3/trunk/ascgml.inc similarity index 100% rename from programs/pong3/trunk/ascgml.inc rename to programs/games/pong3/trunk/ascgml.inc diff --git a/programs/pong3/trunk/ascl.inc b/programs/games/pong3/trunk/ascl.inc similarity index 100% rename from programs/pong3/trunk/ascl.inc rename to programs/games/pong3/trunk/ascl.inc diff --git a/programs/pong3/trunk/build_en.bat b/programs/games/pong3/trunk/build_en.bat similarity index 100% rename from programs/pong3/trunk/build_en.bat rename to programs/games/pong3/trunk/build_en.bat diff --git a/programs/pong3/trunk/build_ru.bat b/programs/games/pong3/trunk/build_ru.bat similarity index 100% rename from programs/pong3/trunk/build_ru.bat rename to programs/games/pong3/trunk/build_ru.bat diff --git a/programs/pong3/trunk/pong.bmp b/programs/games/pong3/trunk/pong.bmp similarity index 100% rename from programs/pong3/trunk/pong.bmp rename to programs/games/pong3/trunk/pong.bmp diff --git a/programs/pong3/trunk/pong3.asm b/programs/games/pong3/trunk/pong3.asm similarity index 100% rename from programs/pong3/trunk/pong3.asm rename to programs/games/pong3/trunk/pong3.asm diff --git a/programs/tanks/trunk/Hi_win.txt b/programs/games/tanks/trunk/Hi_win.txt similarity index 100% rename from programs/tanks/trunk/Hi_win.txt rename to programs/games/tanks/trunk/Hi_win.txt diff --git a/programs/tanks/trunk/build_en.bat b/programs/games/tanks/trunk/build_en.bat similarity index 100% rename from programs/tanks/trunk/build_en.bat rename to programs/games/tanks/trunk/build_en.bat diff --git a/programs/tanks/trunk/build_ru.bat b/programs/games/tanks/trunk/build_ru.bat similarity index 100% rename from programs/tanks/trunk/build_ru.bat rename to programs/games/tanks/trunk/build_ru.bat diff --git a/programs/tanks/trunk/lev01.lev b/programs/games/tanks/trunk/lev01.lev similarity index 100% rename from programs/tanks/trunk/lev01.lev rename to programs/games/tanks/trunk/lev01.lev diff --git a/programs/tanks/trunk/leveledit.asm b/programs/games/tanks/trunk/leveledit.asm similarity index 100% rename from programs/tanks/trunk/leveledit.asm rename to programs/games/tanks/trunk/leveledit.asm diff --git a/programs/tanks/trunk/pixengin.inc b/programs/games/tanks/trunk/pixengin.inc similarity index 100% rename from programs/tanks/trunk/pixengin.inc rename to programs/games/tanks/trunk/pixengin.inc diff --git a/programs/tanks/trunk/tanks.asm b/programs/games/tanks/trunk/tanks.asm similarity index 100% rename from programs/tanks/trunk/tanks.asm rename to programs/games/tanks/trunk/tanks.asm diff --git a/programs/tetris/trunk/block.inc b/programs/games/tetris/trunk/block.inc similarity index 100% rename from programs/tetris/trunk/block.inc rename to programs/games/tetris/trunk/block.inc diff --git a/programs/tetris/trunk/blocks.inc b/programs/games/tetris/trunk/blocks.inc similarity index 100% rename from programs/tetris/trunk/blocks.inc rename to programs/games/tetris/trunk/blocks.inc diff --git a/programs/tetris/trunk/build_en.bat b/programs/games/tetris/trunk/build_en.bat similarity index 100% rename from programs/tetris/trunk/build_en.bat rename to programs/games/tetris/trunk/build_en.bat diff --git a/programs/tetris/trunk/build_ru.bat b/programs/games/tetris/trunk/build_ru.bat similarity index 100% rename from programs/tetris/trunk/build_ru.bat rename to programs/games/tetris/trunk/build_ru.bat diff --git a/programs/tetris/trunk/key.inc b/programs/games/tetris/trunk/key.inc similarity index 100% rename from programs/tetris/trunk/key.inc rename to programs/games/tetris/trunk/key.inc diff --git a/programs/hexhd/trunk/macros.inc b/programs/games/tetris/trunk/macros.inc similarity index 100% rename from programs/hexhd/trunk/macros.inc rename to programs/games/tetris/trunk/macros.inc diff --git a/programs/tetris/trunk/menu.inc b/programs/games/tetris/trunk/menu.inc similarity index 100% rename from programs/tetris/trunk/menu.inc rename to programs/games/tetris/trunk/menu.inc diff --git a/programs/tetris/trunk/mouse.inc b/programs/games/tetris/trunk/mouse.inc similarity index 100% rename from programs/tetris/trunk/mouse.inc rename to programs/games/tetris/trunk/mouse.inc diff --git a/programs/tetris/trunk/random.inc b/programs/games/tetris/trunk/random.inc similarity index 100% rename from programs/tetris/trunk/random.inc rename to programs/games/tetris/trunk/random.inc diff --git a/programs/tetris/trunk/score.inc b/programs/games/tetris/trunk/score.inc similarity index 100% rename from programs/tetris/trunk/score.inc rename to programs/games/tetris/trunk/score.inc diff --git a/programs/tetris/trunk/table.inc b/programs/games/tetris/trunk/table.inc similarity index 100% rename from programs/tetris/trunk/table.inc rename to programs/games/tetris/trunk/table.inc diff --git a/programs/tetris/trunk/tetris.asm b/programs/games/tetris/trunk/tetris.asm similarity index 100% rename from programs/tetris/trunk/tetris.asm rename to programs/games/tetris/trunk/tetris.asm diff --git a/programs/tetris/trunk/window.inc b/programs/games/tetris/trunk/window.inc similarity index 100% rename from programs/tetris/trunk/window.inc rename to programs/games/tetris/trunk/window.inc diff --git a/programs/grscreen/trunk/build_en.bat b/programs/grscreen/trunk/build_en.bat deleted file mode 100644 index 7fba699139..0000000000 --- a/programs/grscreen/trunk/build_en.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix en >lang.inc -@fasm grscreen.asm grscreen -@pause \ No newline at end of file diff --git a/programs/grscreen/trunk/build_ru.bat b/programs/grscreen/trunk/build_ru.bat deleted file mode 100644 index ae849ab774..0000000000 --- a/programs/grscreen/trunk/build_ru.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix ru >lang.inc -@fasm grscreen.asm grscreen -@pause \ No newline at end of file diff --git a/programs/grscreen/trunk/grscreen.asm b/programs/grscreen/trunk/grscreen.asm deleted file mode 100644 index 9ad1cd1a61..0000000000 --- a/programs/grscreen/trunk/grscreen.asm +++ /dev/null @@ -1,114 +0,0 @@ -; -; NICE BACKGROUND -; -; Compile with FASM for Menuet -; - -;****************************************************************************** - use32 - org 0x0 - - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd 0x5000 ; memory for app - dd 0x5000 ; esp - dd 0x0 , 0x0 ; I_Param , I_Icon - -include "lang.inc" -include "macros.inc" -;****************************************************************************** - -;GRADES = 100 ; count of grades -;START_COLOR = 0x8292B4 ;0x0078b000 -;STEP = 0x010101 ;0x00010100 -;xxx equ sub ; from dark to light - -;****************************************************************************** - -db "MenuetOS RE #8",13,10 - -START: - ; set stretch backgound - mcall 15, 4, 2 - - ; set wallpaper - mcall 58, start_info - -;jmp exit -; -;mov eax,image+3 ; generate image -;mov ecx,GRADES-1 -;@@: -;mov ebx,[eax-3] -;xxx ebx,STEP -;mov [eax],ebx -;add eax,3 -;dec ecx -;jnz @b - -;mov eax,15 ; copy image to background memory -;mov ebx,5 -;mov ecx,image -;xor edx,edx -;mov esi,(GRADES+1)*3 -;int 0x40 - -;mov eax,15 ; set stretch backgound -;mov ebx,4 -;mov ecx,2 -;int 0x40 - -;mov eax,15 ; set background size -;mov ebx,1 -;mov ecx,ebx -;mov edx,GRADES -;int 0x40 - -;mov eax,15 ; draw background -;mov ebx,3 -;int 0x40 - -;exit: - -; BEGIN_REDRAW_SCREEN -; mcall 12, 1 - -; mcall 14 -; mov ecx, eax -; shr eax, 16 -; and ecx, 0xFFFF -; mov ebx, eax -; mov edx, 0x01000000 -; mcall 0 - -; mcall 12, 2 -; END_REDRAW_SCREEN - mcall 5,100 - mcall -1 - -;------------------------------------------------------------------------------ - -start_info: - .mode dd 16 - dd 0 - .params dd boot - dd 0 - .workarea dd work_area - .path db "/rd/1/jpegview",0 - -boot db 'BOOT',0 - -;------------------------------------------------------------------------------ - -;image: -;dd START_COLOR - -I_END: -;rd 256 - -align 32 -work_area: - -; EOF \ No newline at end of file diff --git a/programs/iconmngr/trunk/build_en.bat b/programs/iconmngr/trunk/build_en.bat deleted file mode 100644 index 9701cc8896..0000000000 --- a/programs/iconmngr/trunk/build_en.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix en >lang.inc -@fasm iconmngr.asm iconmngr -@pause \ No newline at end of file diff --git a/programs/iconmngr/trunk/build_ru.bat b/programs/iconmngr/trunk/build_ru.bat deleted file mode 100644 index 377e2b891b..0000000000 --- a/programs/iconmngr/trunk/build_ru.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix ru >lang.inc -@fasm iconmngr.asm iconmngr -@pause \ No newline at end of file diff --git a/programs/iconmngr/trunk/iconmngr.asm b/programs/iconmngr/trunk/iconmngr.asm deleted file mode 100644 index 7208c56714..0000000000 --- a/programs/iconmngr/trunk/iconmngr.asm +++ /dev/null @@ -1,726 +0,0 @@ -;******************************** -;* * -;* DESKTOP ICON MANAGER * -;* * -;* Compile with flat assembler * -;* * -;******************************** -; 22.02.05 was modified for work with new multi-thread ICON. -;****************************************************************************** - use32 - org 0x0 - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd 0x2000 ; memory for app - dd 0x2000 ; esp - dd I_Param , 0x0 ; I_Param , I_Icon -include 'lang.inc' -include 'macros.inc' -;****************************************************************************** - -START: ; start of execution - - call load_icon_list - - call check_parameters - - red: - call draw_window ; at first, draw the window - -still: - - mov eax,10 ; wait here for event - int 0x40 - - cmp eax,1 ; redraw request ? - je red - cmp eax,2 ; key in buffer ? - je key - cmp eax,3 ; button in buffer ? - je button - - jmp still - - key: ; key - mov eax,2 ; just read it and ignore - int 0x40 - jmp still - - button: ; button - mov eax,17 ; get id - int 0x40 - - shr eax,8 - - cmp eax,1 ; button id=1 ? - jne noclose - mov eax,-1 ; close this program - int 0x40 - noclose: - - cmp eax,11 - jb no_str - cmp eax,13 - jg no_str - call read_string - jmp still - no_str: - - - cmp eax,21 ; apply changes - jne no_apply - - ; (1) save list - - mov eax,33 - mov ebx,icon_lst - mov ecx,icon_data - mov edx,52 - imul edx,dword [icons] - mov esi,0 - int 0x40 - - - ; (2) terminate all icons - - mov esi,1 - newread: - inc esi - mov eax,9 - mov ebx,I_END - mov ecx,esi - int 0x40 - cmp esi,eax - jg all_terminated - - cmp [I_END+10],dword 'ICON' - jne newread - cmp [I_END+14],dword ' ' - jne newread - - mov eax,18 - mov ebx,2 - mov ecx,esi - int 0x40 - -; mov eax,5 -; mov ebx,5 -; int 0x40 - - mov esi,1 - - jmp newread - - all_terminated: - - apply_changes: - - mov eax,19 - mov ebx,icon_name - mov ecx,icon_start_parameters - int 0x40 - -; mov eax,5 -; mov ebx,3 -; int 0x40 - - jmp still - -; mov eax,-1 -; int 0x40 - - no_apply: - - - cmp eax,22 ; user pressed the 'add icon' button - jne no_add_icon - - mov eax,13 - mov ebx,24*65536+270 - mov ecx,250*65536+10 - mov edx,0xffffff - int 0x40 - mov eax,4 - mov ebx,24*65536+250 - mov ecx,0xff0000 - mov edx,add_text - mov esi,add_text_len-add_text - int 0x40 - - mov eax,10 - int 0x40 - cmp eax,3 - jne still - mov eax,17 - int 0x40 - shr eax,8 - cmp eax,40 - jb no_f - sub eax,40 - - xor edx,edx ; bcd -> 10 - mov ebx,16 - div ebx - imul eax,10 - add eax,edx - - mov ebx,eax - add ebx,icons_reserved - cmp [ebx],byte 'x' - je no_f - mov [ebx],byte 'x' - - xor edx,edx - mov ebx,10 - div ebx - add eax,65 - add edx,65 - mov [icon_default+0],dl - mov [icon_default+1],al - - inc dword [icons] - mov edi,[icons] - dec edi - imul edi,52 - add edi,icon_data - - mov [current_icon],edi - - mov esi,icon_default - mov ecx,52 - cld - rep movsb - - no_f: - - call draw_window - - jmp still - - no_add_icon: - - - cmp eax,23 ; user pressed the remove icon button - jne no_remove_icon - - mov eax,13 - mov ebx,24*65536+270 - mov ecx,250*65536+10 - mov edx,0xffffff - int 0x40 - mov eax,4 - mov ebx,24*65536+250 - mov ecx,0xff0000 - mov edx,rem_text - mov esi,rem_text_len-rem_text - int 0x40 - - mov eax,10 - int 0x40 - cmp eax,3 - jne no_found - mov eax,17 - int 0x40 - shr eax,8 - cmp eax,40 - jb no_found - sub eax,40 - - xor edx,edx - mov ebx,16 - div ebx - imul eax,10 - add eax,edx - - mov ebx,eax - add ebx,icons_reserved - cmp [ebx],byte 'x' - jne no_found - mov [ebx],byte ' ' - - xor edx,edx - mov ebx,10 - div ebx - shl eax,8 - mov al,dl - - add eax,65*256+65 - - mov esi,icon_data - mov edi,52 - imul edi,[icons] - add edi,icon_data - news: - cmp word [esi],ax - je foundi - add esi,52 - cmp esi,edi - jb news - jmp no_found - - foundi: - - mov ecx,edi - sub ecx,esi - - mov edi,esi - add esi,52 - - cld - rep movsb - - dec [icons] - - mov eax,icon_data - mov [current_icon],eax - - no_found: - - call draw_window - - jmp still - - - - no_remove_icon: - - - cmp eax,40 ; user pressed button for icon position - jb no_on_screen_button - - sub eax,40 - mov edx,eax - shl eax,4 - and edx,0xf - mov dh,ah - add edx,65*256+65 - - mov esi,icon_data - mov ecx,[icons] - cld - findl1: - cmp dx,[esi] - je foundl1 - add esi,50+2 - loop findl1 - jmp still - - foundl1: - - mov [current_icon],esi - - call print_strings - - jmp still - - no_on_screen_button: - - - jmp still - - -current_icon dd icon_data - - -print_strings: - - pusha - - mov eax,13 ; clear text area - mov ebx,100*65536+100 - mov ecx,278*65536+40 - mov edx,0xffffff - int 0x40 - - mov eax,4 ; icon text - mov ebx,100*65536+278 - mov ecx,0x000000 - mov edx,[current_icon] - add edx,33 - mov esi,12 - int 0x40 - - mov eax,4 ; icon application - add ebx,14 - mov edx,[current_icon] - add edx,19 - mov esi,12 - int 0x40 - - mov eax,4 ; icon bmp - add ebx,14 - mov edx,[current_icon] - add edx,5 - mov esi,12 - int 0x40 - - popa - - ret - - -icon_lst db 'ICON LST' - -load_icon_list: - - - pusha - - mov eax,6 - mov ebx,icon_lst - mov ecx,0 - mov edx,-1 - mov esi,icon_data - int 0x40 - - add eax,10 - xor edx,edx - mov ebx,52 - div ebx - mov [icons],eax - - mov edi,icons_reserved ; clear reserved area - mov eax,32 - mov ecx,10*10 - cld - rep stosb - - mov ecx,[icons] ; set used icons to reserved area - mov esi,icon_data - cld - ldl1: - movzx ebx,byte [esi+1] - sub ebx,65 - imul ebx,10 - movzx eax,byte [esi] - add ebx,eax - sub ebx,65 - add ebx,icons_reserved - mov [ebx],byte 'x' - add esi,50+2 - loop ldl1 - - popa - - ret - - -check_parameters: - - cmp [I_Param],dword 'BOOT' - je chpl1 - ret - chpl1: - - mov eax,21 - jmp apply_changes - - -positions dd 33,19,5 - -read_string: - - pusha - - sub eax,11 - shl eax,2 - add eax,positions - mov eax,[eax] - - mov esi,[current_icon] - add esi,eax - mov [addr],esi - - mov edi,[addr] - mov eax,'_' - mov ecx,12 - cld - rep stosb - - call print_strings - - mov edi,[addr] - f11: - mov eax,10 - int 0x40 - cmp eax,2 - jz fbu - jmp rs_done - fbu: - mov eax,2 - int 0x40 - shr eax,8 - cmp eax,13 - je rs_done - cmp eax,8 - jnz nobsl - cmp edi,[addr] - jz f11 - dec edi - mov [edi],byte '_' - call print_strings - jmp f11 - nobsl: - cmp eax,31 - jbe f11 - cmp eax,97 - jb keyok - sub eax,32 - keyok: - mov [edi],al - call print_strings - - add edi,1 - mov esi,[addr] - add esi,12 - cmp esi,edi - jnz f11 - - rs_done: - - mov ecx,[addr] - add ecx,12 - sub ecx,edi - mov eax,32 - cld - rep stosb - - call print_strings - - popa - - ret - - - -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ******** -; ********************************************* - - -draw_window: - - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,1 ; 1, start of draw - int 0x40 - - ; DRAW WINDOW - mov eax,0 - mov ebx,210*65536+300 - mov ecx,30*65536+390 - mov edx,0x03ffffff - mov esi,0x808899ff - mov edi,0x008899ff - int 0x40 - - ; WINDOW LABEL - mov eax,4 - mov ebx,8*65536+8 - mov ecx,0x10ffffff - mov edx,labelt - mov esi,labellen-labelt - int 0x40 - - mov eax,13 ; WINDOW AREA - mov ebx,20*65536+260 - mov ecx,35*65536+200 - mov edx,0x3366cc - int 0x40 - - mov eax,38 ; VERTICAL LINE ON WINDOW AREA - mov ebx,150*65536+150 - mov ecx,35*65536+235 - mov edx,0xffffff - int 0x40 - - mov eax,38 ; HOROZONTAL LINE ON WINDOW AREA - mov ebx,20*65536+280 - mov ecx,135*65536+135 - mov edx,0xffffff - int 0x40 - - mov eax,8 ; TEXT ENTER BUTTONS - mov ebx,20*65536+72 - mov ecx,275*65536+13 - mov edx,11 - mov esi,[bcolor] - int 0x40 - inc edx - add ecx,14*65536 - mov eax,8 - int 0x40 - inc edx - add ecx,14*65536 - mov eax,8 - int 0x40 - - mov eax,8 ; APPLY AND SAVE CHANGES BUTTON - mov ebx,20*65536+259 - mov ecx,329*65536+15 - mov edx,21 - mov esi,[bcolor] - int 0x40 - - mov eax,8 ; ADD ICON BUTTON - mov ebx,20*65536+129 - add ecx,14*2*65536 - inc edx - int 0x40 - - mov eax,8 ; REMOVE ICON BUTTON - add ebx,130*65536 - inc edx - int 0x40 - - mov eax,0 ; DRAW BUTTONS ON WINDOW AREA - mov ebx,20*65536+25 - mov ecx,35*65536+19 - mov edi,icon_table - mov edx,40 - newbline: - - cmp [edi],byte 'x' - jne no_button - - mov esi,0x5577cc - cmp [edi+100],byte 'x' - jne nores - mov esi,0xcc5555 - nores: - - push eax - mov eax,8 - int 0x40 - pop eax - - no_button: - - add ebx,26*65536 - - inc edi - inc edx - - inc al - cmp al,9 - jbe newbline - mov al,0 - - add edx,6 - - ror ebx,16 - mov bx,20 - ror ebx,16 - add ecx,20*65536 - - inc ah - cmp ah,9 - jbe newbline - - mov ebx,24*65536+250 - mov ecx,0xffffff - mov edx,text - mov esi,47 - newline: - mov ecx,[edx] - add edx,4 - mov eax,4 - int 0x40 - add ebx,14 - add edx,47 - cmp [edx],byte 'x' - jne newline - - call print_strings - - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,2 ; 2, end of draw - int 0x40 - - ret - - -; DATA AREA - - -str1 db ' ' -str2 db ' ' - -bcolor dd 0x335599 - -icon_table: - - times 4 db 'xxxx xxxx' - times 2 db ' ' - times 1 db ' ' - times 2 db 'xxxx xxxx' - times 1 db ' ' - -icons_reserved: - - times 10 db ' ' - -if lang eq ru - text: - db 0,0,0,0, 'НАЖМИТЕ НА ПОЗИЦИЮ ИКОНКИ ДЛЯ РЕДАКТИРОВАНИЯ ' - db 0,0,0,0, ' ' - db 255,255,255,0, ' ТЕКСТ ' - db 255,255,255,0, ' ПРОГРАММА ' - db 255,255,255,0, ' ВМР ФАЙЛ ' - db 0,0,0,0, ' ' - db 255,255,255,0, ' ПРИМЕНИТЬ ' - db 0,0,0,0, ' ' - db 255,255,255,0, ' ДОБАВИТЬ УДАЛИТЬ ' - db 'x' ; <- END MARKER, DONT DELETE - - labelt: - db 'Настройка рабочего стола' - labellen: -else - text: - db 0,0,0,0, 'CLICK ON THE UNUSED ICON POSITION TO EDIT ' - db 0,0,0,0, ' ' - db 255,255,255,0, ' ТЕКСТ ' - db 255,255,255,0, ' ПРОГРАММА ' - db 255,255,255,0, ' ВМР ФАЙЛ ' - db 0,0,0,0, ' ' - db 255,255,255,0, ' ПРИМЕНИТЬ ' - db 0,0,0,0, ' ' - db 255,255,255,0, ' ДОБАВИТЬ УДАЛИТЬ ' - db 'x' ; <- END MARKER, DONT DELETE - - labelt: - db 'Настройка рабочего стола' - labellen: -end if - -icons dd 0 - -addr dd 0 -ya dd 0 - -add_text db 'НАЖМИТЕ НА ПОЗИЦИЮ НЕИСПОЛЬЗУЕМОЙ ИКОНКИ' -add_text_len: - -rem_text db 'НАЖМИТЕ НА ПОЗИЦИЮ ИСПОЛЬЗУЕМОЙ ИКОНКИ' -rem_text_len: - -icon_name: - db 'ICON ' - -icon_start_parameters: - db 25,1,1,1 - db 35,1,1,1 - db 'WRITE BMP' - db 'EDITOR ' - db 'EDITOR ',0,0 - -icon_default: - db 'AA - TIP.BMP - SETUP - SETUP *',13,10 - -I_Param: - - icon_data = I_END+256 - -I_END: diff --git a/programs/ac97wav/trunk/ac97.inc b/programs/media/ac97wav/trunk/ac97.inc similarity index 100% rename from programs/ac97wav/trunk/ac97.inc rename to programs/media/ac97wav/trunk/ac97.inc diff --git a/programs/ac97wav/trunk/ac97wav.asm b/programs/media/ac97wav/trunk/ac97wav.asm similarity index 100% rename from programs/ac97wav/trunk/ac97wav.asm rename to programs/media/ac97wav/trunk/ac97wav.asm diff --git a/programs/ac97wav/trunk/build_en.bat b/programs/media/ac97wav/trunk/build_en.bat similarity index 100% rename from programs/ac97wav/trunk/build_en.bat rename to programs/media/ac97wav/trunk/build_en.bat diff --git a/programs/ac97wav/trunk/build_ru.bat b/programs/media/ac97wav/trunk/build_ru.bat similarity index 100% rename from programs/ac97wav/trunk/build_ru.bat rename to programs/media/ac97wav/trunk/build_ru.bat diff --git a/programs/ac97wav/trunk/codec.inc b/programs/media/ac97wav/trunk/codec.inc similarity index 100% rename from programs/ac97wav/trunk/codec.inc rename to programs/media/ac97wav/trunk/codec.inc diff --git a/programs/ac97wav/trunk/constant.inc b/programs/media/ac97wav/trunk/constant.inc similarity index 100% rename from programs/ac97wav/trunk/constant.inc rename to programs/media/ac97wav/trunk/constant.inc diff --git a/programs/archer/trunk/debug.inc b/programs/media/ac97wav/trunk/debug.inc similarity index 100% rename from programs/archer/trunk/debug.inc rename to programs/media/ac97wav/trunk/debug.inc diff --git a/programs/ac97wav/trunk/frontend.inc b/programs/media/ac97wav/trunk/frontend.inc similarity index 100% rename from programs/ac97wav/trunk/frontend.inc rename to programs/media/ac97wav/trunk/frontend.inc diff --git a/programs/ac97wav/trunk/includes.inc b/programs/media/ac97wav/trunk/includes.inc similarity index 100% rename from programs/ac97wav/trunk/includes.inc rename to programs/media/ac97wav/trunk/includes.inc diff --git a/programs/copy2/trunk/macros.inc b/programs/media/ac97wav/trunk/macros.inc similarity index 100% rename from programs/copy2/trunk/macros.inc rename to programs/media/ac97wav/trunk/macros.inc diff --git a/programs/ac97wav/trunk/meosfunc.inc b/programs/media/ac97wav/trunk/meosfunc.inc similarity index 100% rename from programs/ac97wav/trunk/meosfunc.inc rename to programs/media/ac97wav/trunk/meosfunc.inc diff --git a/programs/ac97wav/trunk/pci.inc b/programs/media/ac97wav/trunk/pci.inc similarity index 100% rename from programs/ac97wav/trunk/pci.inc rename to programs/media/ac97wav/trunk/pci.inc diff --git a/programs/bmpview/trunk/bmpview.asm b/programs/media/bmpview/trunk/bmpview.asm similarity index 100% rename from programs/bmpview/trunk/bmpview.asm rename to programs/media/bmpview/trunk/bmpview.asm diff --git a/programs/bmpview/trunk/build_en.bat b/programs/media/bmpview/trunk/build_en.bat similarity index 100% rename from programs/bmpview/trunk/build_en.bat rename to programs/media/bmpview/trunk/build_en.bat diff --git a/programs/bmpview/trunk/build_ru.bat b/programs/media/bmpview/trunk/build_ru.bat similarity index 100% rename from programs/bmpview/trunk/build_ru.bat rename to programs/media/bmpview/trunk/build_ru.bat diff --git a/programs/ipc/trunk/macros.inc b/programs/media/bmpview/trunk/macros.inc similarity index 100% rename from programs/ipc/trunk/macros.inc rename to programs/media/bmpview/trunk/macros.inc diff --git a/programs/cdp/trunk/build_en.bat b/programs/media/cdp/trunk/build_en.bat similarity index 100% rename from programs/cdp/trunk/build_en.bat rename to programs/media/cdp/trunk/build_en.bat diff --git a/programs/cdp/trunk/build_ru.bat b/programs/media/cdp/trunk/build_ru.bat similarity index 100% rename from programs/cdp/trunk/build_ru.bat rename to programs/media/cdp/trunk/build_ru.bat diff --git a/programs/cdp/trunk/cdp.asm b/programs/media/cdp/trunk/cdp.asm similarity index 100% rename from programs/cdp/trunk/cdp.asm rename to programs/media/cdp/trunk/cdp.asm diff --git a/programs/copyr/trunk/macros.inc b/programs/media/cdp/trunk/macros.inc similarity index 100% rename from programs/copyr/trunk/macros.inc rename to programs/media/cdp/trunk/macros.inc diff --git a/programs/cdplay/trunk/build_en.bat b/programs/media/cdplay/trunk/build_en.bat similarity index 100% rename from programs/cdplay/trunk/build_en.bat rename to programs/media/cdplay/trunk/build_en.bat diff --git a/programs/cdplay/trunk/build_ru.bat b/programs/media/cdplay/trunk/build_ru.bat similarity index 100% rename from programs/cdplay/trunk/build_ru.bat rename to programs/media/cdplay/trunk/build_ru.bat diff --git a/programs/cdplay/trunk/cdplay.asm b/programs/media/cdplay/trunk/cdplay.asm similarity index 100% rename from programs/cdplay/trunk/cdplay.asm rename to programs/media/cdplay/trunk/cdplay.asm diff --git a/programs/dhcp/trunk/macros.inc b/programs/media/cdplay/trunk/macros.inc similarity index 100% rename from programs/dhcp/trunk/macros.inc rename to programs/media/cdplay/trunk/macros.inc diff --git a/programs/gifview/trunk/build_en.bat b/programs/media/gifview/trunk/build_en.bat similarity index 100% rename from programs/gifview/trunk/build_en.bat rename to programs/media/gifview/trunk/build_en.bat diff --git a/programs/gifview/trunk/build_ru.bat b/programs/media/gifview/trunk/build_ru.bat similarity index 100% rename from programs/gifview/trunk/build_ru.bat rename to programs/media/gifview/trunk/build_ru.bat diff --git a/programs/gifview/trunk/debug.inc b/programs/media/gifview/trunk/debug.inc similarity index 100% rename from programs/gifview/trunk/debug.inc rename to programs/media/gifview/trunk/debug.inc diff --git a/programs/gifview/trunk/gif_lite.inc b/programs/media/gifview/trunk/gif_lite.inc similarity index 100% rename from programs/gifview/trunk/gif_lite.inc rename to programs/media/gifview/trunk/gif_lite.inc diff --git a/programs/gifview/trunk/gifview.asm b/programs/media/gifview/trunk/gifview.asm similarity index 100% rename from programs/gifview/trunk/gifview.asm rename to programs/media/gifview/trunk/gifview.asm diff --git a/programs/hexview/trunk/macros.inc b/programs/media/gifview/trunk/macros.inc similarity index 100% rename from programs/hexview/trunk/macros.inc rename to programs/media/gifview/trunk/macros.inc diff --git a/programs/iconedit/trunk/build_en.bat b/programs/media/iconedit/trunk/build_en.bat similarity index 100% rename from programs/iconedit/trunk/build_en.bat rename to programs/media/iconedit/trunk/build_en.bat diff --git a/programs/iconedit/trunk/build_ru.bat b/programs/media/iconedit/trunk/build_ru.bat similarity index 100% rename from programs/iconedit/trunk/build_ru.bat rename to programs/media/iconedit/trunk/build_ru.bat diff --git a/programs/iconedit/trunk/iconedit.asm b/programs/media/iconedit/trunk/iconedit.asm similarity index 100% rename from programs/iconedit/trunk/iconedit.asm rename to programs/media/iconedit/trunk/iconedit.asm diff --git a/programs/ir/trunk/macros.inc b/programs/media/iconedit/trunk/macros.inc similarity index 100% rename from programs/ir/trunk/macros.inc rename to programs/media/iconedit/trunk/macros.inc diff --git a/programs/jpegview/trunk/build_en.bat b/programs/media/jpegview/trunk/build_en.bat similarity index 100% rename from programs/jpegview/trunk/build_en.bat rename to programs/media/jpegview/trunk/build_en.bat diff --git a/programs/jpegview/trunk/build_ru.bat b/programs/media/jpegview/trunk/build_ru.bat similarity index 100% rename from programs/jpegview/trunk/build_ru.bat rename to programs/media/jpegview/trunk/build_ru.bat diff --git a/programs/jpegview/trunk/filelib.asm b/programs/media/jpegview/trunk/filelib.asm similarity index 100% rename from programs/jpegview/trunk/filelib.asm rename to programs/media/jpegview/trunk/filelib.asm diff --git a/programs/jpegview/trunk/jpegdat.asm b/programs/media/jpegview/trunk/jpegdat.asm similarity index 100% rename from programs/jpegview/trunk/jpegdat.asm rename to programs/media/jpegview/trunk/jpegdat.asm diff --git a/programs/jpegview/trunk/jpeglib.asm b/programs/media/jpegview/trunk/jpeglib.asm similarity index 100% rename from programs/jpegview/trunk/jpeglib.asm rename to programs/media/jpegview/trunk/jpeglib.asm diff --git a/programs/jpegview/trunk/jpegview.asm b/programs/media/jpegview/trunk/jpegview.asm similarity index 100% rename from programs/jpegview/trunk/jpegview.asm rename to programs/media/jpegview/trunk/jpegview.asm diff --git a/programs/jpegview/trunk/memlib.asm b/programs/media/jpegview/trunk/memlib.asm similarity index 100% rename from programs/jpegview/trunk/memlib.asm rename to programs/media/jpegview/trunk/memlib.asm diff --git a/programs/midiplay/trunk/build_en.bat b/programs/media/midiplay/trunk/build_en.bat similarity index 100% rename from programs/midiplay/trunk/build_en.bat rename to programs/media/midiplay/trunk/build_en.bat diff --git a/programs/midiplay/trunk/build_ru.bat b/programs/media/midiplay/trunk/build_ru.bat similarity index 100% rename from programs/midiplay/trunk/build_ru.bat rename to programs/media/midiplay/trunk/build_ru.bat diff --git a/programs/keyascii/trunk/macros.inc b/programs/media/midiplay/trunk/macros.inc similarity index 100% rename from programs/keyascii/trunk/macros.inc rename to programs/media/midiplay/trunk/macros.inc diff --git a/programs/midiplay/trunk/midiplay.asm b/programs/media/midiplay/trunk/midiplay.asm similarity index 100% rename from programs/midiplay/trunk/midiplay.asm rename to programs/media/midiplay/trunk/midiplay.asm diff --git a/programs/mixer/trunk/build_en.bat b/programs/media/mixer/trunk/build_en.bat similarity index 100% rename from programs/mixer/trunk/build_en.bat rename to programs/media/mixer/trunk/build_en.bat diff --git a/programs/mixer/trunk/build_ru.bat b/programs/media/mixer/trunk/build_ru.bat similarity index 100% rename from programs/mixer/trunk/build_ru.bat rename to programs/media/mixer/trunk/build_ru.bat diff --git a/programs/launcher/trunk/macros.inc b/programs/media/mixer/trunk/macros.inc similarity index 100% rename from programs/launcher/trunk/macros.inc rename to programs/media/mixer/trunk/macros.inc diff --git a/programs/mixer/trunk/mixer.asm b/programs/media/mixer/trunk/mixer.asm similarity index 100% rename from programs/mixer/trunk/mixer.asm rename to programs/media/mixer/trunk/mixer.asm diff --git a/programs/mp3s/trunk/build_en.bat b/programs/media/mp3s/trunk/build_en.bat similarity index 100% rename from programs/mp3s/trunk/build_en.bat rename to programs/media/mp3s/trunk/build_en.bat diff --git a/programs/mp3s/trunk/build_ru.bat b/programs/media/mp3s/trunk/build_ru.bat similarity index 100% rename from programs/mp3s/trunk/build_ru.bat rename to programs/media/mp3s/trunk/build_ru.bat diff --git a/programs/life/trunk/macros.inc b/programs/media/mp3s/trunk/macros.inc similarity index 100% rename from programs/life/trunk/macros.inc rename to programs/media/mp3s/trunk/macros.inc diff --git a/programs/mp3s/trunk/mp3s.asm b/programs/media/mp3s/trunk/mp3s.asm similarity index 100% rename from programs/mp3s/trunk/mp3s.asm rename to programs/media/mp3s/trunk/mp3s.asm diff --git a/programs/mv/trunk/build_en.bat b/programs/media/mv/trunk/build_en.bat similarity index 100% rename from programs/mv/trunk/build_en.bat rename to programs/media/mv/trunk/build_en.bat diff --git a/programs/mv/trunk/build_ru.bat b/programs/media/mv/trunk/build_ru.bat similarity index 100% rename from programs/mv/trunk/build_ru.bat rename to programs/media/mv/trunk/build_ru.bat diff --git a/programs/local/trunk/macros.inc b/programs/media/mv/trunk/macros.inc similarity index 100% rename from programs/local/trunk/macros.inc rename to programs/media/mv/trunk/macros.inc diff --git a/programs/mv/trunk/mv.asm b/programs/media/mv/trunk/mv.asm similarity index 100% rename from programs/mv/trunk/mv.asm rename to programs/media/mv/trunk/mv.asm diff --git a/programs/sb/trunk/build_en.bat b/programs/media/sb/trunk/build_en.bat similarity index 100% rename from programs/sb/trunk/build_en.bat rename to programs/media/sb/trunk/build_en.bat diff --git a/programs/sb/trunk/build_ru.bat b/programs/media/sb/trunk/build_ru.bat similarity index 100% rename from programs/sb/trunk/build_ru.bat rename to programs/media/sb/trunk/build_ru.bat diff --git a/programs/dnsr/trunk/macros.inc b/programs/media/sb/trunk/macros.inc similarity index 100% rename from programs/dnsr/trunk/macros.inc rename to programs/media/sb/trunk/macros.inc diff --git a/programs/sb/trunk/sb.asm b/programs/media/sb/trunk/sb.asm similarity index 100% rename from programs/sb/trunk/sb.asm rename to programs/media/sb/trunk/sb.asm diff --git a/programs/scrshot/trunk/ascl.inc b/programs/media/scrshot/trunk/ascl.inc similarity index 100% rename from programs/scrshot/trunk/ascl.inc rename to programs/media/scrshot/trunk/ascl.inc diff --git a/programs/scrshot/trunk/build_en.bat b/programs/media/scrshot/trunk/build_en.bat similarity index 100% rename from programs/scrshot/trunk/build_en.bat rename to programs/media/scrshot/trunk/build_en.bat diff --git a/programs/scrshot/trunk/build_ru.bat b/programs/media/scrshot/trunk/build_ru.bat similarity index 100% rename from programs/scrshot/trunk/build_ru.bat rename to programs/media/scrshot/trunk/build_ru.bat diff --git a/programs/panel/trunk/macros.inc b/programs/media/scrshot/trunk/macros.inc similarity index 100% rename from programs/panel/trunk/macros.inc rename to programs/media/scrshot/trunk/macros.inc diff --git a/programs/scrshot/trunk/readme.txt b/programs/media/scrshot/trunk/readme.txt similarity index 100% rename from programs/scrshot/trunk/readme.txt rename to programs/media/scrshot/trunk/readme.txt diff --git a/programs/scrshot/trunk/scrshot.asm b/programs/media/scrshot/trunk/scrshot.asm similarity index 100% rename from programs/scrshot/trunk/scrshot.asm rename to programs/media/scrshot/trunk/scrshot.asm diff --git a/programs/vscreen/trunk/build_en.bat b/programs/media/vscreen/trunk/build_en.bat similarity index 100% rename from programs/vscreen/trunk/build_en.bat rename to programs/media/vscreen/trunk/build_en.bat diff --git a/programs/vscreen/trunk/build_ru.bat b/programs/media/vscreen/trunk/build_ru.bat similarity index 100% rename from programs/vscreen/trunk/build_ru.bat rename to programs/media/vscreen/trunk/build_ru.bat diff --git a/programs/timer/trunk/macros.inc b/programs/media/vscreen/trunk/macros.inc similarity index 100% rename from programs/timer/trunk/macros.inc rename to programs/media/vscreen/trunk/macros.inc diff --git a/programs/vscreen/trunk/vscreen.asm b/programs/media/vscreen/trunk/vscreen.asm similarity index 100% rename from programs/vscreen/trunk/vscreen.asm rename to programs/media/vscreen/trunk/vscreen.asm diff --git a/programs/xpaint/trunk/ascgl.inc b/programs/media/xpaint/trunk/ascgl.inc similarity index 100% rename from programs/xpaint/trunk/ascgl.inc rename to programs/media/xpaint/trunk/ascgl.inc diff --git a/programs/xpaint/trunk/ascgml.inc b/programs/media/xpaint/trunk/ascgml.inc similarity index 100% rename from programs/xpaint/trunk/ascgml.inc rename to programs/media/xpaint/trunk/ascgml.inc diff --git a/programs/xpaint/trunk/ascl.inc b/programs/media/xpaint/trunk/ascl.inc similarity index 100% rename from programs/xpaint/trunk/ascl.inc rename to programs/media/xpaint/trunk/ascl.inc diff --git a/programs/xpaint/trunk/ascml.inc b/programs/media/xpaint/trunk/ascml.inc similarity index 100% rename from programs/xpaint/trunk/ascml.inc rename to programs/media/xpaint/trunk/ascml.inc diff --git a/programs/xpaint/trunk/build_en.bat b/programs/media/xpaint/trunk/build_en.bat similarity index 100% rename from programs/xpaint/trunk/build_en.bat rename to programs/media/xpaint/trunk/build_en.bat diff --git a/programs/xpaint/trunk/build_ru.bat b/programs/media/xpaint/trunk/build_ru.bat similarity index 100% rename from programs/xpaint/trunk/build_ru.bat rename to programs/media/xpaint/trunk/build_ru.bat diff --git a/programs/tinyfrac/trunk/macros.inc b/programs/media/xpaint/trunk/macros.inc similarity index 100% rename from programs/tinyfrac/trunk/macros.inc rename to programs/media/xpaint/trunk/macros.inc diff --git a/programs/xpaint/trunk/xpaint.asm b/programs/media/xpaint/trunk/xpaint.asm similarity index 100% rename from programs/xpaint/trunk/xpaint.asm rename to programs/media/xpaint/trunk/xpaint.asm diff --git a/programs/airc/trunk/airc.asm b/programs/network/airc/trunk/airc.asm similarity index 100% rename from programs/airc/trunk/airc.asm rename to programs/network/airc/trunk/airc.asm diff --git a/programs/airc/trunk/build_en.bat b/programs/network/airc/trunk/build_en.bat similarity index 100% rename from programs/airc/trunk/build_en.bat rename to programs/network/airc/trunk/build_en.bat diff --git a/programs/airc/trunk/build_ru.bat b/programs/network/airc/trunk/build_ru.bat similarity index 100% rename from programs/airc/trunk/build_ru.bat rename to programs/network/airc/trunk/build_ru.bat diff --git a/programs/param/trunk/macros.inc b/programs/network/airc/trunk/macros.inc similarity index 100% rename from programs/param/trunk/macros.inc rename to programs/network/airc/trunk/macros.inc diff --git a/programs/arpstat/trunk/arpstat.asm b/programs/network/arpstat/trunk/arpstat.asm similarity index 100% rename from programs/arpstat/trunk/arpstat.asm rename to programs/network/arpstat/trunk/arpstat.asm diff --git a/programs/arpstat/trunk/build_en.bat b/programs/network/arpstat/trunk/build_en.bat similarity index 100% rename from programs/arpstat/trunk/build_en.bat rename to programs/network/arpstat/trunk/build_en.bat diff --git a/programs/arpstat/trunk/build_ru.bat b/programs/network/arpstat/trunk/build_ru.bat similarity index 100% rename from programs/arpstat/trunk/build_ru.bat rename to programs/network/arpstat/trunk/build_ru.bat diff --git a/programs/pic4/trunk/macros.inc b/programs/network/arpstat/trunk/macros.inc similarity index 100% rename from programs/pic4/trunk/macros.inc rename to programs/network/arpstat/trunk/macros.inc diff --git a/programs/autodhcp/trunk/MACROS.INC b/programs/network/autodhcp/trunk/MACROS.INC similarity index 100% rename from programs/autodhcp/trunk/MACROS.INC rename to programs/network/autodhcp/trunk/MACROS.INC diff --git a/programs/autodhcp/trunk/autodhcp.asm b/programs/network/autodhcp/trunk/autodhcp.asm similarity index 100% rename from programs/autodhcp/trunk/autodhcp.asm rename to programs/network/autodhcp/trunk/autodhcp.asm diff --git a/programs/autodhcp/trunk/debug.inc b/programs/network/autodhcp/trunk/debug.inc similarity index 100% rename from programs/autodhcp/trunk/debug.inc rename to programs/network/autodhcp/trunk/debug.inc diff --git a/programs/dhcp/trunk/build_en.bat b/programs/network/dhcp/trunk/build_en.bat similarity index 100% rename from programs/dhcp/trunk/build_en.bat rename to programs/network/dhcp/trunk/build_en.bat diff --git a/programs/dhcp/trunk/build_ru.bat b/programs/network/dhcp/trunk/build_ru.bat similarity index 100% rename from programs/dhcp/trunk/build_ru.bat rename to programs/network/dhcp/trunk/build_ru.bat diff --git a/programs/dhcp/trunk/dhcp.asm b/programs/network/dhcp/trunk/dhcp.asm similarity index 100% rename from programs/dhcp/trunk/dhcp.asm rename to programs/network/dhcp/trunk/dhcp.asm diff --git a/programs/plasma/trunk/macros.inc b/programs/network/dhcp/trunk/macros.inc similarity index 100% rename from programs/plasma/trunk/macros.inc rename to programs/network/dhcp/trunk/macros.inc diff --git a/programs/dnsr/trunk/build_en.bat b/programs/network/dnsr/trunk/build_en.bat similarity index 100% rename from programs/dnsr/trunk/build_en.bat rename to programs/network/dnsr/trunk/build_en.bat diff --git a/programs/dnsr/trunk/build_ru.bat b/programs/network/dnsr/trunk/build_ru.bat similarity index 100% rename from programs/dnsr/trunk/build_ru.bat rename to programs/network/dnsr/trunk/build_ru.bat diff --git a/programs/dnsr/trunk/dnsr.asm b/programs/network/dnsr/trunk/dnsr.asm similarity index 100% rename from programs/dnsr/trunk/dnsr.asm rename to programs/network/dnsr/trunk/dnsr.asm diff --git a/programs/ppp/trunk/macros.inc b/programs/network/dnsr/trunk/macros.inc similarity index 100% rename from programs/ppp/trunk/macros.inc rename to programs/network/dnsr/trunk/macros.inc diff --git a/programs/ethstat/trunk/build_en.bat b/programs/network/ethstat/trunk/build_en.bat similarity index 100% rename from programs/ethstat/trunk/build_en.bat rename to programs/network/ethstat/trunk/build_en.bat diff --git a/programs/ethstat/trunk/build_ru.bat b/programs/network/ethstat/trunk/build_ru.bat similarity index 100% rename from programs/ethstat/trunk/build_ru.bat rename to programs/network/ethstat/trunk/build_ru.bat diff --git a/programs/ethstat/trunk/ethstat.asm b/programs/network/ethstat/trunk/ethstat.asm similarity index 100% rename from programs/ethstat/trunk/ethstat.asm rename to programs/network/ethstat/trunk/ethstat.asm diff --git a/programs/magnify/trunk/macros.inc b/programs/network/ethstat/trunk/macros.inc similarity index 100% rename from programs/magnify/trunk/macros.inc rename to programs/network/ethstat/trunk/macros.inc diff --git a/programs/httpc/trunk/build_en.bat b/programs/network/httpc/trunk/build_en.bat similarity index 100% rename from programs/httpc/trunk/build_en.bat rename to programs/network/httpc/trunk/build_en.bat diff --git a/programs/httpc/trunk/build_ru.bat b/programs/network/httpc/trunk/build_ru.bat similarity index 100% rename from programs/httpc/trunk/build_ru.bat rename to programs/network/httpc/trunk/build_ru.bat diff --git a/programs/httpc/trunk/httpc.asm b/programs/network/httpc/trunk/httpc.asm similarity index 100% rename from programs/httpc/trunk/httpc.asm rename to programs/network/httpc/trunk/httpc.asm diff --git a/programs/httpc/trunk/macros.inc b/programs/network/httpc/trunk/macros.inc similarity index 100% rename from programs/httpc/trunk/macros.inc rename to programs/network/httpc/trunk/macros.inc diff --git a/programs/https/trunk/build_en.bat b/programs/network/https/trunk/build_en.bat similarity index 100% rename from programs/https/trunk/build_en.bat rename to programs/network/https/trunk/build_en.bat diff --git a/programs/https/trunk/build_ru.bat b/programs/network/https/trunk/build_ru.bat similarity index 100% rename from programs/https/trunk/build_ru.bat rename to programs/network/https/trunk/build_ru.bat diff --git a/programs/https/trunk/https.asm b/programs/network/https/trunk/https.asm similarity index 100% rename from programs/https/trunk/https.asm rename to programs/network/https/trunk/https.asm diff --git a/programs/https/trunk/macros.inc b/programs/network/https/trunk/macros.inc similarity index 100% rename from programs/https/trunk/macros.inc rename to programs/network/https/trunk/macros.inc diff --git a/programs/ipc/trunk/build_en.bat b/programs/network/ipc/trunk/build_en.bat similarity index 100% rename from programs/ipc/trunk/build_en.bat rename to programs/network/ipc/trunk/build_en.bat diff --git a/programs/ipc/trunk/build_ru.bat b/programs/network/ipc/trunk/build_ru.bat similarity index 100% rename from programs/ipc/trunk/build_ru.bat rename to programs/network/ipc/trunk/build_ru.bat diff --git a/programs/ipc/trunk/ipc.asm b/programs/network/ipc/trunk/ipc.asm similarity index 100% rename from programs/ipc/trunk/ipc.asm rename to programs/network/ipc/trunk/ipc.asm diff --git a/programs/mblocks/trunk/macros.inc b/programs/network/ipc/trunk/macros.inc similarity index 100% rename from programs/mblocks/trunk/macros.inc rename to programs/network/ipc/trunk/macros.inc diff --git a/programs/local/trunk/build_en.bat b/programs/network/local/trunk/build_en.bat similarity index 100% rename from programs/local/trunk/build_en.bat rename to programs/network/local/trunk/build_en.bat diff --git a/programs/local/trunk/build_ru.bat b/programs/network/local/trunk/build_ru.bat similarity index 100% rename from programs/local/trunk/build_ru.bat rename to programs/network/local/trunk/build_ru.bat diff --git a/programs/local/trunk/local.asm b/programs/network/local/trunk/local.asm similarity index 100% rename from programs/local/trunk/local.asm rename to programs/network/local/trunk/local.asm diff --git a/programs/menu/trunk/macros.inc b/programs/network/local/trunk/macros.inc similarity index 100% rename from programs/menu/trunk/macros.inc rename to programs/network/local/trunk/macros.inc diff --git a/programs/md5/trunk/build_en.bat b/programs/network/md5/trunk/build_en.bat similarity index 100% rename from programs/md5/trunk/build_en.bat rename to programs/network/md5/trunk/build_en.bat diff --git a/programs/md5/trunk/build_ru.bat b/programs/network/md5/trunk/build_ru.bat similarity index 100% rename from programs/md5/trunk/build_ru.bat rename to programs/network/md5/trunk/build_ru.bat diff --git a/programs/md5/trunk/md5.asm b/programs/network/md5/trunk/md5.asm similarity index 100% rename from programs/md5/trunk/md5.asm rename to programs/network/md5/trunk/md5.asm diff --git a/programs/netsendc/trunk/build_en.bat b/programs/network/netsendc/trunk/build_en.bat similarity index 100% rename from programs/netsendc/trunk/build_en.bat rename to programs/network/netsendc/trunk/build_en.bat diff --git a/programs/netsendc/trunk/build_ru.bat b/programs/network/netsendc/trunk/build_ru.bat similarity index 100% rename from programs/netsendc/trunk/build_ru.bat rename to programs/network/netsendc/trunk/build_ru.bat diff --git a/programs/mhc/trunk/macros.inc b/programs/network/netsendc/trunk/macros.inc similarity index 100% rename from programs/mhc/trunk/macros.inc rename to programs/network/netsendc/trunk/macros.inc diff --git a/programs/netsendc/trunk/netsendc.asm b/programs/network/netsendc/trunk/netsendc.asm similarity index 100% rename from programs/netsendc/trunk/netsendc.asm rename to programs/network/netsendc/trunk/netsendc.asm diff --git a/programs/netsends/trunk/build_en.bat b/programs/network/netsends/trunk/build_en.bat similarity index 100% rename from programs/netsends/trunk/build_en.bat rename to programs/network/netsends/trunk/build_en.bat diff --git a/programs/netsends/trunk/build_ru.bat b/programs/network/netsends/trunk/build_ru.bat similarity index 100% rename from programs/netsends/trunk/build_ru.bat rename to programs/network/netsends/trunk/build_ru.bat diff --git a/programs/midiplay/trunk/macros.inc b/programs/network/netsends/trunk/macros.inc similarity index 100% rename from programs/midiplay/trunk/macros.inc rename to programs/network/netsends/trunk/macros.inc diff --git a/programs/netsends/trunk/netsends.asm b/programs/network/netsends/trunk/netsends.asm similarity index 100% rename from programs/netsends/trunk/netsends.asm rename to programs/network/netsends/trunk/netsends.asm diff --git a/programs/nntpc/trunk/build_en.bat b/programs/network/nntpc/trunk/build_en.bat similarity index 100% rename from programs/nntpc/trunk/build_en.bat rename to programs/network/nntpc/trunk/build_en.bat diff --git a/programs/nntpc/trunk/build_ru.bat b/programs/network/nntpc/trunk/build_ru.bat similarity index 100% rename from programs/nntpc/trunk/build_ru.bat rename to programs/network/nntpc/trunk/build_ru.bat diff --git a/programs/mixer/trunk/macros.inc b/programs/network/nntpc/trunk/macros.inc similarity index 100% rename from programs/mixer/trunk/macros.inc rename to programs/network/nntpc/trunk/macros.inc diff --git a/programs/nntpc/trunk/nntpc.asm b/programs/network/nntpc/trunk/nntpc.asm similarity index 100% rename from programs/nntpc/trunk/nntpc.asm rename to programs/network/nntpc/trunk/nntpc.asm diff --git a/programs/popc/trunk/build_en.bat b/programs/network/popc/trunk/build_en.bat similarity index 100% rename from programs/popc/trunk/build_en.bat rename to programs/network/popc/trunk/build_en.bat diff --git a/programs/popc/trunk/build_ru.bat b/programs/network/popc/trunk/build_ru.bat similarity index 100% rename from programs/popc/trunk/build_ru.bat rename to programs/network/popc/trunk/build_ru.bat diff --git a/programs/popc/trunk/popc.asm b/programs/network/popc/trunk/popc.asm similarity index 100% rename from programs/popc/trunk/popc.asm rename to programs/network/popc/trunk/popc.asm diff --git a/programs/ppp/trunk/build_en.bat b/programs/network/ppp/trunk/build_en.bat similarity index 100% rename from programs/ppp/trunk/build_en.bat rename to programs/network/ppp/trunk/build_en.bat diff --git a/programs/ppp/trunk/build_ru.bat b/programs/network/ppp/trunk/build_ru.bat similarity index 100% rename from programs/ppp/trunk/build_ru.bat rename to programs/network/ppp/trunk/build_ru.bat diff --git a/programs/ppp/trunk/chat.inc b/programs/network/ppp/trunk/chat.inc similarity index 100% rename from programs/ppp/trunk/chat.inc rename to programs/network/ppp/trunk/chat.inc diff --git a/programs/rccc/trunk/macros.inc b/programs/network/ppp/trunk/macros.inc similarity index 100% rename from programs/rccc/trunk/macros.inc rename to programs/network/ppp/trunk/macros.inc diff --git a/programs/ppp/trunk/ppp.asm b/programs/network/ppp/trunk/ppp.asm similarity index 100% rename from programs/ppp/trunk/ppp.asm rename to programs/network/ppp/trunk/ppp.asm diff --git a/programs/rccc/trunk/build_en.bat b/programs/network/rccc/trunk/build_en.bat similarity index 100% rename from programs/rccc/trunk/build_en.bat rename to programs/network/rccc/trunk/build_en.bat diff --git a/programs/rccc/trunk/build_ru.bat b/programs/network/rccc/trunk/build_ru.bat similarity index 100% rename from programs/rccc/trunk/build_ru.bat rename to programs/network/rccc/trunk/build_ru.bat diff --git a/programs/rccs/trunk/macros.inc b/programs/network/rccc/trunk/macros.inc similarity index 100% rename from programs/rccs/trunk/macros.inc rename to programs/network/rccc/trunk/macros.inc diff --git a/programs/rccc/trunk/rccc.asm b/programs/network/rccc/trunk/rccc.asm similarity index 100% rename from programs/rccc/trunk/rccc.asm rename to programs/network/rccc/trunk/rccc.asm diff --git a/programs/rccs/trunk/build_en.bat b/programs/network/rccs/trunk/build_en.bat similarity index 100% rename from programs/rccs/trunk/build_en.bat rename to programs/network/rccs/trunk/build_en.bat diff --git a/programs/rccs/trunk/build_ru.bat b/programs/network/rccs/trunk/build_ru.bat similarity index 100% rename from programs/rccs/trunk/build_ru.bat rename to programs/network/rccs/trunk/build_ru.bat diff --git a/programs/rd2fd/trunk/macros.inc b/programs/network/rccs/trunk/macros.inc similarity index 100% rename from programs/rd2fd/trunk/macros.inc rename to programs/network/rccs/trunk/macros.inc diff --git a/programs/rccs/trunk/rccs.asm b/programs/network/rccs/trunk/rccs.asm similarity index 100% rename from programs/rccs/trunk/rccs.asm rename to programs/network/rccs/trunk/rccs.asm diff --git a/programs/remote/trunk/build_en.bat b/programs/network/remote/trunk/build_en.bat similarity index 100% rename from programs/remote/trunk/build_en.bat rename to programs/network/remote/trunk/build_en.bat diff --git a/programs/remote/trunk/build_ru.bat b/programs/network/remote/trunk/build_ru.bat similarity index 100% rename from programs/remote/trunk/build_ru.bat rename to programs/network/remote/trunk/build_ru.bat diff --git a/programs/rd2hd/trunk/macros.inc b/programs/network/remote/trunk/macros.inc similarity index 100% rename from programs/rd2hd/trunk/macros.inc rename to programs/network/remote/trunk/macros.inc diff --git a/programs/remote/trunk/remote.asm b/programs/network/remote/trunk/remote.asm similarity index 100% rename from programs/remote/trunk/remote.asm rename to programs/network/remote/trunk/remote.asm diff --git a/programs/rtdata/trunk/build_en.bat b/programs/network/rtdata/trunk/build_en.bat similarity index 100% rename from programs/rtdata/trunk/build_en.bat rename to programs/network/rtdata/trunk/build_en.bat diff --git a/programs/rtdata/trunk/build_ru.bat b/programs/network/rtdata/trunk/build_ru.bat similarity index 100% rename from programs/rtdata/trunk/build_ru.bat rename to programs/network/rtdata/trunk/build_ru.bat diff --git a/programs/rdfdel/trunk/macros.inc b/programs/network/rtdata/trunk/macros.inc similarity index 100% rename from programs/rdfdel/trunk/macros.inc rename to programs/network/rtdata/trunk/macros.inc diff --git a/programs/rtdata/trunk/rtdata.asm b/programs/network/rtdata/trunk/rtdata.asm similarity index 100% rename from programs/rtdata/trunk/rtdata.asm rename to programs/network/rtdata/trunk/rtdata.asm diff --git a/programs/smtps/trunk/build_en.bat b/programs/network/smtps/trunk/build_en.bat similarity index 100% rename from programs/smtps/trunk/build_en.bat rename to programs/network/smtps/trunk/build_en.bat diff --git a/programs/smtps/trunk/build_ru.bat b/programs/network/smtps/trunk/build_ru.bat similarity index 100% rename from programs/smtps/trunk/build_ru.bat rename to programs/network/smtps/trunk/build_ru.bat diff --git a/programs/smtps/trunk/smtps.asm b/programs/network/smtps/trunk/smtps.asm similarity index 100% rename from programs/smtps/trunk/smtps.asm rename to programs/network/smtps/trunk/smtps.asm diff --git a/programs/stackcfg/trunk/build_en.bat b/programs/network/stackcfg/trunk/build_en.bat similarity index 100% rename from programs/stackcfg/trunk/build_en.bat rename to programs/network/stackcfg/trunk/build_en.bat diff --git a/programs/stackcfg/trunk/build_ru.bat b/programs/network/stackcfg/trunk/build_ru.bat similarity index 100% rename from programs/stackcfg/trunk/build_ru.bat rename to programs/network/stackcfg/trunk/build_ru.bat diff --git a/programs/stackcfg/trunk/stackcfg.asm b/programs/network/stackcfg/trunk/stackcfg.asm similarity index 100% rename from programs/stackcfg/trunk/stackcfg.asm rename to programs/network/stackcfg/trunk/stackcfg.asm diff --git a/programs/stackinf/trunk/build_en.bat b/programs/network/stackinf/trunk/build_en.bat similarity index 100% rename from programs/stackinf/trunk/build_en.bat rename to programs/network/stackinf/trunk/build_en.bat diff --git a/programs/stackinf/trunk/build_ru.bat b/programs/network/stackinf/trunk/build_ru.bat similarity index 100% rename from programs/stackinf/trunk/build_ru.bat rename to programs/network/stackinf/trunk/build_ru.bat diff --git a/programs/remote/trunk/macros.inc b/programs/network/stackinf/trunk/macros.inc similarity index 100% rename from programs/remote/trunk/macros.inc rename to programs/network/stackinf/trunk/macros.inc diff --git a/programs/stackinf/trunk/stackinf.asm b/programs/network/stackinf/trunk/stackinf.asm similarity index 100% rename from programs/stackinf/trunk/stackinf.asm rename to programs/network/stackinf/trunk/stackinf.asm diff --git a/programs/telnet/trunk/build_en.bat b/programs/network/telnet/trunk/build_en.bat similarity index 100% rename from programs/telnet/trunk/build_en.bat rename to programs/network/telnet/trunk/build_en.bat diff --git a/programs/telnet/trunk/build_ru.bat b/programs/network/telnet/trunk/build_ru.bat similarity index 100% rename from programs/telnet/trunk/build_ru.bat rename to programs/network/telnet/trunk/build_ru.bat diff --git a/programs/tinypad2/trunk/macros.inc b/programs/network/telnet/trunk/macros.inc similarity index 100% rename from programs/tinypad2/trunk/macros.inc rename to programs/network/telnet/trunk/macros.inc diff --git a/programs/telnet/trunk/telnet.asm b/programs/network/telnet/trunk/telnet.asm similarity index 100% rename from programs/telnet/trunk/telnet.asm rename to programs/network/telnet/trunk/telnet.asm diff --git a/programs/terminal/trunk/build_en.bat b/programs/network/terminal/trunk/build_en.bat similarity index 100% rename from programs/terminal/trunk/build_en.bat rename to programs/network/terminal/trunk/build_en.bat diff --git a/programs/terminal/trunk/build_ru.bat b/programs/network/terminal/trunk/build_ru.bat similarity index 100% rename from programs/terminal/trunk/build_ru.bat rename to programs/network/terminal/trunk/build_ru.bat diff --git a/programs/transp/trunk/macros.inc b/programs/network/terminal/trunk/macros.inc similarity index 100% rename from programs/transp/trunk/macros.inc rename to programs/network/terminal/trunk/macros.inc diff --git a/programs/terminal/trunk/terminal.asm b/programs/network/terminal/trunk/terminal.asm similarity index 100% rename from programs/terminal/trunk/terminal.asm rename to programs/network/terminal/trunk/terminal.asm diff --git a/programs/tftpa/trunk/build_en.bat b/programs/network/tftpa/trunk/build_en.bat similarity index 100% rename from programs/tftpa/trunk/build_en.bat rename to programs/network/tftpa/trunk/build_en.bat diff --git a/programs/tftpa/trunk/build_ru.bat b/programs/network/tftpa/trunk/build_ru.bat similarity index 100% rename from programs/tftpa/trunk/build_ru.bat rename to programs/network/tftpa/trunk/build_ru.bat diff --git a/programs/tube/trunk/macros.inc b/programs/network/tftpa/trunk/macros.inc similarity index 100% rename from programs/tube/trunk/macros.inc rename to programs/network/tftpa/trunk/macros.inc diff --git a/programs/tftpa/trunk/tftpa.asm b/programs/network/tftpa/trunk/tftpa.asm similarity index 100% rename from programs/tftpa/trunk/tftpa.asm rename to programs/network/tftpa/trunk/tftpa.asm diff --git a/programs/tftpc/trunk/build_en.bat b/programs/network/tftpc/trunk/build_en.bat similarity index 100% rename from programs/tftpc/trunk/build_en.bat rename to programs/network/tftpc/trunk/build_en.bat diff --git a/programs/tftpc/trunk/build_ru.bat b/programs/network/tftpc/trunk/build_ru.bat similarity index 100% rename from programs/tftpc/trunk/build_ru.bat rename to programs/network/tftpc/trunk/build_ru.bat diff --git a/programs/vrr_m/trunk/macros.inc b/programs/network/tftpc/trunk/macros.inc similarity index 100% rename from programs/vrr_m/trunk/macros.inc rename to programs/network/tftpc/trunk/macros.inc diff --git a/programs/tftpc/trunk/tftpc.asm b/programs/network/tftpc/trunk/tftpc.asm similarity index 100% rename from programs/tftpc/trunk/tftpc.asm rename to programs/network/tftpc/trunk/tftpc.asm diff --git a/programs/ym/trunk/build_en.bat b/programs/network/ym/trunk/build_en.bat similarity index 100% rename from programs/ym/trunk/build_en.bat rename to programs/network/ym/trunk/build_en.bat diff --git a/programs/ym/trunk/build_ru.bat b/programs/network/ym/trunk/build_ru.bat similarity index 100% rename from programs/ym/trunk/build_ru.bat rename to programs/network/ym/trunk/build_ru.bat diff --git a/programs/ym/trunk/ym.asm b/programs/network/ym/trunk/ym.asm similarity index 100% rename from programs/ym/trunk/ym.asm rename to programs/network/ym/trunk/ym.asm diff --git a/programs/calc/trunk/build_en.bat b/programs/other/calc/trunk/build_en.bat similarity index 100% rename from programs/calc/trunk/build_en.bat rename to programs/other/calc/trunk/build_en.bat diff --git a/programs/calc/trunk/build_ru.bat b/programs/other/calc/trunk/build_ru.bat similarity index 100% rename from programs/calc/trunk/build_ru.bat rename to programs/other/calc/trunk/build_ru.bat diff --git a/programs/calc/trunk/calc.asm b/programs/other/calc/trunk/calc.asm similarity index 100% rename from programs/calc/trunk/calc.asm rename to programs/other/calc/trunk/calc.asm diff --git a/programs/movback/trunk/macros.inc b/programs/other/calc/trunk/macros.inc similarity index 100% rename from programs/movback/trunk/macros.inc rename to programs/other/calc/trunk/macros.inc diff --git a/programs/rtfread/trunk/READER.RTF b/programs/other/rtfread/trunk/READER.RTF similarity index 100% rename from programs/rtfread/trunk/READER.RTF rename to programs/other/rtfread/trunk/READER.RTF diff --git a/programs/rtfread/trunk/ascl.inc b/programs/other/rtfread/trunk/ascl.inc similarity index 100% rename from programs/rtfread/trunk/ascl.inc rename to programs/other/rtfread/trunk/ascl.inc diff --git a/programs/rtfread/trunk/bgifont.inc b/programs/other/rtfread/trunk/bgifont.inc similarity index 100% rename from programs/rtfread/trunk/bgifont.inc rename to programs/other/rtfread/trunk/bgifont.inc diff --git a/programs/rtfread/trunk/build_en.bat b/programs/other/rtfread/trunk/build_en.bat similarity index 100% rename from programs/rtfread/trunk/build_en.bat rename to programs/other/rtfread/trunk/build_en.bat diff --git a/programs/rtfread/trunk/build_ru.bat b/programs/other/rtfread/trunk/build_ru.bat similarity index 100% rename from programs/rtfread/trunk/build_ru.bat rename to programs/other/rtfread/trunk/build_ru.bat diff --git a/programs/rtfread/trunk/debug.inc b/programs/other/rtfread/trunk/debug.inc similarity index 100% rename from programs/rtfread/trunk/debug.inc rename to programs/other/rtfread/trunk/debug.inc diff --git a/programs/rtdata/trunk/macros.inc b/programs/other/rtfread/trunk/macros.inc similarity index 100% rename from programs/rtdata/trunk/macros.inc rename to programs/other/rtfread/trunk/macros.inc diff --git a/programs/rtfread/trunk/rtf_lite.inc b/programs/other/rtfread/trunk/rtf_lite.inc similarity index 100% rename from programs/rtfread/trunk/rtf_lite.inc rename to programs/other/rtfread/trunk/rtf_lite.inc diff --git a/programs/rtfread/trunk/rtfactn.inc b/programs/other/rtfread/trunk/rtfactn.inc similarity index 100% rename from programs/rtfread/trunk/rtfactn.inc rename to programs/other/rtfread/trunk/rtfactn.inc diff --git a/programs/rtfread/trunk/rtfread.asm b/programs/other/rtfread/trunk/rtfread.asm similarity index 100% rename from programs/rtfread/trunk/rtfread.asm rename to programs/other/rtfread/trunk/rtfread.asm diff --git a/programs/rtfread/trunk/rtftype.inc b/programs/other/rtfread/trunk/rtftype.inc similarity index 100% rename from programs/rtfread/trunk/rtftype.inc rename to programs/other/rtfread/trunk/rtftype.inc diff --git a/programs/spanel/trunk/build_en.bat b/programs/spanel/trunk/build_en.bat deleted file mode 100644 index fb0545ec72..0000000000 --- a/programs/spanel/trunk/build_en.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix en >lang.inc -@fasm spanel.asm spanel -@pause \ No newline at end of file diff --git a/programs/spanel/trunk/build_ru.bat b/programs/spanel/trunk/build_ru.bat deleted file mode 100644 index 6befabb5ec..0000000000 --- a/programs/spanel/trunk/build_ru.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix ru >lang.inc -@fasm spanel.asm spanel -@pause \ No newline at end of file diff --git a/programs/spanel/trunk/spanel.asm b/programs/spanel/trunk/spanel.asm deleted file mode 100644 index ed4cf65f38..0000000000 --- a/programs/spanel/trunk/spanel.asm +++ /dev/null @@ -1,254 +0,0 @@ -; -; PANEL SETUP -; -; Compile with FASM for Menuet -; - -use32 - - org 0x0 - - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd 0x8000 ; memory for app - dd 0x8000 ; esp - dd 0x0 , 0x0 ; I_Param , I_Icon - -include 'lang.inc' -include 'macros.inc' - -START: ; start of execution - - call draw_window - -still: - - mov eax,10 ; wait here for event - int 0x40 - - cmp eax,1 ; redraw request ? - je red - cmp eax,2 ; key in buffer ? - je key - cmp eax,3 ; button in buffer ? - je button - - jmp still - - red: ; redraw - call draw_window - jmp still - - key: ; key - mov eax,2 ; just read it and ignore - int 0x40 - - shr eax,8 - cmp eax,'0' - jb still - cmp eax,'9' - jg still - - mov edi,[ent] - add edi,text - mov esi,edi - inc esi - mov ecx,3 - cld - rep movsb - - mov [edi],al - - call draw_window - jmp still - - button: ; button - mov eax,17 ; get id - int 0x40 - - cmp ah,1 ; button id=1 ? - jne noclose - mov eax,-1 ; close this program - int 0x40 - noclose: - - cmp ah,10 - jne no_apply - - mov esi,text+17 - mov edi,I_END+10 - mov ecx,12 - newfe: - mov ebx,[esi] - mov [edi],ebx - mov [edi+4],byte ';' - add edi,5 - add esi,55 - loop newfe - mov [edi],byte 'x' - - mov eax,33 - mov ebx,filename - mov ecx,I_END+10 - mov edx,5*12+1 - mov esi,0 - int 0x40 - - - mov esi,1 - newread: - inc esi - mov eax,9 - mov ebx,I_END - mov ecx,esi - int 0x40 - cmp esi,eax - jg all_terminated - - cmp [I_END+10],dword 'PANE' - jne newread - cmp [I_END+14],dword 'L ' - jne newread - - mov eax,18 - mov ebx,2 - mov ecx,esi - int 0x40 - - mov eax,5 - mov ebx,5 - int 0x40 - - mov esi,1 - - jmp newread - - all_terminated: - - mov eax,5 - mov ebx,25 - int 0x40 - - mov eax,19 - mov ebx,panel - mov ecx,0 - int 0x40 - - - no_apply: - - cmp ah,11 - jb no_entry - shr eax,8 - sub eax,11 - imul eax,55 - add eax,17 - mov [ent],eax - mov [text+eax],dword '0000' - call draw_window - jmp still - no_entry: - - - jmp still - - -ent dd 17 -filename db 'PANEL DAT' -panel db 'PANEL ' - -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ******** -; ********************************************* - - -draw_window: - - - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,1 ; 1, start of draw - int 0x40 - - ; DRAW WINDOW - mov eax,0 ; function 0 : define and draw window - mov ebx,100*65536+385 ; [x start] *65536 + [x size] - mov ecx,100*65536+190 ; [y start] *65536 + [y size] - mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl - mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl - mov edi,0x005080d0 ; color of frames RRGGBB - int 0x40 - - ; WINDOW LABEL - mov eax,4 ; function 4 : write text to window - mov ebx,8*65536+8 ; [x start] *65536 + [y start] - mov ecx,0x10ddeeff ; color of text RRGGBB - mov edx,labelt ; pointer to text beginning - mov esi,labellen-labelt ; text length - int 0x40 - - mov eax,8 - mov ebx,25*65536+335 ;160 - mov ecx,162*65536+12 - mov edx,10 - mov esi,0x80a0c0 ;0x6677cc - int 0x40 - - mov eax,8 - mov ebx,340*65536+20 - mov ecx,34*65536+10 - mov edx,11 - newb: - int 0x40 - add ecx,10*65536 - inc edx - cmp edx,23 - jb newb - - mov ebx,25*65536+35 ; draw info text with function 4 - mov ecx,0x224466 - mov edx,text - mov esi,55 - newline: - mov eax,4 - int 0x40 - add ebx,10 - add edx,55 - cmp [edx],byte 'x' - jne newline - - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,2 ; 2, end of draw - int 0x40 - - ret - - -; DATA AREA - - -text: - -db 'width 0000 : 0 for full screen width <' -db 'buttons 0001 : 0 no frames , 1 frames <' -db 'soften_up 0001 : 0 no , 1 yes <' -db 'soften_down 0001 : 0 no , 1 yes <' -db 'minimize_left 0001 : 0 no , 1 yes <' -db 'minimize_right 0001 : 0 no , 1 yes <' -db 'icons_position 0130 : position in pixels <' -db 'menu_enable 0001 : 0 no , 1 yes <' -db 'setup_enable 0001 : 0 no , 1 yes <' -db 'graph_text 0000 : 0 graphics , 1 text <' -db 'soften_middle 0000 : 0 no , 1 yes <' -db 'icons 0000 : 0 start , 1 activate <' -db ' ' -db ' APPLY ' -db 'x' - - -labelt: - db 'PANEL SETUP' -labellen: - -I_END: diff --git a/programs/ss/trunk/macros.inc b/programs/ss/trunk/macros.inc deleted file mode 100644 index d599dea0e0..0000000000 --- a/programs/ss/trunk/macros.inc +++ /dev/null @@ -1,267 +0,0 @@ -; new application structure -macro meos_app_start - { - use32 - org 0x0 - - db 'MENUET01' - dd 0x01 - dd __start - dd __end - dd __memory - dd __stack - - if used __params & ~defined __params - dd __params - else - dd 0x0 - end if - - dd 0x0 - } -MEOS_APP_START fix meos_app_start - -macro code - { - __start: - } -CODE fix code - -macro data - { - __data: - } -DATA fix data - -macro udata - { - if used __params & ~defined __params - __params: - db 0 - __end: - rb 255 - else - __end: - end if - __udata: - } -UDATA fix udata - -macro meos_app_end - { - align 32 - rb 2048 - __stack: - __memory: - } -MEOS_APP_END fix meos_app_end - - -; macro for defining multiline text data -struc mstr [sstring] - { - forward - local ssize - virtual at 0 - db sstring - ssize = $ - end virtual - dd ssize - db sstring - common - dd -1 - } - - -; strings -macro sz name,[data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if used name - db data - end if - common - if used name - .size = $-name - end if -} - -macro lsz name,[lng,data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if (used name)&(lang eq lng) - db data - end if - common - if used name - .size = $-name - end if -} - - - -; easy system call macro -macro mpack dest, hsrc, lsrc -{ - if (hsrc eqtype 0) & (lsrc eqtype 0) - mov dest, (hsrc) shl 16 + lsrc - else - if (hsrc eqtype 0) & (~lsrc eqtype 0) - mov dest, (hsrc) shl 16 - add dest, lsrc - else - mov dest, hsrc - shl dest, 16 - add dest, lsrc - end if - end if -} - -macro __mov reg,a,b { ; mike.dld - if (~a eq)&(~b eq) - mpack reg,a,b - else if (~a eq)&(b eq) - mov reg,a - end if -} - -macro mcall a,b,c,d,e,f { ; mike.dld - __mov eax,a - __mov ebx,b - __mov ecx,c - __mov edx,d - __mov esi,e - __mov edi,f - int 0x40 -} - - - - - - - -; optimize the code for size -__regs fix - -macro add arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - inc arg1 - else - add arg1,arg2 - end if - else - add arg1,arg2 - end if - } - -macro sub arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - dec arg1 - else - sub arg1,arg2 - end if - else - sub arg1,arg2 - end if - } - -macro mov arg1,arg2 - { - if (arg1 in __regs) & (arg2 eqtype 0) - if (arg2) = 0 - xor arg1,arg1 - else if (arg2) = 1 - xor arg1,arg1 - inc arg1 - else if (arg2) = -1 - or arg1,-1 - else if (arg2) > -128 & (arg2) < 128 - push arg2 - pop arg1 - else - mov arg1,arg2 - end if - else - mov arg1,arg2 - end if - } - - -macro struct name - { - virtual at 0 - name name - sizeof.#name = $ - name - end virtual - } - -; structures used in MeOS -struc process_information - { - .cpu_usage dd ? ; +0 - .window_stack_position dw ? ; +4 - .window_stack_value dw ? ; +6 - .not_used1 dw ? ; +8 - .process_name rb 12 ; +10 - .memory_start dd ? ; +22 - .used_memory dd ? ; +26 - .PID dd ? ; +30 - .x_start dd ? ; +34 - .y_start dd ? ; +38 - .x_size dd ? ; +42 - .y_size dd ? ; +46 - .slot_state dw ? ; +50 - rb (1024-52) - } -struct process_information - -struc system_colors - { - .frame dd ? - .grab dd ? - .grab_button dd ? - .grab_button_text dd ? - .grab_text dd ? - .work dd ? - .work_button dd ? - .work_button_text dd ? - .work_text dd ? - .work_graph dd ? - } -struct system_colors - - -; constants - -; events -EV_IDLE = 0 -EV_TIMER = 0 -EV_REDRAW = 1 -EV_KEY = 2 -EV_BUTTON = 3 -EV_EXIT = 4 -EV_BACKGROUND = 5 -EV_MOUSE = 6 -EV_IPC = 7 -EV_STACK = 8 - -; event mask bits for function 40 -EVM_REDRAW = 1b -EVM_KEY = 10b -EVM_BUTTON = 100b -EVM_EXIT = 1000b -EVM_BACKGROUND = 10000b -EVM_MOUSE = 100000b -EVM_IPC = 1000000b -EVM_STACK = 10000000b \ No newline at end of file diff --git a/programs/board/trunk/board.asm b/programs/system/board/trunk/board.asm similarity index 100% rename from programs/board/trunk/board.asm rename to programs/system/board/trunk/board.asm diff --git a/programs/board/trunk/build_en.bat b/programs/system/board/trunk/build_en.bat similarity index 100% rename from programs/board/trunk/build_en.bat rename to programs/system/board/trunk/build_en.bat diff --git a/programs/board/trunk/build_ru.bat b/programs/system/board/trunk/build_ru.bat similarity index 100% rename from programs/board/trunk/build_ru.bat rename to programs/system/board/trunk/build_ru.bat diff --git a/programs/mp3s/trunk/macros.inc b/programs/system/board/trunk/macros.inc similarity index 100% rename from programs/mp3s/trunk/macros.inc rename to programs/system/board/trunk/macros.inc diff --git a/programs/calendar/trunk/build_en.bat b/programs/system/calendar/trunk/build_en.bat similarity index 100% rename from programs/calendar/trunk/build_en.bat rename to programs/system/calendar/trunk/build_en.bat diff --git a/programs/calendar/trunk/build_ru.bat b/programs/system/calendar/trunk/build_ru.bat similarity index 100% rename from programs/calendar/trunk/build_ru.bat rename to programs/system/calendar/trunk/build_ru.bat diff --git a/programs/calendar/trunk/calendar.asm b/programs/system/calendar/trunk/calendar.asm similarity index 100% rename from programs/calendar/trunk/calendar.asm rename to programs/system/calendar/trunk/calendar.asm diff --git a/programs/calendar/trunk/calendar.txt b/programs/system/calendar/trunk/calendar.txt similarity index 100% rename from programs/calendar/trunk/calendar.txt rename to programs/system/calendar/trunk/calendar.txt diff --git a/programs/rtfread/trunk/macros.inc b/programs/system/calendar/trunk/macros.inc similarity index 100% rename from programs/rtfread/trunk/macros.inc rename to programs/system/calendar/trunk/macros.inc diff --git a/programs/cpu/trunk/build_en.bat b/programs/system/cpu/trunk/build_en.bat similarity index 100% rename from programs/cpu/trunk/build_en.bat rename to programs/system/cpu/trunk/build_en.bat diff --git a/programs/cpu/trunk/build_ru.bat b/programs/system/cpu/trunk/build_ru.bat similarity index 100% rename from programs/cpu/trunk/build_ru.bat rename to programs/system/cpu/trunk/build_ru.bat diff --git a/programs/cpu/trunk/cpu.asm b/programs/system/cpu/trunk/cpu.asm similarity index 100% rename from programs/cpu/trunk/cpu.asm rename to programs/system/cpu/trunk/cpu.asm diff --git a/programs/crownscr/trunk/macros.inc b/programs/system/cpu/trunk/macros.inc similarity index 100% rename from programs/crownscr/trunk/macros.inc rename to programs/system/cpu/trunk/macros.inc diff --git a/programs/cpuspeed/trunk/build_en.bat b/programs/system/cpuspeed/trunk/build_en.bat similarity index 100% rename from programs/cpuspeed/trunk/build_en.bat rename to programs/system/cpuspeed/trunk/build_en.bat diff --git a/programs/cpuspeed/trunk/build_ru.bat b/programs/system/cpuspeed/trunk/build_ru.bat similarity index 100% rename from programs/cpuspeed/trunk/build_ru.bat rename to programs/system/cpuspeed/trunk/build_ru.bat diff --git a/programs/cpuspeed/trunk/cpuspeed.asm b/programs/system/cpuspeed/trunk/cpuspeed.asm similarity index 100% rename from programs/cpuspeed/trunk/cpuspeed.asm rename to programs/system/cpuspeed/trunk/cpuspeed.asm diff --git a/programs/cpuspeed/trunk/macros.inc b/programs/system/cpuspeed/trunk/macros.inc similarity index 100% rename from programs/cpuspeed/trunk/macros.inc rename to programs/system/cpuspeed/trunk/macros.inc diff --git a/programs/desktop/trunk/build_en.bat b/programs/system/desktop/trunk/build_en.bat similarity index 100% rename from programs/desktop/trunk/build_en.bat rename to programs/system/desktop/trunk/build_en.bat diff --git a/programs/desktop/trunk/build_ru.bat b/programs/system/desktop/trunk/build_ru.bat similarity index 100% rename from programs/desktop/trunk/build_ru.bat rename to programs/system/desktop/trunk/build_ru.bat diff --git a/programs/desktop/trunk/desktop.asm b/programs/system/desktop/trunk/desktop.asm similarity index 100% rename from programs/desktop/trunk/desktop.asm rename to programs/system/desktop/trunk/desktop.asm diff --git a/programs/desktop/trunk/macros.inc b/programs/system/desktop/trunk/macros.inc similarity index 100% rename from programs/desktop/trunk/macros.inc rename to programs/system/desktop/trunk/macros.inc diff --git a/programs/end/trunk/build_en.bat b/programs/system/end/trunk/build_en.bat similarity index 100% rename from programs/end/trunk/build_en.bat rename to programs/system/end/trunk/build_en.bat diff --git a/programs/end/trunk/build_ru.bat b/programs/system/end/trunk/build_ru.bat similarity index 100% rename from programs/end/trunk/build_ru.bat rename to programs/system/end/trunk/build_ru.bat diff --git a/programs/end/trunk/end.asm b/programs/system/end/trunk/end.asm similarity index 100% rename from programs/end/trunk/end.asm rename to programs/system/end/trunk/end.asm diff --git a/programs/mv/trunk/macros.inc b/programs/system/end/trunk/macros.inc similarity index 100% rename from programs/mv/trunk/macros.inc rename to programs/system/end/trunk/macros.inc diff --git a/programs/icon/trunk/build_en.bat b/programs/system/icon/trunk/build_en.bat similarity index 100% rename from programs/icon/trunk/build_en.bat rename to programs/system/icon/trunk/build_en.bat diff --git a/programs/icon/trunk/build_ru.bat b/programs/system/icon/trunk/build_ru.bat similarity index 100% rename from programs/icon/trunk/build_ru.bat rename to programs/system/icon/trunk/build_ru.bat diff --git a/programs/icon/trunk/gif_lite.inc b/programs/system/icon/trunk/gif_lite.inc similarity index 100% rename from programs/icon/trunk/gif_lite.inc rename to programs/system/icon/trunk/gif_lite.inc diff --git a/programs/icon/trunk/icon.asm b/programs/system/icon/trunk/icon.asm similarity index 100% rename from programs/icon/trunk/icon.asm rename to programs/system/icon/trunk/icon.asm diff --git a/programs/mview/trunk/macros.inc b/programs/system/icon/trunk/macros.inc similarity index 100% rename from programs/mview/trunk/macros.inc rename to programs/system/icon/trunk/macros.inc diff --git a/programs/ir/trunk/build_en.bat b/programs/system/ir/trunk/build_en.bat similarity index 100% rename from programs/ir/trunk/build_en.bat rename to programs/system/ir/trunk/build_en.bat diff --git a/programs/ir/trunk/build_ru.bat b/programs/system/ir/trunk/build_ru.bat similarity index 100% rename from programs/ir/trunk/build_ru.bat rename to programs/system/ir/trunk/build_ru.bat diff --git a/programs/ir/trunk/ir.asm b/programs/system/ir/trunk/ir.asm similarity index 100% rename from programs/ir/trunk/ir.asm rename to programs/system/ir/trunk/ir.asm diff --git a/programs/netsendc/trunk/macros.inc b/programs/system/ir/trunk/macros.inc similarity index 100% rename from programs/netsendc/trunk/macros.inc rename to programs/system/ir/trunk/macros.inc diff --git a/programs/launcher/trunk/build_en.bat b/programs/system/launcher/trunk/build_en.bat similarity index 100% rename from programs/launcher/trunk/build_en.bat rename to programs/system/launcher/trunk/build_en.bat diff --git a/programs/launcher/trunk/build_ru.bat b/programs/system/launcher/trunk/build_ru.bat similarity index 100% rename from programs/launcher/trunk/build_ru.bat rename to programs/system/launcher/trunk/build_ru.bat diff --git a/programs/launcher/trunk/launcher.asm b/programs/system/launcher/trunk/launcher.asm similarity index 100% rename from programs/launcher/trunk/launcher.asm rename to programs/system/launcher/trunk/launcher.asm diff --git a/programs/netsends/trunk/macros.inc b/programs/system/launcher/trunk/macros.inc similarity index 100% rename from programs/netsends/trunk/macros.inc rename to programs/system/launcher/trunk/macros.inc diff --git a/programs/menu/trunk/build_en.bat b/programs/system/menu/trunk/build_en.bat similarity index 100% rename from programs/menu/trunk/build_en.bat rename to programs/system/menu/trunk/build_en.bat diff --git a/programs/menu/trunk/build_ru.bat b/programs/system/menu/trunk/build_ru.bat similarity index 100% rename from programs/menu/trunk/build_ru.bat rename to programs/system/menu/trunk/build_ru.bat diff --git a/programs/nntpc/trunk/macros.inc b/programs/system/menu/trunk/macros.inc similarity index 100% rename from programs/nntpc/trunk/macros.inc rename to programs/system/menu/trunk/macros.inc diff --git a/programs/menu/trunk/menu.asm b/programs/system/menu/trunk/menu.asm similarity index 100% rename from programs/menu/trunk/menu.asm rename to programs/system/menu/trunk/menu.asm diff --git a/programs/menu/trunk/readme.txt b/programs/system/menu/trunk/readme.txt similarity index 100% rename from programs/menu/trunk/readme.txt rename to programs/system/menu/trunk/readme.txt diff --git a/programs/menu/trunk/readme2.txt b/programs/system/menu/trunk/readme2.txt similarity index 100% rename from programs/menu/trunk/readme2.txt rename to programs/system/menu/trunk/readme2.txt diff --git a/programs/panel/trunk/@PANEL.ASM b/programs/system/panel/trunk/@PANEL.ASM similarity index 100% rename from programs/panel/trunk/@PANEL.ASM rename to programs/system/panel/trunk/@PANEL.ASM diff --git a/programs/panel/trunk/build_en.bat b/programs/system/panel/trunk/build_en.bat similarity index 100% rename from programs/panel/trunk/build_en.bat rename to programs/system/panel/trunk/build_en.bat diff --git a/programs/panel/trunk/build_ru.bat b/programs/system/panel/trunk/build_ru.bat similarity index 100% rename from programs/panel/trunk/build_ru.bat rename to programs/system/panel/trunk/build_ru.bat diff --git a/programs/run/trunk/macros.inc b/programs/system/panel/trunk/macros.inc similarity index 100% rename from programs/run/trunk/macros.inc rename to programs/system/panel/trunk/macros.inc diff --git a/programs/pcidev/trunk/build_en.bat b/programs/system/pcidev/trunk/build_en.bat similarity index 100% rename from programs/pcidev/trunk/build_en.bat rename to programs/system/pcidev/trunk/build_en.bat diff --git a/programs/pcidev/trunk/build_ru.bat b/programs/system/pcidev/trunk/build_ru.bat similarity index 100% rename from programs/pcidev/trunk/build_ru.bat rename to programs/system/pcidev/trunk/build_ru.bat diff --git a/programs/pcidev/trunk/pcidev.asm b/programs/system/pcidev/trunk/pcidev.asm similarity index 100% rename from programs/pcidev/trunk/pcidev.asm rename to programs/system/pcidev/trunk/pcidev.asm diff --git a/programs/pcidev/trunk/vendors.inc b/programs/system/pcidev/trunk/vendors.inc similarity index 100% rename from programs/pcidev/trunk/vendors.inc rename to programs/system/pcidev/trunk/vendors.inc diff --git a/programs/pic4/trunk/build_en.bat b/programs/system/pic4/trunk/build_en.bat similarity index 100% rename from programs/pic4/trunk/build_en.bat rename to programs/system/pic4/trunk/build_en.bat diff --git a/programs/pic4/trunk/build_ru.bat b/programs/system/pic4/trunk/build_ru.bat similarity index 100% rename from programs/pic4/trunk/build_ru.bat rename to programs/system/pic4/trunk/build_ru.bat diff --git a/programs/sb/trunk/macros.inc b/programs/system/pic4/trunk/macros.inc similarity index 100% rename from programs/sb/trunk/macros.inc rename to programs/system/pic4/trunk/macros.inc diff --git a/programs/pic4/trunk/pic4.asm b/programs/system/pic4/trunk/pic4.asm similarity index 100% rename from programs/pic4/trunk/pic4.asm rename to programs/system/pic4/trunk/pic4.asm diff --git a/programs/rb/trunk/@RB.ASM b/programs/system/rb/trunk/@RB.ASM similarity index 100% rename from programs/rb/trunk/@RB.ASM rename to programs/system/rb/trunk/@RB.ASM diff --git a/programs/rb/trunk/build_en.bat b/programs/system/rb/trunk/build_en.bat similarity index 100% rename from programs/rb/trunk/build_en.bat rename to programs/system/rb/trunk/build_en.bat diff --git a/programs/rb/trunk/build_ru.bat b/programs/system/rb/trunk/build_ru.bat similarity index 100% rename from programs/rb/trunk/build_ru.bat rename to programs/system/rb/trunk/build_ru.bat diff --git a/programs/rb/trunk/macros.inc b/programs/system/rb/trunk/macros.inc similarity index 100% rename from programs/rb/trunk/macros.inc rename to programs/system/rb/trunk/macros.inc diff --git a/programs/rd2fd/trunk/build_en.bat b/programs/system/rd2fd/trunk/build_en.bat similarity index 100% rename from programs/rd2fd/trunk/build_en.bat rename to programs/system/rd2fd/trunk/build_en.bat diff --git a/programs/rd2fd/trunk/build_ru.bat b/programs/system/rd2fd/trunk/build_ru.bat similarity index 100% rename from programs/rd2fd/trunk/build_ru.bat rename to programs/system/rd2fd/trunk/build_ru.bat diff --git a/programs/scancode/trunk/macros.inc b/programs/system/rd2fd/trunk/macros.inc similarity index 100% rename from programs/scancode/trunk/macros.inc rename to programs/system/rd2fd/trunk/macros.inc diff --git a/programs/rd2fd/trunk/rd2fd.asm b/programs/system/rd2fd/trunk/rd2fd.asm similarity index 100% rename from programs/rd2fd/trunk/rd2fd.asm rename to programs/system/rd2fd/trunk/rd2fd.asm diff --git a/programs/rd2hd/trunk/build_en.bat b/programs/system/rd2hd/trunk/build_en.bat similarity index 100% rename from programs/rd2hd/trunk/build_en.bat rename to programs/system/rd2hd/trunk/build_en.bat diff --git a/programs/rd2hd/trunk/build_ru.bat b/programs/system/rd2hd/trunk/build_ru.bat similarity index 100% rename from programs/rd2hd/trunk/build_ru.bat rename to programs/system/rd2hd/trunk/build_ru.bat diff --git a/programs/scrshot/trunk/macros.inc b/programs/system/rd2hd/trunk/macros.inc similarity index 100% rename from programs/scrshot/trunk/macros.inc rename to programs/system/rd2hd/trunk/macros.inc diff --git a/programs/rd2hd/trunk/rd2hd.asm b/programs/system/rd2hd/trunk/rd2hd.asm similarity index 100% rename from programs/rd2hd/trunk/rd2hd.asm rename to programs/system/rd2hd/trunk/rd2hd.asm diff --git a/programs/run/trunk/build_en.bat b/programs/system/run/trunk/build_en.bat similarity index 100% rename from programs/run/trunk/build_en.bat rename to programs/system/run/trunk/build_en.bat diff --git a/programs/run/trunk/build_ru.bat b/programs/system/run/trunk/build_ru.bat similarity index 100% rename from programs/run/trunk/build_ru.bat rename to programs/system/run/trunk/build_ru.bat diff --git a/programs/setup/trunk/macros.inc b/programs/system/run/trunk/macros.inc similarity index 100% rename from programs/setup/trunk/macros.inc rename to programs/system/run/trunk/macros.inc diff --git a/programs/run/trunk/run.asm b/programs/system/run/trunk/run.asm similarity index 100% rename from programs/run/trunk/run.asm rename to programs/system/run/trunk/run.asm diff --git a/programs/setup/trunk/build_en.bat b/programs/system/setup/trunk/build_en.bat similarity index 100% rename from programs/setup/trunk/build_en.bat rename to programs/system/setup/trunk/build_en.bat diff --git a/programs/setup/trunk/build_ru.bat b/programs/system/setup/trunk/build_ru.bat similarity index 100% rename from programs/setup/trunk/build_ru.bat rename to programs/system/setup/trunk/build_ru.bat diff --git a/programs/spanel/trunk/macros.inc b/programs/system/setup/trunk/macros.inc similarity index 100% rename from programs/spanel/trunk/macros.inc rename to programs/system/setup/trunk/macros.inc diff --git a/programs/setup/trunk/setup.asm b/programs/system/setup/trunk/setup.asm similarity index 100% rename from programs/setup/trunk/setup.asm rename to programs/system/setup/trunk/setup.asm diff --git a/programs/sysmeter/trunk/build_en.bat b/programs/system/sysmeter/trunk/build_en.bat similarity index 100% rename from programs/sysmeter/trunk/build_en.bat rename to programs/system/sysmeter/trunk/build_en.bat diff --git a/programs/sysmeter/trunk/build_ru.bat b/programs/system/sysmeter/trunk/build_ru.bat similarity index 100% rename from programs/sysmeter/trunk/build_ru.bat rename to programs/system/sysmeter/trunk/build_ru.bat diff --git a/programs/stackinf/trunk/macros.inc b/programs/system/sysmeter/trunk/macros.inc similarity index 100% rename from programs/stackinf/trunk/macros.inc rename to programs/system/sysmeter/trunk/macros.inc diff --git a/programs/sysmeter/trunk/sysmeter.asm b/programs/system/sysmeter/trunk/sysmeter.asm similarity index 100% rename from programs/sysmeter/trunk/sysmeter.asm rename to programs/system/sysmeter/trunk/sysmeter.asm diff --git a/programs/systrace/trunk/build_en.bat b/programs/system/systrace/trunk/build_en.bat similarity index 100% rename from programs/systrace/trunk/build_en.bat rename to programs/system/systrace/trunk/build_en.bat diff --git a/programs/systrace/trunk/build_ru.bat b/programs/system/systrace/trunk/build_ru.bat similarity index 100% rename from programs/systrace/trunk/build_ru.bat rename to programs/system/systrace/trunk/build_ru.bat diff --git a/programs/sysmeter/trunk/macros.inc b/programs/system/systrace/trunk/macros.inc similarity index 100% rename from programs/sysmeter/trunk/macros.inc rename to programs/system/systrace/trunk/macros.inc diff --git a/programs/systrace/trunk/systrace.asm b/programs/system/systrace/trunk/systrace.asm similarity index 100% rename from programs/systrace/trunk/systrace.asm rename to programs/system/systrace/trunk/systrace.asm diff --git a/programs/vrr/trunk/Warning.txt b/programs/system/vrr/trunk/Warning.txt similarity index 100% rename from programs/vrr/trunk/Warning.txt rename to programs/system/vrr/trunk/Warning.txt diff --git a/programs/vrr/trunk/build_en.bat b/programs/system/vrr/trunk/build_en.bat similarity index 100% rename from programs/vrr/trunk/build_en.bat rename to programs/system/vrr/trunk/build_en.bat diff --git a/programs/vrr/trunk/build_ru.bat b/programs/system/vrr/trunk/build_ru.bat similarity index 100% rename from programs/vrr/trunk/build_ru.bat rename to programs/system/vrr/trunk/build_ru.bat diff --git a/programs/vrr/trunk/infoform.txt b/programs/system/vrr/trunk/infoform.txt similarity index 100% rename from programs/vrr/trunk/infoform.txt rename to programs/system/vrr/trunk/infoform.txt diff --git a/programs/vrr/trunk/vrr.asm b/programs/system/vrr/trunk/vrr.asm similarity index 100% rename from programs/vrr/trunk/vrr.asm rename to programs/system/vrr/trunk/vrr.asm diff --git a/programs/vrr/trunk/vrr_eng.txt b/programs/system/vrr/trunk/vrr_eng.txt similarity index 100% rename from programs/vrr/trunk/vrr_eng.txt rename to programs/system/vrr/trunk/vrr_eng.txt diff --git a/programs/vrr/trunk/vrr_rus.txt b/programs/system/vrr/trunk/vrr_rus.txt similarity index 100% rename from programs/vrr/trunk/vrr_rus.txt rename to programs/system/vrr/trunk/vrr_rus.txt diff --git a/programs/vrr_m/trunk/build_en.bat b/programs/system/vrr_m/trunk/build_en.bat similarity index 100% rename from programs/vrr_m/trunk/build_en.bat rename to programs/system/vrr_m/trunk/build_en.bat diff --git a/programs/vrr_m/trunk/build_ru.bat b/programs/system/vrr_m/trunk/build_ru.bat similarity index 100% rename from programs/vrr_m/trunk/build_ru.bat rename to programs/system/vrr_m/trunk/build_ru.bat diff --git a/programs/vscreen/trunk/macros.inc b/programs/system/vrr_m/trunk/macros.inc similarity index 100% rename from programs/vscreen/trunk/macros.inc rename to programs/system/vrr_m/trunk/macros.inc diff --git a/programs/vrr_m/trunk/vrr_m.asm b/programs/system/vrr_m/trunk/vrr_m.asm similarity index 100% rename from programs/vrr_m/trunk/vrr_m.asm rename to programs/system/vrr_m/trunk/vrr_m.asm diff --git a/programs/systrace/trunk/macros.inc b/programs/systrace/trunk/macros.inc deleted file mode 100644 index 1d153e8723..0000000000 --- a/programs/systrace/trunk/macros.inc +++ /dev/null @@ -1,266 +0,0 @@ -; new application structure -macro meos_app_start - { - use32 - org 0x0 - - db 'MENUET01' - dd 0x01 - dd __start - dd __end - dd __memory - dd __stack - - if used __params & ~defined __params - dd __params - else - dd 0x0 - end if - - dd 0x0 - } -MEOS_APP_START fix meos_app_start - -macro code - { - __start: - } -CODE fix code - -macro data - { - __data: - } -DATA fix data - -macro udata - { - if used __params & ~defined __params - __params: - db 0 - __end: - rb 255 - else - __end: - end if - __udata: - } -UDATA fix udata - -macro meos_app_end - { - align 32 - rb 2048 - __stack: - __memory: - } -MEOS_APP_END fix meos_app_end - - -; macro for defining multiline text data -struc mstr [sstring] - { - forward - local ssize - virtual at 0 - db sstring - ssize = $ - end virtual - dd ssize - db sstring - common - dd -1 - } - - -; strings -macro sz name,[data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if used name - db data - end if - common - if used name - .size = $-name - end if -} - -macro lsz name,[lng,data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if (used name)&(lang eq lng) - db data - end if - common - if used name - .size = $-name - end if -} - - - -; easy system call macro -macro mpack dest, hsrc, lsrc -{ - if (hsrc eqtype 0) & (lsrc eqtype 0) - mov dest, (hsrc) shl 16 + lsrc - else - if (hsrc eqtype 0) & (~lsrc eqtype 0) - mov dest, (hsrc) shl 16 - add dest, lsrc - else - mov dest, hsrc - shl dest, 16 - add dest, lsrc - end if - end if -} - -macro __mov reg,a,b { ; mike.dld - if (~a eq)&(~b eq) - mpack reg,a,b - else if (~a eq)&(b eq) - mov reg,a - end if -} - -macro mcall a,b,c,d,e,f { ; mike.dld - __mov eax,a - __mov ebx,b - __mov ecx,c - __mov edx,d - __mov esi,e - __mov edi,f - int 0x40 -} - - - - - - -; optimize the code for size -__regs fix - -macro add arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - inc arg1 - else - add arg1,arg2 - end if - else - add arg1,arg2 - end if - } - -macro sub arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - dec arg1 - else - sub arg1,arg2 - end if - else - sub arg1,arg2 - end if - } - -macro mov arg1,arg2 - { - if (arg1 in __regs) & (arg2 eqtype 0) - if (arg2) = 0 - xor arg1,arg1 - else if (arg2) = 1 - xor arg1,arg1 - inc arg1 - else if (arg2) = -1 - or arg1,-1 - else if (arg2) > -128 & (arg2) < 128 - push arg2 - pop arg1 - else - mov arg1,arg2 - end if - else - mov arg1,arg2 - end if - } - - -macro struct name - { - virtual at 0 - name name - sizeof.#name = $ - name - end virtual - } - -; structures used in MeOS -struc process_information - { - .cpu_usage dd ? ; +0 - .window_stack_position dw ? ; +4 - .window_stack_value dw ? ; +6 - .not_used1 dw ? ; +8 - .process_name rb 12 ; +10 - .memory_start dd ? ; +22 - .used_memory dd ? ; +26 - .PID dd ? ; +30 - .x_start dd ? ; +34 - .y_start dd ? ; +38 - .x_size dd ? ; +42 - .y_size dd ? ; +46 - .slot_state dw ? ; +50 - rb (1024-52) - } -struct process_information - -struc system_colors - { - .frame dd ? - .grab dd ? - .grab_button dd ? - .grab_button_text dd ? - .grab_text dd ? - .work dd ? - .work_button dd ? - .work_button_text dd ? - .work_text dd ? - .work_graph dd ? - } -struct system_colors - - -; constants - -; events -EV_IDLE = 0 -EV_TIMER = 0 -EV_REDRAW = 1 -EV_KEY = 2 -EV_BUTTON = 3 -EV_EXIT = 4 -EV_BACKGROUND = 5 -EV_MOUSE = 6 -EV_IPC = 7 -EV_STACK = 8 - -; event mask bits for function 40 -EVM_REDRAW = 1b -EVM_KEY = 10b -EVM_BUTTON = 100b -EVM_EXIT = 1000b -EVM_BACKGROUND = 10000b -EVM_MOUSE = 100000b -EVM_IPC = 1000000b -EVM_STACK = 10000000b \ No newline at end of file diff --git a/programs/tetris/trunk/macros.inc b/programs/tetris/trunk/macros.inc deleted file mode 100644 index d45b69e6e3..0000000000 --- a/programs/tetris/trunk/macros.inc +++ /dev/null @@ -1,265 +0,0 @@ -; new application structure -macro meos_app_start - { - use32 - org 0x0 - - db 'MENUET01' - dd 0x01 - dd __start - dd __end - dd __memory - dd __stack - - if used __params & ~defined __params - dd __params - else - dd 0x0 - end if - - dd 0x0 - } -MEOS_APP_START fix meos_app_start - -macro code - { - __start: - } -CODE fix code - -macro data - { - __data: - } -DATA fix data - -macro udata - { - if used __params & ~defined __params - __params: - db 0 - __end: - rb 255 - else - __end: - end if - __udata: - } -UDATA fix udata - -macro meos_app_end - { - align 32 - rb 2048 - __stack: - __memory: - } -MEOS_APP_END fix meos_app_end - - -; macro for defining multiline text data -struc mstr [sstring] - { - forward - local ssize - virtual at 0 - db sstring - ssize = $ - end virtual - dd ssize - db sstring - common - dd -1 - } - - -; strings -macro sz name,[data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if used name - db data - end if - common - if used name - .size = $-name - end if -} - -macro lsz name,[lng,data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if (used name)&(lang eq lng) - db data - end if - common - if used name - .size = $-name - end if -} - - - -; easy system call macro -macro mpack dest, hsrc, lsrc -{ - if (hsrc eqtype 0) & (lsrc eqtype 0) - mov dest, (hsrc) shl 16 + lsrc - else - if (hsrc eqtype 0) & (~lsrc eqtype 0) - mov dest, (hsrc) shl 16 - add dest, lsrc - else - mov dest, hsrc - shl dest, 16 - add dest, lsrc - end if - end if -} - -macro __mov reg,a { ; mike.dld - if ~a eq - mov reg,a - end if -} - -macro mcall a,b,c,d,e,f { ; mike.dld - __mov eax,a - __mov ebx,b - __mov ecx,c - __mov edx,d - __mov esi,e - __mov edi,f - int 0x40 -} - - - - - - - -; optimize the code for size -__regs fix - -macro add arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - inc arg1 - else - add arg1,arg2 - end if - else - add arg1,arg2 - end if - } - -macro sub arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - dec arg1 - else - sub arg1,arg2 - end if - else - sub arg1,arg2 - end if - } - -macro mov arg1,arg2 - { - if (arg1 in __regs) & (arg2 eqtype 0) - if (arg2) = 0 - xor arg1,arg1 - else if (arg2) = 1 - xor arg1,arg1 - inc arg1 - else if (arg2) = -1 - or arg1,-1 - else if (arg2) > -128 & (arg2) < 128 - push arg2 - pop arg1 - else - mov arg1,arg2 - end if - else - mov arg1,arg2 - end if - } - - -macro struct name - { - virtual at 0 - name name - sizeof.#name = $ - name - end virtual - } - -; structures used in MeOS -struc process_information - { - .cpu_usage dd ? ; +0 - .window_stack_position dw ? ; +4 - .window_stack_value dw ? ; +6 - .not_used1 dw ? ; +8 - .process_name rb 12 ; +10 - .memory_start dd ? ; +22 - .used_memory dd ? ; +26 - .PID dd ? ; +30 - .x_start dd ? ; +34 - .y_start dd ? ; +38 - .x_size dd ? ; +42 - .y_size dd ? ; +46 - .slot_state dw ? ; +50 - rb (1024-52) - } -struct process_information - -struc system_colors - { - .frame dd ? - .grab dd ? - .grab_button dd ? - .grab_button_text dd ? - .grab_text dd ? - .work dd ? - .work_button dd ? - .work_button_text dd ? - .work_text dd ? - .work_graph dd ? - } -struct system_colors - - -; constants - -; events -EV_IDLE = 0 -EV_TIMER = 0 -EV_REDRAW = 1 -EV_KEY = 2 -EV_BUTTON = 3 -EV_EXIT = 4 -EV_BACKGROUND = 5 -EV_MOUSE = 6 -EV_IPC = 7 -EV_STACK = 8 - -; event mask bits for function 40 -EVM_REDRAW = 1b -EVM_KEY = 10b -EVM_BUTTON = 100b -EVM_EXIT = 1000b -EVM_BACKGROUND = 10000b -EVM_MOUSE = 100000b -EVM_IPC = 1000000b -EVM_STACK = 10000000b \ No newline at end of file diff --git a/programs/tinypad2/trunk/ReadMe.txt b/programs/tinypad2/trunk/ReadMe.txt deleted file mode 100644 index d62046b76e..0000000000 --- a/programs/tinypad2/trunk/ReadMe.txt +++ /dev/null @@ -1,203 +0,0 @@ --= [v 3.78b] =- -Версия была сделана сразу после того как я выложил пред., но я её не выкладывал, -так как надеялся ещё доработать. - -Новое: -- поиск спрятан в меню, горячая клавиша ctrl+F7, поиск далее - ctrl+F8 -- более длинная строка открытия файлов, не желательно открывать пути - >71 символа, так как могут возникнуть ошибки при работе с окном "быстрого с/з" - - -это просто дополнение к предыдущему выпуску. дальше будет исправлено: -- глюк с неактивными окнами. - --= [v 3.78a] =- - -Вроде работает.. :) - -Новое: -- Скролл взят с "Scroll.inc",автор которого Jason Delozier. - принцип движения по документу полностью изменён (по сравнению - с прошлой версией). -- Курсор двигается кликом мышки. -- Добавлена функция Goto Line #. - (enter-goto; esc - cancel) - достаточно полезная функция, когда фасм(на доске отладки) пишет что ошибка - в такой-то строке... -- Исправлен баг с заданием имени нового файла -- Исправлен баг со строкой поиска (при "поиске" последней строки) -- Исправлен баг после вызова диалогов открытия/сохранения. - теперь скролл после них продолжает работать ;) -- Мелкие исправления в работе меню. - -Появился: - глюк, как в LC - при нажатии в области окна, даже если окно не активно, - курсов и скролл бар всё равно реагируют на мышку. - -Работаю над: --списком последних файлов --загрузкой "color table'a" - -так же, надо посмотреть исходники HeEd'a, а точнее функции перекодировки. - -------------------------------------------------- - --= [v 3.77a] =- - -Ещё одна альфа. - -На этот раз: -- добавлена полоса прокутки -- исправлено окно вопроса "сохранить документ", так как я заметил - что оно жрало много процессорного времени. -- обновление экрана после диалогов сохранения и открытия - -На заметку: скролл полностью сделан мной и поэтому, возможно, есть глюки. -так как я не нашёл более хорошей формулы, скролл всегда немного не доезжает до -верха, зато никогда не пересекает нижнюю кнопку (вроде бы) - -кнопки скролла "вверх" и "вниз" эквивалентны pg.up и pg.down - -Размер скролла жестко закреплён, так как скоро будет заперщено -изменять размены окна. - - -Не получится: -Убрать ограничение в 80 символов и присобачить поддержку BGI шрифтов. -Проблема в слишком извращённом алгоритме вывода символов (по крайней -мере мне так показалось), проще будет переделать всё по новой, -взяв некоторые функции отсюда. - -В следующей версии планируется: -- функция "goto string #" -- изменение цвета текста (и спец. символов) и рабочей области. -- сохранение небольшого списка "последних редактируемых файлов" -постараюсь, но всё же ничего не обещаю.... - - --= [v 3.76 ] =- - -Повторный ремейк тайнипада :) Клавиатура рулит. - -Что нового? - -- "Окно быстрого сохранения и загрузки" для прописывания пути - к файлу "вручную". В этом же окне горячие клавиши - - ctrl+s - сохранить, ctrl+o - открыть, esc - отмена - -- Горячие клавиши для компиляции(CTRL+F9), - компиляции и запуска (CTRL+F10), и доски отладки(F12) - -- главное окно остаётся активным после запуска доски отладки - и окна быстрого сохранения (только горячими клавишами) - -- Исправлен глюк вылетания при попытке поиска в пустом - документе - -- облагорожен писк из спикера, теперь похож на писк Колибри 3 - -- Кнопки выровнены для использования скина - -- по непонятным мне причинам файлы сохранённые в нижнем регистре - абсолютно не принимались sysxtree и нужно было их открывать - вручную прописывая путь. исправлено обычным переводом в верхний - регистр. - -- окна сообщения при переполненном диске (та же процедура, что и для erroff у - savedialog) - -- исправлен мой баг - при невозможности сохранения теперь остаётся старый путь - к файлу (и имя). - -- исправлено ещё парочка мелких недочётов (моих?!). - -Что не сделано? - - Всё ещё нет поддержки шрифтов BGI и - изменения цвета фона/текста. Хотя я сомневаюсь, что BGI шрифты прямо "необходим -ы" - в асм-блокноте. - Пока ещё не обрабатывается ошибка "fat12 заполнен" - вроде бы даже функции в яд -ре нет... - Хочу перейти на скан-коды, а то в аски повторяются коды. --------------------------------------------- -и ещё: о ошибках и критике - мне (не "меня") на мыло или на форум. --------------------------------------------- - -История... - --= [ v 3.75b ] =- - -О.... -Ремейк :) Tinypad'a : -Тулбар теперь спрятан в меню. Для сохранения и открытия используются -диалоги из ASCL Павлюшина Евгения. Исправлен "жуткий" баг - когда -сохраняешь документ под другим именем, в строке заголовка оставалось -старое название. -Добавлены диалоговые окна при ошибках и выходе. Добавлена кнопка -"новый", при нажатии на которую задаётся вопрос о сохранении файла, затем -создаётся документ с новым именем. Максимально 99 новых документов. Кнопка -"новое окно" открывает новое окно Тайнипада (запускает новый процесс). - -О грустном... -Обо всех ошибках мне на мыло, попробую исправить. -Диалог "сохранить как" сохраняет только на готовые файлы (то есть поверх них, -нельзя создать новый). -При попытке поиска строки в пустом документе прога вылетает :( -При выходе, когда вылазит окошко с вопросом "сохранить файл?" - да - сохраняет - документ и закрывает окно, нет - не сохраняет и выходит, Щелчёк по рабочей обла -сти -тайнипада эквивалентен кнопке отмена, которой нету ;), правда если окно сообщени -я - переместить, главное окно не обновляется. Это вызванно "специфическим" кодом, т -ак - как более простого решения я не нашёл. - -О спасибках... -Всем спасиба! Павлюшину за ASCL, Халявину, Willow и всем с нашего форума помощь. - -О будущем... -если получится, можно будет реализовать поддержку BGI шрифтов... ещё не смотрел -их код -- страшно! - -Кто, бл%? -DoomEd Archangel -archangel@mail.kz / meos-wall.narod.ru - - - --= [ v 3.75a ------> v 3.6 ] =- - -;****************************************************************************** -; project name: TINYPAD -; compiler: flat assmebler 1.52 alpha 3 -; version: 3.75a -; last update: 24/03/2004 -; maintained by: Ivan Poddubny -; e-mail: ivan-yar@bk.ru -;****************************************************************************** -; HISTORY: -; 3.75a -; fixed converting char to upper case in read_string -; 3.75 -; rewrote save_file from scratch; bugfix in loadfile; -; 3.74 -; optimisation -; 3.73 -; completly new load_file function -; 3.72 -; speed++ -; 3.71 -; error beep -; 3.6,3.7: -; many bugs fixed -; simple toolbar -; compile, run applications from TINYPAD, all fasm output is in debug board -; TAB button -; auto-indent -; Ctrl+L - insert comment string -;****************************************************************************** -; Memory 0x300000: -; stack 0x00eff0 - стэк -; stack for help 0x00fff0 - -; stack for help 0x00fff0 \ No newline at end of file diff --git a/programs/tinypad2/trunk/archive.txt b/programs/tinypad2/trunk/archive.txt deleted file mode 100644 index d136c55a0a..0000000000 --- a/programs/tinypad2/trunk/archive.txt +++ /dev/null @@ -1,8 +0,0 @@ -Для начинающих работать с MeOS - описание файлов в этом архиве: - -tinypad - скомпилированный исполняемый файл MeOS -tinypad.asm - исходный код -ascl.inc - assembler small code library от Павлюшина Евгения - (функция label заменена на putlabel) -dialogs1.inc - диалоговые окна, messagebox'ы и не очень хорошее меню. -macros.inc - тоже замечательный набор макросов. \ No newline at end of file diff --git a/programs/tinypad2/trunk/ascl.inc b/programs/tinypad2/trunk/ascl.inc deleted file mode 100644 index af987d6215..0000000000 --- a/programs/tinypad2/trunk/ascl.inc +++ /dev/null @@ -1,933 +0,0 @@ -lang equ ru ; ru en fr ge fi - -; -; Assembler -; SMALL -; CODE -; Libary -; -; Ver 0.14 By Pavlushin Evgeni (RUSSIA) -; www.waptap@mail.ru - -;Please compile aplications on FASM ver1.54 or higer!!! - -;InfoList -;0.01 scank,putpix,puttxt -;0.02 label,random,colors -;0.03 window,startwd,endwd,attributes -;0.04 close,delay,scevent ~30.04.2004 -;0.05 small random, ~04.05.2004 -;0.06 wtevent ~09.05.2004 -;0.07 timeevent ~23.05.2004 -;0.08 txtput ~14.06.2004 -;0.09 opendialog,savedialog ~20.06.2004 -;0.10 wordstoreg by halyavin, add at ~30.08.2004 -; random bug deleted eax is use. -;0.11 loadfile from me +puttxt bug del ~07.09.2004 -;0.12 open/save dialog ~13.09.2004 -;0.13 dialogs bugs deleted -;0.14 drawlbut ~03.10.2004 -;0.15 extendet label! - -; LOADFILE -; (SYNTAX) LOADFILE 'full_path_to_file',file_load_area,file_temp_area -; (SAMPLE) LOADFILE '/rd/1/clock.bmp',load_area,temp_area - - -macro loadfile file_name,file_load_area,file_temp_area -{ -local open,fileinfo,string - jmp open -fileinfo: - dd 0 - dd 0 - dd 1 - dd file_load_area - dd file_temp_area -string: - db file_name,0 -open: - mov dword [fileinfo+8],1 ; how many blocks to read (1) - mov eax,58 - mov ebx,fileinfo - int 0x40 - mov eax,[file_load_area+2] - shr eax,9 ; поделим на 512 и прибавим 1 - получим число блоков - inc eax - mov dword [fileinfo+8],eax - mov eax,58 - mov ebx,fileinfo - int 0x40 -} - - -;*********************************************************** -macro savefile file_name,file_save_area,file_temp_area,fsize -{ -local save,fileinfo,string ;,counter00 - jmp save -;counter00 dd 0 -fileinfo: - dd 1 - dd 0 - dd fsize ;counter00 - dd file_save_area - dd file_temp_area -string: - db file_name,0 -save: -;xor edi,edi -; sub edi,file_save_area ; calculate dump size -; mov edx,edi -;mov [counter00],edi -; mov dword [fileinfo+8],1 ; how many blocks to write (1) -; mov eax,58 -; mov ebx,fileinfo -; int 0x40 -; mov eax,[file_load_area+2] -; shr eax,9 ; поделим на 512 и прибавим 1 - получим число блоков -; inc eax -; mov dword [fileinfo+8],eax - mov eax,58 - mov ebx,fileinfo - int 0x40 -} -;*********************************************************** - - -;macro wordstoreg reg,hiword,loword -;{ -;if hiword eqtype 0 & loword eqtype 0 -; mov reg,dword hiword*65536+loword -;else if hiword eqtype 12 & loword eqtype eax -; mov reg,dword hiword*65536 -; add reg,dword loword -;else if hiword eqtype 12 & loword eqtype [123] -; mov reg,dword hiword*65536 -; add reg,dword loword -;else -; mov reg,dword hiword -; shl reg,16 -; add reg,dword loword -;end if -;} - -macro dword2reg reg,doubleword -{ -if doubleword eq - ; not changes -else - mov reg,dword doubleword -end if -} - -macro words2reg reg,hiword,lowword -{ -if hiword eq - if lowword eq - ; not changes - else - if lowword eqtype 12 - and reg,dword 0xffff0000 - add reg,dword lowword - else - and reg,dword 0xffff0000 - add reg,dword lowword - end if - end if -else - if lowword eq - if hiword eqtype 12 - and reg,dword 0x0000ffff - add reg,dword hiword*65536 - else - shl reg,16 - add reg,dword hiword - ror reg,16 - end if - else - if lowword eqtype 12 & hiword eqtype 12 - if lowword eq 0 & hiword eq 0 - xor reg,reg - else - mov reg,dword hiword*65536+lowword - end if - else - mov reg,dword hiword - shl reg,16 - add reg,dword lowword - end if - end if -end if -} - - - - -; DRAW BUTTON with label - -macro drawlbut x,y,xs,ys,text,id,bcolor,tcolor -{ -local asd,lab - jmp asd -lab db text ;arg label -asd: - words2reg ebx,x,xs - words2reg ecx,y,ys - mov edx,id - mov esi,bcolor - mov eax,8 - int 0x40 - - mov eax,asd-lab ;calc size - mov ebx,6 - mul ebx - mov esi,eax - - mov eax,xs - sub eax,esi - shr eax,1 - add eax,x - - mov edx,ys - sub edx,7 - shr edx,1 - add edx,y - - mov ebx,eax - shl ebx,16 - add ebx,edx - - mov ecx,tcolor ;arg4 color - mov edx,lab - mov esi,asd-lab ;calc size - mov eax,4 - int 0x40 -} - - -macro opendialog redproc,openoff,erroff,path -{ -local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc -local run_fileinfo, param -local getmesloop, loox, mred, mkey, mbutton, mgetmes -local dlg_is_work, ready, procinfo -; -; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, -; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) -; - - cld -;; mov esi,path - mov edi,path - mov eax,0 - mov ecx,200 - rep stosb - -;mov [get_loops],0 -mov [dlg_pid_get],0 - -; Get my PID in dec format 4 bytes - mov eax,9 - mov ebx,procinfo - mov ecx,-1 - int 0x40 - -; convert eax bin to param dec - mov eax,dword [procinfo+30] ;offset of myPID - mov edi,param+4-1 ;offset to 4 bytes - mov ecx,4 - mov ebx,10 - cld -new_d: - xor edx,edx - div ebx - add dl,'0' - mov [edi],dl - dec edi - loop new_d - -; wirite 1 byte space to param - mov [param+4],byte 32 ;Space for next parametr -; and 1 byte type of dialog to param - mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog) - -; -; STEP2 prepare IPC area for get messages -; - -; prepare IPC area - mov [path],dword 0 - mov [path+4],dword 8 - -; define IPC memory - mov eax,60 - mov ebx,1 ; define IPC - mov ecx,path ; offset of area - mov edx,150 ; size 150 bytes - int 0x40 - -; change wanted events list 7-bit IPC event - mov eax,40 - mov ebx,01000111b - int 0x40 - -; -; STEP 3 run SYSTEM XTREE with parameters -; - - mov eax,58 - mov ebx,run_fileinfo - int 0x40 - - call redproc - - mov [get_loops],0 -getmesloop: - mov eax,23 - mov ebx,50 ;0.5 sec - int 0x40 - - cmp eax,1 - je mred - cmp eax,2 - je mkey - cmp eax,3 - je mbutton - cmp eax,7 - je mgetmes - -; Get number of procces - mov ebx,procinfo - mov ecx,-1 - mov eax,9 - int 0x40 - mov ebp,eax - -loox: - mov eax,9 - mov ebx,procinfo - mov ecx,ebp - int 0x40 - mov eax,[DLGPID] - cmp [procinfo+30],eax ;IF Dialog find - je dlg_is_work ;jmp to dlg_is_work - dec ebp - jnz loox - - jmp erroff - -dlg_is_work: - cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated - je erroff ;TESTODP2 terminated too - - cmp [dlg_pid_get],dword 1 - je getmesloop - inc [get_loops] - cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated - jae erroff - jmp getmesloop - -mred: - call redproc - jmp getmesloop -mkey: - mov eax,2 - int 0x40 ; read (eax=2) - jmp getmesloop -mbutton: - mov eax,17 ; get id - int 0x40 - cmp ah,1 ; button id=1 ? - jne getmesloop - mov eax,-1 ; close this program - int 0x40 -mgetmes: - -; If dlg_pid_get then second message get jmp to still - cmp [dlg_pid_get],dword 1 - je ready - -; First message is number of PID SYSXTREE dialog - -; convert PID dec to PID bin - movzx eax,byte [path+16] - sub eax,48 - imul eax,10 - movzx ebx,byte [path+16+1] - add eax,ebx - sub eax,48 - imul eax,10 - movzx ebx,byte [path+16+2] - add eax,ebx - sub eax,48 - imul eax,10 - movzx ebx,byte [path+16+3] - add eax,ebx - sub eax,48 - mov [DLGPID],eax - -; Claear and prepare IPC area for next message - mov [path],dword 0 - mov [path+4],dword 8 - mov [path+8],dword 0 - mov [path+12],dword 0 - mov [path+16],dword 0 - -; Set dlg_pid_get for get next message - mov [dlg_pid_get],dword 1 - call redproc ;show DLG_PID - jmp getmesloop - -ready: -; -; The second message get -; Second message is 100 bytes path to SAVE/OPEN file -; shl path string on 16 bytes -; - cld - mov esi,path+16 - mov edi,path - mov ecx,200 - rep movsb - mov [edi],byte 0 - - jmp openoff - - -; DATA AREA -get_loops dd 0 -dlg_pid_get dd 0 -DLGPID dd 0 - -param: - dd 0 ; My dec PID - dd 0,0 ; Type of dialog - -run_fileinfo: - dd 16 - dd 0 - dd param - dd 0 - dd procinfo ; 0x10000 -;run_filepath - db '/RD/1/SYSXTREE',0 - -procinfo: -times 1024 db 0 -} - - -macro savedialog redproc,openoff,erroff,path -{ -local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc -local run_fileinfo, run_filepath, param -local getmesloop, loox, mred, mkey, mbutton, mgetmes -local dlg_is_work, ready, procinfo -; -; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, -; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) -; - - cld -;; mov esi,path - mov edi,path - mov eax,0 - mov ecx,200 - rep stosb - -;mov [get_loops],0 -mov [dlg_pid_get],0 - -; Get my PID in dec format 4 bytes - mov eax,9 - mov ebx,procinfo - mov ecx,-1 - int 0x40 - -; convert eax bin to param dec - mov eax,dword [procinfo+30] ;offset of myPID - mov edi,param+4-1 ;offset to 4 bytes - mov ecx,4 - mov ebx,10 - cld -new_d: - xor edx,edx - div ebx - add dl,'0' - mov [edi],dl - dec edi - loop new_d - -; wirite 1 byte space to param - mov [param+4],byte 32 ;Space for next parametr -; and 1 byte type of dialog to param - mov [param+5],byte 'S' ;Get Open dialog (Use 'S' for Save dialog) - -; -; STEP2 prepare IPC area for get messages -; - -; prepare IPC area - mov [path],dword 0 - mov [path+4],dword 8 - -; define IPC memory - mov eax,60 - mov ebx,1 ; define IPC - mov ecx,path ; offset of area - mov edx,150 ; size 150 bytes - int 0x40 - -; change wanted events list 7-bit IPC event - mov eax,40 - mov ebx,01000111b - int 0x40 - -; -; STEP 3 run SYSTEM XTREE with parameters -; - - mov eax,58 - mov ebx,run_fileinfo - int 0x40 - - call redproc - - mov [get_loops],0 -getmesloop: - mov eax,23 - mov ebx,50 ;0.5 sec - int 0x40 - - cmp eax,1 - je mred - cmp eax,2 - je mkey - cmp eax,3 - je mbutton - cmp eax,7 - je mgetmes - -; Get number of procces - mov ebx,procinfo - mov ecx,-1 - mov eax,9 - int 0x40 - mov ebp,eax - -loox: - mov eax,9 - mov ebx,procinfo - mov ecx,ebp - int 0x40 - mov eax,[DLGPID] - cmp [procinfo+30],eax ;IF Dialog find - je dlg_is_work ;jmp to dlg_is_work - dec ebp - jnz loox - - jmp erroff - -dlg_is_work: - cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated - je erroff ;TESTODP2 terminated too - - cmp [dlg_pid_get],dword 1 - je getmesloop - inc [get_loops] - cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated - jae erroff - jmp getmesloop - -mred: - call redproc - jmp getmesloop -mkey: - mov eax,2 - int 0x40 ; read (eax=2) - jmp getmesloop -mbutton: - mov eax,17 ; get id - int 0x40 - cmp ah,1 ; button id=1 ? - jne getmesloop - mov eax,-1 ; close this program - int 0x40 -mgetmes: - -; If dlg_pid_get then second message get jmp to still - cmp [dlg_pid_get],dword 1 - je ready - -; First message is number of PID SYSXTREE dialog - -; convert PID dec to PID bin - movzx eax,byte [path+16] - sub eax,48 - imul eax,10 - movzx ebx,byte [path+16+1] - add eax,ebx - sub eax,48 - imul eax,10 - movzx ebx,byte [path+16+2] - add eax,ebx - sub eax,48 - imul eax,10 - movzx ebx,byte [path+16+3] - add eax,ebx - sub eax,48 - mov [DLGPID],eax - -; Claear and prepare IPC area for next message - mov [path],dword 0 - mov [path+4],dword 8 - mov [path+8],dword 0 - mov [path+12],dword 0 - mov [path+16],dword 0 - -; Set dlg_pid_get for get next message - mov [dlg_pid_get],dword 1 - call redproc ;show DLG_PID - jmp getmesloop - -ready: -; -; The second message get -; Second message is 100 bytes path to SAVE/OPEN file -; shl path string on 16 bytes -; - cld - mov esi,path+16 - mov edi,path - mov ecx,200 - rep movsb - mov [edi],byte 0 - - jmp openoff - - -; DATA AREA -get_loops dd 0 -dlg_pid_get dd 0 -DLGPID dd 0 - -param: - dd 0 ; My dec PID - dd 0,0 ; Type of dialog - -run_fileinfo: - dd 16 - dd 0 - dd param - dd 0 - dd procinfo -;run_filepath: - db '/RD/1/SYSXTREE',0 - -procinfo: -times 1024 db 0 -} - - - - -; RANDOM - generate random count (small) -; (SYNTAX) RANDOM MaxCount,OutArgument -; (SAMPLE) RANDOM 10000,eax -; ( NOTE ) Maxint<65536 ; use random 65536,eax for more combinations - -randomuse = 0 - -macro random arg1,arg2 -{ -local rxproc -randomuse = randomuse + 1 - - jmp rxproc - -if defined randomuse & randomuse = 1 -randomproc: - jmp rnj -rsx1 dw 0x4321 -rsx2 dw 0x1234 -rnj: -; mov eax,arg1 - push bx - push cx - push dx - push si - push di - mov cx,ax - mov ax,word ptr rsx1 - mov bx,word ptr rsx2 - mov si,ax - mov di,bx - mov dl,ah - mov ah,al - mov al,bh - mov bh,bl - xor bl,bl - rcr dl,1 - rcr ax,1 - rcr bx,1 - add bx,di - adc ax,si - add bx,0x62e9 - adc ax,0x3619 - mov word ptr rsx1,bx - mov word ptr rsx2,ax - xor dx,dx - cmp ax,0 - je nodiv - cmp cx,0 - je nodiv - div cx -nodiv: - mov ax,dx - pop di - pop si - pop dx - pop cx - pop bx - and eax,0000ffffh -; mov arg2,0 -; mov arg2,eax - ret -end if - -rxproc: - mov eax,arg1 - call randomproc - mov arg2,eax -} - -macro scank -{ - mov eax,10 - int 0x40 -} - -macro putpix x,y,color -{ - mov ebx,x - mov ecx,y - mov edx,color - mov eax,1 - int 0x40 -} - -macro puttxt x,y,offs,size,color -{ -; mov ebx,x -; shl ebx,16 -; add ebx,y - words2reg ebx,x,y - - dword2reg ecx,color - dword2reg edx,offs - dword2reg esi,size - -; mov ecx,color -; mov edx,offs -; mov esi,size - mov eax,4 - int 0x40 -} - -macro outcount data, x, y, color, numtype -{ - mov ecx,data - mov ebx,numtype - mov bl,0 -; mov edx,x*65536+y - words2reg edx,x,y - mov esi,color - mov eax,47 - int 0x40 -} - -; SCEVENT - Scan event - -macro scevent red,key,but -{ - mov eax,11 - int 0x40 - dec eax - jz red - dec eax - jz key - dec eax - jz but -} - -; WTEVENT - Wait event - -macro wtevent red,key,but -{ - mov eax,10 - int 0x40 - dec eax - jz red - dec eax - jz key - dec eax - jz but -} - -; TIMEEVENT - Wite for event with timeout - -macro timeevent xfps,noevent,red,key,but -{ - mov eax,23 - mov ebx,xfps - int 0x40 - cmp eax,0 - je noevent - dec eax - jz red - dec eax - jz key - dec eax - jz but -} - - -; CLOSE - Close program - -macro close -{ - mov eax,-1 - int 0x40 -} - -; DELAY - Create delay 1/100 sec -; (SYNTAX) Delay time -; (SAMPLE) Delay 100 ;delay 2 sec 1/100*200=2 sec - -macro delay arg1 -{ - mov eax,5 - mov ebx,arg1 - int 0x40 -} - -; WINDOW - Draw window -; (SYNTAX) WINDOW Xstart,Ystart,'Text',Color -; (SAMPLE) WINDOW 10,10,640+8,480+24,window_Skinned - -macro window arg1,arg2,arg3,arg4,arg5 -{ -; mov ebx,arg1*65536+arg3 -; mov ecx,arg2*65536+arg4 - words2reg ebx,arg1,arg3 - words2reg ecx,arg2,arg4 - mov edx,arg5 - mov eax,0 - int 0x40 -} - -macro colorwindow arg1,arg2,arg3,arg4,arg5,arg6,arg7 -{ -; mov ebx,arg1*65536+arg3 -; mov ecx,arg2*65536+arg4 - words2reg ebx,arg1,arg3 - words2reg ecx,arg2,arg4 - mov edx,arg5 - mov esi,arg6 - mov edi,arg7 - mov eax,0 - int 0x40 -} - - -; STARTWD - Start of window draw - -macro startwd -{ - mov eax,12 - mov ebx,1 - int 0x40 -} - -; ENDWD - End window draw - -macro endwd -{ - mov eax,12 - mov ebx,2 - int 0x40 -} - -; LABEL - Put text to frame -; (SYNTAX) LABEL Xstart,Ystart,'Text',Color -; (SAMPLE) LABEL 10,12,'Hello World!',cl_Green+font_Big - -macro putlabel arg1,arg2,arg3,arg4 -{ -local asd,lab - jmp asd -lab db arg3 ;arg label -asd: -; mov ebx,arg1 ;arg1=y arg2=x -; shl ebx,16 -; add ebx,arg2 - - words2reg ebx,arg1,arg2 - - dword2reg ecx,arg4 - - mov edx,lab - mov esi,asd-lab ;calc size - mov eax,4 - int 0x40 -} - -;Key's -key_Up equ 178 -key_Down equ 177 -key_Right equ 179 -key_Left equ 176 -key_Esc equ 27 -key_Space equ 32 -key_Enter equ 13 -key_Bspace equ 8 -key_F1 equ 50 -key_F2 equ 51 -key_F3 equ 52 -key_F4 equ 53 -key_F5 equ 54 -key_F6 equ 55 -key_F7 equ 56 -key_F8 equ 57 -key_F9 equ 48 -key_F10 equ 49 -key_F11 equ 68 -key_F12 equ 255 -key_Home equ 180 -key_End equ 181 -key_PgUp equ 184 -key_PgDown equ 183 - -;Attributes - -;Window Attributes -window_Skinned equ 0x03000000 -window_Type2 equ 0x02000000 -window_Type1 equ 0x00000000 -window_Reserve equ 0x01000000 - -;Font Attributes -font_Big equ 0x10000000 - -;Colors -cl_White equ 0x00ffffff -cl_Black equ 0x00000000 -cl_Grey equ 0x00888888 -cl_Red equ 0x00ff0000 -cl_Lime equ 0x0000ff00 -cl_Green equ 0x0000af00 -cl_Blue equ 0x000000ff -cl_Purple equ 0x008080ff -cl_Violet equ 0x008040ff -cl_Cyan equ 0x0040e0ff diff --git a/programs/tinypad2/trunk/build_en.bat b/programs/tinypad2/trunk/build_en.bat deleted file mode 100644 index 52f91e6cfc..0000000000 --- a/programs/tinypad2/trunk/build_en.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix en >lang.inc -@fasm tinypad2.asm tinypad2 -@pause \ No newline at end of file diff --git a/programs/tinypad2/trunk/build_ru.bat b/programs/tinypad2/trunk/build_ru.bat deleted file mode 100644 index a33d1e5906..0000000000 --- a/programs/tinypad2/trunk/build_ru.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix ru >lang.inc -@fasm tinypad2.asm tinypad2 -@pause \ No newline at end of file diff --git a/programs/tinypad2/trunk/dialogs1.inc b/programs/tinypad2/trunk/dialogs1.inc deleted file mode 100644 index a6a29624dd..0000000000 --- a/programs/tinypad2/trunk/dialogs1.inc +++ /dev/null @@ -1,597 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; ; -; DIALOGS1.INC ; -; ; -; COMPILE WITH FASM for MENUET ; -; ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -menus dd 3 ; number of menus -m_x dd 0x5 ; x start -m_y dd 20 ; y start -m_xs dd 290 ; x size -m_ys dd 14 ; y size -g_stack dd 0xf000 ; thread stack - required - - -menu:; AB C D E F G - - db '*D FILE +Save File +Load File +- +Quit ' - db '*B EDIT +Copy +Paste ' - db '*B HELP +Setup +About.. ' - db '@' ; end mark - -; A : Data type '*' -> New menu , '+' -> menu selection -; B : Number of selections in menu (A+) -; C : Menu header text -; D-G : Menu selection text - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; DATA BELOW IS FOR DIALOGS1.INC INTERNALS - -menu_action dd '----' - -window_on db 0 - -g_n dd -1 -g_x dd 0x0 -g_t dd 0x0 -g_1 dd 0x0 -g_l dd 0x0 -closet db 0 - -table: times 1024 db 0 - -last_mouse dd 0x0 - -mo_x dd 0x0 -mo_y dd 0x0 - - -check_mouse: - - pusha - - cmp [window_on],1 - je no_open - - mov eax,37 - mov ebx,2 - int 0x40 - - cmp [window_on],0 - jne openw2 - - cmp eax,0 - je no_open - - openw2: - - waitformouse: - - mov eax,23 - mov ebx,2 - int 0x40 - - cmp eax,0 - jne no_open - - mov eax,37 - mov ebx,2 - int 0x40 - - cmp eax,0 - jne waitformouse - - - mov eax,37 - mov ebx,1 - int 0x40 - - mov esi,eax - - shr eax,16 - xor edx,edx - mov ebx,50 - div ebx - mov edx,eax - cmp edx,[g_n] - je no_open - cmp edx,[menus] - jge no_open - mov eax,esi - - and eax,0xffff - - mov ebx,[m_y] - cmp eax,ebx - jbe no_open - add ebx,[m_ys] - cmp eax,ebx - jge no_open - - cmp [window_on],0 - je noww - - mov [closet],1 - mov ecx,100 - waitm: - mov eax,5 - mov ebx,1 - int 0x40 - dec ecx - jz no_open - cmp [window_on],0 - jne waitm - noww: - - mov eax,edx - jmp cll - - no_open: - - mov [last_mouse],esi - - popa - - ret - - cll: - - mov [window_on],2 - - mov [g_n],eax - mov [g_x],96 - mov [g_t],0 - mov [g_1],1 - - mov eax,9 - mov ebx,table - mov ecx,-1 - int 0x40 - - mov eax,[table+34] - mov [mo_x],eax - mov eax,[table+38] - mov [mo_y],eax - - mov eax,51 - mov ebx,1 - mov ecx,alert_entry - mov edx,[g_stack] - int 0x40 - - mov [esp+28],dword 0 ; clear button entry - - mov [menu_action],'MD ' - - check_gr: - - popa - - ret - - -draw_menu: - - mov eax,9 - mov ebx,table - mov ecx,-1 - int 0x40 - - cmp [table+46],dword 30 - jb drmr - - mov eax,13 ; white background - mov ebx,[m_x] - shl ebx,16 - add ebx,[m_xs] - inc ebx - mov ecx,[m_y] - shl ecx,16 - add ecx,[m_ys] - mov edx,0xf0f8ff - int 0x40 - - mov eax,38 ; egde lines - mov ebx,[m_x] - shl ebx,16 - add ebx,[m_x] - add ebx,[m_xs] - mov ecx,[m_y] - shl ecx,16 - add ecx,[m_y] - mov edx,0x000000 - int 0x40 - mov eax,38 - mov ecx,[m_y] - add ecx,[m_ys] - shl ecx,16 - add ecx,[m_y] - add ecx,[m_ys] - int 0x40 - - mov esi,menu-1 - mov edi,[m_x] - mov ebp,1 - new_menu: - inc esi - - cmp [esi],byte '*' - jne drmnl1 - push esi - mov eax,4 - mov ebx,edi - shl ebx,16 - add ebx,[m_y] - add ebx,0x00050004 - mov ecx,0x000000 - mov edx,esi - add edx,3 - mov esi,12 - int 0x40 ; draw text - pop esi - add esi,2 - add edi,50 - inc ebp - - drmnl1: - cmp [esi],byte '@' - jne new_menu - - drmr: - - ret - -alert_box: - - ; eax : x size - min 200 - ; ebx : pointer to ASCIIZ - max 128 character text - ; ecx : button 1 id ( OK or YES ) - ; edx : button 2 id or zero ( NO ) - - - cmp [window_on],0 - jne alert_box_return - - mov [window_on],1 - - cmp eax,100 - jg size_ok - mov eax,100 - size_ok: - - mov [g_x],eax - mov [g_t],ebx - mov [g_1],ecx - - mov ecx,0 - new_search: - cmp [ebx],byte 0 - je found_len - inc ebx - inc ecx - cmp ecx,128 - jbe new_search - found_len: - mov [g_l],ecx - - mov eax,51 - mov ebx,1 - mov ecx,alert_entry - mov edx,[g_stack] - int 0x40 - - mov [menu_action],'MA ' - - alert_box_return: - - ret - -alert_entry: - - call alert_draw_window - -alert_still: - - mov eax,23 ; wait here for event - mov ebx,1 - int 0x40 - - cmp eax,1 ; redraw request ? - je alert_red - cmp eax,2 ; key in buffer ? - je alert_key - cmp eax,3 ; button in buffer ? - je alert_button - - cmp [closet],0 - jne ccc - - mov eax,9 - mov ebx,table - mov ecx,-1 - int 0x40 - - cmp ax,[table+4] - je no_close - ccc: - mov [closet],0 - mov [g_n],-1 - mov [menu_action],'----' - mov [window_on],0 - mov eax,-1 - int 0x40 - no_close: - - jmp alert_still - - alert_red: ; redraw - call alert_draw_window - jmp alert_still - - alert_key: ; key - mov eax,2 ; just read it and ignore - int 0x40 - jmp alert_still - - alert_button: ; button - mov eax,17 ; get id - int 0x40 - - shr eax,8 - cmp eax,3 - jg no_action1 - dec eax - shl eax,2 - mov eax,dword [eax+rtext] - mov [menu_action],eax - jmp action_done - no_action1: - sub eax,16 - add eax,65 - shl eax,8 - mov ebx,[g_n] - add ebx,65 - add eax,ebx - mov [menu_action],eax - - action_done: - - mov [closet],0 - mov [g_n],-1 - mov [window_on],0 - mov eax,-1 ; close this program - int 0x40 - - rtext db 'NO YES OK ' - - jmp alert_still - - -; ********************************************* -; ******* WINDOW DEFINITIONS AND DRAW ******** -; ********************************************* - - -alert_draw_window: - - - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,1 ; 1, start of draw - int 0x40 - - cmp [window_on],2 - jne no_win_type_2 - - mov edx,menu-1 - mov ecx,[g_n] - add ecx,1 - find_menu: - inc edx - cmp [edx],byte '*' - je menu_loop - jmp find_menu - menu_loop: - loop find_menu - movzx ebp,byte [edx+1] - sub ebp,64 - push edx - ; DRAW WINDOW - mov eax,0 ; function 0 : define and draw window - mov ebx,[g_n] - imul ebx,50 - add ebx,[mo_x] - add ebx,[m_x] - shl ebx,16 - add ebx,[g_x] - mov ecx,[mo_y] - add ecx,[m_y] - add ecx,[m_ys] - shl ecx,16 - mov edx,14 - imul edx,ebp - add edx,7 - add ecx,edx - mov edx,0x00ffffff ; color of work area RRGGBB,8->color gl - mov esi,0x00ffffff ; color of grab bar RRGGBB,8->color gl - mov edi,0x000000cc ; color of frames RRGGBB - int 0x40 - - pop edx - - mov ebx,5*65536+7 ; draw info text with function 4 - mov ecx,0x10000000 - mov esi,12 - mov ebp,16 - no_d_found: - inc edx - cmp [edx],byte '*' - je d_drawed - cmp [edx],byte '@' - je d_drawed - cmp [edx],byte '+' - jne no_d_found - inc edx - pusha ; draw button - mov eax,8 - mov ecx,ebx - mov ebx,[g_x] - add ebx,0x0000fffe - shl ecx,16 - add ecx,0xfffc0000+14 - mov edx,0x40000000 - add edx,ebp - mov esi,0 - int 0x40 - popa - mov eax,4 ; draw text - int 0x40 - inc ebp - add ebx,14 - jmp no_d_found - d_drawed: - - no_win_type_2: - - - cmp [window_on],1 - jne no_win_1 - - mov eax,14 ; to middle of screen - int 0x40 - mov ecx,eax - and ecx,0xffff - shr ecx,1 - shr eax,1 - mov ebx,[g_x] - shr ebx,1 - shl ebx,16 - sub eax,ebx - mov ebx,eax - - mov eax,0 ; function 0 : define and draw window - mov bx,word [g_x] - sub ecx,80 - shl ecx,16 - mov cx,110 ; [y start] *65536 + [y size] - mov edx,0x02ffffff ; color of work area RRGGBB,8->color gl - mov esi,0x80d05050 ; color of grab bar RRGGBB,8->color gl - mov edi,0x00d05050 ; color of frames RRGGBB - int 0x40 - - - mov eax,4 ; label - mov ebx,8*65536+8 - mov ecx,0x10ddeeff - mov edx,alert_labelt1 - mov esi,alert_label1len-alert_labelt1 - int 0x40 - - mov eax,4 - mov ebx,10*65536+43 - mov ecx,0x10000000 - mov edx,[g_t] - mov esi,[g_l] - int 0x40 - - cmp [g_1],1 - jne gadgets_no_1 - - mov eax,8 - mov ebx,[g_x] - sub ebx,100 - shr ebx,1 - shl ebx,16 - add ebx,30*65536+40 - mov ecx,75*65536+16 - mov edx,3 - mov esi,0x446688 - int 0x40 - - mov eax,4 - mov ebx,[g_x] - sub ebx,100 - shr ebx,1 - shl ebx,16 - add ebx,31*65536+80 - mov ecx,0x10ffffff - mov edx,alert_t2 - mov esi,alert_t2len-alert_t2 - int 0x40 - - gadgets_no_1: - - cmp [g_1],2 - jne gadgets_no_2 - - mov eax,8 - mov ebx,[g_x] - sub ebx,100 - shr ebx,1 - shl ebx,16 - add ebx,0*65536+40 - mov ecx,75*65536+16 - mov edx,1 - mov esi,0x446688 - int 0x40 - - mov eax,8 - mov ebx,[g_x] - sub ebx,100 - shr ebx,1 - shl ebx,16 - add ebx,57*65536+40 - mov ecx,75*65536+16 - mov edx,2 - mov esi,0x446688 - int 0x40 - - mov eax,4 - mov ebx,[g_x] - sub ebx,100 - shr ebx,1 - shl ebx,16 - add ebx,1*65536+80 - mov ecx,0x10ffffff - mov edx,alert_t1 - mov esi,alert_t1len-alert_t1 - int 0x40 - - gadgets_no_2: - - no_win_1: - - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,2 ; 2, end of draw - int 0x40 - - ret - - -; DATA AREA - - -alert_t1: - db ' No Yes' -alert_t1len: - - -alert_t2: - db ' OK' -alert_t2len: - - -alert_labelt1: - db 'ALERT' -alert_label1len: - - - - - - - - diff --git a/programs/tinypad2/trunk/scroll.inc b/programs/tinypad2/trunk/scroll.inc deleted file mode 100644 index 18c4c046b9..0000000000 --- a/programs/tinypad2/trunk/scroll.inc +++ /dev/null @@ -1,440 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ; -;; Scroll.inc ; -;; ; -;; Vertical Scroll Bar Example for MenuetOS ; -;; ; -;; Version 0.2 27 February 2005 ; -;; ; -;; ; -;; GNU GENERAL PUBLIC LICENSE ; -;; Version 2, June 1991 ; -;; ; -;; Copyright 2005 Jason Delozier, ; -;; cordata51@hotmail.com ; -;; ; -;; See file COPYING for details ; -;; ; -;; Updates: ; -;; - FPU not longer used for calculations -Feb 27, 2005 ; -;; ; -;; ; -;; TODO: ; -;; - Create Message Handler and only allow runtime arguments ; -;; to be processed through the message handler ; -;; - Remove all local varibles and only allow working varible to ; -;; reside in scroll bar structure. ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - - - - -;***************************************************************************** -;* -;* VScroll Structure Equates -;* -;***************************************************************************** - -VScroll_width equ 0 -VScroll_x equ 2 -VScroll_height equ 4 -VScroll_y equ 6 -VScroll_min equ 8 -VScroll_max equ 12 -VScroll_current equ 16 -VScroll_s_change equ 20 -VScroll_b_change equ 24 - -;Example VScroll Structure -;VScroll_1: -; dw 16 ;width +0 -; dw 100 ;x +2 -; dw 200 ;height +4 -; dw 40 ;y +6 -; dd 0 ;min +8 -; dd 1000;max +12 -; dd 1 ;current +16 -; dd 1 ;small change +20 -; dd 10 ;big change +24 - -VScroll_Min_Height dw 16 ;scroll box -Vscroll_Fixed_Height dw 16 ;height of scroll buttons (up and down) - -;************************************** -;* -;* Mouse Over VScroll -;* -;************************************** -vsm1 dd 0 -vstoff dd 0 - -VScroll_mouse_over: - cmp [mouseb], 1 - je VScroll_Mouse_Has_Mouse - cmp [mouseb], 0 - jne VScroll_mouse_over_done2 - mov [vsm1], 0 - jmp VScroll_mouse_over_done2 -VScroll_Mouse_Has_Mouse: - push ecx - mov ecx, [vsm1] - shl ecx,2 - call dword [VScroll_Mouse_Jumptable+ecx] -VScroll_mouse_over_done: - pop ecx -VScroll_mouse_over_done2: - ret - -VScroll_Mouse_Jumptable: - dd VScroll_Mouse_Find - dd VScroll_Mouse_On_Up - dd VScroll_Mouse_On_Down - dd VScroll_Mouse_Above_Thumb - dd VScroll_Mouse_Below_Thumb - dd VScroll_Mouse_On_Thumb - -VScroll_Mouse_Find: - inc ecx - call dword [VScroll_Mouse_Jumptable+ecx*4] - cmp [vsm1], 0 - jne VScroll_mouse_over_done2 - cmp ecx, 5 - je VScroll_mouse_over_done2 - jmp VScroll_Mouse_Find - - -;************************************** -;Is Mouse at Up button -VScroll_Mouse_On_Up: - push eax - movzx eax, word [ebp+VScroll_y] - add ax, word [Vscroll_Fixed_Height] - cmp [mousey], ax - pop eax - ja VScroll_Mouse_On_Up2 - mov [vsm1], 1 - call VScroll_Small_Up -VScroll_Mouse_On_Up2: - ret - -;************************************** -;Is Mouse at Down button -VScroll_Mouse_On_Down: - push eax - movzx eax,word [ebp+VScroll_y] - add ax, word [ebp+VScroll_height] - sub ax, word [Vscroll_Fixed_Height] - cmp [mousey], ax - pop eax - jb VScroll_Mouse_On_Down2 - mov [vsm1], 2 - call VScroll_Small_Down -VScroll_Mouse_On_Down2: - ret - -;************************************** -;Is Mouse above Scroll Thumb -VScroll_Mouse_Above_Thumb: - push eax - push ecx - push edx - call Vscroll_SBox_Area - add cx, word [ebp+VScroll_y] - add cx, word [Vscroll_Fixed_Height] ;plus height of scroll button - cmp cx, [mousey] - pop edx - pop ecx - pop eax - jb VScroll_Mouse_Above_Thumb2 - mov [vsm1], 3 - call VScroll_Big_Up -VScroll_Mouse_Above_Thumb2: - ret - -;************************************** -;Is Mouse below scroll thumb -VScroll_Mouse_Below_Thumb: - push eax - push ecx - push edx - call Vscroll_SBox_Area - add cx, word [ebp+VScroll_y] - add cx, word [Vscroll_Fixed_Height] ;plus height of scroll button - add cx, ax - cmp cx, [mousey] - pop edx - pop ecx - pop eax - ja VScroll_Mouse_Below_Thumb2 - mov [vsm1], 4 - call VScroll_Big_Down -VScroll_Mouse_Below_Thumb2: - ret - -;************************************** -;Mouse is on Scroll Thumb -VScroll_Mouse_On_Thumb: - - pusha - cmp [vsm1], 5 ;first time moving since we clicked? - je VScroll_Mouse_On_Thumb1 ;if not jump.. we already have offset - mov [vsm1], 5 ;determine offset between mouse pointer and top of thumb - call Vscroll_SBox_Area ;get top of thumb coordinate - add cx, word [ebp+VScroll_y] ;make screen coordinate - add cx, word [Vscroll_Fixed_Height] ;plus height of scroll button and top - movzx esi,word [mousey] ;get mouse position - sub esi, ecx ;make offset between top of thumb - mov [vstoff], esi ;and mouse pointer then save it -VScroll_Mouse_On_Thumb1: ; - movzx esi, [mousey] ;get mouse y value - sub si, word [ebp+VScroll_y] ;get y starting value of scroll bar - sub si, [Vscroll_Fixed_Height] - sub esi, [vstoff] ; - call Vscroll_SBox_Area ; -VScroll_Mouse_On_Thumb2: ; - cmp [ebp+VScroll_current], edx ;only redraw if change occured - je VScroll_Mouse_On_Thumb3 ; - mov [ebp+VScroll_current], edx ;new current value - call drawvscrolla ;redraw scroll background and thumb -VScroll_Mouse_On_Thumb3: ; - popa ; - ret -;************************************** - - - - -;***************************************************************************** -;* -;* Vscroll_SBox_Area -;* -;* Purpose: To determine the area of the Scroll Bar Thumb and the current -;* value of scroll based on top pixel of thumb. -;* -;* Inputs: -;* EBP - Structure of scroll bar -;* ESI - Top of Thumb - optional -;* -;* Outputs: -;* EAX - Thumb Height -;* ECX - Top of thumb -;* EDX - Current Value based on top pixel of thumb. Valid when ESI -;* is given as input. -;* -;* This procedure is divided up into 5 specific functions. -;* 1. ((Vmax-VMin)/Small Change)= Total Changes -;* 2. Height - (2* Fixed Button Height) = Total Pixels -;* 3. Total Pixels - Total Changes = Thumb Height (must be >= 16) -;* Minimum Height of 16 is varible [VScroll_Min_Height] -;* 4. (((Tot Pixels - Thumb Height)* Current)/Max-min)=Top Pixel of Thumb -;* 5. ((Mouse Top * (max-Min))/(Total Pix - Thumb Height)) = Current -;* Step 5 is only valid if ESI is supplied as an input. -;* -;* -;***************************************************************************** - -Vscroll_SBox_Area: - push ebx - push esi - push edi - ;Step 1. Determine Total Changes - mov eax, dword [ebp+VScroll_max] ;get max scroll - sub eax, dword [ebp+VScroll_min] ;sub minmum scroll for total scro - xor edx,edx - push eax - div dword [ebp+VScroll_s_change] ; - ;eax = total changes ((max-min)/Small Change) - - ;Step 2. Determine Total Pixels - movzx ecx, word [ebp+VScroll_height] ;height of entire scroll bar - mov bx, word [Vscroll_Fixed_Height] ;minus height of both scroll button - shl bx, 1 - sub cx, bx - push ecx - ;ecx = total pixels (Total Height - (2*Fixed Button Height) - - ;Step 3. Determine Thumb Height - cmp ecx, eax - jbe vs1 - sub ecx, eax - cmp cx, word [VScroll_Min_Height] - jb vs1 - jmp vs2 -vs1: - movzx ecx, word [VScroll_Min_Height] -vs2: - ;ecx = Thumb Height (Total Pixels - Total Changes) >=16 - - ;Step 4. Determine Top Pixel of Thumb - pop edi ;Total Pixels - sub edi, ecx ; - ;edi = Total Pixels - thumb Height - mov eax, edi ; - mul dword [ebp+VScroll_current] ;get current scroll value - pop ebx ;max scroll - push ecx ; - div ebx ; - mov ecx, eax ; - ;ecx = top pixel of thumb - - ;Step 5. Determine Current Value based on Mouse Position - cmp si,0 - jge vss4 - mov eax, dword [ebp+VScroll_min] - jmp vsdone1 -vss4: - cmp esi, edi - jbe vss3 - mov eax, dword [ebp+VScroll_max] - jmp vsdone1 -vss3: - mov eax,ebx ;max scroll - mul esi ;Top Pixel of mouse - div edi ;Total Pixels - Thumb Height - ;eax = Current Value - -vsdone1: - mov edx, eax ;Current Value - pop eax ;Thumb Height - pop edi - pop esi - pop ebx -ret - -;***************************************************************************** -;* -;***************************************************************************** -;ebp is structure -drawvscroll: -pusha - ;up button - mov eax, 13 ;button system function - mov edx,0x00777777 ;0x6677cc ;color - mov ebx, [ebp+VScroll_width] ;x-start/width - mov cx, word [ebp+VScroll_y] ;get bottom of scroll bar - shl ecx, 16 - mov cx, [Vscroll_Fixed_Height] ;fixed height - int 0x40 - - ;down button - mov ebx, [ebp+VScroll_width] ;x-start/width - mov cx, word [ebp+VScroll_y] ;get bottom of scroll bar - add cx, word [ebp+VScroll_height] ; - sub cx, [Vscroll_Fixed_Height] ;y-start is 12 pixel from bottom - shl ecx, 16 ; - mov cx, [Vscroll_Fixed_Height] ;fixed height - int 0x40 -;------- 'ASCL.INC' needs to be included to use this -- - putlabel 493,46,'',cl_Black - putlabel 493,372,'',cl_Black -;------------------------------------------------------ - -popa -drawvscrolla: -pusha - - mov eax, 13 ;Draw Scroll Box Background - mov edx, 0x00999999;0 ;color - push edx - movzx edx, word [Vscroll_Fixed_Height] - mov ebx, [ebp+VScroll_width] ;x-start/width - movzx ecx,word [ebp+VScroll_y] ;y-start - add ecx, edx ;add fixed height button - shl ecx, 16 ;do height next - mov cx,word [ebp+VScroll_height] ;y-start - sub cx, dx ;subtract fixed height of up button - sub cx, dx ;subtract fixed height of down button - pop edx - int 0x40 ;tell system to draw it - -;determine height of scroll box (thumb) - - call Vscroll_SBox_Area - add cx, [ebp+VScroll_y] - add cx, 16 - shl ecx, 16 - mov cx, ax - - mov eax, 13 ;draw scroll box - mov ebx, [ebp+VScroll_width] ;x-start/width - mov edx, 0x00bbbbbb ;0x999999 - int 0x40 -;call Draw_Scroll_info -popa -ret -;***************************************************************************** - -;***************************************************************************** -;* VScroll_Big_Up -;* VScroll_Small_Up -;***************************************************************************** -;need to update for signed values -VScroll_Big_Up: - push eax - push ebx - mov eax, dword [ebp+VScroll_b_change] - jmp VScroll_Up -VScroll_Small_Up: - push eax - push ebx - mov eax, dword [ebp+VScroll_s_change] -VScroll_Up: - mov ebx, dword [ebp+VScroll_min] ;get minimum value - cmp [ebp+VScroll_current], ebx ;are we at minimum already? - je VScroll_Up_exit ;if so leave - sub [ebp+VScroll_current], eax ; - jnc VScroll_Up_done - mov [ebp+VScroll_current], ebx -VScroll_Up_done: - cmp [ebp+VScroll_current], ebx ;if current is greater then max - jae VScroll_Up_done2 - mov [ebp+VScroll_current], ebx -VScroll_Up_done2: -;redraw - call drawvscroll ;temp? -VScroll_Up_exit: - pop ebx - pop eax - -ret -;***************************************************************************** - - -;***************************************************************************** -;* VScroll_Big_Down -;* VScroll_Small_Down -;***************************************************************************** -;need to update for signed values -VScroll_Big_Down: - push eax - push ebx - mov eax, dword [ebp+VScroll_b_change];get big change value - jmp VScroll_Down -VScroll_Small_Down: - push eax - push ebx - mov eax, dword [ebp+VScroll_s_change];get small change value -VScroll_Down: - mov ebx, dword [ebp+VScroll_max] ;get maximum scroll value - cmp [ebp+VScroll_current], ebx ;are we at max already? - je VScroll_Down_exit ;if so leave - add [ebp+VScroll_current], eax ;add change to current - jno VScroll_Down_done ;dont go beyond bounds of register - mov [ebp+VScroll_current], ebx ;if we did then we at max -VScroll_Down_done: ; - cmp [ebp+VScroll_current], ebx ;if current is greater then max - jbe VScroll_Down_done2 ; - mov [ebp+VScroll_current], ebx ;then we at max -VScroll_Down_done2: ; -;redraw - call drawvscroll ;temp? -VScroll_Down_exit: - pop ebx - pop eax -ret -;***************************************************************************** - - - - diff --git a/programs/tinypad2/trunk/tinypad2.asm b/programs/tinypad2/trunk/tinypad2.asm deleted file mode 100644 index a6a8bf51a9..0000000000 --- a/programs/tinypad2/trunk/tinypad2.asm +++ /dev/null @@ -1,4001 +0,0 @@ -; SYSTEM HAEDER: - use32 - org 0x0 - db 'MENUET01' ; identifier - dd 0x01 ; version - dd START ; pointer to start - dd TINYPAD_END ; size of file - dd 0x300f00 ;0x500000; 0x3fff00;0x300000 ; size of memory - dd 0xeff0 ;0x4fffff ;0x3ff000;0xeff0 ; esp - dd I_PARAM ; parameters - dd 0 ; reserved -include 'lang.inc' -include 'ascl.inc' -include 'macros.inc' ; useful stuff -include 'dialogs1.inc' -include 'scroll.inc' -;include 'debug.inc' -purge mov ;  SPEED -;****************************************************************************** -; INITIALIZING -START: -;debug_print_hex TINYPAD_END -call mask_events - - cmp [I_PARAM],byte 0 - jz noparams - - ; parameters are at I_PARAM - mov esi,I_PARAM - mov edi,filename - mov ecx,50 - cld - rep movsb - - mov edi,filename - mov ecx,50 - xor eax,eax - repne scasb - sub edi,filename - dec edi - mov [filename_len],edi - jmp do_load_file - noparams: - jmp newfile -;****************************************************************************** -; MAIN LOOP -still: - call writepos ; write current position & number of strings - call mouse_info - - mov eax,10 ; wait here until event - int 0x40 - - cmp eax,1 - je red - cmp eax,2 - je key - cmp eax,3 - je button - cmp eax,6 - je mouse - jmp still -;****************************************************************************** -; ********************************* -; * MOUSE * -; ********************************* -mouse: -mov eax,37 ;mouse click -mov ebx,2 -int 0x40 -cmp eax,0 -je .leave_now -;if exit window is on -cmp [exit_wnd_on],1 -jne @f -mov [exit_wnd_on],0 -jmp red -;else -@@: -cmp eax,1 ;mouse 1 -jne .leave_now - -mov eax,37 ;mouse position -mov ebx,1 -int 0x40 - -mov word[mouse_y],ax -shr eax,16 -mov word[mouse_x],ax - - -cmp [mouse_x],7 -jb .leave_now ;.leave_now ;if < -cmp [mouse_x],485;487 -ja .leave_now ;.leave_now ;if > - -cmp [mouse_y],45 -jb .leave_now ;.leave_now ;if < -cmp [mouse_y],342 ;345 -ja .leave_now ;.leave_now ;if > - -call main_cursor_move - -.leave_now: -jmp still - -; ********************************* -; * BUTTON HANDLER * -; ********************************* - - button: - - mov eax,17 - int 0x40 -;;;;;;;;;;;;;;;exit dialog box check;;;;;;;;;;;;; -cmp ah,49 -je save_and_exit -cmp ah,48 -je exit_now -cmp ah,47 -mov [exit_wnd_on],0 -je red -cmp ah,46 -jne @f - - call save_file - jmp newfile -@@: -cmp ah,45 -je newfile -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;;;;;;;;;MENU CHECK;;;;;;;;;;;;;;;;;;;;;;; -cmp ah,15 -jne no_d_w -call draw_window_for_dialogs -jmp still -no_d_w: -cmp ah,97 -je draw_win_menu_file -cmp ah,98 -je draw_win_menu_code -cmp ah,96 -je draw_win_menu_text -cmp ah,95 -je goto_string -cmp ah,92 -je search_window -cmp ah,94 -je red -cmp ah,99 - je help_wnd -cmp ah,100 - je new_pad_wnd -cmp ah,101 - je doyouwannasave -cmp ah,102 - jne nosavenow - for_key_save: - savedialog draw_window_for_dialogs,copy_fpath_s,saveerror,mypath -nosavenow: -cmp ah,103 - jne noopennow - for_key_open: - opendialog draw_window_for_dialogs,copy_fpath,openerror,mypath -noopennow: -cmp ah,104 -je exit -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - shr eax,8 - - cmp al,50 - jne no_search - -; SEARCH { - search: - - cmp [lines],1 ;something like bug fix - je red ;still - - xor esi,esi - mov edi,[post] - add edi,80 - imul ecx,[lines],80 - sub ecx,edi ; ecx (loop counter) = lines*80-(post+80) - news: - push edi - news2: - - ; 1) LOAD BYTES - mov al,[esi+search_string] - mov bl,[edi+0x80000] - - ; 2) COMPARE BYTES - cmp al,bl - je yes_char - - ; 3) LETTER? - cmp al,'A' - jb notequal - cmp al,'z' - ja notequal - - ; 4) A->a OR a->A - cmp al,'a' - jb @f - add al,-32 - jmp compare_bytes - @@: - cmp al,'Z' - ja notequal - add al,32 - - compare_bytes: - cmp al,bl - jne notequal - - yes_char: - inc edi - inc esi - cmp esi,[search_len] - jge sfound - jmp news2 - - notequal: - pop edi - xor esi,esi - inc edi - loop news - call string_not_found - jmp still - - sfound: - mov eax,edi - cdq ; edx = 0; - mov ebx,80 - div ebx -;;;;; imul eax,80 -; lea eax,[eax+eax*4] ; eax *= 5; -; shl eax,4 ; eax *= 16; - -; mov [post],eax - mov [posy],0 -;--------------- -; mov ebx,80 -; div ebx - call goto_pos - call draw_vertical_scroll - jmp still -; SEARCH } - - no_search: - -; TOOLBAR { - cmp eax,10000 - jb no_toolbar - - add eax,-10000 - jne @f -lbl_compile_file: - mov [run_outfile],0 - call start_fasm - jmp still - @@: - dec eax - jnz @f -lbl_run_outfile: - mov [run_outfile],1 - call start_fasm - jmp still - @@: - dec eax - jnz @f - call open_debug_board - jmp still - @@: - dec eax - jnz still - call open_sysfuncs_txt - jmp still -; TOOLBAR } - - no_toolbar: - - cmp al,4 - jne noid4 - -; LOAD_FILE { - do_load_file: - mov [modified],0 - - call empty_work_space - - - cmp [filename],'/' - jne @f - - call loadhdfile - jmp .restorecursor - @@: - call loadfile1 - .restorecursor: - mov edi,0x78000 - mov ecx,80*80/4 - mov eax,0x01010101 - cld - rep stosd - xor eax,eax - mov [post],eax - mov [posx],eax - mov [posy],eax - -; enable color syntax for ASM and INC files: - mov [asm_mode], 0 - - mov eax, [filename_len] - add eax, filename - cmp word [eax-3],'AS' - jne @f - cmp byte [eax-1],'M' - jne @f - mov [asm_mode], 1 - jmp .nocol - @@: - cmp word [eax-3],'IN' - jne @f - cmp byte [eax-1],'C' - jne @f - mov [asm_mode], 1 - @@: - .nocol: - -; if the header is the same as the previous, -; just redraw the text area -; else redraw the window - -;------pos00=filename_len - mov eax,[filename_len] - mov [pos00],eax -;------------------------- - mov ecx, [filename_len] - add ecx, 10 ; strlen(" - TINYPAD"); - cmp ecx, [headlen] - jne @f - add ecx, -10 - mov esi, filename ; strcmp(filename,header); - mov edi, header - rep cmpsb - jne @f - call drawfile - call draw_window_for_dialogs ;redraw, because it's needed - cmp [to_return],0 - je still - ret - ;jmp still - @@: -call set_title -cmp [to_return],0 -je still -ret -; jmp still -; LOAD_FILE } - - noid4: - - cmp al, 2 - jz yessave - - dec al ; close if butid == 0 - jnz nosave -; EXIT: -exit: -cmp [modified],0 -je exit_now - - mov eax,55 ; beep - mov ebx,eax - mov esi,save_beep1 - int 0x40 - delay 4 - mov eax,55 ; beep - mov ebx,eax - mov esi,save_beep2 - int 0x40 - - ;---------"EXIT" dialog box - - mov eax,13 - mov ebx,150*65536+200 - mov ecx,100*65536+70 - mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512 - int 0x40 - - -mov eax,38 -mov ebx,150*65536+350 -mov ecx,100*65536+100 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,150*65536+350 -mov ecx,170*65536+170 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,150*65536+150 -mov ecx,100*65536+170 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,350*65536+350 -mov ecx,100*65536+170 -mov edx,cl_White -int 0x40 - - - - putlabel 190,120,'Сохранить документ?',cl_White - - drawlbut 170,140,30,15,'Да',49,[sc.work_button],cl_White - drawlbut 230,140,30,15,'Нет',48,[sc.work_button],cl_White - drawlbut 290,140,45,15,'Отмена',47,[sc.work_button],cl_White - - mov [exit_wnd_on],1 -;---------------- - -jmp still - - exit_now: - mov [MainWndClosed], 1 - or eax, -1 - int 0x40 - - save_and_exit: - call save_file - jmp exit_now -; mov [MainWndClosed], 1 -; or eax, -1 -; int 0x40 - -; SAVE_FILE { - yessave: - call clear_screen - call drawwindow - call save_file -; call clear_screen -; call drawwindow - mov [modified],0 - - jmp still -; SAVE_FILE } - - nosave: - - inc al - call read_string - - jmp still - -;********************************** -;* REDRAW HANDLER * -;********************************** - -red: -; перерисовка окна - call clear_screen - call drawwindow - jmp still - - - -;********************************** -;* KEY HANDLER * -;********************************** - - key: - mov eax, 2 ; GET KEY - int 0x40 - - cmp [exit_wnd_on],1 ;exit window is ON? - jne no_exit_wnd ; no - goto other checks - -; cmp eax,13 ;enter - save n exit -; je save_and_exit - -; cmp eax,173 ;ctrl+enter - exit -; je exit_now - mov [exit_wnd_on],0 ;other keys - cancel -; call draw_window_for_dialogs - - jmp red ;redraw and still - - - no_exit_wnd: - shr eax, 8 - -; HELP_TEXT { - cmp al, 210 ; Ctrl + F1 - jne no_help_text -help_wnd: -call clear_screen -call drawwindow - mov eax, 51 - mov ebx, 1 - mov ecx, help_thread_start - mov edx, 0xfff0 - int 0x40 - jmp still - -help_thread_start: - call draw_help_wnd - - still_hw: - cmp [MainWndClosed], 1 - je exit_hw - mov eax, 10 - int 0x40 - cmp eax, 1 - je red_hw - cmp eax, 2 - je key_hw - cmp eax, 3 - je button_hw - jmp still_hw - - red_hw: - call draw_help_wnd - jmp still_hw - - key_hw: -; mov eax, 2 - int 0x40 - cmp ah, 27 - jne still_hw - - button_hw: - mov eax, 17 - int 0x40 - exit_hw: - or eax, -1 - int 0x40 - -; draw help window - draw_help_wnd: - mov eax, 12 - mov ebx, 1 - int 0x40 - - xor eax, eax - mov ebx, 200 shl 16 + 320 - mov ecx, 200 shl 16 + 260 - mov edx, 0x03e0e0e0 ; work - mov esi, [sc.grab] - or esi, 0x80000000 ; grab - mov edi, [sc.frame] ; frame - int 0x40 - - mov eax, 4 - mov ebx, 8 shl 16 + 8 - mov ecx, 0xffffff - mov edx, help_wnd_header - mov esi, hlphead_len - int 0x40 - - mov eax, 4 - mov ebx, 8 shl 16 + 34 - xor ecx, ecx - mov esi, 51 - mov edx, help_text - .new_help_line: - int 0x40 - add ebx, 10 - add edx, esi - cmp [edx], byte 'x' - jne .new_help_line - - mov eax, 12 - mov ebx, 2 - int 0x40 - ret -; HELP_TEXT } - - no_help_text: -; LOAD_FILE { - cmp al, 211 ; Ctrl + F2 - je for_key_open ;do_load_file -; LOAD_FILE } - -; SEARCH { - cmp al, 212 ; Ctrl + F3 - je search -; SEARCH } - -; SAVE_FILE { - cmp al, 213 ; Ctrl + F4 - je yessave -; SAVE_FILE } - -; ENTER_FILENAME { - cmp al, 214 ; Ctrl + F5 - jne @f -jmp for_key_save - @@: -; ENTER_FILENAME } - -; ENTER_SEARCH { - cmp al, 215 ; Ctrl + F6 - jne @f -; mov al, 51 -; call read_string -; jmp still - jmp search_window - @@: -; ENTER_SEARCH } - -; CHANGE_LAYOUT { - cmp al, 217 ; Ctrl + F8 - jne @f - call layout - jmp still - @@: -; CHANGE_LAYOUT } - -; COMPILE_FILE { - cmp al, 208 - je lbl_compile_file -; COMPILE_FILE } - -; RUN_OUTFILE { - cmp al, 209 - je lbl_run_outfile - -; RUN_OUTFILE } - -;run debug board { ----- - cmp al,255 - jne @f - call open_debug_board - call activate_me - jmp still -;} - @@: -;open sysfuncR { ----- -; cmp al,228 -; jne @f -; call open_sysfuncs_txt -; jmp still -; @@: - -;fast_save_and_open { - cmp al,216 - jne @f - call make_fast_so - jmp still -;} - @@: -; 3 times english -> русский -; 2 times русский -> english - -; COPY START { - cmp al, 19 - jne no_copy_start - mov eax, [post] - imul ebx, [posy], 80 - add eax, ebx - mov [copy_start], eax - jmp still -; COPY START } - - no_copy_start: -; COPY END { - cmp al, 5 - jne no_copy_end - cmp [copy_start], 0 - je still - mov ecx, [post] - imul ebx, [posy], 80 - add ecx, ebx - add ecx, 80 - cmp ecx, [copy_count] - jb still - sub ecx, [copy_start] - mov [copy_count], ecx - mov esi, [copy_start] - add esi, 0x80000 - mov edi, 0x2f0000 - cld - rep movsb - jmp still -; COPY END } - - no_copy_end: - -; PASTE { - cmp al, 16 - jne no_copy_paste - cmp [copy_count], 0 - je still - mov eax,[copy_count] - cdq - mov ebx, 80 - div ebx - add [lines], eax - mov ecx, 0x2e0000 - mov eax, [post] - imul ebx, [posy], 80 - add eax, ebx - add eax, 0x80000 - sub ecx, eax - mov esi, 0x2e0000 - sub esi, [copy_count] - mov edi, 0x2e0000 - std - rep movsb - mov esi, 0x2f0000 - mov edi, [post] - imul eax, [posy], 80 - add edi, eax - add edi, 0x80000 - mov ecx, [copy_count] - cld - rep movsb - - call clear_screen - call drawfile -call draw_vertical_scroll - mov [modified],1 - - jmp still -; PASTE } - - - no_copy_paste: - - -; INSERT_SEPARATOR { - cmp al,0xc ; Ctrl+L - jne no_insert_separator - - imul eax,[posy],80 - add eax,[post] - add eax,0x80000 - mov ebx,eax - - imul eax,[lines],80 - add eax,0x80000 ; теперь указывает на конец файла - - mov ecx,eax ; size - sub ecx,ebx - inc ecx - - mov esi,eax ; from - mov edi,eax - add edi,80 ; to - - std - rep movsb - - mov ecx,80/4 - mov esi,comment_string - mov edi,ebx - cld - rep movsd - - inc [lines] - - call clear_screen - call drawfile -;call calc_scroll_size_and_pos -call draw_vertical_scroll - mov [modified],1 - - jmp still -; INSERT_SEPARATOR } - - - no_insert_separator: - - -; DEL_LINE { - cmp al,4 - jne no_delete_line - mov eax,[post] - cdq - mov ebx,80 - div ebx - add eax,[posy] - inc eax - cmp eax,[lines] - jge still - dec dword [lines] - imul edi,[posy],80 - add edi,[post] - add edi,0x80000 - mov esi,edi - add esi,80 - mov ecx,0x2e0000 - sub ecx,esi - shr ecx,4 - cld - rep movsd - call clear_screen - call drawfile -;call calc_scroll_size_and_pos -call draw_vertical_scroll - mov [modified],1 - - jmp still -; DEL_LINE } - - no_delete_line: - -; ENTER { - cmp al,13 - jnz noenter - - ; lines down - mov eax,[posy] - inc eax -; imul eax,80 - lea eax,[eax+eax*4] ; eax *= 5 - shl eax,4 ; eax *= 16 - add eax,0x80000 - add eax,[post] - mov ebx,eax - - ; ebx = ([posy]+1)*80 + 0x80000 + [post] - ; ebx -> first byte of next string - - imul eax,[lines],80 - add eax,0x80000 - mov ecx,eax - - ; ecx = [lines]*80 + 0x80000 - ; ecx -> end of the document - - cmp ebx,ecx - jz .bug_fixed - - @@: - dec ecx - mov dl,[ecx] - mov [ecx+80],dl - - cmp ecx,ebx - jnz @b - - .bug_fixed: - - ; save for later - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - mov ebx,eax - add eax,[posx] - ; eax = 0x80000 + [post] + [posy]*80 + [posx] - - push eax - - dec ebx - xor ecx,ecx - @@: - cmp ecx,80 - je @f - inc ecx - inc ebx - cmp byte [ebx],' ' - je @b - @@: - dec ecx - - cmp ecx,80-1 - jne @f -; mov [posx],0 - jmp .lbl - @@: - - cmp [posx],ecx - jbe @f - mov [posx],ecx - jmp .lbl - @@: - mov [posx],0 - - .lbl: - inc [posy] - - ;clear line - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - - mov edi,eax - mov eax,' ' - mov ecx,80/4 - cld - rep stosd - - - ; end of line to next line beginning - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] -; add eax,[posx] - mov ebx,eax - ; ebx -> beginning of this line - - pop esi - mov edi,eax - - @@: - mov al,[esi] - mov [ebx],al - mov [esi],byte ' ' - - inc esi - inc ebx - - cmp esi,edi - jb @b - - inc [lines] - - mov ecx,[posy] - cmp ecx,[slines] - jne @f - - dec [posy] - add [post],80 - - @@: - call clear_screen - call drawfile -;call calc_scroll_size_and_pos - - call draw_vertical_scroll - mov [modified],1 - - jmp still -; ENTER } - - - noenter: - - -; UP { - cmp al,130+48 - jnz noup - mov ecx,[posy] - test ecx,ecx - jnz .up1 - mov ecx,[post] - test ecx,ecx - jz still - add ecx,-80 - mov [post],ecx - call clear_screen - jmp .finish - .up1: - dec ecx - mov [posy],ecx - .finish: - call drawfile - call draw_vertical_scroll -;call calc_scroll_size_and_pos - - jmp still -; UP } - - noup: - -; DOWN { - cmp al,129+48 - jnz nodown - - mov ecx,[posy] - mov eax,[slines] - dec eax - cmp ecx,eax - jb .do1 ; goto do1 if [posy] < [slines]-1 - - mov eax,[lines] - sub eax,[slines] - dec eax - jb still ; goto still if [lines] < [slines]-1 -; imul eax,80 - lea eax,[eax+eax*4] - shl eax,4 - cmp [post],eax - jg still ; goto still if [post] > ([lines]-[slines]-1)*80 - - add [post],80 - call clear_screen - call drawfile - call draw_vertical_scroll -;call calc_scroll_size_and_pos - - jmp still - - .do1: - pusha - mov eax,[post] - cdq - mov ebx,80 - div ebx - add eax,[posy] - inc eax - cmp eax,[lines] - jb .do10 - popa - jmp still - - .do10: - popa - inc ecx - mov [posy],ecx - call drawfile - call draw_vertical_scroll -;call calc_scroll_size_and_pos - - jmp still -; DOWN } - - - nodown: - - -; LEFT { - cmp al,128+48 - jnz noleft - cmp [posx],0 - je still - dec [posx] - call drawfile - jmp still -; LEFT } - - - noleft: - - -; RIGHT { - cmp al,131+48 - jnz noright - cmp [posx],79 - je still - inc [posx] - call drawfile - jmp still -; RIGHT } - - - noright: - - -; PAGE_UP { - page_up: - cmp al,136+48 - jnz nopu -scrl_up: - mov eax,[slines] - dec eax -; imul eax,80 - lea eax,[eax+eax*4] - shl eax,4 - mov ecx,[post] - cmp eax,ecx - jbe pu1 - mov ecx,eax - pu1: - sub ecx,eax - mov [post],ecx - - call clear_screen - call drawfile - call draw_vertical_scroll -;call calc_scroll_size_and_pos - jmp still -; PAGE_UP } - - - nopu: - - -; PAGE_DOWN { - page_down: - cmp al,135+48 - jnz nopd -scrl_down: - mov eax,[lines] - cmp eax,[slines] - jb still - - mov eax,[post] ; eax = offset - cdq - mov ebx,80 - div ebx ; eax /= 80 - mov ecx,[lines] ; ecx = lines in the file - cmp eax,ecx ; if eax < ecx goto pfok - jnb still - mov eax,[slines] ; eax = lines on the screen - dec eax ; eax-- -; imul eax,80 ; eax *= 80 - lea eax,[eax+eax*4] - shl eax,4 - add [post],eax ; offset += eax - - mov eax,[lines] ; eax = lines in the file - sub eax,[slines] ; eax -= lines on the screen -; imul eax,80 ; eax *= 80 - lea eax,[eax+eax*4] - shl eax,4 - cmp [post],eax - jb @f - mov [post],eax - @@: - - call clear_screen - call drawfile - call draw_vertical_scroll -;call calc_scroll_size_and_pos - - jmp still -; PAGE_DOWN } - - nopd: - -; HOME { - cmp al,132+48 - jnz nohome - - push 0 - pop [posx] - - call drawfile - jmp still -; HOME } - - - nohome: - - -; END { - end_key: - cmp al,133+48 - jnz noend - - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - - mov esi,eax - add eax,80+1 - -@@: dec eax - cmp eax,esi - je @f - cmp byte [eax-1],' ' - jbe @b -@@: - sub eax,esi - cmp eax,80-1 - jbe @f - dec eax -@@: - mov [posx],eax - - call drawfile - jmp still -; END } - - - noend: - - -; GO_START { - cmp al,251 ; Ctrl + [ - jnz no_go_to_start - - push 0 - pop [post] ; offset = 0 - - call clear_screen - call drawfile ; draw file - call draw_vertical_scroll -;call calc_scroll_size_and_pos - jmp still ; go to still -; GO_START } - - - no_go_to_start: - - -; GO_END { - cmp al,253 ; Ctrl + ] - jnz no_go_to_end - cmp [lines],30 ;to fix ctrl+] bug - jb @f - mov eax,[lines] ; eax = lines in the file - sub eax,[slines] ; eax -= lines on the screen -; imul eax,80 ; eax *= 80 (length of line) - lea eax,[eax+eax*4] - shl eax,4 - mov [post],eax ; offset in the file - - call clear_screen - call drawfile ; draw file - call draw_vertical_scroll - @@: - jmp still ; go to still -; GO_END } - - - no_go_to_end: - - -; DELETE { - cmp al,134+48 - jne nodel - - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - add eax,[posx] - mov ecx,eax - - imul eax,[posy],80 - add eax,0x80000+79 - add eax,[post] - mov ebx,eax - - push ebx - - dec ecx - dec ebx - - - push ecx ebx - - push ebx - - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - mov ecx,eax - - xor eax,eax - cdq - - pop ebx - - dec ecx - @@: - inc ecx - mov dh,[ecx] - cmp dh,33 - jb .nok - xor eax,eax - inc eax - .nok: - cmp ecx,ebx - jb @b - - pop ebx ecx - - @@: - inc ecx - mov dl,[ecx+1] - mov [ecx],dl - cmp ecx,ebx - jb @b - - - pop ebx - mov [ebx],byte 32 - - test eax,eax - jz dellinesup - - call clear_screen - call drawfile - mov [modified],1 - - jmp still - - dellinesup: - - ; lines -1 - - pusha - - mov eax,[post] - cdq - mov ebx,80 - div ebx - add eax,[posy] - inc eax - - cmp eax,[lines] - jb @f - - popa - mov [modified],1 - - jmp still - - @@: - - popa - - dec [lines] - - ; lines up - - mov [posx],dword 0 - - imul eax,[posy],80 - add eax,0x80000-1 - add eax,[post] - mov ebx,eax - - push ebx - - imul eax,[lines],80 - add eax,0x80000-1 - add eax,[post] - mov ecx,eax - - pop ebx - - @@: - mov dl,[ebx+80] - mov [ebx],dl - inc ebx - - cmp ecx,ebx - jnz @b - - call clear_screen - call drawfile - mov [modified],1 - - jmp still -; DELETE } - - - nodel: - - -; INSERT { - cmp al,137+48 - jnz noins - - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - add eax,[posx] - mov ecx,eax - ; ecx = [posy]*80+0x80000+[post]+[posx] - - imul eax,[posy],80 - add eax,0x80000+79 - add eax,[post] - mov ebx,eax - ; ebx = [posy]*80+0x80000+79+[post] - - .movstr: - dec ebx - mov dl,[ebx] - mov [ebx+1],dl - cmp ecx,ebx - jb .movstr - - mov [ecx],byte ' ' - - call invalidate_string - call drawfile - mov [modified],1 - - jmp still -; INSERT } - - - noins: - - -; BACKSPACE { - cmp al,8 - jnz nobs - mov ecx,[posx] - test ecx,ecx - jz still - dec ecx - mov [posx],ecx - - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - add eax,[posx] - mov ebx,eax - - push ebx - - imul eax,[posy],80 - add eax,0x80000+79 - add eax,[post] - mov ebx,eax - - pop ecx - - push ebx - - dec ecx - .movleft: - inc ecx - mov dl,[ecx+1] - mov [ecx],dl - cmp ecx,ebx - jb .movleft - - pop ebx - mov [ebx],byte ' ' - - call invalidate_string - call drawfile - mov [modified],1 - - jmp still -; BACKSPACE } - - - nobs: - - -; TAB { - cmp eax,9 ; Tab - jne notab - - mov eax,[posx] - cmp eax,80-1 - jae still - add eax,5 ; 9 5 3 - and eax,11111100b ; ...1000b, ...100b, ...10b - dec eax - mov [posx], eax - - call drawfile - mov [modified],1 - - jmp still -; TAB } - - - notab: - - -; ADD_KEY { - push eax ; add key - - imul eax,[posy],80 - add eax,0x80000 - add eax,[post] - add eax,[posx] - mov ecx,eax - - push ecx - - imul eax,[posy],80 - add eax,0x80000+79 - add eax,[post] - mov ebx,eax - - .movright: - dec ebx - mov al,[ebx] - mov [ebx+1],al - cmp ecx,ebx - jbe .movright - - pop ebx - - pop eax - - mov [ebx],al - mov edx,78 - mov ecx,[posx] - cmp edx,ecx - jb noxp - inc ecx - mov [posx],ecx - noxp: - - call invalidate_string - call drawfile - mov [modified],1 -; call draw_vertical_scroll - jmp still -; ADD_KEY } - - -;****************************************************************************** - -start_fasm: - cmp [asm_mode],1 - je @f - ret - @@: - mov esi,filename - mov edi,fasm_parameters - - cmp byte [esi],'/' - je .yes_systree - - mov ecx,[filename_len] - rep movsb - - mov al,',' - stosb - - mov ecx,[filename_len] - add ecx,-4 - mov esi,filename - rep movsb - - mov al,',' - stosb - - mov [edi],dword '/RD/' - add edi,4 - mov [edi],word '1/' - inc edi - inc edi - - mov al,0 - stosb - - jmp .run - - .yes_systree: - add esi,[filename_len] - dec esi - - xor ecx,ecx - mov al,'/' - @@: - cmp [esi],al - je @f - dec esi - inc ecx - jmp @b - @@: - inc esi - - push esi - push esi - push ecx - - rep movsb - - mov al,',' - stosb - - pop ecx - pop esi - - add ecx,-4 - rep movsb - - mov al,',' - stosb - - pop ecx - sub ecx,filename - mov esi,filename - - rep movsb - - mov al,0 - stosb - - .run: - cmp [run_outfile],1 - jne @f - dec edi - mov eax,',run' - stosd - mov al,0 - stosb - @@: - - mov eax,19 - mov ebx,fasm_filename - mov ecx,fasm_parameters - int 0x40 -ret - -open_debug_board: - mov eax,19 - mov ebx,debug_filename - xor ecx,ecx - int 0x40 -ret - -open_sysfuncs_txt: - mov eax,19 - mov ebx,tinypad_filename - mov ecx,sysfuncs_filename - int 0x40 -ret - - -empty_work_space: -; очистить все - mov eax,' ' - mov edi,0x80000 - mov ecx,(0x300000-0x90000)/4 - cld - rep stosd - mov edi,0x10000 - mov ecx,0x60000/4 - rep stosd -ret - - -clear_screen: -; очистить экран - mov ecx,80*40 - mov edi,0x78000 - xor eax,eax - @@: - mov [edi],eax - add edi,4 - dec ecx - jnz @b -ret - -invalidate_string: - imul eax,[posy],80 - add eax,0x78000 - mov edi,eax - mov al,1 - mov ecx,80/4 - rep stosd -ret - -layout: -; сменить раскладку клавиатуры - mov eax,19 - mov ebx,setup - mov ecx,param_setup - int 0x40 - mov eax,5 - mov ebx,eax - int 0x40 - call activate_me -ret - - -activate_me: -; 1) get info about me - mov eax,9 - mov ebx,procinfo - mov ecx,-1 - int 0x40 - ; eax = number of processes - -; save process counter - inc eax - inc eax - mov [proccount],eax - - mov eax,[procinfo.PID] - mov [PID],eax - -; 2) get my process number - mov eax,9 - mov ebx,procinfo - mov ecx,[proccount] - @@: - dec ecx - jz @f ; counter=0 => not found? => return - mov eax,9 - int 0x40 - mov edx,[procinfo.PID] - cmp edx,[PID] - jne @b - - ;found: ecx = process_number - mov eax,18 - mov ebx,3 - int 0x40 - - mov eax,5 - mov ebx,eax - int 0x40 - - @@: -ret - - - - -; ******************************************************************* -; ************************** DRAW WINDOW ************************** -; ******************************************************************* - -align 4 -drawwindow: - - mov eax,12 ; WINDOW DRAW START - mov ebx,1 - int 0x40 - mov [menu_is_on],0 - mov eax,48 ; get system colors - mov ebx,3 - mov ecx,sc - mov edx,sizeof.system_colors - int 0x40 - - mov [sc.work],0xe0e0e0 - - xor eax,eax ; DEFINE WINDOW - mov ebx,100*65536+506 ; 496 - mov ecx,75*65536+400 ;385;400 ; sum < 480 for 640x480 - mov edx,[sc.work] - add edx,0x03000000 - mov esi,[sc.grab] - or esi,0x80000000 - mov edi,[sc.frame] - int 0x40 - -; header string - mov eax,4 - mov ebx,10*65536+8 - mov ecx,[sc.grab_text] - mov edx,header - mov esi,[headlen] - int 0x40 - - mov eax,9 ; get info about me - mov ebx,procinfo - or ecx,-1 - int 0x40 - - mov eax,[procinfo.y_size] - - mov [do_not_draw],1 ; do_not_draw = true - cmp eax,100 - jb .no_draw ; do not draw text & buttons if height < 100 - mov [do_not_draw],0 ; do_not_draw = false - add eax,-(46+47) ; 46 = y offs - cdq - mov ebx,10 - div ebx - mov [slines],eax - - cmp eax,[posy] - jnb @f - dec eax - mov [posy],eax - @@: - - mov eax,[procinfo.y_size] ; calculate buttons position - add eax,-47 - mov [dstart],eax - -; mov eax,8 ; STRING BUTTON -; mov ebx,5*65536+57 -; mov ecx,[dstart] -; add ecx,29 -; shl ecx,16 -; add ecx,13 -; mov edx,51 ;;;;;-----string button ID=51 -; mov esi,[sc.work_button] -; int 0x40 - ; SEARCH BUTTON -; mov ebx,(505-129)*65536+125 -; mov edx,50 -; mov esi,[sc.work_button] -; int 0x40 - -; mov eax,4 ; SEARCH TEXT -; mov ebx,[dstart] -; add ebx,7*65536+32 -; mov ecx,[sc.work_button_text] -; mov edx,searcht -; mov esi,searchtl-searcht -; int 0x40 - - - mov eax,13 ; BAR STRIPE - mov ebx,5*65536+497 - mov ecx,[dstart] - shl ecx,16 - add ecx,30 ;15 - - mov edx,0x00aaaaaa - int 0x40 - -; mov eax,4 ; FIRST TEXT LINE (POSITION...) -; mov ebx,12*65536 -; add ebx,[dstart] -; add ebx,38 ;18 -; mov ecx,[sc.work_button_text] -; mov edx,htext2 -; mov esi,htextlen2-htext2 -; int 0x40 - - - call drawfile - -; mov eax,[dstart] - -; add eax,31 -; mov [ya],eax -; mov [addr],search_string -; call print_text - - .no_draw: - call draw_win_menu - - call draw_vertical_scroll - - mov eax,12 ; WINDOW DRAW END - mov ebx,2 - int 0x40 - - ret - - - - -; ********************************** -; *********** DRAWFILE *********** -; ********************************** - -drawfile: -;--------------- -cmp [menu_is_on],1 -jne .ff -call drawwindow -.ff: -;--------------- - mov [next_not_quote],1 - mov [next_not_quote2],1 - - mov eax,[post] ; print from position - - pusha - - mov edi,[post] - mov [posl],edi - - mov ebx,8*65536+46 ; letters (46 = y offs) - xor ecx,ecx - - mov edx,0x80000 - add edx,eax - mov edi,edx - - imul esi,[slines],80 - add edi,esi - - - nd: - - pusha - - mov edx,ebx - mov edi,ebx - add edi,(6*65536)*80 - - wi1: - - - ; draw ? - - - pusha - - push ecx - - imul eax,[posx],6 - add eax,8 - shl eax,16 - mov ecx,eax - -;  ecx = ([posx]*6+8)<<16 - - imul eax,[posy],10 - add eax,46 ; y offs - add eax,ecx - -;  eax = [posy]*10+46+ecx - - pop ecx - - cmp edx,eax - jnz drwa - - mov eax,0x7ffff - call check_pos - jmp drlet - - drwa: - - popa - - - pusha - - imul eax,[posxm],6 - add eax,8 - shl eax,16 - mov ecx,eax - - imul eax,[posym],10 - add eax,46 ; y offs - add eax,ecx - - cmp edx,eax - jnz drwa2 - - mov eax,0x7ffff - call check_pos - jmp drlet - - drwa2: - - popa - - pusha - - mov eax,0x78000 ; screen - add eax,[posl] ; screen+abs - sub eax,[post] ; eax = screen+abs-base = y*80+x + screen - - mov edx,0x80000 ; file - add edx,[posl] ; edx = absolute - mov bl,[edx] ; in the file - - call check_pos - - mov cl,[eax] ; on the screen - cmp bl,cl - jnz drlet - - popa - - jmp nodraw - - - ; draw letter - - - drlet: - - mov [eax],bl ; mov byte to the screen - mov [tmpabc],bl - popa ; restore regs - -;!!!!!!!!!!!! - - cmp [tmpabc],' ' - je @f - call draw_letter - jmp nodraw - @@: - call clear_char - - nodraw: - - inc [posl] - - add edx,6*65536 - cmp edx,edi - jz wi3 - jmp wi1 - - wi3: - - popa - - add ebx,10 - add edx,80 - cmp edi,edx - jbe nde - jmp nd - - nde: - - mov eax,[posx] - mov ebx,[posy] - - mov [posxm],eax - mov [posym],ebx - - popa - - ret - - stText = 0 - stInstr = 1 - stReg = 2 - stNum = 3 - stQuote = 4 - stComment = 5 - stSymbol = 6 - -align 4 - -clear_char: - - pusha - mov ebx,[sc.work] - - push ecx - - imul eax,[posx],6 - add eax,8 - shl eax,16 - mov ecx,eax - - imul eax,[posy],10 - add eax,46 ; 26 - add eax,ecx - - pop ecx - cmp edx,eax - jnz @f - mov ebx,0xffffff ; light blue 0x00ffff - @@: - - ; draw bar - push ebx - mov eax,13 - mov ebx,edx - mov bx,6 - mov ecx,edx - shl ecx,16 - add ecx,10 - pop edx - int 0x40 - popa - ret - -align 4 - -; CHECK_POSITION { -check_pos: - cmp [asm_mode],1 - je @f - - mov [d_status],stText - ret - - @@: - pushad - -; COMMENT TERMINATOR - cmp [d_status],stComment - jnz @f - mov eax,[posl] - sub eax,[post] - cdq - mov ebx,80 - div ebx - test edx,edx - jnz end_check_pos - mov [d_status],stText - @@: - -; QUOTE TERMINATOR B - cmp [next_not_quote],1 - jne @f - mov [d_status],stText - @@: - - mov eax,[posl] - add eax,0x80000 - mov edx,eax - mov al,[eax] - -; QUOTE TERMINATOR A - cmp [d_status],stQuote - jnz @f - cmp al,[quote] - jne end_check_pos - mov [next_not_quote],1 - jmp end_check_pos - @@: - mov [next_not_quote],0 - -; START QUOTE 1 - cmp al,"'" - jne @f - mov [d_status],stQuote - mov [quote],al - jmp end_check_pos - @@: - -; START QUOTE 2 - cmp al,'"' - jne @f - mov [d_status],stQuote - mov [quote],al - jmp end_check_pos - @@: - -; START COMMENT - cmp al,';' - jne @f - mov [d_status],stComment - jmp end_check_pos - @@: - -; NUMBER TERMINATOR - cmp [d_status],stNum - jne nonumt - mov ecx,23 - @@: - dec ecx - jz nonumt - cmp al,[symbols+ecx] - jne @b - - nonumt1: - mov [d_status],stText - nonumt: - -; START NUMBER - cmp [d_status],stNum - je end_check_pos - cmp al,'0' - jb nonum - cmp al,'9' - ja nonum - mov bl,[edx-1] - mov ecx,23 - @@: - dec ecx - jz nonum - cmp bl,[symbols+ecx] - jne @b - @@: - mov [d_status],stNum - jmp end_check_pos - nonum: - -; SYMBOL - mov esi,symbols - mov ecx,21 - @@: - cmp byte [esi],al - je @f - dec ecx - jz nosymbol - inc esi - jmp @b - @@: - mov [d_status],stSymbol - jmp end_check_pos - - nosymbol: - mov [d_status],stText - - end_check_pos: - popad - ret -; CHECK_POSITION } - - -;;;;;;;;;;;;;;;;; -;; DRAW LETTER ;; -;;;;;;;;;;;;;;;;; -draw_letter: - - call clear_char - - pusha - - mov ebx,edx ; x & y - - mov eax,[d_status] - mov ecx,[eax*4+color_tbl] - mov eax,4 - - xor esi,esi - inc esi - mov edx,0x80000 - mov edi,[posl] - add edx,edi - int 0x40 - - popa - - ret - - -; ******************************************** -; **************** SAVEFILE **************** -; ******************************************** -save_file: - mov esi,0x80000 - mov edi,0x10000 - or ecx,-1 - .new_string: - inc ecx - call save_string - cmp ecx,[lines] - jb .new_string - - sub edi,0x10004 ; why??? - mov [filelen],edi - - cmp byte [filename],'/' - je .systree_save - - mov eax,33 - mov ebx,filename - mov ecx,0x10000 - mov edx,[filelen] - xor esi,esi - int 0x40 - - test eax,eax - je .finish -; call file_not_found - call disk_is_full -;============================== - jmp .finish - - .systree_save: - mov eax,[filelen] - mov [fileinfo_write+8],eax - - mov esi,filename - mov edi,pathfile_write - mov ecx,50 - cld - rep movsb - - mov eax,58 - mov ebx,fileinfo_write - int 0x40 - cmp eax,0 - je .finish - call disk_is_full - .finish: -call draw_window_for_dialogs - mov [modified],0 -ret - -save_string: - push ecx - push esi - mov eax,esi - mov ebx,eax - add ebx,79 - .countlen: - cmp ebx,eax - jb .endcount - cmp byte [ebx],' ' - jne .endcount - dec ebx - jmp .countlen - .endcount: - inc ebx - sub ebx,eax - - mov ecx,ebx - jecxz .endcopy - .copystr: - mov al,[esi] - mov [edi],al - inc esi - inc edi - dec ecx - jnz .copystr - .endcopy: - - mov eax,0x0a0d - stosw - - pop esi - add esi,80 - pop ecx -ret - - - -; ******************************************** -; **************** LOADFILE **************** -; ******************************************** - -loadhdfile: - - mov esi,filename - mov edi,pathfile_read - mov ecx,250 ;50 - cld - rep movsb - - mov eax,58 - mov ebx,fileinfo_read - int 0x40 - - xchg eax,ebx - inc eax - test ebx,ebx ;errorcode=0 - ok - je file_found - cmp ebx,6 ;errorcode=5 - ok - je file_found - call file_not_found - ret - - -loadfile1: - - mov eax,6 ; 6 = open file - mov ebx,filename - xor ecx,ecx - mov edx,16800 - mov esi,0x10000 - int 0x40 - - inc eax ; eax = -1 -> file not found - jnz file_found ;strannaya proverka (Ed) - - call file_not_found - ret - - - file_found: - dec eax -; eax = file size - jz .finish - mov [filesize],eax - - mov edi,0x80000 ; clear all - @@: - mov [edi],byte ' ' - inc edi - cmp edi,0x2effff - jnz @b - - mov [lines],0 - mov edi,0x10000 - mov ebx,0x80000 - -; edi = from -; ebx = to -; eax = filesize - - .new_char: - mov cl,[edi] ; get_char(); - cmp cl,13 ; if (char==13) - je .new_str1 ; goto .new_str1; - cmp cl,10 ; if (char==10) - je .new_str2 ; goto .new_str2; - mov [ebx],cl ; store_char(); - inc ebx ; dest++; - .back: - inc edi ; src++; - dec eax ; counter--; - jnz .new_char ; if (counter!=0) goto .new_char; - - .finish: - inc [lines] ; [lines]++; - ret - - .new_str1: - pusha - mov eax,ebx ; eax = destination - add eax,-0x80000 ; eax = offset - cdq - mov ecx,80 - div ecx ; offset /= 80; - test edx,edx ; if not the first char in the string - jne @f ; go forward - test eax,eax ; if first line - je @f ; go forward - cmp [edi-1],byte 10; if previous char != 10 continue without line feed - jne .contin - @@: - inc eax ; offset++; - imul eax,80 ; offset *= 80; - add eax,0x80000 - mov [esp+4*4],eax ; to ebx - .contin: - popa - inc edi ; do not look on the next char (10) - dec eax ; counter--; - inc [lines] ; [lines]++; - jmp .back - - - .new_str2: - pusha - mov eax,ebx - add eax,-0x80000 - cdq - mov ecx,80 - div ecx - inc eax - imul eax,80 - add eax,0x80000 - mov [esp+4*4],eax ; to ebx - popa - inc [lines] - jmp .back - - -file_not_found: - mov eax,55 ; beep - mov ebx,eax - mov esi,error_beep - int 0x40 - mov [lines],1 ; open empty document - - mov [to_return2],1 - call openerror - - ret - -disk_is_full: - mov eax,55 ; beep - mov ebx,eax - mov esi,error_beep - int 0x40 - mov [to_return2],1 - call saveerror - mov [error2_found],1 -ret - - -; ***************************** -; ****** WRITE POSITION ****** -; ***************************** - -writepos: - - cmp [do_not_draw],1 ; return if drawing is not permitted - jne @f - ret - @@: - - pusha - - mov eax,[posx] - inc eax - cdq - mov ebx,10 - div ebx - add al,'0' - add dl,'0' - mov [htext2+ 9],al - mov [htext2+10],dl - - mov eax,[post] - cdq - mov ebx,80 - div ebx - mov [real_posy],eax ;=====!!!!!!!!! - - add eax,[posy] - inc eax - mov ebx,10 - cdq - div ebx - add dl,'0' - mov [htext2+16],dl ; 00001 - cdq - div ebx - add dl,'0' - mov [htext2+15],dl ; 00010 - cdq - div ebx - add dl,'0' - mov [htext2+14],dl ; 00100 - cdq - div ebx - add dl,'0' - add al,'0' - mov [htext2+13],dl ; 01000 - mov [htext2+12],al ; 10000 - - - mov eax,[lines] ; number of lines - cdq - mov ebx,10 - div ebx - add dl,'0' - mov [htext2+31],dl ; 0001 - cdq - div ebx - add dl,'0' - mov [htext2+30],dl ; 0010 - cdq - div ebx - add dl,'0' - mov [htext2+29],dl ; 0100 - cdq - div ebx - add dl,'0' - add al,'0' - mov [htext2+28],dl - mov [htext2+27],al ; 10000 - -; НАДО БЫ ОТОБРАЖАТЬ РАСКЛАДКУ КЛАВИАТУРЫ! -; mov [htext2+42], word 'RU' - -; mov eax,13 ; draw bar -; mov ebx,5*65536+38*6 -; mov ecx,[dstart] -; shl ecx,16 -; add ecx,15 -; mov edx,[sc.work_graph] -; int 0x40 - - mov eax,13 ; BAR STRIPE - mov ebx,5*65536+497 - mov ecx,[dstart] - add ecx,29;30 ;15 - shl ecx,16 - add ecx,14 - mov edx,[sc.work_graph] - int 0x40 - - mov eax,4 ; write position - mov ebx,12*65536 - mov bx,word [dstart] - add ebx,33 ;18 - mov ecx,[sc.work_button_text] - mov edx,htext2 - mov esi,38 - int 0x40 - - cmp [modified],1 - jne no_mod - putlabel 270,386,'ИЗМЕНЕН',[sc.work_button_text] - no_mod: - popa - - ret - -;----------------------------- -; search window -;----------------------------- -search_window: - -mov eax,13 -mov ebx,55*65536+380 -mov ecx,100*65536+60 -mov edx,[sc.work_graph] -int 0x40 - -mov eax,38 -mov ebx,55*65536+435 -mov ecx,100*65536+100 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,55*65536+55 -mov ecx,100*65536+160 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,435*65536+435 -mov ecx,100*65536+160 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,55*65536+435 -mov ecx,160*65536+160 -mov edx,cl_White -int 0x40 - - -drawlbut 375,110,50,15,'Поиск',50,[sc.work_button],[sc.work_button_text] -drawlbut 375,130,50,15,'Отмена',94,[sc.work_button],[sc.work_button_text] - -call read_string - -; add eax,31 -; mov [ya],eax -; mov [addr],search_string -; call print_text - - - -jmp search - -string_not_found: - mov eax,13 - mov ebx,150*65536+200 - mov ecx,100*65536+70 - mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512 - int 0x40 - -mov eax,38 -mov ebx,150*65536+350 -mov ecx,100*65536+100 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,150*65536+350 -mov ecx,170*65536+170 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,150*65536+150 -mov ecx,100*65536+170 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,350*65536+350 -mov ecx,100*65536+170 -mov edx,cl_White -int 0x40 - - - putlabel 195,120,'Строка не найденна!',cl_White - - drawlbut 235,140,30,15,'Ок',94,[sc.work_button],cl_White - -ret - -read_string: - -push eax -;---------------- -mov eax,40 -mov ebx,00000000000000000000000000000111b -int 0x40 -;---------------- -pop eax - -; cmp al,51 -; jz .f2 -; ret - - .f2: - mov [addr],dword search_string - mov eax,[dstart] - add eax,17+14 - mov [ya],eax - mov [case_sens],1 - - .rk: - - mov edi,[addr] - - mov eax,[addr] - mov eax,[eax-4] - mov [temp],eax - - add edi,eax - - call print_text - - .waitev: - mov eax, 10 - int 0x40 - cmp eax, 2 - jne .read_done - int 0x40 - shr eax, 8 - - cmp al, 13 ; enter - je .read_done - - cmp al,27 - jne ._f - jmp red - ._f: - cmp al, 192 ; Ctrl + space - jne .noclear - - xor eax, eax - mov [temp], eax - mov edi, [addr] - mov [edi-4], eax - mov ecx, 49 - cld - rep stosb - mov edi, [addr] - call print_text - jmp .waitev - - .noclear: - - cmp al, 8 ; backspace - jnz .nobsl - cmp [temp], 0 - jz .waitev - dec [temp] - mov edi, [addr] - add edi, [temp] - mov [edi], byte 0 - - mov eax,[addr] - dec dword [eax-4] - - call print_text - jmp .waitev - - .nobsl: - cmp [temp],50 - jae .read_done - -; CONVERT CHAR TO UPPER CASE: - cmp al, ' ' ; below "space" - ignore - jb .waitev - cmp [case_sens], 1 ; case sensitive? - je .keyok - cmp al, 'a' - jb .keyok - cmp al, 'z' - ja .keyok - sub al, 32 - .keyok: - - mov edi,[addr] - add edi,[temp] - mov [edi],al - - inc [temp] - - mov eax,[addr] - inc dword [eax-4] - call print_text - - cmp [temp],50 - jbe .waitev - - .read_done: - mov ecx,50 - sub ecx,[temp] - mov edi,[addr] - add edi,[temp] - xor eax,eax - cld - rep stosb - - mov [temp],987 - - call print_text - call mask_events - ret - - -print_text: - - pusha - - mov eax,13 - mov ebx,64*65536+50*6+2 -; mov ecx,[ya] -; shl ecx,16 -; add ecx,12 - mov ecx,110*65536+12 - mov edx,[sc.work] - int 0x40 - - mov edx,[addr] - mov esi,[edx-4] - mov eax,4 - mov ebx,65*65536+112 ;2 -; add ebx,[ya] - mov ecx,[color_tbl+0] - int 0x40 - - cmp [temp],50 - ja @f - -; draw cursor -; { -; mov eax,[ya] - mov eax,18*65536+102 ;65 - mov ebx,eax - shl eax,16 - add eax,ebx - add eax,10 - mov ecx,eax - - mov eax,[temp] -; imul eax,6 - lea eax,[eax+eax*2] - shl eax,1 - add eax,65 - mov ebx,eax - shl eax,16 - add ebx,eax - - mov eax,38 - mov edx,[color_tbl+0] - int 0x40 -; } - -@@: - popa - - ret - - - -; mov eax,8 ; STRING BUTTON -; mov ebx,5*65536+57 -; mov ecx,[dstart] -; add ecx,29 -; shl ecx,16 -; add ecx,13 -; mov edx,51 ;;;;;-----string button ID=51 -; mov esi,[sc.work_button] -; int 0x40 - ; SEARCH BUTTON -; mov ebx,(505-129)*65536+125 -; mov edx,50 -; mov esi,[sc.work_button] -; int 0x40 - -; mov eax,4 ; SEARCH TEXT -; mov ebx,[dstart] -; add ebx,7*65536+32 -; mov ecx,[sc.work_button_text] -; mov edx,searcht -; mov esi,searchtl-searcht -; int 0x40 - - - -; **************************** -; ******* READ STRING ******** -; **************************** -goto_string: - -mov [num_goto_string],0 -call read_str_num -mov eax,[num_goto_string] -cmp eax,[lines] -ja .leave - -;--------------- -mov [posy],0 -call goto_pos - -.leave: -call draw_window_for_dialogs -call mask_events - -jmp still - - -read_str_num: -push eax -;---------------- -mov eax,40 -mov ebx,00000000000000000000000000000111b -int 0x40 -;---------------- -pop eax - -mov eax,13 -mov ebx,100*65536+100 -mov ecx,70*65536+60 -mov edx,[sc.work_button] -int 0x40 - - -mov eax,38 -mov ebx,100*65536+200 -mov ecx,70*65536+70 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,100*65536+200 -mov ecx,130*65536+130 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,100*65536+100 -mov ecx,70*65536+130 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,200*65536+200 -mov ecx,70*65536+130 -mov edx,cl_White -int 0x40 - - - -putlabel 105,75,'GoTo Line #',cl_White - mov eax,13 - mov ebx,110*65536+40 - mov ecx,90*65536+12;[ya] - mov edx,[sc.work] - int 0x40 - -outcount [num_goto_string],112,92,cl_Black,6*65536 -drawlbut 110,105,40,15,'GoTo',93,cl_Grey,cl_Black -drawlbut 153,105,40,15,'Cancel',94,cl_Grey,cl_Black - .waitev: - mov eax, 10 - int 0x40 -; cmp eax,6 -; je .mouse - cmp eax,3 - je .but - cmp eax, 2 -; jne .read_done - jne .waitev - int 0x40 - shr eax, 8 - - cmp al, 13 ; enter - je .read_done - cmp al,27 - je goto_string.leave - cmp al, 8 ; backspace - jnz .nobsl - -xor edx,edx - -mov eax,[num_goto_string] -mov ebx,dword 10 -div ebx -mov [num_goto_string],eax -call print_text2 -jmp .waitev - -;.mouse: -;mov eax,37 -;mov ebx,2 -;int 0x40 -;cmp eax,2 -;je goto_string.leave -;jmp .waitev - -.but: -mov eax,17 -int 0x40 -cmp ah,94 -je goto_string.leave -cmp ah,93 -je .read_done -jmp .waitev - - - .nobsl: -xor ecx,ecx -xor edx,edx - -sub al,48 -mov cl,al - -mov eax,[num_goto_string] -cmp eax,99999 -ja .read_done -mov ebx,10 -mul ebx -add eax,ecx -mov [num_goto_string],eax - -call print_text2 -jmp .waitev - - .read_done: -mov eax,[num_goto_string] -dec eax -mov [num_goto_string],eax - call print_text2 - ret - - -print_text2: - - pusha - - mov eax,13 - mov ebx,110*65536+40 - mov ecx,90*65536+12;[ya] - mov edx,[sc.work] - int 0x40 - -outcount [num_goto_string],112,92,cl_Black,6*65536 - popa - - ret - -;****************************************************************************** -calc_scroll_size_and_pos: - -;cmp [menu_is_on],0 -;je ._ff -;call drawwindow -;mov [menu_is_on],0 -;._ff: - -cmp [lines],30 -jbe .lines_less_30 - -xor edx,edx -mov eax,[post] -mov ebx,80 -div ebx -add eax,[posy] -;add eax,[slines] - -;checking for bug -mov ebx,[lines] -sub ebx,30 - -cmp eax,ebx -ja .f -mov [VScroll_1+16],eax -jmp .ff -.f: -mov [VScroll_1+16],ebx - -.ff: -;--------------------- -mov eax,[lines] -sub eax,30 ;---max=lines-30 -mov [VScroll_1+12],eax -jmp .leave - -.lines_less_30: - -mov [VScroll_1+16],dword 0 -mov [VScroll_1+12],dword 1 - -.leave: - -ret -;============Draw vertical scroll bar========= -draw_vertical_scroll: -call calc_scroll_size_and_pos -;======================== - xor ecx,ecx ;start at top of controls list -Draw_Controls_Loop: ;Redraw Controls Loop - mov ebp, [App_Controls+ecx] ;get controls data location - or ebp,ebp ;is this the last control? - jz Draw_Controls_Done ; - call dword [App_Controls+ecx+4] ;call controls draw function - add ecx, 12 ;get next control - jmp Draw_Controls_Loop ;loop till done -Draw_Controls_Done: ;all done -;======================== - -mov eax,38 -mov ebx,488*65536+488 -mov ecx,43*65536+388 -mov edx,0x00000000 -int 0x40 -ret - -mouse_info: -;call - mov eax, 37 ;get mouse cordinates - mov ebx, 1 ; - int 0x40 ; - mov ecx, eax ; - push ecx ; - mov eax, 37 ;get mouse buttons - mov ebx, 2 ; - int 0x40 ; -;------------------ -; if menu is on - then we need to redraw window before continue -cmp eax,1 -jne ._f1 - -pusha -cmp [menu_is_on],0 -je ._ff -call drawwindow -mov [menu_is_on],0 -._ff: -popa - -._f1: -;------------------ - cmp [mouseb], eax ;compare old mouse states to new states - jne redraw_mouse_info ; - cmp [mousey], cx ; - jne redraw_mouse_info ; - shr ecx, 16 ; - cmp [mousex], cx ; - jne redraw_mouse_info ; - pop ecx ; -ret ;return if no change in states -redraw_mouse_info: - pop ecx - mov [mouseb], eax ;save new mouse states - mov dword [mousey], ecx - xor ecx, ecx -Check_Mouse_Over_Controls_Loop: - mov ebp, [App_Controls+ecx] - or ebp, ebp - jz Check_Mouse_Over_Controls_Loop_done - - movzx eax,word [ebp+2] - cmp ax, [mousex] - ja mouse_not_on_control - movzx eax,word [ebp+6] - cmp ax, [mousey] - ja mouse_not_on_control - movzx eax,word [ebp] - add ax, [ebp+2] - cmp ax, [mousex] - jb mouse_not_on_control - movzx eax,word [ebp+4] - add ax, [ebp+6] - cmp ax, [mousey] - jb mouse_not_on_control - call dword [App_Controls+ecx+8] - ;------------------------------ - cmp [mouseb],1 - jne mouse_not_on_control - mov eax,[VScroll_1+16] - call goto_pos - ;------------------------------ - -mouse_not_on_control: - add ecx, 12 - jmp Check_Mouse_Over_Controls_Loop -Check_Mouse_Over_Controls_Loop_done: - -ret -;****************************************************************************** -goto_pos: -;pusha - -mov ecx,eax ;save new position number in ecx for future - -cmp [lines],30 ;check for 'cursor' bug -jbe .lines_less_30 -;--------------- - -mov edx,[lines] ;if new pos is > than (lines-30) -sub edx,30 - -cmp eax,edx -ja .f1 -jmp .ff - -.f1: -mov eax,edx ;than newpos is = (lines-30) - -sub ecx,edx ;and posY=newpos-(lines-30) -mov [posy],ecx - -.ff: - -;----------------------- - ;in eax must be string number - mov ecx,80 - mul ecx - -; add eax,[slines] -; sub -;------------------------ - mov [post],eax - -.lines_less_30: - call clear_screen - call drawfile -;popa -ret -;****************************************************************************** -mask_events: -mov eax,40 -mov ebx,00100111b -int 0x40 -ret -;****************************************************************************** -main_cursor_move: -;call drawwindow -sub [mouse_x],7 -sub [mouse_y],45 - -xor edx,edx -mov eax,[mouse_x] -mov ebx,6 -div ebx ;eax=result -mov [posx],eax - -xor edx,edx -mov eax,dword [mouse_y] -mov ebx,dword 10 -div ebx ;eax=result=new posY - -;error checking ------ -cmp [lines],dword 1 ;for "1st line" bug -je ._do_nothing - -mov ebx,[lines] -sub ebx,dword 1 - -cmp eax,ebx ;[lines] -ja ._do_nothing - -;---------------------- -mov [posy],eax - -._do_nothing: -call clear_screen -call drawfile -call draw_vertical_scroll -ret - -;****************************************************************************** -make_fast_so: -;=========================== -; 1) get info about me - mov eax,9 - mov ebx,procinfo - mov ecx,-1 - int 0x40 - ; eax = number of processes - -; save process counter - inc eax - inc eax - mov [proccount],eax - - mov eax,[procinfo.PID] - mov [PID],eax -;========================== - - -mov eax,51 -mov ebx,1 -mov ecx,fast_so_thread_start -mov edx,so_stack -int 0x40 -ret -;****************************************************************************** - -;fast save & fast open -draw_fastso_window: -startwd -colorwindow 120,100,454,70,window_Type1+0x00cccccc,0x00cccccc,cl_Black - -call draw_string00 -drawlbut 10,40,30,20,'Save',17,cl_Grey,cl_Black - -drawlbut 50,40,30,20,'Open',18,cl_Grey,cl_Black - -drawlbut 90,40,37,20,'Close',19,cl_Grey,cl_Black -endwd -ret - -draw_string00: -mov ebx,10*65536+433 -mov ecx,10*65536+20 -mov edx,0x00ffffff -mov eax,13 -int 0x40 - -push eax -mov eax,6*65536 -mul dword [pos00] -add eax,10*65536+6 -mov ebx,eax -pop eax -mov edx,0x6a73d0 -int 0x40 - -mov eax,4 -mov ebx,12*65536+17 -mov ecx,cl_Black ;0x00000000 -mov edx,mypath ;filename ;path -mov esi,71 ;200 -int 0x40 -ret - -fast_so_thread_start: -;copy filename to mypath - cld - mov esi,filename - mov edi,mypath - mov ecx,71 ;200 - rep movsb - mov edi,mypath - mov ecx,71 ;200 - xor eax,eax - repne scasb -;end copy -call draw_fastso_window - -fastso_still: - wtevent fred,fkey,fbut -jmp fastso_still - -fred: -call draw_fastso_window -jmp fastso_still - -;====KEY -fkey: - -mov eax,2 -int 0x40 - -cmp ah,179 -jne noright00 -mov eax,[pos00] -cmp eax,70 ;41 -ja fastso_still -inc eax -mov [pos00],eax -call draw_string00 -jmp fastso_still -noright00: -cmp ah,176 -jne noleft00 -mov eax,[pos00] -test eax,eax -je fastso_still -dec eax -mov [pos00],eax -call draw_string00 -jmp fastso_still -noleft00: -cmp ah,182 -jne nodelete00 -call shiftback00 -call draw_string00 -jmp fastso_still -nodelete00: -cmp ah,8 -jne noback00 -mov eax,[pos00] -test eax,eax -je fastso_still -dec eax -mov [pos00],eax -call shiftback00 -call draw_string00 -jmp fastso_still -noback00: -enter00: - -cmp ah,19 ;ctrl+s -je fast_save -cmp ah,15 ;ctrl+o -je fast_open - -cmp ah,27 ;esli escape -jne noesc00 -jmp closethis ;to zakrivaem okno i nifiga ne delayem - -noesc00: -cmp dword [pos00],71 ;200 ;42 -jae fastso_still ;if pos>71 then jump to still - -;============letters================== -;~~~~~~~TEST CODE~~~~~~~~~ -; upper case -shr eax,8 - cmp eax,dword 31 - jbe no_lit - cmp eax,dword 95 - jb capital - sub eax,32 - capital: -;~~~~~~~~~~~~~~~~~~~~~~~~~ -mov edi,mypath ;filename ;mypath ;**************PATHNAME -add edi,71 ;200 ;count of letters -mov esi,edi -dec esi -mov ecx,71 ;200 ;again??? -sub ecx,[pos00] -std -rep movsb - -;shr eax,8 -mov esi,mypath ;filename ;*************PATH AGAIN -add esi,[pos00] -mov byte [esi],al -inc dword [pos00] -call draw_string00 - -no_lit: -jmp fastso_still -;=============================== -shiftback00: -mov edi,mypath ;filename ;******PATH -add edi,[pos00] -mov esi,edi -inc esi -mov ecx,71 ;200 ; count??? -sub ecx,[pos00] -cld -rep movsb -ret - -;****************************************************************************** - -;====button -fbut: -mov eax,17 -int 0x40 -cmp ah,17 -je fast_save -cmp ah,18 -je fast_open -cmp ah,19 -je closethis -jmp fastso_still -;****************************************************************************** -;****************************************************************************** - -fast_open: -call path_copy -call set_title -mov [to_return],1 -call do_load_file -jmp closethis -fast_save: -call path_copy -call save_file -call set_title -;call copy_fpath_s -closethis: -mov [to_return],0 -cmp [error_found],1 -je @f -call activate_main -@@: -mov [error_found],0 -close - - -activate_main: - mov eax,9 - mov ebx,procinfo - mov ecx,[proccount] - @@: - dec ecx - jz @f ; counter=0 => not found? => return - mov eax,9 - int 0x40 - mov edx,[procinfo.PID] - cmp edx,[PID] - jne @b - - ;found: ecx = process_number - mov eax,18 - mov ebx,3 - int 0x40 - - mov eax,5 - mov ebx,eax - int 0x40 - - @@: -ret - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -doyouwannasave: -;****************************************************************************** -cmp [modified],0 -je newfile - mov eax,55 ; beep - mov ebx,eax - mov esi,save_beep1 - int 0x40 - delay 4 - mov eax,55 ; beep - mov ebx,eax - mov esi,save_beep2 - int 0x40 - - mov eax,13 - mov ebx,150*65536+200 - mov ecx,100*65536+70 - mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512 - int 0x40 - -mov eax,38 -mov ebx,150*65536+350 -mov ecx,100*65536+100 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,150*65536+350 -mov ecx,170*65536+170 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,150*65536+150 -mov ecx,100*65536+170 -mov edx,cl_White -int 0x40 -mov eax,38 -mov ebx,350*65536+350 -mov ecx,100*65536+170 -mov edx,cl_White -int 0x40 - - - putlabel 190,120,'Сохранить документ?',cl_White - - drawlbut 170,140,30,15,'Да',46,[sc.work_button],cl_White - drawlbut 230,140,30,15,'Нет',45,[sc.work_button],cl_White - drawlbut 290,140,45,15,'Отмена',47,[sc.work_button],cl_White - - mov [exit_wnd_on],1 - jmp still -;------------- -newfile: -;if filename is not NEWDOC## than change it to it! -mov eax,dword [orig_filename] -cmp dword [filename],eax ;[orig_filename] -je @f - cld - mov esi,orig_filename - mov edi,filename - mov ecx,71 ;50 - rep movsb - mov edi,filename - mov ecx,71 ;50 - xor eax,eax - repne scasb - sub edi,filename - dec edi - mov [filename_len],edi - -@@: - -call change_fname -call set_title -call draw_window_for_dialogs -call empty_work_space -mov [lines],1 -jmp do_load_file.restorecursor - -change_fname: -cmp [filename+7],'9' -jne addfname -cmp [filename+6],'9' -je error_creating_new_file -mov [filename+7],'0' -add [filename+6],0x1 -jmp leavenow -addfname: -add [filename+7],0x1 -leavenow: -ret - -set_title: - cmp [error2_found],1 - je no_set_title - mov esi, filename - mov edi, header - mov ecx, [filename_len] - mov eax, ecx - add eax, 10 - mov [headlen], eax - cld - rep movsb - - mov [edi], dword ' - ' - add edi, 3 - mov esi, htext - mov ecx, htext.size - rep movsb - - call drawwindow -no_set_title: -mov [error2_found],0 -ret - -draw_window_for_dialogs: -call clear_screen -call drawwindow -ret - -copy_fpath: -call mask_events -call path_copy -call set_title -call draw_window_for_dialogs -jmp do_load_file - -copy_fpath_s: -call mask_events -call path_copy -call save_file -call set_title -call draw_window_for_dialogs -jmp still - -path_copy: - cld - mov esi,mypath - mov edi,filename - mov ecx,250 ;71 ;50 - rep movsb - mov edi,filename - mov ecx,250 ;71 ;50 - xor eax,eax - repne scasb - sub edi,filename - dec edi - mov [filename_len],edi -ret - -openerror: -mov eax,360 -mov ebx,openerrtext -mov ecx,1 -call alert_box - -cmp [to_return2],1 -jne jmp_to_still -mov [to_return2],0 -mov [error_found],1 -call mask_events - -ret - -saveerror: -mov eax,390 -mov ebx,saveerrtext -mov ecx,1 -call alert_box -cmp [to_return2],0 -je jmp_to_still -mov [to_return2],0 -mov [error_found],1 -call mask_events -ret -;jmp still -jmp_to_still: -call mask_events -jmp still - -error_creating_new_file: -mov eax,200 -mov ebx,newfileerror -mov ecx,1 -call alert_box -jmp still - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;;;;;;;MENU;;;;;;;;;;;;;;;;;;;;;; -draw_win_menu: - -;mov eax,8 -;mov ebx,145*65536+276 -;mov ecx,22*65536+15 -;mov edx,00100000000000000000000000001111b -;mov esi,0x00aaaaaa -;int 0x40 - -mov eax,13 -mov ebx,5*65536+497 -mov ecx,22*65536+17 -mov edx,[sc.work_graph] ;0x00999999 -int 0x40 -mov ecx,39*65536+5 -mov edx,0x00aaaaaa -int 0x40 - -drawlbut 5,22,70,15,'Файл',97,[sc.work_button],[sc.work_button_text] -drawlbut 75,22,70,15,'Код',98,[sc.work_button],[sc.work_button_text] -drawlbut 145,22,70,15,'Текст',96,[sc.work_button],[sc.work_button_text] -drawlbut 431,22,70,15,'Справка',99,[sc.work_button],[sc.work_button_text] - -ret - -draw_win_menu_file: -call clear_screen -call drawwindow -;mov eax,13 -;mov ebx,5*65536+71 -;mov ecx,35*65536+90 -;mov edx,[sc.grab_button];0x00999999 -;int 0x40 -;mov eax,38 -;mov ebx,5*65536+35 -;mov ecx,40*65536+47 -;mov edx,0x00ff0000 -;int 0x40 -mov [menu_is_on],1 - -drawlbut 5,38,70,15,'Новое окно',100,[sc.grab_button],[sc.grab_button_text] -drawlbut 5,53,70,15,'Новый',101,[sc.grab_button],[sc.grab_button_text] -drawlbut 5,68,70,15,'Сохранить',2,[sc.grab_button],[sc.grab_button_text] -drawlbut 5,83,70,15,'Сохр. как',102,[sc.grab_button],[sc.grab_button_text] -drawlbut 5,98,70,15,'Открыть',103,[sc.grab_button],[sc.grab_button_text] -drawlbut 5,113,70,15,'Выход',104,[sc.grab_button],[sc.grab_button_text] -jmp still - -draw_win_menu_code: -call clear_screen -call drawwindow -drawlbut 75,38,70,15,'Компил.',10000,[sc.grab_button],[sc.grab_button_text] -drawlbut 75,53,70,15,'Запустить',10001,[sc.grab_button],[sc.grab_button_text] -drawlbut 75,68,70,15,'Доска отл.',10002,[sc.grab_button],[sc.grab_button_text] -drawlbut 75,83,70,15,'SysFunc',10003,[sc.grab_button],[sc.grab_button_text] -mov [menu_is_on],1 -jmp still - -draw_win_menu_text: -call clear_screen -call drawwindow -drawlbut 145,38,70,15,'GoTo Line#',95,[sc.grab_button],[sc.grab_button_text] -drawlbut 145,53,70,15,'Найти',92,[sc.grab_button],[sc.grab_button_text] -drawlbut 145,68,70,15,'Найти далее',50,[sc.grab_button],[sc.grab_button_text] -mov [menu_is_on],1 -jmp still - -new_pad_wnd: -mov eax,19 -mov ebx,tinypad_filename -mov ecx,0 -int 0x40 -jmp still - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -openerrtext db 'Ошибка открытия файла или открытие отменено!',0 -saveerrtext db 'Ошибка сохранения файла или сохранение отменено!',0 -newfileerror db 'Невозможно сохдать новый файл',0 -; ******************** -; ****** DATA ****** -; ******************** -sz fasm_filename, 'FASM ' -sz debug_filename, 'BOARD ' -sz tinypad_filename, 'TINYPAD ' - -lsz sysfuncs_filename,\ - ru, <'SYSFUNCR.TXT',0>,\ - en, <'SYSFUNCS.TXT',0> - -sz setup, 'SETUP ' ; we need to run SETUP to change keyboard layout -param_setup db 'LANG',0 ; parameter for SETUP - - -addr dd filename ; address of input string - -filename_len dd 12 -filename db 'NEWDOC00.TXT' -times 256 db 0;51-12 db 0 -;times db 0 ; я не знаю почему Вилл не поставил эту строчку -orig_filename db 'NEWDOC00.TXT' -rb 256 -search_len dd 5 -search_string db 'still' -times 51-5 db 0 - -case_sens db 0 ; for search function - -align 4 -comment_string: -db ';***************************************' -db '*************************************** ' - - - -; INTERFACE DATA: - - -sz htext, 'TINYPAD' -;sz toolbar_btn_text, 'COMPILE RUN BOARD SYSFUNC' - - -searcht: -if lang eq ru - db ' СТРОКА > ' - db ' ПОИСК ' -else - db ' STRING > ' - db ' SEARCH ' -end if -searchtl: - - -htext2: -if lang eq ru - db ' ПОЗИЦИЯ 00:00000 ДЛИНА 00000 СТРОК ' -else - db 'POSITION 00:00000 LENGTH 00000 LINES ' -end if -htextlen2: - -help_text: -if lang eq ru - db ' КОМАНДЫ: ' - db ' ' - db ' CTRL+F1 : Это окно ' - db ' CTRL+S : Первая строка для копирования ' - db ' CTRL+E : Последняя строка для копирования ' - db ' CTRL+P : Вставить выбранное на текущую позицию ' - db ' CTRL+D : Удалить строку ' - db ' CTRL+L : Вставить строку-разделитель ' - db ' CTRL+[ : Перейти в начало файла ' - db ' CTRL+] : Перейти в конец файла ' - db ' CTRL+F2 : Загрузить файл ' - db ' CTRL+F3 : Поиск ' - db ' CTRL+F4 : Сохранить файл ' - db ' CTRL+F5 : Сохранить файл как... ' - db ' CTRL+F6 : Ввести строку для поиска ' - db ' CTRL+F7 : "Окно быстрого сохранения и загрузки" ' - db ' CTRL+F8 : Сменить раскладку клавиатуры ' - db ' CTRL+F9 : Компилировать файл ' - db ' CTRL+F10 : Компилировать и запустить ' - db ' F12 : Запустить доску отладки ' - db 'x' -else - db ' COMMANDS: ' - db ' ' - db ' CTRL+F1 : SHOW THIS WINDOW ' - db ' CTRL+S : SELECT FIRST STRING TO COPY ' - db ' CTRL+E : SELECT LAST STRING TO COPY ' - db ' CTRL+P : PASTE SELECTED TO CURRENT POSITION ' - db ' CTRL+D : DELETE CURRENT LINE ' - db ' CTRL+L : INSERT SEPARATOR LINE ' - db ' CTRL+[ : GO TO THE BEGINNING OF FILE ' - db ' CTRL+] : GO TO THE END OF FILE ' - db ' CTRL+F2 : LOAD FILE ' - db ' CTRL+F3 : SEARCH ' - db ' CTRL+F4 : SAVE FILE ' - db ' CTRL+F5 : SAVE FILE AS... ' - db ' CTRL+F6 : ENTER SEARCH STRING ' - db ' CTRL+F7 : DRAW "FAST SAVE AND OPEN" WINDOW ' - db ' CTRL+F8 : CHANGE KEYBOARD LAYOUT ' - db ' CTRL+F9 : COMPILE FILE ' - db ' CTRL+F10 : RUN OUTFILE ' - db ' F12 : OPEN DEBUG BOARD ' - db 'x' -end if - -help_wnd_header: -if lang eq ru - db 'ПОМОЩЬ',0 -else - db 'TINYPAD HELP',0 -end if - -hlphead_len = $ - help_wnd_header - -save_yes_no: -if lang eq ru - db 'Сохранить файл перед выходом?',0 -else - db 'Save file before exit?',0 -end if - -VScroll_1: - dw 13 ;width +0 - dw 489 ;x +2 - dw 341 ;326 ;height +4 - dw 43 ;y +6 - dd 0 ;min +8 - dd 100 ;scrl_max ;lines ;max +12 - dd 0 ;cur_pos ;current +16 - dd 1 ;small change +20 - dd 10 ;big change +24 - -App_Controls: - dd VScroll_1 , drawvscroll, VScroll_mouse_over ; - dd 0,0,0 ;last control do not delete - -; END OF INTERFACE DATA - -symbols db '%#&*\:/<>|{}()[]=+-,. ' - -error_beep: - db 0xA0,0x30,0 -save_beep1: - db 0x84,0x43,0 -save_beep2: - db 0x84,0x48,0 - - -align 4 -fileinfo_read: - dd 0 - dd 0 - dd 300000/512 - dd 0x10000 - dd 0x70000 -pathfile_read: - times 250 db 0 ;51 db 0 - -align 4 -fileinfo_write: - dd 1 - dd 0 - dd 0 - dd 0x10000 - dd 0x70000 -pathfile_write: - times 250 db 0 ; 51 db 0 - -align 4 - -temp dd 0xabc ; used in read_string -d_status dd 0 - -color_tbl: - dd 0x00000000 ; text - dd 0x00000000 ; instruction - dd 0x00000000 ; register - dd 0x00009000 ; number - dd 0x00a00000 ; quote - dd 0x00909090 ; comment - dd 0x003030f0 ; symbol - - -next_not_quote2 db 0 ; " -next_not_quote db 0 ; ' -quote db 0 -asm_mode db 0 ; ASM highlight? -tmpabc db 0 - - -I_PARAM db 0 ; parameters are HERE - параметры будут начинаться ЗДЕСЬ! -TINYPAD_END: ; end of file - - -; Uninitialised data -; Неинициализированные данные -align 4 - -posx dd ? ; x на экране (on the screen) -posy dd ? ; y на экране -post dd ? ; смещение от начала - offset -posl dd ? -lines dd ? ; количество строк в документе -posxm dd ? -posym dd ? - -dstart dd ? ; смещение по оси y для отрисовки кнопок и др. - -filelen dd ? ; длина файла - -PID dd ? ; идентификатор процесса -proccount dd ? ; количество процессов - -filesize dd ? ; размер файла -ya dd ? ; для read_string -slines dd ? ; number of strings on the screen - количество строк на экране - -run_outfile dd ? ; for FASM -copy_start dd ? ; Ctrl+S -copy_count dd ? ; Ctrl+E -headlen dd ? ; header length -do_not_draw dd ? ; to draw or not to draw - this is a serious question ;) - -MainWndClosed dd ? -sc system_colors - -to_return db 0 -to_return2 db 0 -error_found db 0 -error2_found db 0 - -header: ; window header - заголовок окна -rb 256 - -; информация о процессе записывается в эту структуру -procinfo process_information - -virtual at procinfo -fasm_parameters rb 256 -end virtual -pos00 dd 0 -newdoc db ? -mypath: -times 258 db 0 -real_posy dd 0 -vscroll_size dd 0 -vscroll_pos dd 0 -cur_pos dd 0 -scrl_max dd 100 - -mouse_x dd 0 -mouse_y dd 0 -mousey dw 0 -mousex dw 0 -mouseb dd 0 - -num_goto_string dd 0 - -menu_is_on db 0 -exit_wnd_on db 0 -modified db 0 -;fast save n open stack -rb 1024 -so_stack: -;growing down -; the end! - - diff --git a/programs/xpaint/trunk/macros.inc b/programs/xpaint/trunk/macros.inc deleted file mode 100644 index 5527ff55c1..0000000000 --- a/programs/xpaint/trunk/macros.inc +++ /dev/null @@ -1,266 +0,0 @@ -; new application structure -macro meos_app_start - { - use32 - org 0x0 - - db 'MENUET01' - dd 0x01 - dd __start - dd __end - dd __memory - dd __stack - - if used __params & ~defined __params - dd __params - else - dd 0x0 - end if - - dd 0x0 - } -MEOS_APP_START fix meos_app_start - -macro code - { - __start: - } -CODE fix code - -macro data - { - __data: - } -DATA fix data - -macro udata - { - if used __params & ~defined __params - __params: - db 0 - __end: - rb 255 - else - __end: - end if - __udata: - } -UDATA fix udata - -macro meos_app_end - { - align 32 - rb 2048 - __stack: - __memory: - } -MEOS_APP_END fix meos_app_end - - -; macro for defining multiline text data -struc mstr [sstring] - { - forward - local ssize - virtual at 0 - db sstring - ssize = $ - end virtual - dd ssize - db sstring - common - dd -1 - } - - -; strings -macro sz name,[data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if used name - db data - end if - common - if used name - .size = $-name - end if -} - -macro lsz name,[lng,data] { ; from MFAR [mike.dld] - common - if used name - label name - end if - forward - if (used name)&(lang eq lng) - db data - end if - common - if used name - .size = $-name - end if -} - - - -; easy system call macro -macro mpack dest, hsrc, lsrc -{ - if (hsrc eqtype 0) & (lsrc eqtype 0) - mov dest, (hsrc) shl 16 + lsrc - else - if (hsrc eqtype 0) & (~lsrc eqtype 0) - mov dest, (hsrc) shl 16 - add dest, lsrc - else - mov dest, hsrc - shl dest, 16 - add dest, lsrc - end if - end if -} - -macro __mov reg,a { ; mike.dld - if ~a eq - mov reg,a - end if -} - -macro mcall a,b,c,d,e,f { ; mike.dld - __mov eax,a - __mov ebx,b - __mov ecx,c - __mov edx,d - __mov esi,e - __mov edi,f - int 0x40 -} - - - -; language for programs -lang fix ru ; ru en fr ge fi - - - -; optimize the code for size -__regs fix - -macro add arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - inc arg1 - else - add arg1,arg2 - end if - else - add arg1,arg2 - end if - } - -macro sub arg1,arg2 - { - if (arg2 eqtype 0) - if (arg2) = 1 - dec arg1 - else - sub arg1,arg2 - end if - else - sub arg1,arg2 - end if - } - -macro mov arg1,arg2 - { - if (arg1 in __regs) & (arg2 eqtype 0) - if (arg2) = 0 - xor arg1,arg1 - else if (arg2) = 1 - xor arg1,arg1 - inc arg1 - else if (arg2) = -1 - or arg1,-1 - else if (arg2) > -128 & (arg2) < 128 - push arg2 - pop arg1 - else - mov arg1,arg2 - end if - else - mov arg1,arg2 - end if - } - - -macro struct name - { - virtual at 0 - name name - sizeof.#name = $ - name - end virtual - } - -; structures used in MeOS -struc process_information - { - .cpu_usage dd ? ; +0 - .window_stack_position dw ? ; +4 - .window_stack_value dw ? ; +6 - .not_used1 dw ? ; +8 - .process_name rb 12 ; +10 - .memory_start dd ? ; +22 - .used_memory dd ? ; +26 - .PID dd ? ; +30 - .x_start dd ? ; +34 - .y_start dd ? ; +38 - .x_size dd ? ; +42 - .y_size dd ? ; +46 - .slot_state dw ? ; +50 - rb (1024-52) - } -struct process_information - -struc system_colors - { - .frame dd ? - .grab dd ? - .grab_button dd ? - .grab_button_text dd ? - .grab_text dd ? - .work dd ? - .work_button dd ? - .work_button_text dd ? - .work_text dd ? - .work_graph dd ? - } -struct system_colors - - -; constants - -; events -EV_IDLE = 0 -EV_TIMER = 0 -EV_REDRAW = 1 -EV_KEY = 2 -EV_BUTTON = 3 -EV_EXIT = 4 -EV_BACKGROUND = 5 -EV_MOUSE = 6 -EV_IPC = 7 -EV_STACK = 8 - -; event mask bits for function 40 -EVM_REDRAW = 1b -EVM_KEY = 10b -EVM_BUTTON = 100b -EVM_EXIT = 1000b -EVM_BACKGROUND = 10000b -EVM_MOUSE = 100000b -EVM_IPC = 1000000b -EVM_STACK = 10000000b \ No newline at end of file