From 8180d49f24833fc6cc05a90253a1f57f9045a4f5 Mon Sep 17 00:00:00 2001 From: copy Date: Wed, 6 Nov 2013 01:12:55 +0100 Subject: [PATCH] first public release --- .gitignore | 2 + LICENSE | 26 + Makefile | 72 + Readme.md | 87 + bios/COPYING.LESSER | 165 + bios/seabios-config | 94 + bios/seabios.bin | Bin 0 -> 131072 bytes bios/vgabios.bin | Bin 0 -> 36864 bytes debug.html | 71 + docs/Makefile | 15 + docs/adapters.md | 49 + index.html | 62 + loader.js | 28 + src/arith.macro.js | 1646 +++++ src/browser/keyboard.js | 236 + src/browser/main.js | 589 ++ src/browser/mouse.js | 132 + src/browser/screen.js | 354 + src/const.js | 155 + src/cpu.js | 6029 +++++++++++++++++ src/cpu.macro.js | 2384 +++++++ src/debug.macro.js | 445 ++ src/disk.js | 545 ++ src/dma.js | 149 + src/externs.js | 1 + src/floppy.js | 396 ++ src/fpu.macro.js | 1656 +++++ src/instructions.macro.js | 2263 +++++++ src/io.js | 175 + src/main.js | 339 + src/memory.js | 486 ++ src/misc_instr.macro.js | 458 ++ src/modrm.macro.js | 176 + src/node/ascii.ttf | Bin 0 -> 21136 bytes src/node/keyboard_sdl.js | 35 + src/node/keyboard_tty.js | 60 + src/node/main.js | 141 + src/node/node_modules/node-sdl/.gitignore | 5 + src/node/node_modules/node-sdl/.npmignore | 3 + src/node/node_modules/node-sdl/Makefile | 72 + src/node/node_modules/node-sdl/README.md.orig | 429 ++ src/node/node_modules/node-sdl/Readme | 4 + src/node/node_modules/node-sdl/binding.gyp | 21 + .../node_modules/node-sdl/nodesdl.target.mk | 83 + src/node/node_modules/node-sdl/package.json | 16 + src/node/node_modules/node-sdl/sdl.js | 25 + src/node/node_modules/node-sdl/src/helpers.cc | 437 ++ src/node/node_modules/node-sdl/src/helpers.h | 42 + src/node/node_modules/node-sdl/src/nodesdl.cc | 1078 +++ src/node/node_modules/node-sdl/src/nodesdl.h | 93 + src/node/screen_sdl.js | 124 + src/node/screen_tty.js | 90 + src/pci.js | 173 + src/pic.js | 280 + src/pit.js | 303 + src/ps2.js | 432 ++ src/rtc.js | 188 + src/string.macro.js | 281 + src/uart.js | 26 + src/v86_all.js.map | 8 + src/vga.js | 1023 +++ tests/perf/build.sh | 8 + tests/perf/runtest.js | 59 + tests/perf/test-asm.js | 12 + tests/perf/test.asm | 199 + tests/perf/test.bin | Bin 0 -> 118 bytes tests/qemu/LICENSE | 16 + tests/qemu/Makefile | 17 + tests/qemu/Reame | 8 + tests/qemu/compiler.h | 58 + tests/qemu/config-host.h | 66 + tests/qemu/test-i386-code16.S | 79 + tests/qemu/test-i386-muldiv.h | 76 + tests/qemu/test-i386-shift.h | 185 + tests/qemu/test-i386-vm86.S | 103 + tests/qemu/test-i386.c | 2774 ++++++++ tests/qemu/test-i386.h | 152 + v86.css | 60 + v86_all.js | 247 + 79 files changed, 28876 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 Readme.md create mode 100644 bios/COPYING.LESSER create mode 100644 bios/seabios-config create mode 100644 bios/seabios.bin create mode 100644 bios/vgabios.bin create mode 100644 debug.html create mode 100644 docs/Makefile create mode 100644 docs/adapters.md create mode 100644 index.html create mode 100644 loader.js create mode 100644 src/arith.macro.js create mode 100644 src/browser/keyboard.js create mode 100644 src/browser/main.js create mode 100644 src/browser/mouse.js create mode 100644 src/browser/screen.js create mode 100644 src/const.js create mode 100644 src/cpu.js create mode 100644 src/cpu.macro.js create mode 100644 src/debug.macro.js create mode 100644 src/disk.js create mode 100644 src/dma.js create mode 100644 src/externs.js create mode 100644 src/floppy.js create mode 100644 src/fpu.macro.js create mode 100644 src/instructions.macro.js create mode 100644 src/io.js create mode 100644 src/main.js create mode 100644 src/memory.js create mode 100644 src/misc_instr.macro.js create mode 100644 src/modrm.macro.js create mode 100644 src/node/ascii.ttf create mode 100644 src/node/keyboard_sdl.js create mode 100644 src/node/keyboard_tty.js create mode 100644 src/node/main.js create mode 100644 src/node/node_modules/node-sdl/.gitignore create mode 100644 src/node/node_modules/node-sdl/.npmignore create mode 100644 src/node/node_modules/node-sdl/Makefile create mode 100644 src/node/node_modules/node-sdl/README.md.orig create mode 100644 src/node/node_modules/node-sdl/Readme create mode 100644 src/node/node_modules/node-sdl/binding.gyp create mode 100644 src/node/node_modules/node-sdl/nodesdl.target.mk create mode 100644 src/node/node_modules/node-sdl/package.json create mode 100755 src/node/node_modules/node-sdl/sdl.js create mode 100644 src/node/node_modules/node-sdl/src/helpers.cc create mode 100644 src/node/node_modules/node-sdl/src/helpers.h create mode 100644 src/node/node_modules/node-sdl/src/nodesdl.cc create mode 100644 src/node/node_modules/node-sdl/src/nodesdl.h create mode 100644 src/node/screen_sdl.js create mode 100644 src/node/screen_tty.js create mode 100644 src/pci.js create mode 100644 src/pic.js create mode 100644 src/pit.js create mode 100644 src/ps2.js create mode 100644 src/rtc.js create mode 100644 src/string.macro.js create mode 100644 src/uart.js create mode 100644 src/v86_all.js.map create mode 100644 src/vga.js create mode 100755 tests/perf/build.sh create mode 100644 tests/perf/runtest.js create mode 100644 tests/perf/test-asm.js create mode 100644 tests/perf/test.asm create mode 100644 tests/perf/test.bin create mode 100644 tests/qemu/LICENSE create mode 100644 tests/qemu/Makefile create mode 100644 tests/qemu/Reame create mode 100644 tests/qemu/compiler.h create mode 100644 tests/qemu/config-host.h create mode 100644 tests/qemu/test-i386-code16.S create mode 100644 tests/qemu/test-i386-muldiv.h create mode 100644 tests/qemu/test-i386-shift.h create mode 100644 tests/qemu/test-i386-vm86.S create mode 100644 tests/qemu/test-i386.c create mode 100644 tests/qemu/test-i386.h create mode 100644 v86.css create mode 100644 v86_all.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..10588df0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +images/* + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..3fd3790e --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012, Fabian Hemmer +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..9c7a1f8b --- /dev/null +++ b/Makefile @@ -0,0 +1,72 @@ +CLOSURE=~/closure/closure-compiler/build/compiler.jar +CPP=cpp + + +all: v86_all.js +browser: v86_all.js +node: v86_node.js + +src/cpu.js: src/*.macro.js + # build cpu.macro.js using cpp + $(CPP) -P -undef -Wundef -std=c99 -nostdinc -Wtrigraphs -fdollars-in-identifiers -C src/cpu.macro.js src/cpu.js + + + +# Used for nodejs builds and in order to profile code. +# `debug` gives identifiers a readable name, make sure it doesn't have any side effects. +CLOSURE_READABLE=--formatting PRETTY_PRINT --debug + +CLOSURE_SOURCE_MAP=\ + --source_map_format V3\ + --create_source_map + +CLOSURE_FLAGS=\ + --compilation_level ADVANCED_OPTIMIZATIONS\ + --externs externs.js\ + --warning_level VERBOSE\ + --jscomp_off uselessCode\ + --use_types_for_optimization\ + --summary_detail_level 3\ + --language_in ECMASCRIPT5_STRICT + + +CORE_FILES=const.js io.js cpu.js main.js disk.js pci.js floppy.js memory.js dma.js pit.js vga.js ps2.js pic.js rtc.js uart.js +BROWSER_FILES=browser/main.js browser/screen.js browser/keyboard.js browser/mouse.js +NODE_FILES=node/main.js node/keyboard.js node/screen.js + +v86_all.js: src/*.js src/browser/*.js src/cpu.js + -ls -lh v86_all.js + cd src &&\ + java -jar $(CLOSURE) \ + --js_output_file "../v86_all.js"\ + --define=DEBUG=false\ + $(CLOSURE_SOURCE_MAP) v86_all.js.map\ + $(CLOSURE_FLAGS)\ + --js $(CORE_FILES)\ + --js $(BROWSER_FILES) + + echo "//# sourceMappingURL=src/v86_all.js.map" >> v86_all.js + ls -lh v86_all.js + + +v86_node.js: src/*.js src/node/*.js + cd src &&\ + java -jar $(CLOSURE) \ + --js_output_file "../v86_node.js"\ + --define=DEBUG=false\ + $(CLOSURE_FLAGS)\ + --js $(CORE_FILES) $(NODE_FILES) + + +pack: + rm -f v86-latest.tar.gz + # Not sure if legally necessary + #--exclude "qemu" + tar -zcvf ../v86-latest.tar.gz ../v86/ \ + --exclude "images" \ + --exclude ".git" + + + +clean: + rm -f v86-latest.tar.gz v86_all.js src/v86_all.js.map src/cpu.js diff --git a/Readme.md b/Readme.md new file mode 100644 index 00000000..3e53d8e8 --- /dev/null +++ b/Readme.md @@ -0,0 +1,87 @@ +How does it work? +- + +v86 emulates an x86-compatible CPU and hardware. Here's a list of emulated hardware: + +- An x86 compatible CPU. The instruction set is around Pentium 1 level. Some + features are missing, more specifically: + - Task gates, far calls in protected mode + - 16 bit protected mode features and Virtual 8086 mode + - Single stepping + - MMX, SSE + - A bunch of FPU instructions, FPU exceptions + - Some other exceptions +- A floating point unit (FPU). Calculations are done with JavaScript's double + precision numbers (64 bit), so they are not as precise as calculations on a + real FPU (80 bit). +- An ISA bus. +- A floppy disk controller (8272A). +- A DMA (direct memory access) controller, currently only used by the FDC. +- An 8042 Keyboard Controller, PS2. With mouse support. +- An 8254 Programmable Interval Timer (PIT). +- An 8259 Programmable Interrupt Controller (PIC). +- A CMOS Real Time Clock (RTC). +- A VGA controller with SVGA support and Bochs VBE Extensions. This includes + support for large resolutions. +- A PCI bus. This one is mostly incomplete and not used by every device. +- An AT disk controller with some ATAPI and some SCSI commands. This is quite + incomplete and possibly buggy, too. + + +How to build, run and embed? +- + +- In order to build the `cpu.js` file, you need `make` and `cpp` (the C preprocessor). + Run: `make src/cpu.js`. +- If you want a compressed and fast (ie, with debug code removed) version, you + need Closure Compiler. + Set the path to `compiler.jar` in the Makefile and run `make v86_all.js`. +- For more details on how to customize the behaviour and interface, see [docs/adapters.md](docs/adapters.md). + + +Why? +- + +Similiar projects have been done before, but I decided to work on this as a fun +project and learn something about the x86 architecture. It has grown pretty +advanced and I just got Linux and KolibriOS working recently and +there might be some actual uses. + +If you build something interesting, let me know. However, keep in mind that the project +is not very stable at the moment. + + +How can I contribute? +- + +- Someone who could work on hardware devices, such as a modem or the AT + controller. I'll write an overview for that at a later point, if people are + interested. +- Donate. Since Bitcoin is the new cool thing, here's my address: + `14KBXSoewGzbQY8VoznJ5MZXGxoia8RxC9` + +License +- + +Simplified BSD License, see [LICENSE](LICENSE), unless otherwise noted. + + +Credits +- + +- Test cases via QEMU, http://wiki.qemu.org/Main_Page +- https://github.com/creationix/node-sdl +- ascii.ttf (used in node) from http://www.apollosoft.de/ASCII/indexen.htm + + +More questions? +- + +Shoot me an email to `copy@copy.sh`. Please don't tell about bugs via mail, +create a bug report on github instead. + + +Author +- + +Fabian Hemmer (http://copy.sh/, `copy@copy.sh`) diff --git a/bios/COPYING.LESSER b/bios/COPYING.LESSER new file mode 100644 index 00000000..fc8a5de7 --- /dev/null +++ b/bios/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/bios/seabios-config b/bios/seabios-config new file mode 100644 index 00000000..e0568997 --- /dev/null +++ b/bios/seabios-config @@ -0,0 +1,94 @@ +# +# Automatically generated make config: don't edit +# SeaBIOS Configuration +# Sun Nov 18 21:22:50 2012 +# + +# +# General Features +# +# CONFIG_COREBOOT is not set +CONFIG_XEN=y +CONFIG_THREADS=y +# CONFIG_THREAD_OPTIONROMS is not set +CONFIG_RELOCATE_INIT=y +# CONFIG_BOOTMENU is not set +# CONFIG_BOOTORDER is not set + +# +# Hardware support +# +CONFIG_ATA=y +# CONFIG_ATA_DMA is not set +# CONFIG_ATA_PIO32 is not set +CONFIG_AHCI=y +CONFIG_VIRTIO_BLK=y +CONFIG_VIRTIO_SCSI=y +CONFIG_ESP_SCSI=y +CONFIG_LSI_SCSI=y +CONFIG_FLOPPY=y +CONFIG_PS2PORT=y +CONFIG_USB=y +CONFIG_USB_UHCI=y +CONFIG_USB_OHCI=y +CONFIG_USB_EHCI=y +CONFIG_USB_MSC=y +CONFIG_USB_UAS=y +CONFIG_USB_HUB=y +CONFIG_USB_KEYBOARD=y +CONFIG_USB_MOUSE=y +CONFIG_SERIAL=y +CONFIG_LPT=y +CONFIG_USE_SMM=y +CONFIG_MTRR_INIT=y + +# +# BIOS interfaces +# +CONFIG_DRIVES=y +CONFIG_CDROM_BOOT=y +CONFIG_CDROM_EMU=y +CONFIG_PCIBIOS=n +CONFIG_APMBIOS=n +CONFIG_PNPBIOS=n +CONFIG_OPTIONROMS=y +CONFIG_OPTIONROMS_DEPLOYED=y +CONFIG_PMM=y +CONFIG_BOOT=y +CONFIG_KEYBOARD=y +CONFIG_KBD_CALL_INT15_4F=y +CONFIG_MOUSE=y +CONFIG_S3_RESUME=y +CONFIG_VGAHOOKS=y +# CONFIG_DISABLE_A20 is not set + +# +# BIOS Tables +# +CONFIG_PIRTABLE=n +CONFIG_MPTABLE=n +CONFIG_SMBIOS=n +CONFIG_ACPI=n + +# +# VGA ROM +# +# CONFIG_NO_VGABIOS is not set +CONFIG_VGA_STANDARD_VGA=y +# CONFIG_VGA_CIRRUS is not set +# CONFIG_VGA_BOCHS is not set +# CONFIG_VGA_GEODEGX2 is not set +# CONFIG_VGA_GEODELX is not set +CONFIG_BUILD_VGABIOS=y +CONFIG_VGA_VBE=y +CONFIG_VGA_PCI=y +# CONFIG_OVERRIDE_PCI_ID is not set +CONFIG_VGA_VID=0x0000 +CONFIG_VGA_DID=0x0000 + +# +# Debugging +# +CONFIG_DEBUG_LEVEL=2 +# CONFIG_DEBUG_SERIAL is not set +CONFIG_DEBUG_IO=y diff --git a/bios/seabios.bin b/bios/seabios.bin new file mode 100644 index 0000000000000000000000000000000000000000..9bf4142fe5e62974a371f06b49e00d330ad8e656 GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/debug.html b/debug.html new file mode 100644 index 00000000..dc1cc2c9 --- /dev/null +++ b/debug.html @@ -0,0 +1,71 @@ + + + +Virtual x86 + + + + + + + + +
+
+ +
+ +
+ + + diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..8537bc19 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,15 @@ + +DOCS=adapters embedding +HTML=$(addsuffix .html, $(DOCS)) +MD=$(addsuffix .md, $(DOCS)) + + +all: $(HTML) + + +%.html: %.md + markdown $< > $@ + + +clean: + rm -f *.html diff --git a/docs/adapters.md b/docs/adapters.md new file mode 100644 index 00000000..e9a89025 --- /dev/null +++ b/docs/adapters.md @@ -0,0 +1,49 @@ + + +Adapters are used to communicate between virtual hardware and the browser (or +nodejs, or anything else). Currently, there are 3 adapters: Keyboard, Mouse and +Screen. Adapters are passed through `settings.keyboard_adapter`, +`settings.mouse_adapter` and `settings.screen_adapter` respectively, but they +can also be undefined. + +Here is a list of functions that must be implemented by adapters: + +**ScreenAdapter:** + +- `put_pixel(x, y, color)` +- `put_pixel_linear(offset, color_part)` +- `put_char(row, col, chr, bg_color, fg_color)` +- `update_cursor(row, col)` +- `update_cursor_scanline(start, end)` +- `clear_screen()` +- `timer_graphical()` +- `timer_text()` +- `set_mode(is_graphical)` +- `set_size_graphical(width, height)` +- `set_size_text(rows, cols)` +- `destroy()` + +**KeyboardAdapter:** + +- `init(send_code_fn)` +- `destroy()` +- `enabled` + +**MouseAdapter:** + +- `init(click_fn, move_fn, wheel_fn)` +- `destroy()` +- `enabled` + +**More** + +In addition to adapters, the following functions must be provided in global +scope (TODO: Improve that). + +- `next_tick()` +- `set_tick(fn)` +- `log(str)` - only in debug modes + + +
+Everything on this page may be subject to change. diff --git a/index.html b/index.html new file mode 100644 index 00000000..f663db11 --- /dev/null +++ b/index.html @@ -0,0 +1,62 @@ + + + +Virtual x86 + + + + + + +
+
+ CD image:
+
+ Floppy disk image:
+
+ Hard drive disk image:
+
+ - OR - +
+
+ - Graphical OS, takes about 60 seconds to boot
+ - With busybox and lua interpreter, takes about 20 seconds to boot
+ - Takes 1 second to boot
+ - With nasm, vim, debug.com, some games and demos, takes 1 second to boot
+ - Random boot floppy, takes very long to boot
+
+ + +
+
+
+ + +
+
+ +
+ +
+ +
+ +News: Source Code now available: Github, tarball. + + diff --git a/loader.js b/loader.js new file mode 100644 index 00000000..7876d763 --- /dev/null +++ b/loader.js @@ -0,0 +1,28 @@ +// load all files to run v86 in browser, uncompiled + +(function() +{ + var PATH = "src/", + CORE_FILES="const.js io.js cpu.js main.js disk.js pci.js floppy.js memory.js dma.js pit.js vga.js ps2.js pic.js rtc.js uart.js" + BROWSER_FILES="browser/main.js browser/screen.js browser/keyboard.js browser/mouse.js" + + window.onload = function() + { + load_scripts(CORE_FILES); + load_scripts(BROWSER_FILES); + + function load_scripts(resp) + { + var files = resp.split(" "), + script; + + for(var i = 0; i < files.length; i++) + { + script = document.createElement("script"); + script.src = PATH + files[i] + "?" + Math.random(); + document.body.appendChild(script); + } + } + }; + +})(); diff --git a/src/arith.macro.js b/src/arith.macro.js new file mode 100644 index 00000000..4b51991b --- /dev/null +++ b/src/arith.macro.js @@ -0,0 +1,1646 @@ +/* + * Arithmatic functions + * This file contains: + * + * add, adc, sub, sbc, cmp + * inc, dec + * neg, not + * imul, mul, idiv, div + * xadd + * + * das, daa, aad, aam + * + * and, or, xor, test + * shl, shr, sar, ror, rol, rcr, rcl + * shld, shrd + * + * bts, btr, btc, bt + * bsf, bsr + * + * Gets #included by cpu.macro.js + * +*/ +"use strict"; + +/** + * Helper function for multiplying 2 32 bit numbers + * Returns the low 32 bit (which would normally get cut off) + * + * @param {number} n1 + * @param {number} n2 + */ +function multiply_low(n1, n2) +{ + var low1 = n1 & 0xFFFF, + low2 = n2 & 0xFFFF, + high1 = n1 & ~0xFFFF, + high2 = n2 & ~0xFFFF; + + return low1 * low2 + low1 * high2 + high1 * low2; +} + + +function add8(dest_operand, source_operand) +{ + // very likely to be a crash + if(DEBUG && memory.read32s(translate_address_read(instruction_pointer)) === 0) + { + dump_regs(); + throw "detected jump to 00000000"; + } + + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + source_operand | 0; + + last_op_size = OPSIZE_8; + flags_changed = flags_all; + + return last_result; +} + +function add16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + source_operand | 0; + + last_op_size = OPSIZE_16; + flags_changed = flags_all; + + return last_result; +} + +function add32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + source_operand; + + last_op_size = OPSIZE_32; + flags_changed = flags_all; + + return last_result; +} + +function adc8(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + last_op2 + getcf() | 0; + + last_op_size = OPSIZE_8; + flags_changed = flags_all; + + return last_result; +} + +function adc16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + last_op2 + getcf() | 0; + + last_op_size = OPSIZE_16; + flags_changed = flags_all; + + return last_result; +} + +function adc32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + last_op2 + getcf(); + + last_op_size = OPSIZE_32; + flags_changed = flags_all; + + return last_result; +} + +function cmp8(dest_operand, source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x100); + dbg_assert(dest_operand >= 0 && dest_operand < 0x100); + + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand; + + last_op_size = OPSIZE_8; + flags_changed = flags_all; +} + +function cmp16(dest_operand, source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x10000); + dbg_assert(dest_operand >= 0 && dest_operand < 0x10000); + + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand; + + last_op_size = OPSIZE_16; + flags_changed = flags_all; +} + +function cmp32(dest_operand, source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x100000000); + dbg_assert(dest_operand >= 0 && dest_operand < 0x100000000); + + last_op1 = dest_operand; + last_op2 = -source_operand - 1; + last_result = last_op1 - source_operand; + + last_op_size = OPSIZE_32; + flags_changed = flags_all; +} + +function sub8(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand | 0; + + last_op_size = OPSIZE_8; + flags_changed = flags_all; + + return last_result; +} + +function sub16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand | 0; + + last_op_size = OPSIZE_16; + flags_changed = flags_all; + + return last_result; +} + +function sub32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = -source_operand - 1; + last_result = last_op1 - source_operand; + + last_op_size = OPSIZE_32; + flags_changed = flags_all; + + return last_result; +} + +function sbb8(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand - getcf() | 0; + + last_op_size = OPSIZE_8; + flags_changed = flags_all; + + return last_result; +} + +function sbb16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand - getcf() | 0; + + last_op_size = OPSIZE_16; + flags_changed = flags_all; + + return last_result; +} + +function sbb32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = -source_operand - 1; + last_result = last_op1 - source_operand - getcf(); + + last_op_size = OPSIZE_32; + flags_changed = flags_all; + + return last_result; +} + +/* + * inc and dec + */ + +function inc8(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = 1; + last_result = last_op1 + 1 | 0; + + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry; + + return last_result; +} + +function inc16(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = 1; + last_result = last_op1 + 1 | 0; + + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry; + + return last_result; +} + +function inc32(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = 1; + last_result = last_op1 + 1; + + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry; + + return last_result; +} + + + +function dec8(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = -1; + last_result = last_op1 - 1 | 0; + + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry; + + return last_result; +} + +function dec16(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = -1; + last_result = last_op1 - 1 | 0; + + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry; + + return last_result; +} + +function dec32(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = -1; + last_result = last_op1 - 1; + + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry; + + return last_result; +} + + +/* + * neg and not + */ + +function not8(dest_operand) +{ + return ~dest_operand; +} + +function not16(dest_operand) +{ + return ~dest_operand; +} + +function not32(dest_operand) +{ + return ~dest_operand; +} + +function neg8(dest_operand) +{ + last_result = -dest_operand; + + flags_changed = flags_all; + last_op_size = OPSIZE_8; + last_op1 = 0; + last_op2 = last_result - 1; + + return last_result; +} + +function neg16(dest_operand) +{ + last_result = -dest_operand; + + flags_changed = flags_all; + last_op_size = OPSIZE_16; + last_op1 = 0; + last_op2 = last_result - 1; + + return last_result; +} + +function neg32(dest_operand) +{ + last_result = -dest_operand; + + flags_changed = flags_all; + last_op_size = OPSIZE_32; + last_op1 = 0; + last_op2 = last_result - 1; + + return last_result; +} + +/* + * mul, imul, div, idiv + * + * Note: imul has some extra opcodes + * while other functions only allow + * ax * modrm + */ + +function mul8(source_operand) +{ + var result = source_operand * reg8[reg_al]; + + reg16[reg_ax] = result; + + if(result < 0x100) + { + flags = flags & ~1 & ~flag_overflow; + } + else + { + flags = flags | 1 | flag_overflow; + } + + flags_changed = 0; +} + +function imul8(source_operand) +{ + var result = source_operand * reg8s[reg_al]; + + reg16[reg_ax] = result; + + if(result > 0x7F || result < -0x80) + { + flags = flags | 1 | flag_overflow; + } + else + { + flags = flags & ~1 & ~flag_overflow; + } + flags_changed = 0; +} + +function mul16(source_operand) +{ + var result = source_operand * reg16[reg_ax], + high_result = result >>> 16; + //console.log(h(a) + " * " + h(reg16[reg_ax]) + " = " + h(result)); + + reg16[reg_ax] = result; + reg16[reg_dx] = high_result; + + if(high_result === 0) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; +} + +/* + * imul with 1 argument + * ax = ax * r/m + */ +function imul16(source_operand) +{ + var result = source_operand * reg16s[reg_ax]; + + reg16[reg_ax] = result; + reg16[reg_dx] = result >> 16; + + if(result > 0x7FFF || result < -0x8000) + { + flags |= 1 | flag_overflow; + } + else + { + flags &= ~1 & ~flag_overflow; + } + flags_changed = 0; +} + +/* + * imul with 2 or 3 arguments + * reg = reg * r/m + * reg = imm * r/m + */ +function imul_reg16(operand1, operand2) +{ + dbg_assert(operand1 < 0x8000 && operand1 >= -0x8000); + dbg_assert(operand2 < 0x8000 && operand2 >= -0x8000); + + var result = operand1 * operand2; + + if(result > 0x7FFF || result < -0x8000) + { + flags |= 1 | flag_overflow; + } + else + { + flags &= ~1 & ~flag_overflow; + } + flags_changed = 0; + + return result; +} + +function mul32(source_operand) +{ + var dest_operand = reg32[reg_eax], + high_result = source_operand * dest_operand / 0x100000000 | 0; + + reg32[reg_eax] = multiply_low(source_operand, dest_operand); + reg32[reg_edx] = high_result; + + if(high_result === 0) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; + + //console.log(memory.read32s(address) + " * " + old); + //console.log("= " + reg32[reg_edx] + " " + reg32[reg_eax]); +} + +function imul32(source_operand) +{ + dbg_assert(source_operand < 0x80000000 && source_operand >= -0x80000000); + + var dest_operand = reg32s[reg_eax], + high_result = source_operand * dest_operand / 0x100000000 | 0, + low_result = multiply_low(source_operand, dest_operand); + + if(high_result === 0 && low_result < 0) + { + high_result = -1; + } + + reg32[reg_eax] = low_result; + reg32[reg_edx] = high_result; + + if(high_result === (reg32[reg_eax] < 0x80000000 ? 0 : -1)) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; + + + //console.log(target_operand + " * " + source_operand); + //console.log("= " + h(reg32[reg_edx]) + " " + h(reg32[reg_eax])); +} + +/* + * imul with 2 or 3 arguments + * reg = reg * r/m + * reg = imm * r/m + */ +function imul_reg32(operand1, operand2) +{ + dbg_assert(operand1 < 0x80000000 && operand1 >= -0x80000000); + dbg_assert(operand2 < 0x80000000 && operand2 >= -0x80000000); + + var result = multiply_low(operand1, operand2), + high_result = operand1 * operand2 / 0x100000000 | 0; + + if(high_result === 0) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; + + return result; + + //console.log(operand + " * " + source_operand); + //console.log("= " + reg32[reg]); +} + +function div8(source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x100); + + var target_operand = reg16[reg_ax], + result = target_operand / source_operand | 0; + + if(result > 0xFF || source_operand === 0) + { + trigger_de(); + } + else + { + reg8[reg_al] = result; + reg8[reg_ah] = target_operand % source_operand; + } +} + +function idiv8(source_operand) +{ + dbg_assert(source_operand >= -0x80 && source_operand < 0x80); + + var target_operand = reg16s[reg_ax], + result = target_operand / source_operand | 0; + + if(result > 0x7F || result < -0x80 || source_operand === 0) + { + trigger_de(); + } + else + { + reg8[reg_al] = result; + reg8[reg_ah] = target_operand % source_operand; + } +} + +function div16(source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x10000); + + var + target_operand = (reg16[reg_ax] | reg16[reg_dx] << 16) >>> 0, + result = target_operand / source_operand | 0; + + if(result > 0xFFFF || source_operand === 0) + { + trigger_de(); + } + else + { + reg16[reg_ax] = result; + reg16[reg_dx] = target_operand % source_operand; + } +} + +function idiv16(source_operand) +{ + dbg_assert(source_operand >= -0x8000 && source_operand < 0x8000); + + var target_operand = reg16[reg_ax] | (reg16[reg_dx] << 16), + result = target_operand / source_operand | 0; + + if(result > 0x7FFF || result < -0x8000 || source_operand === 0) + { + trigger_de(); + } + else + { + reg16[reg_ax] = result; + reg16[reg_dx] = target_operand % source_operand; + } +} + +function div32(source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand <= 0xffffffff); + + var + dest_operand_low = reg32[reg_eax], + dest_operand_high = reg32[reg_edx], + + // Wat? Not sure if seriös ... + mod = (0x100000000 * dest_operand_high % source_operand + dest_operand_low % source_operand) % source_operand, + result = dest_operand_low / source_operand + dest_operand_high * 0x100000000 / source_operand; + + if(result > 0xFFFFFFFF || source_operand === 0) + { + trigger_de(); + } + else + { + reg32[reg_eax] = result; + reg32[reg_edx] = mod; + } + + //console.log(h(dest_operand_high) + ":" + h(dest_operand_low) + " / " + h(source_operand)); + //console.log("= " + h(reg32[reg_eax]) + " rem " + h(reg32[reg_edx])); +} + +function idiv32(source_operand) +{ + dbg_assert(source_operand < 0x80000000 && source_operand >= -0x80000000); + + var + dest_operand_low = reg32[reg_eax], + dest_operand_high = reg32s[reg_edx], + mod = (0x100000000 * dest_operand_high % source_operand + dest_operand_low % source_operand) % source_operand, + result = dest_operand_low / source_operand + dest_operand_high * 0x100000000 / source_operand; + + if(result > 0x7FFFFFFF || result < -0x80000000 || source_operand === 0) + { + trigger_de(); + } + else + { + reg32[reg_eax] = result; + reg32[reg_edx] = mod; + } + + //console.log(h(dest_operand_high) + ":" + h(dest_operand_low) + " / " + h(source_operand)); + //console.log("= " + h(reg32[reg_eax]) + " rem " + h(reg32[reg_edx])); +} + + +function xadd8(source_operand, reg) +{ + var tmp = reg8[reg]; + + reg8[reg] = source_operand; + + return add8(source_operand, tmp); +} + + +function xadd16(source_operand, reg) +{ + var tmp = reg16[reg]; + + reg16[reg] = source_operand; + + return add16(source_operand, tmp); +} + + +function xadd32(source_operand, reg) +{ + var tmp = reg32[reg]; + + reg32[reg] = source_operand; + + return add32(source_operand, tmp); +} + + +function bcd_daa() +{ + //dbg_log("daa"); + // decimal adjust after addition + var old_al = reg8[reg_al], + old_cf = getcf(), + old_af = getaf(); + + flags &= ~1 & ~flag_adjust + + if((old_al & 0xF) > 9 || old_af) + { + reg8[reg_al] += 6; + flags |= flag_adjust; + } + if(old_al > 0x99 || old_cf) + { + reg8[reg_al] += 0x60; + flags |= 1; + } + + last_result = reg8[reg_al]; + last_op_size = OPSIZE_8; + last_op1 = last_op2 = 0; + flags_changed = flags_all & ~1 & ~flag_adjust & ~flag_overflow; +} + +function bcd_das() +{ + //dbg_log("das"); + // decimal adjust after subtraction + var old_al = reg8[reg_al], + old_cf = getcf(); + + flags &= ~1; + + if((old_al & 0xF) > 9 || getaf()) + { + reg8[reg_al] -= 6; + flags |= flag_adjust; + flags = flags & ~1 | old_cf | reg8[reg_al] >> 7; + } + else + { + flags &= ~flag_adjust; + } + + if(old_al > 0x99 || old_cf) + { + reg8[reg_al] -= 0x60; + flags |= 1; + } + + last_result = reg8[reg_al]; + last_op_size = OPSIZE_8; + last_op1 = last_op2 = 0; + flags_changed = flags_all & ~1 & ~flag_adjust & ~flag_overflow; +} + +function bcd_aam() +{ + // ascii adjust after multiplication + var imm8 = read_imm8(); + + if(imm8 === 0) + { + trigger_de(); + } + else + { + var temp = reg8[reg_al]; + reg8[reg_ah] = temp / imm8; + reg8[reg_al] = temp % imm8; + + last_result = reg8[reg_al]; + flags_changed = flags_all; + } +} + +function bcd_aad() +{ + // ascii adjust after division + var imm8 = read_imm8(); + + last_result = reg8[reg_al] + reg8[reg_ah] * imm8; + reg16[reg_ax] = last_result & 0xFF; + last_op_size = OPSIZE_8; + flags_changed = flags_all; +} + +function bcd_aaa() +{ + if((reg8[reg_al] & 0xF) > 9 || getaf()) + { + reg16[reg_ax] += 6; + reg8[reg_ah] += 1; + flags |= flag_adjust | 1; + } + else + { + flags &= ~flag_adjust & ~1; + } + reg8[reg_al] &= 0xF; + + flags_changed &= ~flag_adjust & ~1; +} + + +function bcd_aas() +{ + if((reg8[reg_al] & 0xF) > 9 || getaf()) + { + reg16[reg_ax] -= 6; + reg8[reg_ah] -= 1; + flags |= flag_adjust | 1; + } + else + { + flags &= ~flag_adjust & ~1; + } + reg8[reg_al] &= 0xF; + + flags_changed &= ~flag_adjust & ~1; +} + + +/* \O + * bitwise functions |\ + * / \ + * + * and, or, xor, test + * shl, shr, sar, rol, ror, rcl, ror + * shrd, shld + * + * bt, bts, btr, btc + * bsf, bsr + */ + + +function and8(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function and16(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function and32(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function test8(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; +} + +function test16(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; +} + +function test32(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; +} + +function or8(dest_operand, source_operand) +{ + last_result = dest_operand | source_operand; + + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function or16(dest_operand, source_operand) +{ + last_result = dest_operand | source_operand; + + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function or32(dest_operand, source_operand) +{ + last_result = dest_operand | source_operand; + + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function xor8(dest_operand, source_operand) +{ + last_result = dest_operand ^ source_operand; + + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function xor16(dest_operand, source_operand) +{ + last_result = dest_operand ^ source_operand; + + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + +function xor32(dest_operand, source_operand) +{ + last_result = dest_operand ^ source_operand; + + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + + return last_result; +} + + +/* + * rotates and shifts + */ + +function rol8(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + count &= 7; + + var result = dest_operand << count | dest_operand >> (8 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result & 1) + | (result << 11 ^ result << 4) & flag_overflow; + + return result; +} + +function rol16(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + count &= 15; + + var result = dest_operand << count | dest_operand >> (16 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result & 1) + | (result << 11 ^ result >> 4) & flag_overflow; + + return result; +} + +function rol32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + + var result = dest_operand << count | dest_operand >>> (32 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result & 1) + | (result << 11 ^ result >> 20) & flag_overflow; + + return result; +} + +function rcl8(dest_operand, count) +{ + count %= 9; + if(!count) + { + return dest_operand; + } + + var result = dest_operand << count | getcf() << (count - 1) | dest_operand >> (9 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 8 & 1) + | (result << 3 ^ result << 4) & flag_overflow; + + return result; +} + +function rcl16(dest_operand, count) +{ + count %= 17; + if(!count) + { + return dest_operand; + } + + var result = dest_operand << count | getcf() << (count - 1) | dest_operand >> (17 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 16 & 1) + | (result >> 5 ^ result >> 4) & flag_overflow; + + return result; +} + +function rcl32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + + var result = dest_operand << count | getcf() << (count - 1); + + if(count > 1) + { + result |= dest_operand >>> (33 - count); + } + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >>> (32 - count) & 1); + flags |= (flags << 11 ^ result >> 20) & flag_overflow; + + return result; +} + +function ror8(dest_operand, count) +{ + count &= 7; + if(!count) + { + return dest_operand; + } + + var result = dest_operand >> count | dest_operand << (8 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 7 & 1) + | (result << 4 ^ result << 5) & flag_overflow; + + return result; +} + +function ror16(dest_operand, count) +{ + count &= 15; + if(!count) + { + return dest_operand; + } + + var result = dest_operand >> count | dest_operand << (16 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 15 & 1) + | (result >> 4 ^ result >> 3) & flag_overflow; + + return result; +} + +function ror32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + + var result = dest_operand >>> count | dest_operand << (32 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 31 & 1) + | (result >> 20 ^ result >> 19) & flag_overflow; + + return result; +} + +function rcr8(dest_operand, count) +{ + count %= 9; + if(!count) + { + return dest_operand; + } + + var result = dest_operand >> count | getcf() << (8 - count) | dest_operand << (9 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 8 & 1) + | (result << 4 ^ result << 5) & flag_overflow; + + return result; +} + +function rcr16(dest_operand, count) +{ + count %= 17; + if(!count) + { + return dest_operand; + } + + var result = dest_operand >> count | getcf() << (16 - count) | dest_operand << (17 - count); + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 16 & 1) + | (result >> 4 ^ result >> 3) & flag_overflow; + + return result; +} + +function rcr32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + + var result = dest_operand >>> count | getcf() << (32 - count); + + if(count > 1) + { + result |= dest_operand << (33 - count); + } + + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >> (count - 1) & 1) + | (result >> 20 ^ result >> 19) & flag_overflow; + + return result; +} + +function shl8(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand << count; + + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (last_result >> 8 & 1) + | (last_result << 3 ^ last_result << 4) & flag_overflow; + + return last_result; +} + +function shl16(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand << count; + + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (last_result >> 16 & 1) + | (last_result >> 5 ^ last_result >> 4) & flag_overflow; + + return last_result; +} + +function shl32(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand << count; + + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + // test this + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >>> (32 - count) & 1); + flags |= ((flags & 1) ^ (last_result >> 31 & 1)) << 11 & flag_overflow; + + return last_result; +} + +function shr8(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand >> count; + + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >> (count - 1) & 1) + | (dest_operand >> 7 & 1) << 11 & flag_overflow; + + return last_result; +} + +function shr16(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand >> count; + + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >> (count - 1) & 1) + | (dest_operand >> 4) & flag_overflow; + + return last_result; +} + +function shr32(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand >>> count; + + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >>> (count - 1) & 1) + | (dest_operand >> 20) & flag_overflow; + + return last_result; +} + +function sar8(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand >> count; + + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >> (count - 1) & 1); + // of is zero + + return last_result; +} + +function sar16(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand >> count; + + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >> (count - 1) & 1); + + return last_result; +} + +function sar32(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand >> count; + + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >>> (count - 1) & 1); + + return last_result; +} + + +function shrd16(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + if(count <= 16) + { + last_result = dest_operand >> count | source_operand << (16 - count); + flags = (flags & ~1) | (dest_operand >> (count - 1) & 1); + } + else + { + last_result = dest_operand << (32 - count) | source_operand >> (count - 16); + flags = (flags & ~1) | (source_operand >> (count - 17) & 1); + } + + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~1 & ~flag_overflow; + flags = (flags & ~flag_overflow) | ((last_result ^ dest_operand) >> 4 & flag_overflow); + + return last_result; +} + +function shrd32(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand >>> count | source_operand << (32 - count); + + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~1 & ~flag_overflow; + flags = (flags & ~1) | (dest_operand >>> (count - 1) & 1); + flags = (flags & ~flag_overflow) | ((last_result ^ dest_operand) >> 20 & flag_overflow); + + return last_result; +} + +function shld16(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + if(count <= 16) + { + last_result = dest_operand << count | source_operand >>> (16 - count); + flags = (flags & ~1) | (dest_operand >>> (16 - count) & 1); + } + else + { + last_result = dest_operand >> (32 - count) | source_operand << (count - 16); + flags = (flags & ~1) | (source_operand >>> (32 - count) & 1); + } + + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~1 & ~flag_overflow; + flags = (flags & ~flag_overflow) | ((flags & 1) ^ (last_result >> 15 & 1)) << 11; + + return last_result; +} + +function shld32(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + + last_result = dest_operand << count | source_operand >>> (32 - count); + + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~1 & ~flag_overflow; + // test this + flags = (flags & ~1) | (dest_operand >>> (32 - count) & 1); + flags = (flags & ~flag_overflow) | ((flags & 1) ^ (last_result >> 31 & 1)) << 11; + + return last_result; +} + + +function bt_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; +} + +function btc_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + + return bit_base ^ 1 << bit_offset; +} + +function bts_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + + return bit_base | 1 << bit_offset; +} + +function btr_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + + return bit_base & ~(1 << bit_offset); +} + +function bt_mem(virt_addr, bit_offset) +{ + var bit_base = safe_read8(virt_addr + (bit_offset >> 3)); + bit_offset &= 7; + + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; +} + +function btc_mem(virt_addr, bit_offset) +{ + var phys_addr = translate_address_write(virt_addr + (bit_offset >> 3)); + var bit_base = memory.read8(phys_addr); + + bit_offset &= 7; + + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + + memory.write8(phys_addr, bit_base ^ 1 << bit_offset); +} + +function btr_mem(virt_addr, bit_offset) +{ + var phys_addr = translate_address_write(virt_addr + (bit_offset >> 3)); + var bit_base = memory.read8(phys_addr); + + bit_offset &= 7; + + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + + memory.write8(phys_addr, bit_base & ~(1 << bit_offset)); +} + +function bts_mem(virt_addr, bit_offset) +{ + var phys_addr = translate_address_write(virt_addr + (bit_offset >> 3)); + var bit_base = memory.read8(phys_addr); + + bit_offset &= 7; + + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + + memory.write8(phys_addr, bit_base | 1 << bit_offset); +} + +var mod37_bit_position = new Uint8Array([ + 32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4, + 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, + 20, 8, 19, 18 +]); + +function bsf16(old, bit_base) +{ + flags_changed = 0; + + if(bit_base === 0) + { + flags |= flag_zero; + + // not defined in the docs, but value doesn't change on my intel cpu + return old; + } + else + { + flags &= ~flag_zero; + + return mod37_bit_position[((-bit_base & bit_base) >>> 0) % 37]; + } +} + +function bsf32(old, bit_base) +{ + flags_changed = 0; + + if(bit_base === 0) + { + flags |= flag_zero; + + return old; + } + else + { + flags &= ~flag_zero; + + return mod37_bit_position[((-bit_base & bit_base) >>> 0) % 37]; + } +} + +function bsr16(old, bit_base) +{ + flags_changed = 0; + + if(bit_base === 0) + { + flags |= flag_zero; + return old; + } + else + { + flags &= ~flag_zero; + + var t = bit_base >>> 8; + + if(t) + { + return 8 + log2_table[t]; + } + else + { + return log2_table[bit_base]; + } + } +} + +function bsr32(old, bit_base) +{ + flags_changed = 0; + + if(bit_base === 0) + { + flags |= flag_zero; + return old; + } + else + { + flags &= ~flag_zero; + + var tt = bit_base >>> 16, + t; + + if(tt) + { + t = tt >>> 8; + + if(t) + { + return 24 + log2_table[t]; + } + else + { + return 16 + log2_table[tt]; + } + } + else + { + t = bit_base >>> 8; + + if(t) + { + return 8 + log2_table[t]; + } + else + { + return log2_table[bit_base]; + } + } + } +} + + diff --git a/src/browser/keyboard.js b/src/browser/keyboard.js new file mode 100644 index 00000000..62b889ab --- /dev/null +++ b/src/browser/keyboard.js @@ -0,0 +1,236 @@ +"use strict"; + +/** + * @constructor + */ +function KeyboardAdapter() +{ + var + /** + * @type {!Object.} + */ + keys_pressed = {}, + + keyboard = this, + + // callback to call on a keypress + send_code; + + this.enabled = true; + + /** + * Format: + * Javascript event.keyCode -> make code + * @const + */ + var charmap = new Uint16Array([ + 0, 0, 0, 0, 0, 0, 0, 0, + // 0x08: backspace, tab, enter + 0x0E, 0x0F, 0, 0, 0, 0x1C, 0, 0, + + // 0x10: shift, ctrl, alt, pause, caps lock + 0x2A, 0x1D, 0x38, 0, 0x3A, 0, 0, 0, + + // 0x18: escape + 0, 0, 0, 0x01, 0, 0, 0, 0, + + // 0x20: spacebar, page down/up, end, home, arrow keys, ins, del + 0x39, 0xE049, 0xE051, 0x4F, 0x47, 0x4B, 0x48, 0x4D, + 0x50, 0, 0, 0, 0, 0x52, 0x53, 0, + + // 0x30: numbers + 0x0B, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0A, + + // 0x3B: ;= (firefox only) + 0, 0x27, 0, 0x0D, 0, 0, 0, + + // 0x65: letters + 0x1E, 0x30, 0x2E, 0x20, 0x12, 0x21, 0x22, 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, + 0x31, 0x18, 0x19, 0x10, 0x13, 0x1F, 0x14, 0x16, 0x2F, 0x11, 0x2D, 0x15, 0x2C, + + 0, 0, 0, 0, 0, + + // 0x60: keypad + 0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47, + 0x48, 0x49, 0, 0, 0, 0, 0, 0, + + // 0x70: F1 to F12 + 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x57, 0x58, + + 0, 0, 0, 0, + + // 0x80 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + + // 0x90 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + + // 0xA0: - (firefox only) + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x0C, 0, 0, + + // 0xB0 + // , + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x27, 0x0D, 0x33, 0x0C, 0x34, 0x35, + + // 0xC0 + // ` + 0x29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + + // 0xD0 + // [']\ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x1A, 0x2B, 0x1B, 0x28, 0 + ]); + + this.init = function(code_fn) + { + this.destroy(); + + send_code = code_fn; + + window.addEventListener("keyup", keyup_handler, false); + window.addEventListener("keydown", keydown_handler, false); + window.addEventListener("blur", blur_handler, false); + }; + + this.destroy = function() + { + window.removeEventListener("keyup", keyup_handler, false); + window.removeEventListener("keydown", keydown_handler, false); + window.removeEventListener("blur", blur_handler, false); + }; + + + function may_handle(e) + { + if( + (e.shiftKey && e.ctrlKey && e.keyCode === 74) || + e.keyCode === 116 + ) { + // don't prevent opening chromium dev tools or F5 + // maybe add other important combinations here, too + return false; + } + + if(!keyboard.enabled) + { + return false; + } + + if(e.target) + { + return e.target.className === "phone_keyboard" || + (e.target.nodeName !== "INPUT" && e.target.nodeName !== "TEXTAREA"); + } + else + { + return true; + } + } + + function keyup_handler(e) + { + if(!may_handle(e)) + { + return; + } + + var code = e.keyCode; + + if(!keys_pressed[code]) + { + // stray keyup + return false; + } + + keys_pressed[code] = false; + + if(!handler(code, false)) + { + e.preventDefault(); + } + } + + function keydown_handler(e) + { + if(!may_handle(e)) + { + return; + } + + var code = e.keyCode; + + if(keys_pressed[code]) + { + handler(code, false); + } + + keys_pressed[code] = true; + + + if(!handler(code, true)) + { + e.preventDefault(); + } + } + + function blur_handler(e) + { + // trigger keyup for all pressed keys + var keys = Object.keys(keys_pressed), + key; + + for(var i = 0; i < keys.length; i++) + { + key = +keys[i]; + + if(keys_pressed[key]) + { + handler(key, false); + } + } + + keys_pressed = {}; + } + + /** + * @param {number} chr + * @param {boolean} keydown + */ + function handler(chr, keydown) + { + if(chr >= charmap.length || charmap[chr] === 0) + { + dbg_log("missing char: " + h(chr), LOG_PS2); + return true; + } + + var code = charmap[chr]; + + if(!keydown) + { + code |= 0x80; + } + dbg_log("Key: " + h(code) + " from " + h(chr) + " down=" + keydown, LOG_PS2); + + if(code > 0xFF) + { + // prefix + send_code(code >> 8); + send_code(code & 0xFF); + } + else + { + send_code(code); + } + + return false; + } +} + diff --git a/src/browser/main.js b/src/browser/main.js new file mode 100644 index 00000000..d6305e69 --- /dev/null +++ b/src/browser/main.js @@ -0,0 +1,589 @@ +"use strict"; + + +// setImmediate for the browser +var next_tick, set_tick; + +(function() +{ + var fn, + host = location.protocol + "//" + location.hostname; + + set_tick = function(f) + { + fn = f; + + window.removeEventListener("message", tick_handler, false); + window.addEventListener("message", tick_handler, false); + }; + + next_tick = function() + { + window.postMessage(null, host); + }; + + function tick_handler(e) + { + if(e.origin === host) + { + fn(); + } + } +})(); + +function log(data) +{ + var log_element = document.getElementById("log"); + + log_element.textContent += data + "\n"; + log_element.scrollTop = 1e9; +} + +function dump_text(text) +{ + var box = document.createElement("textarea"); + + box.appendChild(document.createTextNode(text)); + document.body.appendChild(box); +} + +function dump_file(ab, name) +{ + var blob = new Blob([ab]), + a; + + a = document.createElement("a"); + a["download"] = name; + a.href = window.URL.createObjectURL(blob), + a.textContent = "Download " + name; + a.onclick = function() { a.parentNode.removeChild(a); }; + + a.dataset["downloadurl"] = ["application/octet-stream", a["download"], a.href].join(":"); + + document.body.appendChild(a); +} + +(function() +{ + + /** @param {?=} progress */ + function load_file(filename, done, progress) + { + var http = new XMLHttpRequest(); + + http.open("get", filename, true); + http.responseType = "arraybuffer"; + + http.onload = function(e) + { + //if(http.readyState === 4 && http.status === 200) + if(http.response) + { + done(http.response); + } + }; + + if(progress) + { + http.onprogress = function(e) + { + progress(e); + }; + } + + http.send(null); + } + + /** + * Asynchronous access to ArrayBuffer, loading blocks lazily as needed. + * This is just a prototype and partly incomplete. + * + * @constructor + * @param {string} filename Name of the file to download parts + * from. Replaces %d with the block number (padded) + */ + function AsyncXHRBuffer(filename, block_size, size) + { + var block_count = size / block_size, + loaded_blocks, + padding_width; + + dbg_assert(block_count === (block_count | 0)); + loaded_blocks = Array(block_count); + + padding_width = ("" + (block_count - 1)).length; + + this.byteLength = size; + + // warning: fn may be called synchronously or asynchronously + this.get = function(start, len, fn) + { + // TODO: Unaligned read + dbg_assert(start % block_size === 0); + dbg_assert(len % block_size === 0); + dbg_assert(len); + + var blocks_to_load = len / block_size, + data, + loaded_count = 0, + start_block = start / block_size; + + if(blocks_to_load > 1) + { + // copy blocks in this buffer if there is more than one + data = new Uint8Array(len); + } + + for(var i = start_block; i < start_block + blocks_to_load; i++) + { + this.load_block(i, block_loaded); + } + + function block_loaded(buffer, i) + { + var block = new Uint8Array(buffer); + loaded_count++; + + if(blocks_to_load === 1) + { + data = block; + } + else + { + data.set(block, (i - start_block) * block_size); + } + + if(loaded_count === blocks_to_load) + { + fn(data); + } + } + }; + + this.load_block = function(i, fn) + { + var cached_block = loaded_blocks[i]; + + if(cached_block === undefined) + { + var file = filename.replace("%d", String.pad0(i, padding_width)); + + load_file(file, function(buffer) + { + loaded_blocks[i] = buffer; + fn(buffer, i); + }); + } + else + { + fn(cached_block, i); + } + }; + + this.get_buffer = function(fn) + { + // We must download all parts, unlikely a good idea for big files + if(size > 32 * 1024 * 1024) + { + dbg_log("Warning: Downloading all parts of a huge file. Will probably " + + "crash or never finish"); + } + + this.get(0, size, function(data) + { + return data.buffer; + }); + }; + + this.set = function(start, slice, fn) + { + // Discard (we can't write to the server) + // TODO: Put data into cache + }; + } + + function lock_mouse(elem) + { + var fn = elem["requestPointerLock"] || + elem["mozRequestPointerLock"] || + elem["webkitRequestPointerLock"]; + + if(fn) + { + fn.call(elem); + } + } + + function show_progress(e) + { + var el = $("loading"); + el.style.display = "block"; + + if(e.lengthComputable) + { + var per50 = e.loaded / e.total * 50 | 0; + + el.textContent = "Loading: " + 2 * per50 + "% [" + + String.chr_repeat("#", per50) + + String.chr_repeat(" ", 50 - per50) + "]"; + } + else + { + el.textContent = "Loading ..."; + } + } + + function $(id) + { + return document.getElementById(id); + } + + window.onload = function() + { + if(!("responseType" in new XMLHttpRequest)) + { + log("Your browser is not supported because it doesn't have XMLHttpRequest.responseType"); + return; + } + + var settings = { + load_devices: true + }; + + + $("lock_mouse").onclick = function() + { + lock_mouse(document.body); + $("lock_mouse").blur(); + }; + + load_file("bios/seabios.bin", function(img) + { + settings.bios = img; + }); + + load_file("bios/vgabios.bin", function(img) + { + settings.vga_bios = img; + }); + + function load_local(me, type) + { + if(me.files.length) + { + var reader = new FileReader(); + + reader.onload = function(e) + { + var buffer = new SyncBuffer(e.target.result); + + switch(type) + { + case "floppy": + settings.floppy_disk = buffer; + break; + case "hd": + settings.hda_disk = buffer; + break; + case "cdrom": + settings.cdrom_disk = buffer; + break; + } + + init(settings); + }; + + //reader.readAsBinaryString($("file").files[0]); + reader.readAsArrayBuffer(me.files[0]); + } + }; + + $("floppy_image").onchange = function() + { + load_local(this, "floppy"); + }; + + $("cd_image").onchange = function() + { + load_local(this, "cdrom"); + }; + + $("hd_image").onchange = function() + { + load_local(this, "hd"); + }; + + $("start_freedos").onclick = function() + { + load_file("images/freedos722.img", function(buffer) + { + settings.floppy_disk = new SyncBuffer(buffer); + init(settings); + }, show_progress); + + $("start_freedos").blur(); + }; + + $("start_win101").onclick = function() + { + load_file("images/windows101.img", function(buffer) + { + settings.floppy_disk = new SyncBuffer(buffer); + init(settings); + }, show_progress); + + $("start_win101").blur(); + }; + + + $("start_linux").onclick = function() + { + load_file("images/linux.iso", function(buffer) + { + settings.cdrom_disk = new SyncBuffer(buffer); + init(settings); + }, show_progress); + + $("start_linux").blur(); + }; + + $("start_koli").onclick = function() + { + load_file("images/kolibri.img", function(buffer) + { + settings.floppy_disk = new SyncBuffer(buffer); + init(settings); + }, show_progress); + + $("start_koli").blur(); + }; + + $("start_bsd").onclick = function() + { + load_file("images/openbsd.img", function(buffer) + { + settings.floppy_disk = new SyncBuffer(buffer); + init(settings); + }, show_progress); + + $("start_bsd").blur(); + }; + + if(DEBUG) + { + $("start_test").onclick = function() + { + settings.floppy_disk = new AsyncXHRBuffer("images/fd/freedos.part%d.img", 512, 720 * 1024); + init(settings); + + //settings.bios = settings.vga_bios = undefined; + //settings.linux = {}; + ////settings.linux.cmdline = "console=ttyS0 root=/dev/hda ro init=/sbin/init notsc=1 hdb=none" + //settings.linux.cmdline = "root=/dev/ram0 rw init=/sbin/init notsc=1"; + + //load_file("images/linux/vmlinux.bin", function(buffer) + //{ + // settings.linux.vmlinux = buffer; + // load_file("images/linux/linuxstart.bin", function(buffer) + // { + // settings.linux.linuxstart = buffer; + // load_file("images/linux/root.bin", function(buffer) + // { + // settings.linux.root = buffer; + // init(settings); + // }); + // }); + //}); + } + } + }; + + // works in firefox and chromium + if(document.readyState === "complete") + { + window.onload(); + } + + + // load_external("https://dl.dropbox.com/example/freedos.img.js"); + function load_external(url) + { + window["loaded"] = function(bin_image) + { + var buffer = new ArrayBuffer(bin_image.length), + buffer_array = new Uint8Array(buffer); + + for(var i = 0; i < bin_image.length; i++) + { + buffer_array[i] = bin_image.charCodeAt(i); + } + + window["loaded"] = function() { + dbg_log("load_external: result loaded twice ?"); + }; + }; + + var script = document.createElement("script"); + script.src = url; + + document.body.appendChild(script); + } + + + function init(settings) + { + var cpu = new v86(), + screen_adapter = new ScreenAdapter(); + + $("boot_options").parentNode.removeChild($("boot_options")); + $("loading").style.display = "none"; + $("runtime_options").style.display = "block"; + document.getElementsByClassName("phone_keyboard")[0].style.display = "block"; + + if(DEBUG) + { + $("step").onclick = function() + { + debug.step(); + } + + $("run_until").onclick = function() + { + debug.run_until(); + }; + + $("debugger").onclick = function() + { + debug.debugger(); + }; + } + + var running = true; + + $("run").onclick = function() + { + if(running) + { + running_time += Date.now() - last_tick; + $("run").value = "Run"; + cpu.stop(); + } + else + { + $("run").value = "Pause"; + cpu.run(); + last_tick = Date.now(); + } + + running = !running; + $("run").blur(); + }; + + var time = document.getElementById("running_time"), + ips = document.getElementById("speed"), + last_tick = Date.now(), + running_time = 0, + last_instr_counter = 0; + + function update_info() + { + if(running) + { + var now = Date.now(); + + running_time += now - last_tick; + last_tick = now; + + ips.textContent = (cpu.instr_counter - last_instr_counter) / 1000 | 0; + time.textContent = (running_time / 1000 | 0); + + last_instr_counter = cpu.instr_counter; + } + } + + setInterval(update_info, 1000); + + $("reset").onclick = function() + { + cpu.restart(); + $("reset").blur(); + }; + + $("get_floppy").onclick = function() + { + var buffer = cpu.dev.fdc.buffer; + + if(!buffer) + { + return; + } + + buffer.get_buffer(function(b) + { + dump_file(b, "floppy.img"); + }); + + $("get_floppy").blur(); + }; + + $("ctrlaltdel").onclick = function() + { + var ps2 = cpu.dev.ps2; + + ps2.kbd_send_code(0x1D); // ctrl + ps2.kbd_send_code(0x38); // alt + ps2.kbd_send_code(0x53); // delete + + // break codes + ps2.kbd_send_code(0x1D | 0x80); + ps2.kbd_send_code(0x38 | 0x80); + ps2.kbd_send_code(0x53 | 0x80); + + $("ctrlaltdel").blur(); + }; + + $("scale").onchange = function() + { + var n = parseFloat(this.value); + + if(n || n > 0) + { + screen_adapter.set_scale(n, n); + } + else + { + this.value = "1"; + } + }; + + $("fullscreen").onclick = function() + { + var elem = document.getElementById("screen_container"), + + // bracket notation because otherwise they get renamed by closure compiler + fn = elem["requestFullScreen"] || + elem["webkitRequestFullscreen"] || + elem["mozRequestFullScreen"] || + elem["msRequestFullScreen"]; + + if(fn) + { + fn.call(elem); + + // This is necessary, because otherwise chromium keyboard doesn't work anymore. + // Might (but doesn't seem to) break something else + document.getElementsByClassName("phone_keyboard")[0].focus(); + } + + lock_mouse(elem); + }; + + settings.screen_adapter = screen_adapter; + settings.keyboard_adapter = new KeyboardAdapter(); + settings.mouse_adapter = new MouseAdapter(); + + cpu.init(settings); + cpu.run(); + } + +})(); diff --git a/src/browser/mouse.js b/src/browser/mouse.js new file mode 100644 index 00000000..a3678602 --- /dev/null +++ b/src/browser/mouse.js @@ -0,0 +1,132 @@ + +/** @constructor */ +function MouseAdapter() +{ + /** @const */ + var SPEED_FACTOR = .5; + + var left_down = false, + right_down = false, + middle_down = false, + + last_x = 0, + last_y = 0, + + // callback to call on a mouse click + send_click, + + // callback to call on a mouse move + send_delta, + + mouse = this; + + this.enabled = false; + + function may_handle(e) + { + return mouse.enabled && + (!e.target || e.type === "mousemove" || (e.target.nodeName !== "INPUT" && e.target.nodeName !== "TEXTAREA")); + } + + this.destroy = function() + { + window.removeEventListener("mousemove", mousemove_handler, false); + document.removeEventListener("contextmenu", contextmenu_handler, false); + window.removeEventListener("mousedown", mousedown_handler, false); + window.removeEventListener("mouseup", mouseup_handler, false); + }; + + this.init = function(click_fn, delta_fn, wheel_fn) + { + this.destroy(); + + send_click = click_fn; + send_delta = delta_fn; + + // TODO: wheel_fn + + window.addEventListener("mousemove", mousemove_handler, false); + document.addEventListener("contextmenu", contextmenu_handler, false); + window.addEventListener("mousedown", mousedown_handler, false); + window.addEventListener("mouseup", mouseup_handler, false); + }; + + function mousemove_handler(e) + { + if(!may_handle(e)) + { + return; + } + + var delta_x, delta_y; + + if(true) + { + delta_x = e["webkitMovementX"] || e["mozMovementX"] || 0; + delta_y = e["webkitMovementY"] || e["mozMovementY"] || 0; + } + else + { + // Fallback for other browsers? + delta_x = e.clientX - last_x; + delta_y = e.clientY - last_y; + + last_x = e.clientX; + last_y = e.clientY; + } + + + delta_x = Math.roundInfinity(delta_x * SPEED_FACTOR); + delta_y = Math.roundInfinity(delta_y * SPEED_FACTOR); + + send_delta(delta_x, -delta_y); + + } + + function contextmenu_handler(e) + { + if(may_handle(e)) + { + e.preventDefault(); + } + } + + function mousedown_handler(e) + { + if(may_handle(e)) + { + click_event(e, true); + } + } + + function mouseup_handler(e) + { + if(may_handle(e)) + { + click_event(e, false); + } + } + + function click_event(e, down) + { + if(e.which === 1) + { + left_down = down; + } + else if(e.which === 2) + { + middle_down = down; + } + else if(e.which === 3) + { + right_down = down; + } + else + { + dbg_log("Unknown event.which: " + e.which, LOG_MOUSE); + } + send_click(left_down, middle_down, right_down); + + e.preventDefault(); + } +} diff --git a/src/browser/screen.js b/src/browser/screen.js new file mode 100644 index 00000000..687c1636 --- /dev/null +++ b/src/browser/screen.js @@ -0,0 +1,354 @@ +"use strict"; + +if(!window.requestAnimationFrame) +{ + window.requestAnimationFrame = + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame; +} + + +/** + * Adapter to use visual screen in browsers (in constrast to node) + * @constructor + */ +function ScreenAdapter() +{ + var + dom_target = document.body, + text_screen = document.getElementById("screen"), + graphic_screen = document.getElementById("vga"), + graphic_context = graphic_screen.getContext("2d"), + cursor_element = document.createElement("div"), + + + graphic_image_data, + graphic_buffer, + + /** @type {number} */ + cursor_row, + + /** @type {number} */ + cursor_col, + + /** @type {number} */ + scale_x = 1, + + /** @type {number} */ + scale_y = 1, + + graphical_mode_width, + + screen = this, + + changed_rows, + + did_redraw = true, + + // Index 0: ASCII code + // Index 1: Background color + // Index 2: Foreground color + text_mode_data, + + // number of columns + text_mode_width, + + // number of rows + text_mode_height; + + + + /** + * Charmaps that containt unicode sequences for the default dospage + * @const + */ + var charmap_high = new Uint16Array([ + 0xC7, 0xFC, 0xE9, 0xE2, 0xE4, 0xE0, 0xE5, 0xE7, + 0xEA, 0xEB, 0xE8, 0xEF, 0xEE, 0xEC, 0xC4, 0xC5, + 0xC9, 0xE6, 0xC6, 0xF4, 0xF6, 0xF2, 0xFB, 0xF9, + 0xFF, 0xD6, 0xDC, 0xA2, 0xA3, 0xA5, 0x20A7, 0x192, + 0xE1, 0xED, 0xF3, 0xFA, 0xF1, 0xD1, 0xAA, 0xBA, + 0xBF, 0x2310, 0xAC, 0xBD, 0xBC, 0xA1, 0xAB, 0xBB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x3B1, 0xDF, 0x393, 0x3C0, 0x3A3, 0x3C3, 0xB5, 0x3C4, + 0x3A6, 0x398, 0x3A9, 0x3B4, 0x221E, 0x3C6, 0x3B5, 0x2229, + 0x2261, 0xB1, 0x2265, 0x2264, 0x2320, 0x2321, 0xF7, + 0x2248, 0xB0, 0x2219, 0xB7, 0x221A, 0x207F, 0xB2, 0x25A0, 0xA0 + ]); + + /** @const */ + var charmap_low = new Uint16Array([ + 0x20, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, + 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, + 0x25BA, 0x25C4, 0x2195, 0x203C, 0xB6, 0xA7, 0x25AC, 0x21A8, + 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC + ]); + + graphic_context["imageSmoothingEnabled"] = false; + graphic_context["mozImageSmoothingEnabled"] = false; + graphic_context["webkitImageSmoothingEnabled"] = false; + + cursor_element.id = "cursor"; + text_screen.style.display = "block"; + + graphic_screen.style.display = "none"; + + this.put_char = function(row, col, chr, bg_color, fg_color) + { + changed_rows[row] = 1; + + var p = 3 * (row * text_mode_width + col); + text_mode_data[p] = chr; + text_mode_data[p + 1] = bg_color; + text_mode_data[p + 2] = fg_color; + }; + + this.timer_text = function() + { + if(!did_redraw) + { + return; + } + did_redraw = false; + + requestAnimationFrame(update_text); + }; + + function update_text() + { + did_redraw = true; + + for(var i = 0; i < text_mode_height; i++) + { + if(changed_rows[i]) + { + screen.text_update_row(i); + changed_rows[i] = 0; + } + } + } + + this.put_pixel = function(x, y, color) + { + var offset = y * graphical_mode_width + x << 2; + + graphic_buffer[offset] = color >> 16 & 0xFF; + graphic_buffer[offset + 1] = color >> 8 & 0xFF; + graphic_buffer[offset + 2] = color & 0xFF; + }; + + this.put_pixel_linear = function(index, color) + { + // (addr ^ 3) - 1: Change BGR (svga) order to RGB (canvas) + graphic_buffer[(index ^ 3) - 1] = color; + }; + + this.timer_graphical = function() + { + if(!did_redraw) + { + return; + } + did_redraw = false; + + requestAnimationFrame(function() + { + did_redraw = true; + graphic_context.putImageData(graphic_image_data, 0, 0); + }); + }; + + this.destroy = function() + { + //dom_target.removeChild(text_screen); + //dom_target.removeChild(graphic_screen); + }; + + this.set_mode = function(graphical) + { + if(graphical) + { + text_screen.style.display = "none"; + graphic_screen.style.display = "block"; + } + else + { + text_screen.style.display = "block"; + graphic_screen.style.display = "none"; + } + }; + + this.clear_screen = function() + { + graphic_context.fillStyle = "#000"; + graphic_context.fillRect(0, 0, graphic_screen.width, graphic_screen.height); + }; + + /** + * @param {number} cols + * @param {number} rows + */ + this.set_size_text = function(cols, rows) + { + changed_rows = new Int8Array(rows); + text_mode_data = new Int32Array(cols * rows * 3); + + text_mode_width = cols; + text_mode_height = rows; + + while(text_screen.firstChild) + { + text_screen.removeChild(text_screen.firstChild); + } + + for(var i = 0; i < rows; i++) + { + text_screen.appendChild(document.createElement("div")); + } + }; + + this.set_size_graphical = function(width, height) + { + graphic_screen.style.display = "block"; + + graphic_screen.width = width; + graphic_screen.height = height; + + //graphic_screen.style.width = width * scale_x + "px"; + //graphic_screen.style.height = height * scale_y + "px"; + + // Make sure to call this here, because pixels are transparent otherwise + screen.clear_screen(); + + graphic_image_data = graphic_context.getImageData(0, 0, width, height); + graphic_buffer = graphic_image_data.data; + + graphical_mode_width = width; + }; + + this.set_scale = function(s_x, s_y) + { + scale_x = s_x; + scale_y = s_y; + + elem_set_scale(graphic_screen, scale_x, scale_y); + elem_set_scale(text_screen, scale_x, scale_y); + }; + this.set_scale(scale_x, scale_y); + + function elem_set_scale(elem, scale_x, scale_y) + { + var scale_str = ""; + + scale_str += scale_x === 1 ? "" : " scaleX(" + scale_x + ")"; + scale_str += scale_y === 1 ? "" : " scaleY(" + scale_y + ")"; + + elem.style.webkitTransform = elem.style.MozTransform = scale_str; + } + + this.update_cursor_scanline = function(start, end) + { + if(start & 0x20) + { + cursor_element.style.display = "none"; + } + else + { + cursor_element.style.display = "inline"; + + cursor_element.style.height = (end - start) + "px"; + cursor_element.style.marginTop = start + "px"; + } + }; + + this.update_cursor = function(row, col) + { + if(row !== cursor_row || col !== cursor_col) + { + changed_rows[row] = 1; + changed_rows[cursor_row] = 1; + + cursor_row = row; + cursor_col = col; + } + }; + + this.text_update_row = function(row) + { + var offset = 3 * row * text_mode_width, + row_element, + color_element, + bg_color, + fg_color, + text; + + row_element = document.createElement("div"); + + for(var i = 0; i < text_mode_width; ) + { + color_element = document.createElement("span"); + + bg_color = text_mode_data[offset + 1]; + fg_color = text_mode_data[offset + 2]; + + color_element.style.backgroundColor = "#" + h(bg_color, 6); + color_element.style.color = "#" + h(fg_color, 6); + + text = ""; + + // put characters of the same color in one element + while(i < text_mode_width + && text_mode_data[offset + 1] === bg_color + && text_mode_data[offset + 2] === fg_color) + { + var ascii = text_mode_data[offset], + chr; + + // use of utf-8 + if(ascii > 127) + { + chr = String.fromCharCode(charmap_high[ascii - 0x80]); + } + else if(ascii < 32) + { + chr = String.fromCharCode(charmap_low[ascii]); + } + else + { + chr = String.fromCharCode(ascii); + } + + text += chr; + + i++; + offset += 3; + + if(row === cursor_row) + { + if(i === cursor_col) + { + // next row will be cursor + // create new element + break; + } + else if(i === cursor_col + 1) + { + // found the cursor + row_element.appendChild(cursor_element); + break; + } + } + } + + color_element.textContent = text; + row_element.appendChild(color_element); + } + + text_screen.replaceChild(row_element, text_screen.childNodes[row]); + }; +} diff --git a/src/const.js b/src/const.js new file mode 100644 index 00000000..e0df56ac --- /dev/null +++ b/src/const.js @@ -0,0 +1,155 @@ + +/** @define {boolean} */ +var DEBUG = true; + + +var + +/** + * @const + * @type {number} + */ +memory_size = 1024 * 1024 * 64; + +var + +/** @const */ LOG_ALL = -1, +/** @const */ LOG_NONE = 0, + +/** @const */ LOG_OTHER = 0x00001, +/** @const */ LOG_CPU = 0x00002, +/** @const */ LOG_FPU = 0x00004, +/** @const */ LOG_MEM = 0x00008, +/** @const */ LOG_DMA = 0x00010, +/** @const */ LOG_IO = 0x00020, +/** @const */ LOG_PS2 = 0x00040, +/** @const */ LOG_PIC = 0x00080, +/** @const */ LOG_VGA = 0x00100, +/** @const */ LOG_PIT = 0x00200, +/** @const */ LOG_MOUSE = 0x00400, +/** @const */ LOG_PCI = 0x00800, +/** @const */ LOG_BIOS = 0x01000, +/** @const */ LOG_CD = 0x02000, +/** @const */ LOG_SERIAL = 0x04000, +/** @const */ LOG_DISK = 0x08000, +/** @const */ LOG_RTC = 0x10000, + + + +///** @const */ LOG_LEVEL = LOG_OTHER | LOG_PS2 | LOG_BIOS; +///** @const */ LOG_LEVEL = LOG_PS2 | LOG_OTHER | LOG_IO; +///** @const */ LOG_LEVEL = LOG_PS2; +///** @const */ LOG_LEVEL = LOG_OTHER | LOG_CPU | LOG_BIOS; +///** @const */ LOG_LEVEL = LOG_VGA | LOG_IO | LOG_BIOS | LOG_OTHER; +///** @const */ LOG_LEVEL = LOG_FPU | LOG_OTHER; +///** @const */ LOG_LEVEL = LOG_DMA | LOG_DISK | LOG_IO | LOG_PCI; +///** @const */ LOG_LEVEL = LOG_DMA | LOG_DISK | LOG_PCI | LOG_CD | LOG_BIOS; +/** @const */ LOG_LEVEL = LOG_ALL & ~LOG_DISK & ~LOG_DMA & ~LOG_VGA & ~LOG_PS2 & ~LOG_FPU; +///** @const */ LOG_LEVEL = LOG_SERIAL | LOG_IO; +///** @const */ LOG_LEVEL = LOG_PIT | LOG_RTC; +///** @const */ LOG_LEVEL = 0; + + +var +/** @const */ TLB_SYSTEM_READ = 1, +/** @const */ TLB_SYSTEM_WRITE = 2, +/** @const */ TLB_USER_READ = 4, +/** @const */ TLB_USER_WRITE = 8; + + +var + + +// flags register bitflags +/** @const */ flag_carry = 1, +/** @const */ flag_parity = 4, +/** @const */ flag_adjust = 16, +/** @const */ flag_zero = 64, +/** @const */ flag_sign = 128, +/** @const */ flag_trap = 256, +/** @const */ flag_interrupt = 512, +/** @const */ flag_direction = 1024, +/** @const */ flag_overflow = 2048, +/** @const */ flag_iopl = 1 << 12 | 1 << 13, +/** @const */ flag_nt = 1 << 14, +/** @const */ flag_vm = 1 << 17, + +/** + * default values of unused flags bits + * @const + */ +flags_default = 1 << 1, + +/** + * bitmask to select used flags bits + * @const + */ +flags_mask = 1 << 0 | 1 << 2 | 1 << 4 | 1 << 6 | 1 << 7 | 1 << 8 | 1 << 9 + | 1 << 10 | 1 << 11 | 1 << 12 | 1 << 13 | 1 << 14 | + 1 << 16 | 1 << 17 | 1 << 18 | 1 << 19 | 1 << 20 | 1 << 21, + +/** + * all arithmetic flags + * @const + */ +flags_all = flag_carry | flag_parity | flag_adjust | flag_zero | flag_sign | flag_overflow, + + + +/** + * opsizes used by get flag functions + * + * @const + */ +OPSIZE_8 = 8, +/** @const */ +OPSIZE_16 = 16, +/** @const */ +OPSIZE_32 = 32, + +/** @const */ +PSE_ENABLED = 128, + +/** @const */ reg_eax = 0, +/** @const */ reg_ecx = 1, +/** @const */ reg_edx = 2, +/** @const */ reg_ebx = 3, +/** @const */ reg_esp = 4, +/** @const */ reg_ebp = 5, +/** @const */ reg_esi = 6, +/** @const */ reg_edi = 7, + +/** @const */ reg_ax = 0, +/** @const */ reg_cx = 2, +/** @const */ reg_dx = 4, +/** @const */ reg_bx = 6, +/** @const */ reg_sp = 8, +/** @const */ reg_bp = 10, +/** @const */ reg_si = 12, +/** @const */ reg_di = 14, + +/** @const */ reg_al = 0, +/** @const */ reg_cl = 4, +/** @const */ reg_dl = 8, +/** @const */ reg_bl = 12, +/** @const */ reg_ah = 1, +/** @const */ reg_ch = 5, +/** @const */ reg_dh = 9, +/** @const */ reg_bh = 13, + + +/** @const */ reg_es = 0, +/** @const */ reg_cs = 1, +/** @const */ reg_ss = 2, +/** @const */ reg_ds = 3, +/** @const */ reg_fs = 4, +/** @const */ reg_gs = 5, +/** @const */ reg_noseg = 6, + + + +/** @const */ LOOP_COUNTER = 20001, +/** @const */ TIME_PER_FRAME = 33; + + + diff --git a/src/cpu.js b/src/cpu.js new file mode 100644 index 00000000..2b4d855e --- /dev/null +++ b/src/cpu.js @@ -0,0 +1,6029 @@ +"use strict"; +var debug = {}; +/** @constructor */ +function v86() +{ +var cpu = this; +this.run = function() +{ + if(!running) + { + cpu_run(); + } +} +this.stop = cpu_stop; +this.init = cpu_init; +this.restart = cpu_restart; +this.dev = {}; +this.instr_counter = 0; +var + segment_is_null, + segment_offsets, + segment_limits, + segment_infos, + /* + * Translation Lookaside Buffer + */ + tlb_user_read, + tlb_user_write, + tlb_system_read, + tlb_system_write, + /* + * Information about which pages are cached in the tlb. + * By bit: + * 0 system, read + * 1 system, write + * 2 user, read + * 3 user, write + */ + tlb_info, + /* + * Same as tlb_info, except it only contains global pages + */ + tlb_info_global, + /** + * Wheter or not in protected mode + * @type {boolean} + */ + protected_mode, + /** + * interrupt descriptor table + * @type {number} + */ + idtr_size, + /** @type {number} */ + idtr_offset, + /** + * global descriptor table register + * @type {number} + */ + gdtr_size, + /** @type {number} */ + gdtr_offset, + /** + * local desciptor table + * @type {number} + */ + ldtr_size, + /** @type {number} */ + ldtr_offset, + /** + * task register + * @type {number} + */ + tsr_size, + /** @type {number} */ + tsr_offset, + /* + * whether or not a page fault occured + */ + page_fault, + /** @type {number} */ + cr0, + /** @type {number} */ + cr2, + /** @type {number} */ + cr3, + /** @type {number} */ + cr4, + // current privilege level + /** @type {number} */ + cpl, + // paging enabled + /** @type {boolean} */ + paging, + // if false, pages are 4 KiB, else 4 Mib + /** @type {number} */ + page_size_extensions, + // current operand/address/stack size + /** @type {boolean} */ + is_32, + /** @type {boolean} */ + operand_size_32, + /** @type {boolean} */ + stack_size_32, + /** + * Cycles since last cpu reset, used by rdtsc instruction + * @type {number} + */ + cpu_timestamp_counter, + /** @type {number} */ + previous_ip, + /** + * wheter or not in step mode + * used for debugging + * @type {boolean} + */ + step_mode, + /** + * was the last instruction a hlt + * @type {boolean} + */ + in_hlt, + /** @type {VGAScreen} */ + vga, + /** @type {PS2} */ + ps2, + /** + * Programmable interval timer + * @type {PIT} + */ + timer, + /** + * Real Time Clock + * @type {RTC} + */ + rtc, + /** + * Floppy Disk controller + * @type {FloppyController} + */ + fdc, + /** + * Serial controller + * @type {UART} + */ + uart, + /** @type {boolean} */ + running, + /** @type {boolean} */ + stopped, + /** @type {number} */ + loop_counter, + /** @type {Memory} */ + memory, + /** @type {(FPU|NoFPU)} */ + fpu, + /** + * Programmable interrupt controller + * @type {PIC} + */ + pic, + /** + * @type {IO} + */ + io, + /** + * @type {PCI} + */ + pci, + /** + * @type {CDRom} + */ + cdrom, + /** + * @type {HDD} + */ + hda, + /** + * @type {HDD} + */ + hdb, + /** + * Direct Memory Access Controller + * @type {DMA} + */ + dma, + translate_address_read, + translate_address_write, + ops, + /** @type {boolean} */ + address_size_32, + /** @type {number} */ + instruction_pointer, + /** @type {number} */ + last_virt_eip, + /** @type {number} */ + eip_phys, + /** @type {number} */ + last_virt_esp, + /** @type {number} */ + esp_phys, + // current state of prefixes + segment_prefix, + /** @type {boolean} */ + repeat_string_prefix, + /** @type {boolean} */ + repeat_string_type, + /** @type {number} */ + last_result, + /** @type {number} */ + flags, + /** + * bitmap of flags which are not updated in the flags variable + * changed by arithmetic instructions, so only relevant to arithmetic flags + * @type {number} + */ + flags_changed, + /** + * the last 2 operators and the result and size of the last arithmetic operation + * @type {number} + */ + last_op1, + /** @type {number} */ + last_op2, + /** @type {number} */ + last_op_size, + // registers + reg32, + reg32s, + reg16, + reg16s, + reg8, + reg8s, + sreg, + // sp or esp, depending on stack size attribute + stack_reg, + reg_vsp, + reg_vbp, + // reg16 or reg32, depending on address size attribute + regv, + reg_vcx, + reg_vsi, + reg_vdi, + // functions that are set depending on whether paging is enabled or not + read_imm8, + read_imm8s, + read_imm16, + read_imm32s, + safe_read8, + safe_read8s, + safe_read16, + safe_read32s, + get_esp_read, + get_esp_write, + table, + table0F, + modrm_resolve, + current_settings +; +function cpu_run() +{ + if(stopped) + { + stopped = running = false; + return; + } + running = true; + try { + do_run(); + } + catch(e) + { + if(e === 0xDEADBEE) + { + // A legit CPU exception (for instance, a page fault happened) + // call_interrupt_vector has already been called at this point, + // so we just need to reset some state + page_fault = false; + repeat_string_prefix = false; + segment_prefix = -1; + address_size_32 = is_32; + update_address_size(); + operand_size_32 = is_32; + update_operand_size(); + cpu_run(); + } + else + { + throw e; + } + } +}; +function cpu_stop() +{ + if(running) + { + stopped = true; + } +} +function cpu_restart() +{ + var was_running = running; + stopped = true; + running = false; + setTimeout(function() + { + ps2.destroy(); + vga.destroy(); + cpu_init(current_settings); + if(was_running) + { + cpu_run(); + } + }, 10); +} +function cpu_reboot_internal() +{ + dbg_assert(running); + ps2.destroy(); + vga.destroy(); + cpu_init(current_settings); + throw 0xDEADBEE; +} +function cpu_init(settings) +{ + // see browser/main.js or node/main.js + if(typeof set_tick !== "undefined") + { + set_tick(cpu_run); + } + current_settings = settings; + cpu.memory = memory = new Memory(new ArrayBuffer(memory_size), memory_size); + segment_is_null = new Uint8Array(8); + segment_limits = new Uint32Array(8); + segment_infos = new Uint32Array(8); + segment_offsets = new Int32Array(8); + // 16 MB in total + tlb_user_read = new Int32Array(1 << 20); + tlb_user_write = new Int32Array(1 << 20); + tlb_system_read = new Int32Array(1 << 20); + tlb_system_write = new Int32Array(1 << 20); + tlb_info = new Uint8Array(1 << 20); + tlb_info_global = new Uint8Array(1 << 20); + reg32 = new Uint32Array(8); + reg32s = new Int32Array(reg32.buffer); + reg16 = new Uint16Array(reg32.buffer); + reg16s = new Int16Array(reg32.buffer); + reg8 = new Uint8Array(reg32.buffer); + reg8s = new Int8Array(reg32.buffer); + sreg = new Uint16Array(8); + protected_mode = false; + idtr_size = 0; + idtr_offset = 0; + gdtr_size = 0; + gdtr_offset = 0; + ldtr_size = 0; + ldtr_offset = 0; + tsr_size = 0; + tsr_offset = 0; + page_fault = false; + cr0 = 0; + cr2 = 0; + cr3 = 0; + cr4 = 0; + cpl = 0; + paging = false; + page_size_extensions = 0; + is_32 = false; + operand_size_32 = false; + stack_size_32 = false; + address_size_32 = false; + paging_changed(); + update_operand_size(); + update_address_size(); + stack_reg = reg16; + reg_vsp = reg_sp; + reg_vbp = reg_bp; + cpu_timestamp_counter = 0; + previous_ip = 0; + step_mode = false; + in_hlt = false; + running = false; + stopped = false; + loop_counter = 20; + translate_address_read = translate_address_disabled; + translate_address_write = translate_address_disabled; + segment_prefix = -1; + repeat_string_prefix = false; + last_result = 0; + flags = flags_default; + flags_changed = 0; + last_op1 = 0; + last_op2 = 0; + last_op_size = 0; + if(settings.bios) + { + // load bios + var data = new Uint8Array(settings.bios), + start = 0x100000 - settings.bios.byteLength; + for(var i = 0; i < settings.bios.byteLength; i++) + { + memory.mem8[start + i] = data[i]; + } + if(settings.vga_bios) + { + // load vga bios + data = new Uint8Array(settings.vga_bios); + for(var i = 0; i < settings.vga_bios.byteLength; i++) + { + memory.mem8[0xC0000 + i] = data[i]; + } + } + // ip initial value + instruction_pointer = 0xFFFF0; + // ss and sp inital value + switch_seg(reg_ss, 0x30); + reg16[reg_sp] = 0x100; + } + else if(settings.linux) + { + instruction_pointer = 0x10000; + memory.write_blob(new Uint8Array(settings.linux.vmlinux), 0x100000); + memory.write_blob(new Uint8Array(settings.linux.linuxstart), instruction_pointer); + if(settings.linux.root) + { + memory.write_blob(new Uint8Array(settings.linux.root), 0x00400000); + reg32[reg_ebx] = settings.linux.root.byteLength; + } + memory.write_string(settings.linux.cmdline, 0xF800); + reg32[reg_eax] = memory_size; + reg32[reg_ecx] = 0xF800; + switch_seg(reg_cs, 0); + switch_seg(reg_ss, 0); + switch_seg(reg_ds, 0); + switch_seg(reg_es, 0); + switch_seg(reg_gs, 0); + switch_seg(reg_fs, 0); + is_32 = true; + address_size_32 = true; + operand_size_32 = true; + stack_size_32 = true; + protected_mode = true; + update_operand_size(); + update_address_size(); + regv = reg32; + reg_vsp = reg_esp; + reg_vbp = reg_ebp; + cr0 = 1; + } + else + { + switch_seg(reg_ss, 0x30); + reg16[reg_sp] = 0x100; + instruction_pointer = 0; + } + cpu.dev = {}; + if(settings.load_devices) + { + var devapi = { + memory: memory, + reboot: cpu_reboot_internal, + }; + devapi.io = cpu.dev.io = io = new IO(); + devapi.pic = pic = new PIC(devapi, call_interrupt_vector, handle_irqs); + devapi.pci = pci = new PCI(devapi); + devapi.dma = dma = new DMA(devapi); + cpu.dev.vga = vga = new VGAScreen(devapi, settings.screen_adapter) + cpu.dev.ps2 = ps2 = new PS2(devapi, settings.keyboard_adapter, settings.mouse_adapter); + //fpu = new NoFPU(); + fpu = new FPU(devapi); + uart = new UART(devapi); + cpu.dev.fdc = fdc = new FloppyController(devapi, settings.floppy_disk); + if(settings.cdrom_disk) + { + cpu.dev.cdrom = cdrom = new CDRom(devapi, settings.cdrom_disk); + } + if(settings.hda_disk) + { + cpu.dev.hda = hda = new HDD(devapi, settings.hda_disk, 0); + } + if(settings.hdb_disk) + { + cpu.dev.hdb = hdb = new HDD(devapi, settings.hdb_disk, 1); + } + timer = new PIT(devapi); + rtc = new RTC(devapi, fdc.type); + } + if(DEBUG) + { + // used for debugging + ops = new CircularQueue(30000); + if(typeof window !== "undefined") + { + window.memory = memory; + window.vga = vga; + } + if(io) + { + // write seabios debug output to console + var seabios_debug = ""; + io.register_write(0x402, function(out_byte) + { + // seabios debug + // + if(out_byte === 10) + { + dbg_log(seabios_debug, LOG_BIOS); + seabios_debug = ""; + } + else + { + seabios_debug += String.fromCharCode(out_byte); + } + }); + } + } +} +function do_run() +{ + var + /** + * @type {number} + */ + now, + start = Date.now(); + vga.timer(start); + // outer loop: + // runs cycles + timers + for(var j = loop_counter; j--;) + { + // inner loop: + // runs only cycles + for(var k = LOOP_COUNTER; k--;) + { + previous_ip = instruction_pointer; + cycle(); + cpu_timestamp_counter++; + } + now = Date.now(); + timer.timer(now); + rtc.timer(now); + } + cpu.instr_counter += loop_counter * LOOP_COUNTER; + if(now - start > TIME_PER_FRAME) + { + loop_counter--; + } + else + { + loop_counter++; + } + next_tick(); +} +// do_run must not be inlined into cpu_run, because then more code +// is in the deoptimized try-catch. +// This trick is a bit ugly, but it works without further complication. +if(typeof window !== "undefined") +{ + window.__no_inline = do_run; +} +/** + * execute a single instruction cycle on the cpu + * this includes reading all prefixes and the whole instruction + */ +function cycle() +{ + var opcode = read_imm8(); + logop(instruction_pointer - 1, opcode); + // call the instruction + table[opcode](); + // TODO + //if(flags & flag_trap) + //{ + // + //} +} +cpu.cycle = function() +{ + table[read_imm8()](); +} +function cr0_changed() +{ + //protected_mode = (cr0 & 1) === 1; + //dbg_log("cr0 = " + h(cr0)); + var new_paging = (cr0 & 0x80000000) !== 0; + if(fpu.is_fpu) + { + cr0 &= ~4; + } + else + { + cr0 |= 4; + } + if(new_paging !== paging) + { + paging = new_paging; + paging_changed(); + } +} +function paging_changed() +{ + var table = paging ? pe_functions : npe_functions; + read_imm8 = table.read_imm8; + read_imm8s = table.read_imm8s; + read_imm16 = table.read_imm16; + read_imm32s = table.read_imm32s; + safe_read8 = table.safe_read8; + safe_read8s = table.safe_read8s; + safe_read16 = table.safe_read16; + safe_read32s = table.safe_read32s; + get_esp_read = table.get_esp_read; + get_esp_write = table.get_esp_write; + // set translate_address_* depending on cpl and paging + cpl_changed(); +} +function cpl_changed() +{ + last_virt_eip = -1; + last_virt_esp = -1; + if(!paging) + { + translate_address_write = translate_address_disabled; + translate_address_read = translate_address_disabled; + } + else if(cpl) + { + translate_address_write = translate_address_user_write; + translate_address_read = translate_address_user_read; + } + else + { + translate_address_write = translate_address_system_write; + translate_address_read = translate_address_system_read; + } +} +// functions that are used when paging is disabled +var npe_functions = { + get_esp_read: get_esp_npe, + get_esp_write: get_esp_npe, + read_imm8: function() + { + return memory.mem8[instruction_pointer++]; + }, + read_imm8s: function() + { + return memory.mem8s[instruction_pointer++]; + }, + read_imm16 : function() + { + var data16 = memory.read16(instruction_pointer); + instruction_pointer = instruction_pointer + 2 | 0; + return data16; + }, + read_imm32s : function() + { + var data32 = memory.read32s(instruction_pointer); + instruction_pointer = instruction_pointer + 4 | 0; + return data32; + }, + safe_read8 : function(addr) { return memory.read8(addr) }, + safe_read8s : function(addr) { return memory.read8s(addr); }, + safe_read16 : function(addr) { return memory.read16(addr); }, + safe_read32s : function(addr) { return memory.read32s(addr); }, +}; +// functions that are used when paging is enabled +var pe_functions = +{ + get_esp_read: get_esp_pe_read, + get_esp_write: get_esp_pe_write, + read_imm8 : function() + { + if((instruction_pointer & ~0xFFF) ^ last_virt_eip) + { + eip_phys = translate_address_read(instruction_pointer) ^ instruction_pointer; + last_virt_eip = instruction_pointer & ~0xFFF; + } + // memory.read8 inlined under the assumption that code never runs in + // memory-mapped io + return memory.mem8[eip_phys ^ instruction_pointer++]; + }, + read_imm8s : function() + { + if((instruction_pointer & ~0xFFF) ^ last_virt_eip) + { + eip_phys = translate_address_read(instruction_pointer) ^ instruction_pointer; + last_virt_eip = instruction_pointer & ~0xFFF; + } + return memory.mem8s[eip_phys ^ instruction_pointer++]; + }, + read_imm16 : function() + { + // Two checks in one comparison: + // 1. Did the high 20 bits of eip change + // or 2. Are the low 12 bits of eip 0xFFF (and this read crosses a page boundary) + if((instruction_pointer ^ last_virt_eip) > 0xFFE) + { + return read_imm8() | read_imm8() << 8; + } + var data16 = memory.read16(eip_phys ^ instruction_pointer); + instruction_pointer = instruction_pointer + 2 | 0; + return data16; + }, + read_imm32s : function() + { + // Analogue to the above comment + if((instruction_pointer ^ last_virt_eip) > 0xFFC) + { + return read_imm16() | read_imm16() << 16; + } + var data32 = memory.read32s(eip_phys ^ instruction_pointer); + instruction_pointer = instruction_pointer + 4 | 0; + return data32; + }, + safe_read8 : do_safe_read8, + safe_read8s : do_safe_read8s, + safe_read16 : do_safe_read16, + safe_read32s : do_safe_read32s, +}; +// read word from a page boundary, given 2 physical addresses +function virt_boundary_read16(low, high) +{ + dbg_assert((low & 0xFFF) === 0xFFF); + dbg_assert((high & 0xFFF) === 0); + return memory.read8(low) | memory.read8(high) << 8; +} +// read doubleword from a page boundary, given 2 addresses +function virt_boundary_read32s(low, high) +{ + dbg_assert((low & 0xFFF) >= 0xFFD); + dbg_assert((high - 3 & 0xFFF) === (low & 0xFFF)); + var result = memory.read8(low) | memory.read8(high) << 24; + if(low & 1) + { + if(low & 2) + { + // 0xFFF + result |= memory.read8(high - 2) << 8 | + memory.read8(high - 1) << 16; + } + else + { + // 0xFFD + result |= memory.read8(low + 1) << 8 | + memory.read8(low + 2) << 16; + } + } + else + { + // 0xFFE + result |= memory.read8(low + 1) << 8 | + memory.read8(high - 1) << 16; + } + return result; +} +function virt_boundary_write16(low, high, value) +{ + dbg_assert((low & 0xFFF) === 0xFFF); + dbg_assert((high & 0xFFF) === 0); + memory.write8(low, value); + memory.write8(high, value >> 8); +} +function virt_boundary_write32(low, high, value) +{ + dbg_assert((low & 0xFFF) >= 0xFFD); + dbg_assert((high - 3 & 0xFFF) === (low & 0xFFF)); + memory.write8(low, value); + memory.write8(high, value >> 24); + if(low & 1) + { + if(low & 2) + { + // 0xFFF + memory.write8(high - 2, value >> 8); + memory.write8(high - 1, value >> 16); + } + else + { + // 0xFFD + memory.write8(low + 1, value >> 8); + memory.write8(low + 2, value >> 16); + } + } + else + { + // 0xFFE + memory.write8(low + 1, value >> 8); + memory.write8(high - 1, value >> 16); + } +} +// safe_read, safe_write +// read or write byte, word or dword to the given *virtual* address, +// and be safe on page boundaries +function do_safe_read8(addr) +{ + return memory.read8(translate_address_read(addr)); +} +function do_safe_read8s(addr) +{ + return memory.read8s(translate_address_read(addr)); +} +function do_safe_read16(addr) +{ + if((addr & 0xFFF) === 0xFFF) + { + return safe_read8(addr) | safe_read8(addr + 1) << 8; + } + else + { + return memory.read16(translate_address_read(addr)); + } +} +function do_safe_read32s(addr) +{ + if((addr & 0xFFF) >= 0xFFD) + { + return safe_read16(addr) | safe_read16(addr + 2) << 16; + } + else + { + return memory.read32s(translate_address_read(addr)); + } +} +function safe_write8(addr, value) +{ + memory.write8(translate_address_write(addr), value); +} +function safe_write16(addr, value) +{ + var phys_low = translate_address_write(addr); + if((addr & 0xFFF) === 0xFFF) + { + virt_boundary_write16(phys_low, translate_address_write(addr + 1), value); + } + else + { + memory.write16(phys_low, value); + } +} +function safe_write32(addr, value) +{ + var phys_low = translate_address_write(addr); + if((addr & 0xFFF) >= 0xFFD) + { + virt_boundary_write32(phys_low, translate_address_write(addr + 3), value); + } + else + { + memory.write32(phys_low, value); + } +} +// read 2 or 4 byte from ip, depending on address size attribute +function read_moffs() +{ + if(address_size_32) + { + return get_seg_prefix(reg_ds) + read_imm32s(); + } + else + { + return get_seg_prefix(reg_ds) + read_imm16(); + } +} +function get_flags() +{ + return (flags & ~flags_all) | getcf() | getpf() | getaf() | getzf() | getsf() | getof(); +} +function load_flags() +{ + flags = get_flags(); + flags_changed = 0; +} +// get esp with paging disabled +function get_esp_npe(mod) +{ + if(stack_size_32) + { + return get_seg(reg_ss) + stack_reg[reg_vsp] + mod; + } + else + { + return get_seg(reg_ss) + (stack_reg[reg_vsp] + mod & 0xFFFF); + } +} +function get_esp_pe_read(mod) +{ + // UNSAFE: stack_reg[reg_vsp]+mod needs to be masked in 16 bit mode + // (only if paging is enabled and in 16 bit mode) + return translate_address_read(get_seg(reg_ss) + stack_reg[reg_vsp] + mod); +} +function get_esp_pe_write(mod) +{ + return translate_address_write(get_seg(reg_ss) + stack_reg[reg_vsp] + mod); +} +/* + * returns the "real" instruction pointer, + * without segment offset + */ +function get_real_ip() +{ + return instruction_pointer - get_seg(reg_cs); +} +function call_interrupt_vector(interrupt_nr, is_software_int, error_code) +{ + if(DEBUG) + { + ops.add(instruction_pointer); + ops.add("-- INT " + h(interrupt_nr)); + ops.add(1); + } + //if(interrupt_nr == 0x13) + //{ + // dbg_log("INT 13"); + // dbg_log(memory.read8(ch) + "/" + memory.read8(dh) + "/" + memory.read8(cl) + " |" + memory.read8(al)); + // dbg_log("=> ", h(memory.read16(es) * 16 + memory.read16(bx))); + //} + //if(interrupt_nr == 0x10) + //{ + // dbg_log("int10 ax=" + h(reg16[reg_ax], 4) + " '" + String.fromCharCode(reg8[reg_al]) + "'"); + // dump_regs_short(); + // if(reg8[reg_ah] == 0xe) vga.tt_write(reg8[reg_al]); + //} + //dbg_log("int " + h(interrupt_nr)); + //if(interrupt_nr === 0x13) + //{ + // dump_regs_short(); + //} + //if(interrupt_nr === 0x80) + //{ + // dbg_log("linux syscall"); + // dump_regs_short(); + //} + if(interrupt_nr === 14) + { + dbg_log("int14 error_code=" + error_code + " cr2=" + h(cr2) + " prev=" + h(previous_ip) + " cpl=" + cpl, LOG_CPU); + } + if(in_hlt) + { + // return to the instruction following the hlt + instruction_pointer++; + in_hlt = false; + } + if(protected_mode) + { + if((interrupt_nr << 3 | 7) > idtr_size) + { + dbg_log(interrupt_nr, LOG_CPU); + dbg_trace(); + throw unimpl("#GP handler"); + } + var addr = idtr_offset + (interrupt_nr << 3) | 0; + dbg_assert((addr & 0xFFF) < 0xFF8); + if(paging) + { + addr = translate_address_system_read(addr); + } + var base = memory.read16(addr) | memory.read16(addr + 6) << 16, + selector = memory.read16(addr + 2), + type = memory.read8(addr + 5), + dpl = type >> 5 & 3, + is_trap; + if((type & 128) === 0) + { + // present bit not set + throw unimpl("#NP handler"); + } + if(is_software_int && dpl < cpl) + { + trigger_gp(interrupt_nr << 3 | 2); + } + type &= 31; + if(type === 14) + { + is_trap = false; + } + else if(type === 15) + { + is_trap = true; + } + else if(type === 5) + { + throw unimpl("call int to task gate"); + } + else if(type === 6) + { + throw unimpl("16 bit interrupt gate"); + } + else if(type === 7) + { + throw unimpl("16 bit trap gate"); + } + else + { + // invalid type + dbg_trace(); + dbg_log("invalid type: " + h(type)); + dbg_log(h(addr) + " " + h(base) + " " + h(selector)); + throw unimpl("#GP handler"); + } + var info = lookup_segment_selector(selector); + if(info.is_null) + { + dbg_log("is null"); + throw unimpl("#GP handler"); + } + if(info === -1) + { + dbg_log("is -1"); + throw unimpl("#GP handler"); + } + if(!info.is_executable || info.dpl > cpl) + { + dbg_log("not exec"); + throw unimpl("#GP handler"); + } + if(!info.is_present) + { + dbg_log("not present"); + throw unimpl("#NP handler"); + } + if(flags & flag_vm) + { + throw unimpl("VM flag"); + } + if(!info.dc_bit && info.dpl < cpl) + { + // inter privilege level interrupt + var tss_stack_addr = (info.dpl << 3) + 4; + if(tss_stack_addr + 5 > tsr_size) + { + throw unimpl("#TS handler"); + } + tss_stack_addr += tsr_offset; + if(paging) + { + tss_stack_addr = translate_address_system_read(tss_stack_addr); + } + var new_esp = memory.read32s(tss_stack_addr), + new_ss = memory.read16(tss_stack_addr + 4), + ss_info = lookup_segment_selector(new_ss); + if(ss_info.is_null) + { + throw unimpl("#TS handler"); + } + if(ss_info.rpl !== info.dpl) + { + throw unimpl("#TS handler"); + } + if(ss_info.dpl !== info.dpl || !ss_info.rw_bit) + { + throw unimpl("#TS handler"); + } + if(!ss_info.is_present) + { + throw unimpl("#TS handler"); + } + var old_esp = reg32s[reg_esp], + old_ss = sreg[reg_ss]; + reg32[reg_esp] = new_esp; + sreg[reg_ss] = new_ss; + cpl = info.dpl; + //dbg_log("int" + h(interrupt_nr, 2) +" from=" + h(instruction_pointer, 8) + // + " cpl=" + cpl + " old ss:esp=" + h(old_ss,4) + ":" + h(old_esp,8), LOG_CPU); + cpl_changed(); + push32(old_ss); + push32(old_esp); + } + else if(info.dc_bit || info.dpl === cpl) + { + // intra privilege level interrupt + //dbg_log("int" + h(interrupt_nr, 2) +" from=" + h(instruction_pointer, 8), LOG_CPU); + } + load_flags(); + push32(flags); + push32(sreg[reg_cs]); + push32(get_real_ip()); + //dbg_log("pushed eip to " + h(reg32[reg_esp], 8), LOG_CPU); + if(error_code !== false) + { + dbg_assert(typeof error_code == "number"); + push32(error_code); + } + // TODO + sreg[reg_cs] = selector; + //switch_seg(reg_cs); + //dbg_log("current esp: " + h(reg32[reg_esp]), LOG_CPU); + //dbg_log("call int " + h(interrupt_nr) + " from " + h(instruction_pointer) + " to " + h(base) + " with error_code=" + error_code, LOG_CPU); + instruction_pointer = get_seg(reg_cs) + base | 0; + //dbg_log("int" + h(interrupt_nr) + " trap=" + is_trap + " if=" + +!!(flags & flag_interrupt)); + if(!is_trap) + { + // clear int flag for interrupt gates + flags &= ~flag_interrupt; + } + else + { + handle_irqs(); + } + } + else + { + // call 4 byte cs:ip interrupt vector from ivt at memory 0 + //logop(instruction_pointer, "callu " + h(interrupt_nr) + "." + h(memory.read8(ah))); + //dbg_log("callu " + h(interrupt_nr) + "." + h(memory.read8(ah)) + " at " + h(instruction_pointer, 8), LOG_CPU, LOG_CPU); + // push flags, cs:ip + load_flags(); + push16(flags); + push16(sreg[reg_cs]); + push16(get_real_ip()); + flags = flags & ~flag_interrupt; + switch_seg(reg_cs, memory.read16((interrupt_nr << 2) + 2)); + instruction_pointer = get_seg(reg_cs) + memory.read16(interrupt_nr << 2) | 0; + } +} +// assumes ip to point to the byte before the next instruction +function raise_exception(interrupt_nr) +{ + if(DEBUG) + { + // warn about error + dbg_log("Exception " + h(interrupt_nr), LOG_CPU); + dbg_trace(); + //throw "exception: " + interrupt_nr; + } + // TODO + call_interrupt_vector(interrupt_nr, false, false); + throw 0xDEADBEE; +} +function raise_exception_with_code(interrupt_nr, error_code) +{ + if(DEBUG) + { + dbg_log("Exception " + h(interrupt_nr) + " err=" + h(error_code), LOG_CPU); + dbg_trace(); + //throw "exception: " + interrupt_nr; + } + call_interrupt_vector(interrupt_nr, false, error_code); + throw 0xDEADBEE; +} +function trigger_de() +{ + instruction_pointer = previous_ip; + raise_exception(0); +} +function trigger_ud() +{ + instruction_pointer = previous_ip; + raise_exception(6); +} +function trigger_gp(code) +{ + instruction_pointer = previous_ip; + raise_exception_with_code(13, code); +} +function trigger_np(code) +{ + instruction_pointer = previous_ip; + raise_exception_with_code(11, code); +} +function trigger_ss(code) +{ + instruction_pointer = previous_ip; + raise_exception_with_code(12, code); +} +/** + * @param {number} seg + */ +function seg_prefix(seg) +{ + dbg_assert(segment_prefix === -1); + dbg_assert(seg >= 0 && seg <= 5); + segment_prefix = seg; + table[read_imm8()](); + segment_prefix = -1; +} +/** + * Get segment base by prefix or default + * @param {number} default_segment + */ +function get_seg_prefix(default_segment /*, offset*/) +{ + if(segment_prefix === -1) + { + return get_seg(default_segment /*, offset*/); + } + else + { + return get_seg(segment_prefix /*, offset*/); + } +} +/** + * Get segment base + * @param {number} segment + */ +function get_seg(segment /*, offset*/) +{ + dbg_assert(segment >= 0 && segment < 8); + dbg_assert(protected_mode || (sreg[segment] << 4) == segment_offsets[segment]); + if(protected_mode) + { + if(segment_is_null[segment]) + { + // trying to access null segment + if(DEBUG) + { + dbg_log("Load null segment: " + h(segment), LOG_CPU); + throw unimpl("#GP handler"); + } + } + // TODO: + // - validate segment limits + // - validate if segment is writable + // - set accessed bit + } + return segment_offsets[segment]; +} +function arpl(seg, r16) +{ + flags_changed &= ~flag_zero; + if((seg & 3) < (reg16[r16] & 3)) + { + flags |= flag_zero; + return seg & ~3 | reg16[r16] & 3; + } + else + { + flags &= ~flag_zero; + return seg; + } +} +function handle_irqs() +{ + if(pic) + { + if((flags & flag_interrupt) && !page_fault) + { + pic.handle_irqs(); + } + } +} +// any two consecutive 8-bit ports can be treated as a 16-bit port; +// and four consecutive 8-bit ports can be treated as a 32-bit port +// +// http://css.csail.mit.edu/6.858/2012/readings/i386/s08_01.htm +function out8(port_addr, out_byte) +{ + if(privileges_for_io()) + { + io.port_write(port_addr, out_byte); + } + else + { + trigger_gp(0); + } +} +function out16(port_addr, out_word) +{ + if(privileges_for_io()) + { + io.port_write(port_addr, out_word & 0xFF); + io.port_write(port_addr + 1, out_word >> 8 & 0xFF); + } + else + { + trigger_gp(0); + } +} +function out32(port_addr, out_dword) +{ + if(privileges_for_io()) + { + io.port_write(port_addr, out_dword & 0xFF); + io.port_write(port_addr + 1, out_dword >> 8 & 0xFF); + io.port_write(port_addr + 2, out_dword >> 16 & 0xFF); + io.port_write(port_addr + 3, out_dword >> 24 & 0xFF); + } + else + { + trigger_gp(0); + } +} +function in8(port_addr) +{ + if(privileges_for_io()) + { + return io.port_read(port_addr); + } + else + { + trigger_gp(0); + } +} +function in16(port_addr) +{ + if(privileges_for_io()) + { + return io.port_read(port_addr) | + io.port_read(port_addr + 1) << 8; + } + else + { + trigger_gp(0); + } +} +function in32(port_addr) +{ + if(privileges_for_io()) + { + return io.port_read(port_addr) | + io.port_read(port_addr + 1) << 8 | + io.port_read(port_addr + 2) << 16 | + io.port_read(port_addr + 3) << 24; + } + else + { + trigger_gp(0); + } +} +/** + * returns the current iopl from the eflags register + */ +function getiopl() +{ + return flags >> 12 & 3; +} +function privileges_for_io() +{ + return !protected_mode || cpl <= getiopl(); +} +function cpuid() +{ + // cpuid + // TODO: Fill in with less bogus values + // http://lxr.linux.no/linux+%2a/arch/x86/include/asm/cpufeature.h + var id = reg32s[reg_eax]; + if((id & 0x7FFFFFFF) === 0) + { + reg32[reg_eax] = 2; + if(id === 0) + { + reg32[reg_ebx] = 0x756E6547; // Genu + reg32[reg_edx] = 0x49656E69; // ineI + reg32[reg_ecx] = 0x6C65746E; // ntel + } + } + else if(id === 1) + { + // pentium + reg32[reg_eax] = 0x513; + reg32[reg_ebx] = 0; + reg32[reg_ecx] = 0; + reg32[reg_edx] = fpu.is_fpu | 1 << 3 | 1 << 4 | 1 << 8| 1 << 13 | 1 << 15; + } + else if(id === 2) + { + // Taken from http://siyobik.info.gf/main/reference/instruction/CPUID + reg32[reg_eax] = 0x665B5001; + reg32[reg_ebx] = 0; + reg32[reg_ecx] = 0; + reg32[reg_edx] = 0x007A7000; + } + else if(id === (0x80860000 | 0)) + { + reg32[reg_eax] = 0; + reg32[reg_ebx] = 0; + reg32[reg_ecx] = 0; + reg32[reg_edx] = 0; + } + else if((id & 0xF0000000) === ~~0x40000000) + { + // Invalid + } + else + { + if(DEBUG) throw "cpuid: unimplemented eax: " + h(id); + } +} +/** + * Update the flags register depending on iopl and cpl + */ +function update_flags(new_flags) +{ + if(cpl === 0 || !protected_mode) + { + // can update all flags + flags = new_flags; + } + else if(cpl <= getiopl()) + { + // cpl != 0 and iopl <= cpl + // can update interrupt flag but not iopl + flags = (new_flags & ~flag_iopl) | (flags & flag_iopl); + } + else + { + // cannot update interrupt flag or iopl + flags = (new_flags & ~flag_iopl & ~flag_interrupt) | (flags & (flag_iopl | flag_interrupt)); + } + flags_changed = 0; + //flags = (flags & flags_mask) | flags_default; +} +function update_operand_size() +{ + if(operand_size_32) + { + table = table32; + table0F = table0F_32; + } + else + { + table = table16; + table0F = table0F_16; + } +} +function update_address_size() +{ + if(address_size_32) + { + modrm_resolve = modrm_resolve32; + regv = reg32; + reg_vcx = reg_ecx; + reg_vsi = reg_esi; + reg_vdi = reg_edi; + } + else + { + modrm_resolve = modrm_resolve16; + regv = reg16; + reg_vcx = reg_cx; + reg_vsi = reg_si; + reg_vdi = reg_di; + } +} +/** + * @param {number} selector + */ +function lookup_segment_selector(selector) +{ + var is_gdt = (selector & 4) === 0, + selector_offset = selector & ~7, + info, + table_offset, + table_limit; + info = { + rpl: selector & 3, + from_gdt: is_gdt, + is_null: false, + is_valid: true, + }; + if(is_gdt) + { + table_offset = gdtr_offset; + table_limit = gdtr_size; + } + else + { + table_offset = ldtr_offset + table_limit = ldtr_size; + } + if(selector_offset === 0) + { + info.is_null = true; + return info; + } + // limit is the number of entries in the table minus one + if((selector_offset >> 3) > table_limit) + { + info.is_valid = false; + return info; + } + table_offset += selector_offset; + if(paging) + { + table_offset = translate_address_system_read(table_offset); + } + info.base = memory.read16(table_offset + 2) | memory.read8(table_offset + 4) << 16 | + memory.read8(table_offset + 7) << 24, + info.access = memory.read8(table_offset + 5), + info.flags = memory.read8(table_offset + 6) >> 4, + info.limit = memory.read16(table_offset) | (memory.read8(table_offset + 6) & 0xF) << 16, + // used if system + info.type = info.access & 0xF; + info.dpl = info.access >> 5 & 3; + info.is_system = (info.access & 0x10) === 0; + info.is_present = (info.access & 0x80) === 0x80; + info.is_executable = (info.access & 8) === 8; + info.rw_bit = (info.access & 2) === 2; + info.dc_bit = (info.access & 4) === 4; + info.size = (info.flags & 4) === 4; + info.granularity = (info.flags & 8) === 8; + if(info.gr_bit) + { + info.real_limit = (info.limit << 12 | 0xFFF) >>> 0; + } + else + { + info.real_limit = info.limit; + } + info.is_writable = info.rw_bit && !info.is_executable; + info.is_readable = info.rw_bit || !info.is_executable; + return info; +} +/** + * @param {number} reg + * @param {number} selector + */ +function switch_seg(reg, selector) +{ + dbg_assert(reg >= 0 && reg <= 5); + dbg_assert(typeof selector === "number" && selector < 0x10000 && selector >= 0); + if(reg === reg_cs) + { + protected_mode = (cr0 & 1) === 1; + } + if(!protected_mode) + { + sreg[reg] = selector; + segment_is_null[reg] = 0; + segment_limits[reg] = 0xFFFFF; + segment_offsets[reg] = selector << 4; + return; + } + var info = lookup_segment_selector(selector); + if(reg === reg_ss) + { + if(info.is_null) + { + trigger_gp(0); + return false; + } + if(!info.is_valid || + info.is_system || + info.rpl !== cpl || + !info.is_writable || + info.dpl !== cpl) + { + trigger_gp(selector & ~3); + return false; + } + if(!info.is_present) + { + trigger_ss(selector & ~3); + return false; + } + stack_size_32 = info.size; + if(info.size) + { + stack_reg = reg32s; + reg_vsp = reg_esp; + reg_vbp = reg_ebp; + } + else + { + stack_reg = reg16; + reg_vsp = reg_sp; + reg_vbp = reg_bp; + } + } + else if(reg === reg_cs) + { + if(!info.is_executable) + { + // cs not executable + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("#GP handler"); + } + if(info.is_system) + { + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("load system segment descriptor, type = " + (info.access & 15)); + } + if(info.dc_bit && (info.dpl !== info.rpl)) + { + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("#GP handler"); + } + if(info.rpl !== cpl) + { + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("privilege change"); + } + dbg_assert(cpl === info.dpl); + if(!info.dc_bit && info.dpl < cpl) + { + throw unimpl("inter privilege interrupt"); + } + else + { + if(info.dc_bit || info.dpl === cpl) + { + // ok + } + else + { + // PE = 1, interrupt or trap gate, nonconforming code segment, DPL > CPL + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("#GP handler"); + } + } + operand_size_32 = address_size_32 = is_32 = info.size; + update_operand_size(); + update_address_size(); + } + else + { + // es, ds, fs, gs + if(info.is_null) + { + sreg[reg] = selector; + segment_is_null[reg] = 1; + return true; + } + if(!info.is_valid || + info.is_system || + !info.is_readable || + ((!info.is_executable || !info.dc_bit) && + info.rpl > info.dpl && + cpl > info.dpl)) + { + trigger_gp(selector & ~3); + return false; + } + if(!info.is_present) + { + trigger_np(selector & ~3); + return false; + } + } + //dbg_log("seg " + reg + " " + h(info.base)); + segment_is_null[reg] = 0; + segment_limits[reg] = info.real_limit; + segment_infos[reg] = 0; // TODO + segment_offsets[reg] = info.base; + sreg[reg] = selector; + return true; +} +function load_tr(selector) +{ + var info = lookup_segment_selector(selector); + //dbg_log("load tr"); + if(!info.from_gdt) + { + throw unimpl("TR can only be loaded from GDT"); + } + if(info.is_null) + { + dbg_log("#GP(0) | tried to load null selector (ltr)"); + throw unimpl("#GP handler"); + } + if(!info.is_present) + { + dbg_log("#GP | present bit not set (ltr)"); + throw unimpl("#GP handler"); + } + if(!info.is_system) + { + dbg_log("#GP | ltr: not a system entry"); + throw unimpl("#GP handler"); + } + if(info.type !== 9) + { + dbg_log("#GP | ltr: invalid type (type = " + info.type + ")"); + throw unimpl("#GP handler"); + } + tsr_size = info.limit; + tsr_offset = info.base; + //dbg_log("tsr at " + h(tsr_offset) + "; (" + tsr_size + " bytes)"); +} +function load_ldt(selector) +{ + var info = lookup_segment_selector(selector); + if(info.is_null) + { + // invalid + ldtr_size = 0; + ldtr_offset = 0; + return; + } + if(!info.from_gdt) + { + throw unimpl("LDTR can only be loaded from GDT"); + } + if(!info.is_present) + { + dbg_log("lldt: present bit not set"); + throw unimpl("#GP handler"); + } + if(!info.is_system) + { + dbg_log("lldt: not a system entry"); + throw unimpl("#GP handler"); + } + if(info.type !== 2) + { + dbg_log("lldt: invalid type (" + info.type + ")"); + throw unimpl("#GP handler"); + } + ldtr_size = info.limit; + ldtr_offset = info.base; + //dbg_log("ldt at " + h(ldtr_offset) + "; (" + ldtr_size + " bytes)"); +} +function clear_tlb() +{ + // clear tlb excluding global pages + last_virt_eip = -1; + last_virt_esp = -1; + tlb_info.set(tlb_info_global); + //dbg_log("page table loaded", LOG_CPU); +} +function full_clear_tlb() +{ + // clear tlb including global pages + tlb_info_global = new Uint8Array(1 << 20); + clear_tlb(); +} +function invlpg(addr) +{ + var page = addr >>> 12; + dbg_log("invlpg: " + h(page), LOG_CPU); + tlb_info[page] = 0; + tlb_info_global[page] = 0; + last_virt_eip = -1; + last_virt_esp = -1; +} +/** + * @param {number} addr + */ +function translate_address_disabled(addr) +{ + return addr; +} +function translate_address_user_write(addr) +{ + var base = addr >>> 12; + if(tlb_info[base] & TLB_USER_WRITE) + { + return tlb_user_write[base] ^ addr; + } + else + { + return do_page_translation(addr, 1, 1) | addr & 0xFFF; + } +} +function translate_address_user_read(addr) +{ + var base = addr >>> 12; + if(tlb_info[base] & TLB_USER_READ) + { + return tlb_user_read[base] ^ addr; + } + else + { + return do_page_translation(addr, 0, 1) | addr & 0xFFF; + } +} +function translate_address_system_write(addr) +{ + var base = addr >>> 12; + if(tlb_info[base] & TLB_SYSTEM_WRITE) + { + return tlb_system_write[base] ^ addr; + } + else + { + return do_page_translation(addr, 1, 0) | addr & 0xFFF; + } +} +function translate_address_system_read(addr) +{ + var base = addr >>> 12; + if(tlb_info[base] & TLB_SYSTEM_READ) + { + return tlb_system_read[base] ^ addr; + } + else + { + return do_page_translation(addr, 0, 0) | addr & 0xFFF; + } +} +/** + * @return {number} + */ +function do_page_translation(addr, for_writing, user) +{ + var page = addr >>> 12, + page_dir_addr = (cr3 >>> 2) + (page >> 10), + page_dir_entry = memory.mem32s[page_dir_addr], + high, + can_write = true, + global, + cachable = true, + allow_user = true; + if(!(page_dir_entry & 1)) + { + // to do at this place: + // + // - set cr2 = addr (which caused the page fault) + // - call_interrupt_vector with id 14, error code 0-7 (requires information if read or write) + // - prevent execution of the function that triggered this call + dbg_log("#PF not present", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 0); + // never reached as trigger_pagefault throws up + dbg_assert(false); + } + if((page_dir_entry & 2) === 0) + { + can_write = false; + if(for_writing) + { + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + if((page_dir_entry & 4) === 0) + { + allow_user = false; + if(user) + { + // "Page Fault: page table accessed by non-supervisor"; + dbg_log("#PF supervisor", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + if((page_dir_entry & 0x10) === 0) + { + cachable = false; + } + if(page_dir_entry & page_size_extensions) + { + // size bit is set + // set the accessed and dirty bits + memory.mem32s[page_dir_addr] = page_dir_entry | 0x20 | for_writing << 6; + high = (page_dir_entry & 0xFFC00000) | (page << 12 & 0x3FF000); + global = page_dir_entry & 0x100; + } + else + { + var page_table_addr = ((page_dir_entry & 0xFFFFF000) >>> 2) + (page & 0x3FF), + page_table_entry = memory.mem32s[page_table_addr]; + if(!(page_table_entry & 1)) + { + dbg_log("#PF not present table", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 0); + dbg_assert(false); + } + if((page_table_entry & 2) === 0) + { + can_write = false; + if(for_writing) + { + dbg_log("#PF not writable page", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + if((page_table_entry & 4) === 0) + { + allow_user = false; + if(user) + { + dbg_log("#PF not supervisor page", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + if((page_table_entry & 0x10) === 0) + { + cachable = false; + } + // set the accessed and dirty bits + memory.mem32s[page_dir_addr] = page_dir_entry | 0x20; + memory.mem32s[page_table_addr] = page_table_entry | 0x20 | for_writing << 6; + high = page_table_entry & 0xFFFFF000; + global = page_table_entry & 0x100; + } + if(cachable) + { + var cache_entry = high ^ page << 12, + info = 0; + if(allow_user) + { + tlb_user_read[page] = cache_entry; + info |= TLB_USER_READ; + if(can_write) + { + tlb_user_write[page] = cache_entry; + info |= TLB_USER_WRITE; + } + } + tlb_system_read[page] = cache_entry; + info |= TLB_SYSTEM_READ; + if(can_write) + { + tlb_system_write[page] = cache_entry; + info |= TLB_SYSTEM_WRITE; + } + tlb_info[page] |= info; + if(global) + { + tlb_info_global[page] = info; + } + } + return high ; +} +function trigger_pagefault(write, user, present) +{ + if(LOG_LEVEL & LOG_CPU) + { + dbg_trace(); + } + if(page_fault) + { + dbg_trace(); + throw unimpl("Double fault"); + } + instruction_pointer = previous_ip; + page_fault = true; + call_interrupt_vector(14, false, user << 2 | write << 1 | present); + throw 0xDEADBEE; +} +// it looks pointless to have these two here, but +// Closure Compiler is able to remove unused functions +//#include "test_helpers.js" +"use strict"; +debug.dump_regs = dump_regs; +debug.dump_regs_short = dump_regs_short; +debug.dump_stack = dump_stack; +debug.dump_page_directory = dump_page_directory; +debug.dump_gdt_ldt = dump_gdt_ldt; +debug.dump_idt = dump_idt; +debug.step = step; +debug.run_until = run_until; +debug.debugger = function() +{ + debugger; +} +function step() +{ + step_mode = true; + if(!running) + { + cycle(); + } + dump_regs(); + var now = Date.now(); + vga.timer(now); + timer.timer(now); + rtc.timer(now); + running = false; +} +function run_until() +{ + running = false; + var a = parseInt(prompt("input hex", ""), 16); + if(a) while(instruction_pointer != a) cycle() + dump_regs(); +} +// http://ref.x86asm.net/x86reference.xml +// for debuggin' purposes +var opcode_map = [ + "ADD", "ADD", "ADD", "ADD", "ADD", "ADD", "PUSH", "POP", + "OR", "OR", "OR", "OR", "OR", "OR", "PUSH", "0F:", + "ADC", "ADC", "ADC", "ADC", "ADC", "ADC", "PUSH", "POP", + "SBB", "SBB", "SBB", "SBB", "SBB", "SBB", "PUSH", "POP", + "AND", "AND", "AND", "AND", "AND", "AND", "ES", "DAA", + "SUB", "SUB", "SUB", "SUB", "SUB", "SUB", "CS", "DAS", + "XOR", "XOR", "XOR", "XOR", "XOR", "XOR", "SS", "AAA", + "CMP", "CMP", "CMP", "CMP", "CMP", "CMP", "DS", "AAS", + "INC", "INC", "INC", "INC", "INC", "INC", "INC", "INC", + "DEC", "DEC", "DEC", "DEC", "DEC", "DEC", "DEC", "DEC", + "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", + "POP", "POP", "POP", "POP", "POP", "POP", "POP", "POP", + "PUSHA", "POPA", "BOUND", "ARPL", "FS", "GS", "none", "none", + "PUSH", "IMUL", "PUSH", "IMUL", "INS", "INS", "OUTS", "OUTS", + "JO", "JNO", "JB", "JNB", "JZ", "JNZ", "JBE", "JNBE", + "JS", "JNS", "JP", "JNP", "JL", "JNL", "JLE", "JNLE", + "ADD", "ADD", "ADD", "ADD", "TEST", "TEST", "XCHG", "XCHG", + "MOV", "MOV", "MOV", "MOV", "MOV", "LEA", "MOV", "POP", + "NOP", "XCHG", "XCHG", "XCHG", "XCHG", "XCHG", "XCHG", "XCHG", + "CBW", "CWD", "CALLF", "FWAIT", "PUSHF", "POPF", "SAHF", "LAHF", + "MOV", "MOV", "MOV", "MOV", "MOVS", "MOVS", "CMPS", "CMPS", + "TEST", "TEST", "STOS", "STOS", "LODS", "LODS", "SCAS", "SCAS", + "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", + "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", + "ROL", "ROL", "RETN", "RETN", "LES", "LDS", "MOV", "MOV", + "ENTER", "LEAVE", "RETF", "RETF", "INT", "INT", "INTO", "IRET", + "ROL", "ROL", "ROL", "ROL", "AAM", "AAD", "none", "XLAT", + "FADD", "FLD", "FIADD", "FILD", "FADD", "FLD", "FIADD", "FILD", + "LOOPNZ", "LOOPZ", "LOOP", "JCXZ", "IN", "IN", "OUT", "OUT", + "CALL", "JMP", "JMPF", "JMP", "IN", "IN", "OUT", "OUT", + "LOCK", "none", "REPNZ", "REPZ", "HLT", "CMC", "TEST", "TEST", + "CLC", "STC", "CLI", "STI", "CLD", "STD", "INC", "INC" +]; +function logop(_ip, op) +{ + if(!DEBUG || !ops) + { + return; + } + if(!step_mode) + { + //return; + } + ops.add(_ip); + ops.add(opcode_map[op] || "unkown"); + ops.add(op); +} +function dump_stack(start, end) +{ + var esp = reg32[reg_esp]; + dbg_log("========= STACK =========="); + if(end >= start || end === undefined) + { + start = 5; + end = -5; + } + for(var i = start; i > end; i--) + { + var line = " "; + if(!i) line = "=> "; + line += h(i, 2) + " | "; + dbg_log(line + h(esp + 4 * i, 8) + " | " + h(memory.read32s(esp + 4 * i) >>> 0)); + } +} +function dump_regs_short() +{ + var + r32 = { "eax": reg_eax, "ecx": reg_ecx, "edx": reg_edx, "ebx": reg_ebx, + "esp": reg_esp, "ebp": reg_ebp, "esi": reg_esi, "edi": reg_edi }, + r32_names = ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"], + s = { "cs": reg_cs, "ds": reg_ds, "es": reg_es, "fs": reg_fs, "gs": reg_gs, "ss": reg_ss }, + line1 = "", + line2 = ""; + for(var i = 0; i < 4; i++) + { + line1 += r32_names[i] + "=" + h(reg32[r32[r32_names[i]]], 8) + " "; + line2 += r32_names[i+4] + "=" + h(reg32[r32[r32_names[i+4]]], 8) + " "; + } + line1 += " eip=" + h(get_real_ip(), 8); + line2 += " flg=" + h(get_flags()); + line1 += " ds=" + h(sreg[reg_ds], 4) + " es=" + h(sreg[reg_es], 4) + " fs=" + h(sreg[reg_fs], 4); + line2 += " gs=" + h(sreg[reg_gs], 4) + " cs=" + h(sreg[reg_cs], 4) + " ss=" + h(sreg[reg_ss], 4); + dbg_log(line1); + dbg_log(line2); +} +function dump_regs() +{ + var + r32 = { "eax": reg_eax, "ecx": reg_ecx, "edx": reg_edx, "ebx": reg_ebx, + "esp": reg_esp, "ebp": reg_ebp, "esi": reg_esi, "edi": reg_edi }, + s = { "cs": reg_cs, "ds": reg_ds, "es": reg_es, + "fs": reg_fs, "gs": reg_gs, "ss": reg_ss }, + out = ""; + var opcodes = ops.toArray(); + for(var i = 0; i < opcodes.length; i += 3) + { + if(opcodes[i]) + { + out += h(opcodes[i], 6) + ": " + + String.pads(opcodes[i + 1], 20) + h(opcodes[i + 2], 2) + "\n"; + } + } + //dbg_log(out.substr(0, out.length - 1)); + log(out.substr(0, out.length - 1)); + ops.clear(); + dbg_log("----- DUMP (ip = 0x" + h(instruction_pointer >>> 0) + ") ----------") + dbg_log("protected mode: " + protected_mode); + for(i in r32) + { + dbg_log(i + " = 0x" + h(reg32[r32[i]], 8)); + } + dbg_log("eip = 0x" + h(get_real_ip(), 8)); + for(i in s) + { + dbg_log(i + " = 0x" + h(sreg[s[i]], 4)); + //var infos = segment_cache[ s[i] - registers_start >> 1 ]; + /*if(infos) + { + dbg_log(infos); + }*/ + } + out = ""; + var flg = { "cf": getcf, "pf": getpf, "zf": getzf, "sf": getsf, + "of": getof, "df": flag_direction, "if": flag_interrupt }; + for(var i in flg) + { + if(+flg[i]) + { + out += i + "=" + Number(!!(flags & flg[i])) + " | "; + } + else + { + out += i + "=" + Number(!!flg[i]()) + " | "; + } + } + out += "iopl=" + getiopl(); + dbg_log(out); + //dbg_log("last operation: " + h(last_op1 | 0) + ", " + h(last_op2 | 0) + " = " + + //h(last_result | 0) + " (" + last_op_size + " bit)") +} +function dump_gdt_ldt() +{ + dbg_log("gdt: (len = " + h(gdtr_size) + ")"); + dump_table(translate_address_read(gdtr_offset), gdtr_size); + dbg_log("\nldt: (len = " + h(ldtr_size) + ")"); + dump_table(translate_address_read(ldtr_offset), ldtr_size); + function dump_table(addr, size) + { + for(var i = 0; i < size; i += 8, addr += 8) + { + var base = memory.read16(addr + 2) | + memory.read8(addr + 4) << 16 | + memory.read8(addr + 7) << 24, + limit = (memory.read16(addr) | memory.read8(addr + 6) & 0xF) + 1, + access = memory.read8(addr + 5), + flags = memory.read8(addr + 6) >> 4, + flags_str = '', + dpl = access >> 5 & 3; + if(!(access & 128)) + { + // present bit not set + //continue; + flags_str += 'NP '; + } + else + { + flags_str += ' P '; + } + if(access & 16) + { + if(flags & 4) + { + flags_str += '32b '; + } + else + { + flags_str += '16b '; + } + if(access & 8) + { + // executable + flags_str += 'X '; + if(access & 4) + { + flags_str += 'C '; + } + } + else + { + // data + flags_str += 'R '; + } + } + else + { + // system + flags_str += 'sys: ' + h(access & 15); + } + if(flags & 8) + { + limit <<= 12; + } + dbg_log(h(i & ~7, 4) + " " + h(base >>> 0, 8) + " (" + h(limit, 8) + " bytes) " + + flags_str + "; dpl = " + dpl + ", a = " + access.toString(2) + + ", f = " + flags.toString(2)); + } + } +} +function dump_idt() +{ + for(var i = 0; i < idtr_size; i += 8) + { + var addr = do_page_translation(idtr_offset + i, 0, 0), + base = memory.read16(addr) | memory.read16(addr + 6) << 16, + selector = memory.read16(addr + 2), + type = memory.read8(addr + 5), + line, + dpl = type >> 5 & 3; + if((type & 31) === 5) + { + line = 'task gate '; + } + else if((type & 31) === 14) + { + line = 'intr gate '; + } + else if((type & 31) === 15) + { + line = 'trap gate '; + } + else + { + line = 'invalid '; + } + if(type & 128) + { + line += ' P'; + } + else + { + // present bit not set + //continue; + line += 'NP'; + } + dbg_log(h(i >> 3, 4) + " " + h(base >>> 0, 8) + ", " + + h(selector, 4) + "; " + line + "; dpl = " + dpl + ", t = " + type.toString(2)); + } +} +function load_page_entry(dword_entry, is_directory) +{ + if(!(dword_entry & 1)) + { + // present bit not set + return false; + } + var size = (dword_entry & 128) === 128, + address; + if(size && !is_directory) + { + address = dword_entry & 0xFFC00000; + } + else + { + address = dword_entry & 0xFFFFF000; + } + return { + size: size, + global: (dword_entry & 256) === 256, + accessed: (dword_entry & 0x20) === 0x20, + dirty: (dword_entry & 0x40) === 0x40, + cache : (dword_entry & 16) === 16, + user : (dword_entry & 4) === 4, + read_write : (dword_entry & 2) === 2, + address : address >>> 0 + }; +} +function dump_page_directory() +{ + for(var i = 0; i < 1024; i++) + { + var dword = memory.read32s(cr3 + 4 * i), + entry = load_page_entry(dword, true); + if(!entry) + { + continue; + } + var flags = ''; + if(entry.size) + flags += 'S '; + if(entry.cache) + flags += 'D '; + if(entry.user) + flags += 'U '; + if(entry.read_write) + flags += 'R '; + if(entry.accessed) + flags += 'A '; + dbg_log("=== " + h(entry.address >>> 0, 8) + " | " + flags); + //dbg_log("=========================") + if(entry.size) + { + continue; + } + for(var j = 0; j < 1024; j++) + { + dword = memory.read32s(entry.address + 4 * j); + var subentry = load_page_entry(dword, false); + if(subentry) + { + flags = ''; + if(subentry.size) + flags += 'S '; + if(subentry.cache) + flags += 'D '; + if(subentry.user) + flags += 'U '; + if(subentry.read_write) + flags += 'R '; + if(subentry.global) + flags += 'G '; + if(subentry.accessed) + flags += 'A '; + if(subentry.dirty) + flags += 'Di '; + dbg_log("# " + h((i << 22 | j << 12) >>> 0, 8) + " -> " + + h(subentry.address, 8) + " | " + flags); + } + } + } +} +/* + * This file contains functions to decode the modrm and sib bytes + * + * These functions return a virtual address + * + * Gets #included by cpu.macro.js + */ +"use strict"; +var modrm_resolve16, + modrm_resolve32; +(function() { +var modrm_table16 = Array(0xC0), + modrm_table32 = Array(0xC0), + sib_table = Array(0x100); +modrm_table16[0x00 | 0] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx] + reg16[reg_si]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 0] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx] + reg16[reg_si]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 0] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx] + reg16[reg_si]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table16[0x00 | 1] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx] + reg16[reg_di]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 1] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx] + reg16[reg_di]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 1] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx] + reg16[reg_di]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table16[0x00 | 2] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp] + reg16[reg_si]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 2] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp] + reg16[reg_si]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 2] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp] + reg16[reg_si]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table16[0x00 | 3] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp] + reg16[reg_di]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 3] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp] + reg16[reg_di]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 3] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp] + reg16[reg_di]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table16[0x00 | 4] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_si]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 4] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_si]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 4] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_si]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table16[0x00 | 5] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_di]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 5] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_di]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 5] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_di]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table16[0x00 | 6] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 6] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 6] = function() { return get_seg_prefix(reg_ss) + ((reg16[reg_bp]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table16[0x00 | 7] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx]) & 0xFFFF) | 0; }; modrm_table16[0x40 | 7] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx]) + read_imm8s() & 0xFFFF) | 0; }; modrm_table16[0x80 | 7] = function() { return get_seg_prefix(reg_ds) + ((reg16[reg_bx]) + read_imm16() & 0xFFFF) | 0; }; +modrm_table32[0x00 | 0] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_eax]) | 0; }; modrm_table32[0x40 | 0] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_eax]) + read_imm8s() | 0; }; modrm_table32[0x80 | 0] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_eax]) + read_imm32s() | 0; };; +modrm_table32[0x00 | 1] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_ecx]) | 0; }; modrm_table32[0x40 | 1] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_ecx]) + read_imm8s() | 0; }; modrm_table32[0x80 | 1] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_ecx]) + read_imm32s() | 0; };; +modrm_table32[0x00 | 2] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_edx]) | 0; }; modrm_table32[0x40 | 2] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_edx]) + read_imm8s() | 0; }; modrm_table32[0x80 | 2] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_edx]) + read_imm32s() | 0; };; +modrm_table32[0x00 | 3] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_ebx]) | 0; }; modrm_table32[0x40 | 3] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_ebx]) + read_imm8s() | 0; }; modrm_table32[0x80 | 3] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_ebx]) + read_imm32s() | 0; };; +modrm_table32[0x00 | 4] = function() { return (getsib(false)) | 0; }; modrm_table32[0x40 | 4] = function() { return (getsib(false)) + read_imm8s() | 0; }; modrm_table32[0x80 | 4] = function() { return (getsib(false)) + read_imm32s() | 0; };; +modrm_table32[0x00 | 5] = function() { return (get_seg_prefix(reg_ss) + reg32s[reg_ebp]) | 0; }; modrm_table32[0x40 | 5] = function() { return (get_seg_prefix(reg_ss) + reg32s[reg_ebp]) + read_imm8s() | 0; }; modrm_table32[0x80 | 5] = function() { return (get_seg_prefix(reg_ss) + reg32s[reg_ebp]) + read_imm32s() | 0; };; +modrm_table32[0x00 | 6] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_esi]) | 0; }; modrm_table32[0x40 | 6] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_esi]) + read_imm8s() | 0; }; modrm_table32[0x80 | 6] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_esi]) + read_imm32s() | 0; };; +modrm_table32[0x00 | 7] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_edi]) | 0; }; modrm_table32[0x40 | 7] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_edi]) + read_imm8s() | 0; }; modrm_table32[0x80 | 7] = function() { return (get_seg_prefix(reg_ds) + reg32s[reg_edi]) + read_imm32s() | 0; };; +// special cases +modrm_table16[0x00 | 6] = function() { return get_seg_prefix(reg_ds) + read_imm16() | 0; } +modrm_table32[0x00 | 5] = function() { return get_seg_prefix(reg_ds) + read_imm32s() | 0; }; +modrm_table32[0x00 | 4] = function() { return getsib(false) | 0; }; +modrm_table32[0x40 | 4] = function() { return getsib(true) + read_imm8s() | 0; }; +modrm_table32[0x80 | 4] = function() { return getsib(true) + read_imm32s() | 0; }; +for(var low = 0; low < 8; low++) +{ + for(var high = 0; high < 3; high++) + { + for(var i = 1; i < 8; i++) + { + var x = low | high << 6; + modrm_table32[x | i << 3] = modrm_table32[x]; + modrm_table16[x | i << 3] = modrm_table16[x]; + } + } +} +sib_table[0x00 | 0 << 3 | 0] = function(mod) { return (reg32s[reg_eax]) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 0 << 3 | 1] = function(mod) { return (reg32s[reg_eax]) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 0 << 3 | 2] = function(mod) { return (reg32s[reg_eax]) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 0 << 3 | 3] = function(mod) { return (reg32s[reg_eax]) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 0 << 3 | 4] = function(mod) { return (reg32s[reg_eax]) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 0 << 3 | 5] = function(mod) { return (reg32s[reg_eax]) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 0 << 3 | 6] = function(mod) { return (reg32s[reg_eax]) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 0 << 3 | 7] = function(mod) { return (reg32s[reg_eax]) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 0 << 3 | 0] = function(mod) { return (reg32s[reg_eax] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 0 << 3 | 1] = function(mod) { return (reg32s[reg_eax] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 0 << 3 | 2] = function(mod) { return (reg32s[reg_eax] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 0 << 3 | 3] = function(mod) { return (reg32s[reg_eax] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 0 << 3 | 4] = function(mod) { return (reg32s[reg_eax] << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 0 << 3 | 5] = function(mod) { return (reg32s[reg_eax] << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 0 << 3 | 6] = function(mod) { return (reg32s[reg_eax] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 0 << 3 | 7] = function(mod) { return (reg32s[reg_eax] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 0 << 3 | 0] = function(mod) { return (reg32s[reg_eax] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 0 << 3 | 1] = function(mod) { return (reg32s[reg_eax] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 0 << 3 | 2] = function(mod) { return (reg32s[reg_eax] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 0 << 3 | 3] = function(mod) { return (reg32s[reg_eax] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 0 << 3 | 4] = function(mod) { return (reg32s[reg_eax] << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 0 << 3 | 5] = function(mod) { return (reg32s[reg_eax] << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 0 << 3 | 6] = function(mod) { return (reg32s[reg_eax] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 0 << 3 | 7] = function(mod) { return (reg32s[reg_eax] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 0 << 3 | 0] = function(mod) { return (reg32s[reg_eax] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 0 << 3 | 1] = function(mod) { return (reg32s[reg_eax] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 0 << 3 | 2] = function(mod) { return (reg32s[reg_eax] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 0 << 3 | 3] = function(mod) { return (reg32s[reg_eax] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 0 << 3 | 4] = function(mod) { return (reg32s[reg_eax] << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 0 << 3 | 5] = function(mod) { return (reg32s[reg_eax] << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 0 << 3 | 6] = function(mod) { return (reg32s[reg_eax] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 0 << 3 | 7] = function(mod) { return (reg32s[reg_eax] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +sib_table[0x00 | 1 << 3 | 0] = function(mod) { return (reg32s[reg_ecx]) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 1 << 3 | 1] = function(mod) { return (reg32s[reg_ecx]) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 1 << 3 | 2] = function(mod) { return (reg32s[reg_ecx]) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 1 << 3 | 3] = function(mod) { return (reg32s[reg_ecx]) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 1 << 3 | 4] = function(mod) { return (reg32s[reg_ecx]) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 1 << 3 | 5] = function(mod) { return (reg32s[reg_ecx]) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 1 << 3 | 6] = function(mod) { return (reg32s[reg_ecx]) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 1 << 3 | 7] = function(mod) { return (reg32s[reg_ecx]) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 1 << 3 | 0] = function(mod) { return (reg32s[reg_ecx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 1 << 3 | 1] = function(mod) { return (reg32s[reg_ecx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 1 << 3 | 2] = function(mod) { return (reg32s[reg_ecx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 1 << 3 | 3] = function(mod) { return (reg32s[reg_ecx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 1 << 3 | 4] = function(mod) { return (reg32s[reg_ecx] << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 1 << 3 | 5] = function(mod) { return (reg32s[reg_ecx] << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 1 << 3 | 6] = function(mod) { return (reg32s[reg_ecx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 1 << 3 | 7] = function(mod) { return (reg32s[reg_ecx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 1 << 3 | 0] = function(mod) { return (reg32s[reg_ecx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 1 << 3 | 1] = function(mod) { return (reg32s[reg_ecx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 1 << 3 | 2] = function(mod) { return (reg32s[reg_ecx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 1 << 3 | 3] = function(mod) { return (reg32s[reg_ecx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 1 << 3 | 4] = function(mod) { return (reg32s[reg_ecx] << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 1 << 3 | 5] = function(mod) { return (reg32s[reg_ecx] << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 1 << 3 | 6] = function(mod) { return (reg32s[reg_ecx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 1 << 3 | 7] = function(mod) { return (reg32s[reg_ecx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 1 << 3 | 0] = function(mod) { return (reg32s[reg_ecx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 1 << 3 | 1] = function(mod) { return (reg32s[reg_ecx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 1 << 3 | 2] = function(mod) { return (reg32s[reg_ecx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 1 << 3 | 3] = function(mod) { return (reg32s[reg_ecx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 1 << 3 | 4] = function(mod) { return (reg32s[reg_ecx] << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 1 << 3 | 5] = function(mod) { return (reg32s[reg_ecx] << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 1 << 3 | 6] = function(mod) { return (reg32s[reg_ecx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 1 << 3 | 7] = function(mod) { return (reg32s[reg_ecx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +sib_table[0x00 | 2 << 3 | 0] = function(mod) { return (reg32s[reg_edx]) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 2 << 3 | 1] = function(mod) { return (reg32s[reg_edx]) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 2 << 3 | 2] = function(mod) { return (reg32s[reg_edx]) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 2 << 3 | 3] = function(mod) { return (reg32s[reg_edx]) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 2 << 3 | 4] = function(mod) { return (reg32s[reg_edx]) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 2 << 3 | 5] = function(mod) { return (reg32s[reg_edx]) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 2 << 3 | 6] = function(mod) { return (reg32s[reg_edx]) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 2 << 3 | 7] = function(mod) { return (reg32s[reg_edx]) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 2 << 3 | 0] = function(mod) { return (reg32s[reg_edx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 2 << 3 | 1] = function(mod) { return (reg32s[reg_edx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 2 << 3 | 2] = function(mod) { return (reg32s[reg_edx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 2 << 3 | 3] = function(mod) { return (reg32s[reg_edx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 2 << 3 | 4] = function(mod) { return (reg32s[reg_edx] << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 2 << 3 | 5] = function(mod) { return (reg32s[reg_edx] << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 2 << 3 | 6] = function(mod) { return (reg32s[reg_edx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 2 << 3 | 7] = function(mod) { return (reg32s[reg_edx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 2 << 3 | 0] = function(mod) { return (reg32s[reg_edx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 2 << 3 | 1] = function(mod) { return (reg32s[reg_edx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 2 << 3 | 2] = function(mod) { return (reg32s[reg_edx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 2 << 3 | 3] = function(mod) { return (reg32s[reg_edx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 2 << 3 | 4] = function(mod) { return (reg32s[reg_edx] << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 2 << 3 | 5] = function(mod) { return (reg32s[reg_edx] << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 2 << 3 | 6] = function(mod) { return (reg32s[reg_edx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 2 << 3 | 7] = function(mod) { return (reg32s[reg_edx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 2 << 3 | 0] = function(mod) { return (reg32s[reg_edx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 2 << 3 | 1] = function(mod) { return (reg32s[reg_edx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 2 << 3 | 2] = function(mod) { return (reg32s[reg_edx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 2 << 3 | 3] = function(mod) { return (reg32s[reg_edx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 2 << 3 | 4] = function(mod) { return (reg32s[reg_edx] << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 2 << 3 | 5] = function(mod) { return (reg32s[reg_edx] << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 2 << 3 | 6] = function(mod) { return (reg32s[reg_edx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 2 << 3 | 7] = function(mod) { return (reg32s[reg_edx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +sib_table[0x00 | 3 << 3 | 0] = function(mod) { return (reg32s[reg_ebx]) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 3 << 3 | 1] = function(mod) { return (reg32s[reg_ebx]) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 3 << 3 | 2] = function(mod) { return (reg32s[reg_ebx]) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 3 << 3 | 3] = function(mod) { return (reg32s[reg_ebx]) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 3 << 3 | 4] = function(mod) { return (reg32s[reg_ebx]) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 3 << 3 | 5] = function(mod) { return (reg32s[reg_ebx]) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 3 << 3 | 6] = function(mod) { return (reg32s[reg_ebx]) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 3 << 3 | 7] = function(mod) { return (reg32s[reg_ebx]) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 3 << 3 | 0] = function(mod) { return (reg32s[reg_ebx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 3 << 3 | 1] = function(mod) { return (reg32s[reg_ebx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 3 << 3 | 2] = function(mod) { return (reg32s[reg_ebx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 3 << 3 | 3] = function(mod) { return (reg32s[reg_ebx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 3 << 3 | 4] = function(mod) { return (reg32s[reg_ebx] << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 3 << 3 | 5] = function(mod) { return (reg32s[reg_ebx] << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 3 << 3 | 6] = function(mod) { return (reg32s[reg_ebx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 3 << 3 | 7] = function(mod) { return (reg32s[reg_ebx] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 3 << 3 | 0] = function(mod) { return (reg32s[reg_ebx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 3 << 3 | 1] = function(mod) { return (reg32s[reg_ebx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 3 << 3 | 2] = function(mod) { return (reg32s[reg_ebx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 3 << 3 | 3] = function(mod) { return (reg32s[reg_ebx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 3 << 3 | 4] = function(mod) { return (reg32s[reg_ebx] << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 3 << 3 | 5] = function(mod) { return (reg32s[reg_ebx] << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 3 << 3 | 6] = function(mod) { return (reg32s[reg_ebx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 3 << 3 | 7] = function(mod) { return (reg32s[reg_ebx] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 3 << 3 | 0] = function(mod) { return (reg32s[reg_ebx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 3 << 3 | 1] = function(mod) { return (reg32s[reg_ebx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 3 << 3 | 2] = function(mod) { return (reg32s[reg_ebx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 3 << 3 | 3] = function(mod) { return (reg32s[reg_ebx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 3 << 3 | 4] = function(mod) { return (reg32s[reg_ebx] << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 3 << 3 | 5] = function(mod) { return (reg32s[reg_ebx] << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 3 << 3 | 6] = function(mod) { return (reg32s[reg_ebx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 3 << 3 | 7] = function(mod) { return (reg32s[reg_ebx] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +sib_table[0x00 | 4 << 3 | 0] = function(mod) { return (0) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 4 << 3 | 1] = function(mod) { return (0) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 4 << 3 | 2] = function(mod) { return (0) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 4 << 3 | 3] = function(mod) { return (0) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 4 << 3 | 4] = function(mod) { return (0) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 4 << 3 | 5] = function(mod) { return (0) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 4 << 3 | 6] = function(mod) { return (0) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 4 << 3 | 7] = function(mod) { return (0) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 4 << 3 | 0] = function(mod) { return (0 << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 4 << 3 | 1] = function(mod) { return (0 << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 4 << 3 | 2] = function(mod) { return (0 << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 4 << 3 | 3] = function(mod) { return (0 << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 4 << 3 | 4] = function(mod) { return (0 << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 4 << 3 | 5] = function(mod) { return (0 << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 4 << 3 | 6] = function(mod) { return (0 << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 4 << 3 | 7] = function(mod) { return (0 << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 4 << 3 | 0] = function(mod) { return (0 << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 4 << 3 | 1] = function(mod) { return (0 << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 4 << 3 | 2] = function(mod) { return (0 << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 4 << 3 | 3] = function(mod) { return (0 << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 4 << 3 | 4] = function(mod) { return (0 << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 4 << 3 | 5] = function(mod) { return (0 << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 4 << 3 | 6] = function(mod) { return (0 << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 4 << 3 | 7] = function(mod) { return (0 << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 4 << 3 | 0] = function(mod) { return (0 << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 4 << 3 | 1] = function(mod) { return (0 << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 4 << 3 | 2] = function(mod) { return (0 << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 4 << 3 | 3] = function(mod) { return (0 << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 4 << 3 | 4] = function(mod) { return (0 << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 4 << 3 | 5] = function(mod) { return (0 << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 4 << 3 | 6] = function(mod) { return (0 << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 4 << 3 | 7] = function(mod) { return (0 << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +sib_table[0x00 | 5 << 3 | 0] = function(mod) { return (reg32s[reg_ebp]) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 5 << 3 | 1] = function(mod) { return (reg32s[reg_ebp]) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 5 << 3 | 2] = function(mod) { return (reg32s[reg_ebp]) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 5 << 3 | 3] = function(mod) { return (reg32s[reg_ebp]) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 5 << 3 | 4] = function(mod) { return (reg32s[reg_ebp]) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 5 << 3 | 5] = function(mod) { return (reg32s[reg_ebp]) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 5 << 3 | 6] = function(mod) { return (reg32s[reg_ebp]) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 5 << 3 | 7] = function(mod) { return (reg32s[reg_ebp]) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 5 << 3 | 0] = function(mod) { return (reg32s[reg_ebp] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 5 << 3 | 1] = function(mod) { return (reg32s[reg_ebp] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 5 << 3 | 2] = function(mod) { return (reg32s[reg_ebp] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 5 << 3 | 3] = function(mod) { return (reg32s[reg_ebp] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 5 << 3 | 4] = function(mod) { return (reg32s[reg_ebp] << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 5 << 3 | 5] = function(mod) { return (reg32s[reg_ebp] << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 5 << 3 | 6] = function(mod) { return (reg32s[reg_ebp] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 5 << 3 | 7] = function(mod) { return (reg32s[reg_ebp] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 5 << 3 | 0] = function(mod) { return (reg32s[reg_ebp] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 5 << 3 | 1] = function(mod) { return (reg32s[reg_ebp] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 5 << 3 | 2] = function(mod) { return (reg32s[reg_ebp] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 5 << 3 | 3] = function(mod) { return (reg32s[reg_ebp] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 5 << 3 | 4] = function(mod) { return (reg32s[reg_ebp] << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 5 << 3 | 5] = function(mod) { return (reg32s[reg_ebp] << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 5 << 3 | 6] = function(mod) { return (reg32s[reg_ebp] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 5 << 3 | 7] = function(mod) { return (reg32s[reg_ebp] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 5 << 3 | 0] = function(mod) { return (reg32s[reg_ebp] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 5 << 3 | 1] = function(mod) { return (reg32s[reg_ebp] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 5 << 3 | 2] = function(mod) { return (reg32s[reg_ebp] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 5 << 3 | 3] = function(mod) { return (reg32s[reg_ebp] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 5 << 3 | 4] = function(mod) { return (reg32s[reg_ebp] << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 5 << 3 | 5] = function(mod) { return (reg32s[reg_ebp] << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 5 << 3 | 6] = function(mod) { return (reg32s[reg_ebp] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 5 << 3 | 7] = function(mod) { return (reg32s[reg_ebp] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +sib_table[0x00 | 6 << 3 | 0] = function(mod) { return (reg32s[reg_esi]) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 6 << 3 | 1] = function(mod) { return (reg32s[reg_esi]) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 6 << 3 | 2] = function(mod) { return (reg32s[reg_esi]) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 6 << 3 | 3] = function(mod) { return (reg32s[reg_esi]) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 6 << 3 | 4] = function(mod) { return (reg32s[reg_esi]) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 6 << 3 | 5] = function(mod) { return (reg32s[reg_esi]) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 6 << 3 | 6] = function(mod) { return (reg32s[reg_esi]) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 6 << 3 | 7] = function(mod) { return (reg32s[reg_esi]) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 6 << 3 | 0] = function(mod) { return (reg32s[reg_esi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 6 << 3 | 1] = function(mod) { return (reg32s[reg_esi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 6 << 3 | 2] = function(mod) { return (reg32s[reg_esi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 6 << 3 | 3] = function(mod) { return (reg32s[reg_esi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 6 << 3 | 4] = function(mod) { return (reg32s[reg_esi] << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 6 << 3 | 5] = function(mod) { return (reg32s[reg_esi] << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 6 << 3 | 6] = function(mod) { return (reg32s[reg_esi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 6 << 3 | 7] = function(mod) { return (reg32s[reg_esi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 6 << 3 | 0] = function(mod) { return (reg32s[reg_esi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 6 << 3 | 1] = function(mod) { return (reg32s[reg_esi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 6 << 3 | 2] = function(mod) { return (reg32s[reg_esi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 6 << 3 | 3] = function(mod) { return (reg32s[reg_esi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 6 << 3 | 4] = function(mod) { return (reg32s[reg_esi] << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 6 << 3 | 5] = function(mod) { return (reg32s[reg_esi] << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 6 << 3 | 6] = function(mod) { return (reg32s[reg_esi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 6 << 3 | 7] = function(mod) { return (reg32s[reg_esi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 6 << 3 | 0] = function(mod) { return (reg32s[reg_esi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 6 << 3 | 1] = function(mod) { return (reg32s[reg_esi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 6 << 3 | 2] = function(mod) { return (reg32s[reg_esi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 6 << 3 | 3] = function(mod) { return (reg32s[reg_esi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 6 << 3 | 4] = function(mod) { return (reg32s[reg_esi] << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 6 << 3 | 5] = function(mod) { return (reg32s[reg_esi] << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 6 << 3 | 6] = function(mod) { return (reg32s[reg_esi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 6 << 3 | 7] = function(mod) { return (reg32s[reg_esi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +sib_table[0x00 | 7 << 3 | 0] = function(mod) { return (reg32s[reg_edi]) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x00 | 7 << 3 | 1] = function(mod) { return (reg32s[reg_edi]) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x00 | 7 << 3 | 2] = function(mod) { return (reg32s[reg_edi]) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x00 | 7 << 3 | 3] = function(mod) { return (reg32s[reg_edi]) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x00 | 7 << 3 | 4] = function(mod) { return (reg32s[reg_edi]) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x00 | 7 << 3 | 5] = function(mod) { return (reg32s[reg_edi]) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x00 | 7 << 3 | 6] = function(mod) { return (reg32s[reg_edi]) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x00 | 7 << 3 | 7] = function(mod) { return (reg32s[reg_edi]) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x40 | 7 << 3 | 0] = function(mod) { return (reg32s[reg_edi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x40 | 7 << 3 | 1] = function(mod) { return (reg32s[reg_edi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x40 | 7 << 3 | 2] = function(mod) { return (reg32s[reg_edi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x40 | 7 << 3 | 3] = function(mod) { return (reg32s[reg_edi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x40 | 7 << 3 | 4] = function(mod) { return (reg32s[reg_edi] << 1) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x40 | 7 << 3 | 5] = function(mod) { return (reg32s[reg_edi] << 1) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x40 | 7 << 3 | 6] = function(mod) { return (reg32s[reg_edi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x40 | 7 << 3 | 7] = function(mod) { return (reg32s[reg_edi] << 1) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0x80 | 7 << 3 | 0] = function(mod) { return (reg32s[reg_edi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0x80 | 7 << 3 | 1] = function(mod) { return (reg32s[reg_edi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0x80 | 7 << 3 | 2] = function(mod) { return (reg32s[reg_edi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0x80 | 7 << 3 | 3] = function(mod) { return (reg32s[reg_edi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0x80 | 7 << 3 | 4] = function(mod) { return (reg32s[reg_edi] << 2) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0x80 | 7 << 3 | 5] = function(mod) { return (reg32s[reg_edi] << 2) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0x80 | 7 << 3 | 6] = function(mod) { return (reg32s[reg_edi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0x80 | 7 << 3 | 7] = function(mod) { return (reg32s[reg_edi] << 2) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; }; sib_table[0xC0 | 7 << 3 | 0] = function(mod) { return (reg32s[reg_edi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_eax] | 0; }; sib_table[0xC0 | 7 << 3 | 1] = function(mod) { return (reg32s[reg_edi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ecx] | 0; }; sib_table[0xC0 | 7 << 3 | 2] = function(mod) { return (reg32s[reg_edi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edx] | 0; }; sib_table[0xC0 | 7 << 3 | 3] = function(mod) { return (reg32s[reg_edi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_ebx] | 0; }; sib_table[0xC0 | 7 << 3 | 4] = function(mod) { return (reg32s[reg_edi] << 3) + get_seg_prefix(reg_ss) + reg32s[reg_esp] | 0; }; sib_table[0xC0 | 7 << 3 | 5] = function(mod) { return (reg32s[reg_edi] << 3) + (mod ? get_seg_prefix(reg_ss) + reg32s[reg_ebp] : get_seg_prefix(reg_ds) + read_imm32s()) | 0; }; sib_table[0xC0 | 7 << 3 | 6] = function(mod) { return (reg32s[reg_edi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_esi] | 0; }; sib_table[0xC0 | 7 << 3 | 7] = function(mod) { return (reg32s[reg_edi] << 3) + get_seg_prefix(reg_ds) + reg32s[reg_edi] | 0; };; +/** + * @param {number} modrm_byte + * @return {number} + */ +modrm_resolve16 = function(modrm_byte) +{ + return modrm_table16[modrm_byte](); +} +/** + * @param {number} modrm_byte + * @return {number} + */ +modrm_resolve32 = function(modrm_byte) +{ + return modrm_table32[modrm_byte](); +} +/** + * @param {boolean} mod + * @return {number} + */ +function getsib(mod) +{ + return sib_table[read_imm8()](mod); +} +})(); +/* + * Arithmatic functions + * This file contains: + * + * add, adc, sub, sbc, cmp + * inc, dec + * neg, not + * imul, mul, idiv, div + * xadd + * + * das, daa, aad, aam + * + * and, or, xor, test + * shl, shr, sar, ror, rol, rcr, rcl + * shld, shrd + * + * bts, btr, btc, bt + * bsf, bsr + * + * Gets #included by cpu.macro.js + * +*/ +"use strict"; +/** + * Helper function for multiplying 2 32 bit numbers + * Returns the low 32 bit (which would normally get cut off) + * + * @param {number} n1 + * @param {number} n2 + */ +function multiply_low(n1, n2) +{ + var low1 = n1 & 0xFFFF, + low2 = n2 & 0xFFFF, + high1 = n1 & ~0xFFFF, + high2 = n2 & ~0xFFFF; + return low1 * low2 + low1 * high2 + high1 * low2; +} +function add8(dest_operand, source_operand) +{ + // very likely to be a crash + if(DEBUG && memory.read32s(translate_address_read(instruction_pointer)) === 0) + { + dump_regs(); + throw "detected jump to 00000000"; + } + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + source_operand | 0; + last_op_size = OPSIZE_8; + flags_changed = flags_all; + return last_result; +} +function add16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + source_operand | 0; + last_op_size = OPSIZE_16; + flags_changed = flags_all; + return last_result; +} +function add32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + source_operand; + last_op_size = OPSIZE_32; + flags_changed = flags_all; + return last_result; +} +function adc8(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + last_op2 + getcf() | 0; + last_op_size = OPSIZE_8; + flags_changed = flags_all; + return last_result; +} +function adc16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + last_op2 + getcf() | 0; + last_op_size = OPSIZE_16; + flags_changed = flags_all; + return last_result; +} +function adc32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = source_operand; + last_result = last_op1 + last_op2 + getcf(); + last_op_size = OPSIZE_32; + flags_changed = flags_all; + return last_result; +} +function cmp8(dest_operand, source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x100); + dbg_assert(dest_operand >= 0 && dest_operand < 0x100); + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand; + last_op_size = OPSIZE_8; + flags_changed = flags_all; +} +function cmp16(dest_operand, source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x10000); + dbg_assert(dest_operand >= 0 && dest_operand < 0x10000); + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand; + last_op_size = OPSIZE_16; + flags_changed = flags_all; +} +function cmp32(dest_operand, source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x100000000); + dbg_assert(dest_operand >= 0 && dest_operand < 0x100000000); + last_op1 = dest_operand; + last_op2 = -source_operand - 1; + last_result = last_op1 - source_operand; + last_op_size = OPSIZE_32; + flags_changed = flags_all; +} +function sub8(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand | 0; + last_op_size = OPSIZE_8; + flags_changed = flags_all; + return last_result; +} +function sub16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand | 0; + last_op_size = OPSIZE_16; + flags_changed = flags_all; + return last_result; +} +function sub32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = -source_operand - 1; + last_result = last_op1 - source_operand; + last_op_size = OPSIZE_32; + flags_changed = flags_all; + return last_result; +} +function sbb8(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand - getcf() | 0; + last_op_size = OPSIZE_8; + flags_changed = flags_all; + return last_result; +} +function sbb16(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = ~source_operand; + last_result = last_op1 - source_operand - getcf() | 0; + last_op_size = OPSIZE_16; + flags_changed = flags_all; + return last_result; +} +function sbb32(dest_operand, source_operand) +{ + last_op1 = dest_operand; + last_op2 = -source_operand - 1; + last_result = last_op1 - source_operand - getcf(); + last_op_size = OPSIZE_32; + flags_changed = flags_all; + return last_result; +} +/* + * inc and dec + */ +function inc8(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = 1; + last_result = last_op1 + 1 | 0; + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry; + return last_result; +} +function inc16(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = 1; + last_result = last_op1 + 1 | 0; + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry; + return last_result; +} +function inc32(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = 1; + last_result = last_op1 + 1; + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry; + return last_result; +} +function dec8(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = -1; + last_result = last_op1 - 1 | 0; + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry; + return last_result; +} +function dec16(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = -1; + last_result = last_op1 - 1 | 0; + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry; + return last_result; +} +function dec32(dest_operand) +{ + flags = (flags & ~1) | getcf(); + last_op1 = dest_operand; + last_op2 = -1; + last_result = last_op1 - 1; + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry; + return last_result; +} +/* + * neg and not + */ +function not8(dest_operand) +{ + return ~dest_operand; +} +function not16(dest_operand) +{ + return ~dest_operand; +} +function not32(dest_operand) +{ + return ~dest_operand; +} +function neg8(dest_operand) +{ + last_result = -dest_operand; + flags_changed = flags_all; + last_op_size = OPSIZE_8; + last_op1 = 0; + last_op2 = last_result - 1; + return last_result; +} +function neg16(dest_operand) +{ + last_result = -dest_operand; + flags_changed = flags_all; + last_op_size = OPSIZE_16; + last_op1 = 0; + last_op2 = last_result - 1; + return last_result; +} +function neg32(dest_operand) +{ + last_result = -dest_operand; + flags_changed = flags_all; + last_op_size = OPSIZE_32; + last_op1 = 0; + last_op2 = last_result - 1; + return last_result; +} +/* + * mul, imul, div, idiv + * + * Note: imul has some extra opcodes + * while other functions only allow + * ax * modrm + */ +function mul8(source_operand) +{ + var result = source_operand * reg8[reg_al]; + reg16[reg_ax] = result; + if(result < 0x100) + { + flags = flags & ~1 & ~flag_overflow; + } + else + { + flags = flags | 1 | flag_overflow; + } + flags_changed = 0; +} +function imul8(source_operand) +{ + var result = source_operand * reg8s[reg_al]; + reg16[reg_ax] = result; + if(result > 0x7F || result < -0x80) + { + flags = flags | 1 | flag_overflow; + } + else + { + flags = flags & ~1 & ~flag_overflow; + } + flags_changed = 0; +} +function mul16(source_operand) +{ + var result = source_operand * reg16[reg_ax], + high_result = result >>> 16; + //console.log(h(a) + " * " + h(reg16[reg_ax]) + " = " + h(result)); + reg16[reg_ax] = result; + reg16[reg_dx] = high_result; + if(high_result === 0) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; +} +/* + * imul with 1 argument + * ax = ax * r/m + */ +function imul16(source_operand) +{ + var result = source_operand * reg16s[reg_ax]; + reg16[reg_ax] = result; + reg16[reg_dx] = result >> 16; + if(result > 0x7FFF || result < -0x8000) + { + flags |= 1 | flag_overflow; + } + else + { + flags &= ~1 & ~flag_overflow; + } + flags_changed = 0; +} +/* + * imul with 2 or 3 arguments + * reg = reg * r/m + * reg = imm * r/m + */ +function imul_reg16(operand1, operand2) +{ + dbg_assert(operand1 < 0x8000 && operand1 >= -0x8000); + dbg_assert(operand2 < 0x8000 && operand2 >= -0x8000); + var result = operand1 * operand2; + if(result > 0x7FFF || result < -0x8000) + { + flags |= 1 | flag_overflow; + } + else + { + flags &= ~1 & ~flag_overflow; + } + flags_changed = 0; + return result; +} +function mul32(source_operand) +{ + var dest_operand = reg32[reg_eax], + high_result = source_operand * dest_operand / 0x100000000 | 0; + reg32[reg_eax] = multiply_low(source_operand, dest_operand); + reg32[reg_edx] = high_result; + if(high_result === 0) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; + //console.log(memory.read32s(address) + " * " + old); + //console.log("= " + reg32[reg_edx] + " " + reg32[reg_eax]); +} +function imul32(source_operand) +{ + dbg_assert(source_operand < 0x80000000 && source_operand >= -0x80000000); + var dest_operand = reg32s[reg_eax], + high_result = source_operand * dest_operand / 0x100000000 | 0, + low_result = multiply_low(source_operand, dest_operand); + if(high_result === 0 && low_result < 0) + { + high_result = -1; + } + reg32[reg_eax] = low_result; + reg32[reg_edx] = high_result; + if(high_result === (reg32[reg_eax] < 0x80000000 ? 0 : -1)) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; + //console.log(target_operand + " * " + source_operand); + //console.log("= " + h(reg32[reg_edx]) + " " + h(reg32[reg_eax])); +} +/* + * imul with 2 or 3 arguments + * reg = reg * r/m + * reg = imm * r/m + */ +function imul_reg32(operand1, operand2) +{ + dbg_assert(operand1 < 0x80000000 && operand1 >= -0x80000000); + dbg_assert(operand2 < 0x80000000 && operand2 >= -0x80000000); + var result = multiply_low(operand1, operand2), + high_result = operand1 * operand2 / 0x100000000 | 0; + if(high_result === 0) + { + flags &= ~1 & ~flag_overflow; + } + else + { + flags |= 1 | flag_overflow; + } + flags_changed = 0; + return result; + //console.log(operand + " * " + source_operand); + //console.log("= " + reg32[reg]); +} +function div8(source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x100); + var target_operand = reg16[reg_ax], + result = target_operand / source_operand | 0; + if(result > 0xFF || source_operand === 0) + { + trigger_de(); + } + else + { + reg8[reg_al] = result; + reg8[reg_ah] = target_operand % source_operand; + } +} +function idiv8(source_operand) +{ + dbg_assert(source_operand >= -0x80 && source_operand < 0x80); + var target_operand = reg16s[reg_ax], + result = target_operand / source_operand | 0; + if(result > 0x7F || result < -0x80 || source_operand === 0) + { + trigger_de(); + } + else + { + reg8[reg_al] = result; + reg8[reg_ah] = target_operand % source_operand; + } +} +function div16(source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand < 0x10000); + var + target_operand = (reg16[reg_ax] | reg16[reg_dx] << 16) >>> 0, + result = target_operand / source_operand | 0; + if(result > 0xFFFF || source_operand === 0) + { + trigger_de(); + } + else + { + reg16[reg_ax] = result; + reg16[reg_dx] = target_operand % source_operand; + } +} +function idiv16(source_operand) +{ + dbg_assert(source_operand >= -0x8000 && source_operand < 0x8000); + var target_operand = reg16[reg_ax] | (reg16[reg_dx] << 16), + result = target_operand / source_operand | 0; + if(result > 0x7FFF || result < -0x8000 || source_operand === 0) + { + trigger_de(); + } + else + { + reg16[reg_ax] = result; + reg16[reg_dx] = target_operand % source_operand; + } +} +function div32(source_operand) +{ + dbg_assert(source_operand >= 0 && source_operand <= 0xffffffff); + var + dest_operand_low = reg32[reg_eax], + dest_operand_high = reg32[reg_edx], + // Wat? Not sure if seriös ... + mod = (0x100000000 * dest_operand_high % source_operand + dest_operand_low % source_operand) % source_operand, + result = dest_operand_low / source_operand + dest_operand_high * 0x100000000 / source_operand; + if(result > 0xFFFFFFFF || source_operand === 0) + { + trigger_de(); + } + else + { + reg32[reg_eax] = result; + reg32[reg_edx] = mod; + } + //console.log(h(dest_operand_high) + ":" + h(dest_operand_low) + " / " + h(source_operand)); + //console.log("= " + h(reg32[reg_eax]) + " rem " + h(reg32[reg_edx])); +} +function idiv32(source_operand) +{ + dbg_assert(source_operand < 0x80000000 && source_operand >= -0x80000000); + var + dest_operand_low = reg32[reg_eax], + dest_operand_high = reg32s[reg_edx], + mod = (0x100000000 * dest_operand_high % source_operand + dest_operand_low % source_operand) % source_operand, + result = dest_operand_low / source_operand + dest_operand_high * 0x100000000 / source_operand; + if(result > 0x7FFFFFFF || result < -0x80000000 || source_operand === 0) + { + trigger_de(); + } + else + { + reg32[reg_eax] = result; + reg32[reg_edx] = mod; + } + //console.log(h(dest_operand_high) + ":" + h(dest_operand_low) + " / " + h(source_operand)); + //console.log("= " + h(reg32[reg_eax]) + " rem " + h(reg32[reg_edx])); +} +function xadd8(source_operand, reg) +{ + var tmp = reg8[reg]; + reg8[reg] = source_operand; + return add8(source_operand, tmp); +} +function xadd16(source_operand, reg) +{ + var tmp = reg16[reg]; + reg16[reg] = source_operand; + return add16(source_operand, tmp); +} +function xadd32(source_operand, reg) +{ + var tmp = reg32[reg]; + reg32[reg] = source_operand; + return add32(source_operand, tmp); +} +function bcd_daa() +{ + //dbg_log("daa"); + // decimal adjust after addition + var old_al = reg8[reg_al], + old_cf = getcf(), + old_af = getaf(); + flags &= ~1 & ~flag_adjust + if((old_al & 0xF) > 9 || old_af) + { + reg8[reg_al] += 6; + flags |= flag_adjust; + } + if(old_al > 0x99 || old_cf) + { + reg8[reg_al] += 0x60; + flags |= 1; + } + last_result = reg8[reg_al]; + last_op_size = OPSIZE_8; + last_op1 = last_op2 = 0; + flags_changed = flags_all & ~1 & ~flag_adjust & ~flag_overflow; +} +function bcd_das() +{ + //dbg_log("das"); + // decimal adjust after subtraction + var old_al = reg8[reg_al], + old_cf = getcf(); + flags &= ~1; + if((old_al & 0xF) > 9 || getaf()) + { + reg8[reg_al] -= 6; + flags |= flag_adjust; + flags = flags & ~1 | old_cf | reg8[reg_al] >> 7; + } + else + { + flags &= ~flag_adjust; + } + if(old_al > 0x99 || old_cf) + { + reg8[reg_al] -= 0x60; + flags |= 1; + } + last_result = reg8[reg_al]; + last_op_size = OPSIZE_8; + last_op1 = last_op2 = 0; + flags_changed = flags_all & ~1 & ~flag_adjust & ~flag_overflow; +} +function bcd_aam() +{ + // ascii adjust after multiplication + var imm8 = read_imm8(); + if(imm8 === 0) + { + trigger_de(); + } + else + { + var temp = reg8[reg_al]; + reg8[reg_ah] = temp / imm8; + reg8[reg_al] = temp % imm8; + last_result = reg8[reg_al]; + flags_changed = flags_all; + } +} +function bcd_aad() +{ + // ascii adjust after division + var imm8 = read_imm8(); + last_result = reg8[reg_al] + reg8[reg_ah] * imm8; + reg16[reg_ax] = last_result & 0xFF; + last_op_size = OPSIZE_8; + flags_changed = flags_all; +} +function bcd_aaa() +{ + if((reg8[reg_al] & 0xF) > 9 || getaf()) + { + reg16[reg_ax] += 6; + reg8[reg_ah] += 1; + flags |= flag_adjust | 1; + } + else + { + flags &= ~flag_adjust & ~1; + } + reg8[reg_al] &= 0xF; + flags_changed &= ~flag_adjust & ~1; +} +function bcd_aas() +{ + if((reg8[reg_al] & 0xF) > 9 || getaf()) + { + reg16[reg_ax] -= 6; + reg8[reg_ah] -= 1; + flags |= flag_adjust | 1; + } + else + { + flags &= ~flag_adjust & ~1; + } + reg8[reg_al] &= 0xF; + flags_changed &= ~flag_adjust & ~1; +} +/* \O + * bitwise functions | * / * + + * + * and, or, xor, test + * shl, shr, sar, rol, ror, rcl, ror + * shrd, shld + * + * bt, bts, btr, btc + * bsf, bsr + */ +function and8(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function and16(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function and32(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function test8(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; +} +function test16(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; +} +function test32(dest_operand, source_operand) +{ + last_result = dest_operand & source_operand; + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; +} +function or8(dest_operand, source_operand) +{ + last_result = dest_operand | source_operand; + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function or16(dest_operand, source_operand) +{ + last_result = dest_operand | source_operand; + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function or32(dest_operand, source_operand) +{ + last_result = dest_operand | source_operand; + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function xor8(dest_operand, source_operand) +{ + last_result = dest_operand ^ source_operand; + last_op_size = OPSIZE_8; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function xor16(dest_operand, source_operand) +{ + last_result = dest_operand ^ source_operand; + last_op_size = OPSIZE_16; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +function xor32(dest_operand, source_operand) +{ + last_result = dest_operand ^ source_operand; + last_op_size = OPSIZE_32; + flags &= ~1 & ~flag_overflow & ~flag_adjust; + flags_changed = flags_all & ~flag_carry & ~flag_overflow & ~flag_adjust; + return last_result; +} +/* + * rotates and shifts + */ +function rol8(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + count &= 7; + var result = dest_operand << count | dest_operand >> (8 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result & 1) + | (result << 11 ^ result << 4) & flag_overflow; + return result; +} +function rol16(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + count &= 15; + var result = dest_operand << count | dest_operand >> (16 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result & 1) + | (result << 11 ^ result >> 4) & flag_overflow; + return result; +} +function rol32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + var result = dest_operand << count | dest_operand >>> (32 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result & 1) + | (result << 11 ^ result >> 20) & flag_overflow; + return result; +} +function rcl8(dest_operand, count) +{ + count %= 9; + if(!count) + { + return dest_operand; + } + var result = dest_operand << count | getcf() << (count - 1) | dest_operand >> (9 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 8 & 1) + | (result << 3 ^ result << 4) & flag_overflow; + return result; +} +function rcl16(dest_operand, count) +{ + count %= 17; + if(!count) + { + return dest_operand; + } + var result = dest_operand << count | getcf() << (count - 1) | dest_operand >> (17 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 16 & 1) + | (result >> 5 ^ result >> 4) & flag_overflow; + return result; +} +function rcl32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + var result = dest_operand << count | getcf() << (count - 1); + if(count > 1) + { + result |= dest_operand >>> (33 - count); + } + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >>> (32 - count) & 1); + flags |= (flags << 11 ^ result >> 20) & flag_overflow; + return result; +} +function ror8(dest_operand, count) +{ + count &= 7; + if(!count) + { + return dest_operand; + } + var result = dest_operand >> count | dest_operand << (8 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 7 & 1) + | (result << 4 ^ result << 5) & flag_overflow; + return result; +} +function ror16(dest_operand, count) +{ + count &= 15; + if(!count) + { + return dest_operand; + } + var result = dest_operand >> count | dest_operand << (16 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 15 & 1) + | (result >> 4 ^ result >> 3) & flag_overflow; + return result; +} +function ror32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + var result = dest_operand >>> count | dest_operand << (32 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 31 & 1) + | (result >> 20 ^ result >> 19) & flag_overflow; + return result; +} +function rcr8(dest_operand, count) +{ + count %= 9; + if(!count) + { + return dest_operand; + } + var result = dest_operand >> count | getcf() << (8 - count) | dest_operand << (9 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 8 & 1) + | (result << 4 ^ result << 5) & flag_overflow; + return result; +} +function rcr16(dest_operand, count) +{ + count %= 17; + if(!count) + { + return dest_operand; + } + var result = dest_operand >> count | getcf() << (16 - count) | dest_operand << (17 - count); + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (result >> 16 & 1) + | (result >> 4 ^ result >> 3) & flag_overflow; + return result; +} +function rcr32(dest_operand, count) +{ + if(!count) + { + return dest_operand; + } + var result = dest_operand >>> count | getcf() << (32 - count); + if(count > 1) + { + result |= dest_operand << (33 - count); + } + flags_changed &= ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >> (count - 1) & 1) + | (result >> 20 ^ result >> 19) & flag_overflow; + return result; +} +function shl8(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand << count; + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (last_result >> 8 & 1) + | (last_result << 3 ^ last_result << 4) & flag_overflow; + return last_result; +} +function shl16(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand << count; + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (last_result >> 16 & 1) + | (last_result >> 5 ^ last_result >> 4) & flag_overflow; + return last_result; +} +function shl32(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand << count; + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + // test this + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >>> (32 - count) & 1); + flags |= ((flags & 1) ^ (last_result >> 31 & 1)) << 11 & flag_overflow; + return last_result; +} +function shr8(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand >> count; + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >> (count - 1) & 1) + | (dest_operand >> 7 & 1) << 11 & flag_overflow; + return last_result; +} +function shr16(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand >> count; + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >> (count - 1) & 1) + | (dest_operand >> 4) & flag_overflow; + return last_result; +} +function shr32(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand >>> count; + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) + | (dest_operand >>> (count - 1) & 1) + | (dest_operand >> 20) & flag_overflow; + return last_result; +} +function sar8(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand >> count; + last_op_size = OPSIZE_8; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >> (count - 1) & 1); + // of is zero + return last_result; +} +function sar16(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand >> count; + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >> (count - 1) & 1); + return last_result; +} +function sar32(dest_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand >> count; + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~flag_carry & ~flag_overflow; + flags = (flags & ~1 & ~flag_overflow) | (dest_operand >>> (count - 1) & 1); + return last_result; +} +function shrd16(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + if(count <= 16) + { + last_result = dest_operand >> count | source_operand << (16 - count); + flags = (flags & ~1) | (dest_operand >> (count - 1) & 1); + } + else + { + last_result = dest_operand << (32 - count) | source_operand >> (count - 16); + flags = (flags & ~1) | (source_operand >> (count - 17) & 1); + } + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~1 & ~flag_overflow; + flags = (flags & ~flag_overflow) | ((last_result ^ dest_operand) >> 4 & flag_overflow); + return last_result; +} +function shrd32(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand >>> count | source_operand << (32 - count); + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~1 & ~flag_overflow; + flags = (flags & ~1) | (dest_operand >>> (count - 1) & 1); + flags = (flags & ~flag_overflow) | ((last_result ^ dest_operand) >> 20 & flag_overflow); + return last_result; +} +function shld16(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + if(count <= 16) + { + last_result = dest_operand << count | source_operand >>> (16 - count); + flags = (flags & ~1) | (dest_operand >>> (16 - count) & 1); + } + else + { + last_result = dest_operand >> (32 - count) | source_operand << (count - 16); + flags = (flags & ~1) | (source_operand >>> (32 - count) & 1); + } + last_op_size = OPSIZE_16; + flags_changed = flags_all & ~1 & ~flag_overflow; + flags = (flags & ~flag_overflow) | ((flags & 1) ^ (last_result >> 15 & 1)) << 11; + return last_result; +} +function shld32(dest_operand, source_operand, count) +{ + if(count === 0) + { + return dest_operand; + } + last_result = dest_operand << count | source_operand >>> (32 - count); + last_op_size = OPSIZE_32; + flags_changed = flags_all & ~1 & ~flag_overflow; + // test this + flags = (flags & ~1) | (dest_operand >>> (32 - count) & 1); + flags = (flags & ~flag_overflow) | ((flags & 1) ^ (last_result >> 31 & 1)) << 11; + return last_result; +} +function bt_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; +} +function btc_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + return bit_base ^ 1 << bit_offset; +} +function bts_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + return bit_base | 1 << bit_offset; +} +function btr_reg(bit_base, bit_offset) +{ + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + return bit_base & ~(1 << bit_offset); +} +function bt_mem(virt_addr, bit_offset) +{ + var bit_base = safe_read8(virt_addr + (bit_offset >> 3)); + bit_offset &= 7; + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; +} +function btc_mem(virt_addr, bit_offset) +{ + var phys_addr = translate_address_write(virt_addr + (bit_offset >> 3)); + var bit_base = memory.read8(phys_addr); + bit_offset &= 7; + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + memory.write8(phys_addr, bit_base ^ 1 << bit_offset); +} +function btr_mem(virt_addr, bit_offset) +{ + var phys_addr = translate_address_write(virt_addr + (bit_offset >> 3)); + var bit_base = memory.read8(phys_addr); + bit_offset &= 7; + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + memory.write8(phys_addr, bit_base & ~(1 << bit_offset)); +} +function bts_mem(virt_addr, bit_offset) +{ + var phys_addr = translate_address_write(virt_addr + (bit_offset >> 3)); + var bit_base = memory.read8(phys_addr); + bit_offset &= 7; + flags = (flags & ~1) | (bit_base >> bit_offset & 1); + flags_changed = 0; + memory.write8(phys_addr, bit_base | 1 << bit_offset); +} +var mod37_bit_position = new Uint8Array([ + 32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4, + 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, + 20, 8, 19, 18 +]); +function bsf16(old, bit_base) +{ + flags_changed = 0; + if(bit_base === 0) + { + flags |= flag_zero; + // not defined in the docs, but value doesn't change on my intel cpu + return old; + } + else + { + flags &= ~flag_zero; + return mod37_bit_position[((-bit_base & bit_base) >>> 0) % 37]; + } +} +function bsf32(old, bit_base) +{ + flags_changed = 0; + if(bit_base === 0) + { + flags |= flag_zero; + return old; + } + else + { + flags &= ~flag_zero; + return mod37_bit_position[((-bit_base & bit_base) >>> 0) % 37]; + } +} +function bsr16(old, bit_base) +{ + flags_changed = 0; + if(bit_base === 0) + { + flags |= flag_zero; + return old; + } + else + { + flags &= ~flag_zero; + var t = bit_base >>> 8; + if(t) + { + return 8 + log2_table[t]; + } + else + { + return log2_table[bit_base]; + } + } +} +function bsr32(old, bit_base) +{ + flags_changed = 0; + if(bit_base === 0) + { + flags |= flag_zero; + return old; + } + else + { + flags &= ~flag_zero; + var tt = bit_base >>> 16, + t; + if(tt) + { + t = tt >>> 8; + if(t) + { + return 24 + log2_table[t]; + } + else + { + return 16 + log2_table[tt]; + } + } + else + { + t = bit_base >>> 8; + if(t) + { + return 8 + log2_table[t]; + } + else + { + return log2_table[bit_base]; + } + } + } +} +/* + * Some miscellaneous instructions: + * + * jmpcc16, jmpcc32, jmp16 + * loop, loope, loopne, jcxz + * test_cc + * + * mov, push, pop + * pusha, popa + * xchg, lss + * lea + * enter + * bswap + * + * Gets #included by cpu.macro.js + */ +"use strict"; +function jmp_rel16(rel16) +{ + var current_cs = get_seg(reg_cs); + // limit ip to 16 bit + // ugly + instruction_pointer -= current_cs; + instruction_pointer = (instruction_pointer + rel16) & 0xFFFF; + instruction_pointer = instruction_pointer + current_cs | 0; +} +function jmpcc16(condition) +{ + if(condition) + { + jmp_rel16(read_imm16()); + } + else + { + instruction_pointer += 2; + } +} +function jmpcc32(condition) +{ + if(condition) + { + // don't write `instruction_pointer += read_imm32s()` + var imm32s = read_imm32s(); + instruction_pointer = instruction_pointer + imm32s | 0; + } + else + { + instruction_pointer = instruction_pointer + 4 | 0; + } +} +function loopne() +{ + if(--regv[reg_vcx] && !getzf()) + { + var imm8s = read_imm8s(); + instruction_pointer = instruction_pointer + imm8s | 0; + } + else + { + instruction_pointer++; + } +} +function loope() +{ + if(--regv[reg_vcx] && getzf()) + { + var imm8s = read_imm8s(); + instruction_pointer = instruction_pointer + imm8s | 0; + } + else + { + instruction_pointer++; + } +} +function loop() +{ + if(--regv[reg_vcx]) + { + var imm8s = read_imm8s(); + instruction_pointer = instruction_pointer + imm8s | 0; + } + else + { + instruction_pointer++; + } +} +function jcxz() +{ + var imm8s = read_imm8s(); + if(regv[reg_vcx] === 0) + { + instruction_pointer = instruction_pointer + imm8s | 0; + } +} +var test_o = getof, + test_b = getcf, + test_z = getzf, + test_s = getsf, + test_p = getpf; +function test_be() +{ + return getcf() || getzf(); +} +function test_l() +{ + return !getsf() !== !getof(); +} +function test_le() +{ + return getzf() || !getsf() !== !getof(); +} +/** + * @return {number} + * @const + */ +function getcf() +{ + if(flags_changed & 1) + { + if(last_op_size === OPSIZE_32) + { + // cannot bit test above 2^32-1 + return last_result > 0xffffffff | last_result < 0; + //return ((last_op1 ^ last_result) & (last_op2 ^ last_result)) >>> 31; + } + else + { + return last_result >> last_op_size & 1; + } + //return last_result >= (1 << last_op_size) | last_result < 0; + } + else + { + return flags & 1; + } +} +/** @return {number} */ +function getpf() +{ + if(flags_changed & flag_parity) + { + // inverted lookup table + return 0x9669 << 2 >> ((last_result ^ last_result >> 4) & 0xF) & flag_parity; + } + else + { + return flags & flag_parity; + } +} +/** @return {number} */ +function getaf() +{ + if(flags_changed & flag_adjust) + { + return (last_op1 ^ last_op2 ^ last_result ^ (last_op2 < 0) << 4) & flag_adjust; + } + else + { + return flags & flag_adjust; + } +} +/** @return {number} */ +function getzf() +{ + if(flags_changed & flag_zero) + { + return (~last_result & last_result - 1) >> last_op_size - 7 & flag_zero; + } + else + { + return flags & flag_zero; + } +} +/** @return {number} */ +function getsf() +{ + if(flags_changed & flag_sign) + { + return last_result >> last_op_size - 8 & flag_sign; + } + else + { + return flags & flag_sign; + } +} +/** @return {number} */ +function getof() +{ + if(flags_changed & flag_overflow) + { + return (((last_op1 ^ last_result) & (last_op2 ^ last_result)) >> last_op_size - 1) << 11 & flag_overflow; + } + else + { + return flags & flag_overflow; + } +} +function push16(imm16) +{ + var sp = get_esp_write(-2); + stack_reg[reg_vsp] -= 2; + memory.write16(sp, imm16); +} +function push32(imm32) +{ + var sp = get_esp_write(-4); + stack_reg[reg_vsp] -= 4; + memory.write32(sp, imm32); +} +function pop16() +{ + var sp = get_esp_read(0); + stack_reg[reg_vsp] += 2; + return memory.read16(sp); +} +function pop32s() +{ + var sp = get_esp_read(0); + stack_reg[reg_vsp] += 4; + return memory.read32s(sp); +} +function pusha16() +{ + var temp = reg16[reg_sp]; + // make sure we don't get a pagefault after having + // pushed several registers already + translate_address_write(temp - 15); + push16(reg16[reg_ax]); + push16(reg16[reg_cx]); + push16(reg16[reg_dx]); + push16(reg16[reg_bx]); + push16(temp); + push16(reg16[reg_bp]); + push16(reg16[reg_si]); + push16(reg16[reg_di]); +} +function pusha32() +{ + var temp = reg32s[reg_esp]; + translate_address_write(temp - 31); + push32(reg32s[reg_eax]); + push32(reg32s[reg_ecx]); + push32(reg32s[reg_edx]); + push32(reg32s[reg_ebx]); + push32(temp); + push32(reg32s[reg_ebp]); + push32(reg32s[reg_esi]); + push32(reg32s[reg_edi]); +} +function popa16() +{ + translate_address_read(stack_reg[reg_vsp] + 15); + reg16[reg_di] = pop16(); + reg16[reg_si] = pop16(); + reg16[reg_bp] = pop16(); + stack_reg[reg_vsp] += 2; + reg16[reg_bx] = pop16(); + reg16[reg_dx] = pop16(); + reg16[reg_cx] = pop16(); + reg16[reg_ax] = pop16(); +} +function popa32() +{ + translate_address_read(stack_reg[reg_vsp] + 31); + reg32[reg_edi] = pop32s(); + reg32[reg_esi] = pop32s(); + reg32[reg_ebp] = pop32s(); + stack_reg[reg_vsp] += 4; + reg32[reg_ebx] = pop32s(); + reg32[reg_edx] = pop32s(); + reg32[reg_ecx] = pop32s(); + reg32[reg_eax] = pop32s(); +} +function xchg8(memory_data, modrm_byte) +{ + var mod = modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1, + tmp = reg8[mod]; + reg8[mod] = memory_data; + return tmp; +} +function xchg16(memory_data, modrm_byte) +{ + var mod = modrm_byte >> 2 & 14, + tmp = reg16[mod]; + reg16[mod] = memory_data; + return tmp; +} +function xchg16r(operand) +{ + var temp = reg16[reg_ax]; + reg16[reg_ax] = reg16[operand]; + reg16[operand] = temp; +} +function xchg32(memory_data, modrm_byte) +{ + var mod = modrm_byte >> 3 & 7, + tmp = reg32s[mod]; + reg32[mod] = memory_data; + return tmp; +} +function xchg32r(operand) +{ + var temp = reg32s[reg_eax]; + reg32[reg_eax] = reg32s[operand]; + reg32[operand] = temp; +} +function lss16(seg, addr, mod) +{ + var new_reg = safe_read16(addr), + new_seg = safe_read16(addr + 2); + switch_seg(seg, new_seg); + reg16[mod] = new_reg; +} +function lss32(seg, addr, mod) +{ + var new_reg = safe_read32s(addr), + new_seg = safe_read16(addr + 4); + switch_seg(seg, new_seg); + reg32[mod] = new_reg; +} +function lea16() +{ + var modrm_byte = read_imm8(), + mod = modrm_byte >> 3 & 7; + // override prefix, so modrm16 does not return the segment part + segment_prefix = reg_noseg; + reg16[mod << 1] = modrm_resolve(modrm_byte); + segment_prefix = -1; +} +function lea32() +{ + var modrm_byte = read_imm8(), + mod = modrm_byte >> 3 & 7; + segment_prefix = reg_noseg; + reg32[mod] = modrm_resolve(modrm_byte); + segment_prefix = -1; +} +function enter16() +{ + var size = read_imm16(), + nesting_level = read_imm8(), + frame_temp; + push16(reg16[reg_bp]); + frame_temp = reg16[reg_sp]; + if(nesting_level > 0) + { + for(var i = 1; i < nesting_level; i++) + { + reg16[reg_bp] -= 2; + push16(reg16[reg_bp]); + } + push16(frame_temp); + } + reg16[reg_bp] = frame_temp; + reg16[reg_sp] = frame_temp - size; + dbg_assert(!page_fault); +} +function enter32() +{ + var size = read_imm16(), + nesting_level = read_imm8() & 31, + frame_temp; + push32(reg32s[reg_ebp]); + frame_temp = reg32s[reg_esp]; + if(nesting_level > 0) + { + for(var i = 1; i < nesting_level; i++) + { + reg32[reg_ebp] -= 4; + push32(reg32s[reg_ebp]); + } + push32(frame_temp); + } + reg32[reg_ebp] = frame_temp; + reg32[reg_esp] -= size; + dbg_assert(!page_fault); +} +function bswap(reg) +{ + var temp = reg32s[reg]; + reg32[reg] = temp >>> 24 | temp << 24 | (temp >> 8 & 0xFF00) | (temp << 8 & 0xFF0000); +} +"use strict"; +/* + * string operations + * + * cmp si di + * movs 0 1 1 A4 + * cmps 1 1 1 A6 + * stos 0 0 1 AA + * lods 0 1 0 AC + * scas 1 0 1 AE + * ins 0 0 1 + * outs 0 1 0 + */ +function movsb() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(false && !true) data_src = reg8[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!true || (dest & (8 >> 3) - 1) === 0) && (!true || (src & (8 >> 3) - 1) === 0); do { if(aligned) { {}; } else { { safe_write8(dest, safe_read8(src)); }; } if(true) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write8(dest, safe_read8(src)); }; if(true) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp8(data_src, data_dest);; +} +function movsw() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(16 >> 3) : 16 >> 3; var ds, es; if(false && !true) data_src = reg16[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 16 > 8 && (!true || (dest & (16 >> 3) - 1) === 0) && (!true || (src & (16 >> 3) - 1) === 0); do { if(aligned) { { var phys_src = translate_address_read(src); var phys_dest = translate_address_write(dest); memory.write_aligned16(phys_dest, memory.read_aligned16(phys_src)); }; } else { { safe_write16(dest, safe_read16(src)); }; } if(true) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write16(dest, safe_read16(src)); }; if(true) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp16(data_src, data_dest);; +} +function movsd() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(32 >> 3) : 32 >> 3; var ds, es; if(false && !true) data_src = reg32[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 32 > 8 && (!true || (dest & (32 >> 3) - 1) === 0) && (!true || (src & (32 >> 3) - 1) === 0); do { if(aligned) { { var phys_src = translate_address_read(src); var phys_dest = translate_address_write(dest); memory.write_aligned32(phys_dest, memory.read_aligned32(phys_src)); }; } else { { safe_write32(dest, safe_read32s(src)); }; } if(true) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write32(dest, safe_read32s(src)); }; if(true) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp32(data_src, data_dest);; +} +function cmpsb() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(true && !true) data_src = reg8[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!true || (dest & (8 >> 3) - 1) === 0) && (!true || (src & (8 >> 3) - 1) === 0); do { if(aligned) { {}; } else { { data_dest = safe_read8(dest); data_src = safe_read8(src); }; } if(true) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!true || (data_src === data_dest) === repeat_string_type)); } else { { data_dest = safe_read8(dest); data_src = safe_read8(src); }; if(true) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(true) cmp8(data_src, data_dest);; +} +function cmpsw() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(16 >> 3) : 16 >> 3; var ds, es; if(true && !true) data_src = reg16[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 16 > 8 && (!true || (dest & (16 >> 3) - 1) === 0) && (!true || (src & (16 >> 3) - 1) === 0); do { if(aligned) { { data_dest = memory.read_aligned16(translate_address_read(dest)); data_src = memory.read_aligned16(translate_address_read(src)); }; } else { { data_dest = safe_read16(dest); data_src = safe_read16(src); }; } if(true) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!true || (data_src === data_dest) === repeat_string_type)); } else { { data_dest = safe_read16(dest); data_src = safe_read16(src); }; if(true) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(true) cmp16(data_src, data_dest);; +} +function cmpsd() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(32 >> 3) : 32 >> 3; var ds, es; if(true && !true) data_src = reg32[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 32 > 8 && (!true || (dest & (32 >> 3) - 1) === 0) && (!true || (src & (32 >> 3) - 1) === 0); do { if(aligned) { { data_dest = memory.read_aligned32(translate_address_read(dest)) >>> 0; data_src = memory.read_aligned32(translate_address_read(src)) >>> 0; }; } else { { data_dest = (safe_read32s(dest) >>> 0); data_src = (safe_read32s(src) >>> 0); }; } if(true) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!true || (data_src === data_dest) === repeat_string_type)); } else { { data_dest = (safe_read32s(dest) >>> 0); data_src = (safe_read32s(src) >>> 0); }; if(true) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(true) cmp32(data_src, data_dest);; +} +function stosb() +{ + var data = reg8[reg_al]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(false && !false) data_src = reg8[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!true || (dest & (8 >> 3) - 1) === 0) && (!false || (src & (8 >> 3) - 1) === 0); do { if(aligned) { {}; } else { { safe_write8(dest, data); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write8(dest, data); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(false) cmp8(data_src, data_dest);; +} +function stosw() +{ + var data = reg16[reg_ax]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(16 >> 3) : 16 >> 3; var ds, es; if(false && !false) data_src = reg16[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 16 > 8 && (!true || (dest & (16 >> 3) - 1) === 0) && (!false || (src & (16 >> 3) - 1) === 0); do { if(aligned) { { memory.write_aligned16(translate_address_write(dest), data); }; } else { { safe_write16(dest, data); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write16(dest, data); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(false) cmp16(data_src, data_dest);; +} +function stosd() +{ + //dbg_log("stosd " + ((reg32[reg_edi] & 3) ? "mis" : "") + "aligned", LOG_CPU); + var data = reg32[reg_eax]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(32 >> 3) : 32 >> 3; var ds, es; if(false && !false) data_src = reg32[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 32 > 8 && (!true || (dest & (32 >> 3) - 1) === 0) && (!false || (src & (32 >> 3) - 1) === 0); do { if(aligned) { { memory.write_aligned32(translate_address_write(dest), data); }; } else { { safe_write32(dest, data); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write32(dest, data); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(false) cmp32(data_src, data_dest);; +} +function lodsb() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(false && !true) data_src = reg8[reg_eax]; if(false) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!false || (dest & (8 >> 3) - 1) === 0) && (!true || (src & (8 >> 3) - 1) === 0); do { if(aligned) { {}; } else { { reg8[reg_al] = safe_read8(src); }; } if(false) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { reg8[reg_al] = safe_read8(src); }; if(false) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp8(data_src, data_dest);; +} +function lodsw() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(16 >> 3) : 16 >> 3; var ds, es; if(false && !true) data_src = reg16[reg_eax]; if(false) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 16 > 8 && (!false || (dest & (16 >> 3) - 1) === 0) && (!true || (src & (16 >> 3) - 1) === 0); do { if(aligned) { { reg16[reg_ax] = safe_read16(src); }; } else { { reg16[reg_ax] = safe_read16(src); }; } if(false) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { reg16[reg_ax] = safe_read16(src); }; if(false) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp16(data_src, data_dest);; +} +function lodsd() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(32 >> 3) : 32 >> 3; var ds, es; if(false && !true) data_src = reg32[reg_eax]; if(false) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 32 > 8 && (!false || (dest & (32 >> 3) - 1) === 0) && (!true || (src & (32 >> 3) - 1) === 0); do { if(aligned) { { reg32[reg_eax] = safe_read32s(src); }; } else { { reg32[reg_eax] = safe_read32s(src); }; } if(false) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { reg32[reg_eax] = safe_read32s(src); }; if(false) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp32(data_src, data_dest);; +} +function scasb() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(true && !false) data_src = reg8[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!true || (dest & (8 >> 3) - 1) === 0) && (!false || (src & (8 >> 3) - 1) === 0); do { if(aligned) { {}; } else { { data_dest = safe_read8(dest); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!true || (data_src === data_dest) === repeat_string_type)); } else { { data_dest = safe_read8(dest); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(true) cmp8(data_src, data_dest);; +} +function scasw() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(16 >> 3) : 16 >> 3; var ds, es; if(true && !false) data_src = reg16[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 16 > 8 && (!true || (dest & (16 >> 3) - 1) === 0) && (!false || (src & (16 >> 3) - 1) === 0); do { if(aligned) { { data_dest = memory.read_aligned16(translate_address_read(dest)); }; } else { { data_dest = safe_read16(dest); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!true || (data_src === data_dest) === repeat_string_type)); } else { { data_dest = safe_read16(dest); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(true) cmp16(data_src, data_dest);; +} +function scasd() +{ + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(32 >> 3) : 32 >> 3; var ds, es; if(true && !false) data_src = reg32[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 32 > 8 && (!true || (dest & (32 >> 3) - 1) === 0) && (!false || (src & (32 >> 3) - 1) === 0); do { if(aligned) { { data_dest = memory.read_aligned32(translate_address_read(dest)) >>> 0; }; } else { { data_dest = (safe_read32s(dest) >>> 0); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!true || (data_src === data_dest) === repeat_string_type)); } else { { data_dest = (safe_read32s(dest) >>> 0); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(true) cmp32(data_src, data_dest);; +} +function insb() +{ + var port = reg16[reg_dx]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(false && !false) data_src = reg8[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!true || (dest & (8 >> 3) - 1) === 0) && (!false || (src & (8 >> 3) - 1) === 0); do { if(aligned) { { }; } else { { safe_write8(dest, in8(port)); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write8(dest, in8(port)); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(false) cmp8(data_src, data_dest);; +} +function insw() +{ + var port = reg16[reg_dx]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(false && !false) data_src = reg8[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!true || (dest & (8 >> 3) - 1) === 0) && (!false || (src & (8 >> 3) - 1) === 0); do { if(aligned) { { var phys_dest = translate_address_write(dest); memory.write_aligned16(phys_dest, in16(port)); }; } else { { safe_write16(dest, in16(port)); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write16(dest, in16(port)); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(false) cmp8(data_src, data_dest);; +} +function insd() +{ + var port = reg16[reg_dx]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(32 >> 3) : 32 >> 3; var ds, es; if(false && !false) data_src = reg32[reg_eax]; if(true) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(false) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 32 > 8 && (!true || (dest & (32 >> 3) - 1) === 0) && (!false || (src & (32 >> 3) - 1) === 0); do { if(aligned) { { var phys_dest = translate_address_write(dest); memory.write_aligned32(phys_dest, in32(port)); }; } else { { safe_write32(dest, in32(port)); }; } if(true) dest += size, regv[reg_vdi] += size; if(false) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { safe_write32(dest, in32(port)); }; if(true) regv[reg_vdi] += size; if(false) regv[reg_vsi] += size; } if(false) cmp32(data_src, data_dest);; +} +function outsb() +{ + var port = reg16[reg_dx]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(8 >> 3) : 8 >> 3; var ds, es; if(false && !true) data_src = reg8[reg_eax]; if(false) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 8 > 8 && (!false || (dest & (8 >> 3) - 1) === 0) && (!true || (src & (8 >> 3) - 1) === 0); do { if(aligned) { { out8(port, safe_read8(src)); }; } else { { out8(port, safe_read8(src)); }; } if(false) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { out8(port, safe_read8(src)); }; if(false) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp8(data_src, data_dest);; +} +function outsw() +{ + var port = reg16[reg_dx]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(16 >> 3) : 16 >> 3; var ds, es; if(false && !true) data_src = reg16[reg_eax]; if(false) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 16 > 8 && (!false || (dest & (16 >> 3) - 1) === 0) && (!true || (src & (16 >> 3) - 1) === 0); do { if(aligned) { { out16(port, safe_read16(src)); }; } else { { out16(port, safe_read16(src)); }; } if(false) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { out16(port, safe_read16(src)); }; if(false) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp16(data_src, data_dest);; +} +function outsd() +{ + var port = reg16[reg_dx]; + var src, dest, data_src, data_dest; var size = flags & flag_direction ? -(32 >> 3) : 32 >> 3; var ds, es; if(false && !true) data_src = reg32[reg_eax]; if(false) es = get_seg(reg_es), dest = es + regv[reg_vdi]; if(true) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi]; if(repeat_string_prefix) { if(regv[reg_vcx] === 0) return; var aligned = 32 > 8 && (!false || (dest & (32 >> 3) - 1) === 0) && (!true || (src & (32 >> 3) - 1) === 0); do { if(aligned) { { out32(port, safe_read32s(src)); }; } else { { out32(port, safe_read32s(src)); }; } if(false) dest += size, regv[reg_vdi] += size; if(true) src += size, regv[reg_vsi] += size; } while(--regv[reg_vcx] && (!false || (data_src === data_dest) === repeat_string_type)); } else { { out32(port, safe_read32s(src)); }; if(false) regv[reg_vdi] += size; if(true) regv[reg_vsi] += size; } if(false) cmp32(data_src, data_dest);; +} +"use strict"; +/** @const */ +var FPU_LOG_OP = true; +/** + * this behaves as if no x87 fpu existed + * @constructor + */ +function NoFPU(io) +{ + this.is_fpu = 0; + //cr0 |= 4; + this.fwait = function() + { + }; + this.op_D8_reg = function(imm8) + { + trigger_ud(); + }; + this.op_D8_mem = function(imm8, addr) + { + trigger_ud(); + }; + this.op_D9_reg = function(imm8) + { + trigger_ud(); + }; + this.op_D9_mem = function(imm8, addr) + { + var mod = imm8 >> 3 & 7; + if(mod === 7) + { + // FNSTCW + dbg_log("Unimplemented D9", LOG_FPU); + safe_write16(addr, 0); + } + else + { + trigger_ud(); + } + }; + this.op_DA = function(imm8) + { + trigger_ud(); + }; + this.op_DA_mem = function(imm8, addr) + { + trigger_ud(); + }; + this.op_DB_reg = function(imm8) + { + if(imm8 === 0xE3) + { + // fninit + // don't error, even if no fpu is present + dbg_log("Unimplemented DB", LOG_FPU); + } + else + { + trigger_ud(); + } + }; + this.op_DB_mem = function(imm8, addr) + { + trigger_ud(); + }; + this.op_DC_reg = function(imm8) + { + trigger_ud(); + }; + this.op_DC_mem = function(imm8, addr) + { + trigger_ud(); + }; + this.op_DD_reg = function(imm8) + { + trigger_ud(); + }; + this.op_DD_mem = function(imm8, addr) + { + var mod = imm8 >> 3 & 7; + switch(mod) + { + case 7: + // fnstsw / store status word + // no fpu -> write nonzero + dbg_log("Unimplemented DD", LOG_FPU); + safe_write16(addr, 1); + break; + default: + trigger_ud(); + } + }; + this.op_DE_reg = function(imm8) + { + trigger_ud(); + }; + this.op_DE_mem = function(imm8, addr) + { + trigger_ud(); + }; + this.op_DF_reg = function(imm8) + { + if(imm8 === 0xE0) + { + // fnstsw + // no fpu -> write nonzero + dbg_log("Unimplemented DF", LOG_FPU); + reg16[reg_ax] = 1; + } + else + { + trigger_ud(); + } + }; + this.op_DF_mem = function(imm8, addr) + { + trigger_ud(); + }; +} +/** + * @constructor + */ +function FPU(io) +{ + this.is_fpu = 1; + // TODO: + // - Precision Control + // - QNaN, unordered comparison + // - Exceptions + var + /** @const */ + C0 = 0x100, + /** @const */ + C1 = 0x200, + /** @const */ + C2 = 0x400, + /** @const */ + C3 = 0x4000, + /** @const */ + RESULT_FLAGS = C0 | C1 | C2 | C3, + /** @const */ + STACK_TOP = 0x3800; + var + // precision, round & infinity control + /** @const */ + PC = 3 << 8, + /** @const */ + RC = 3 << 10, + /** @const */ + IF = 1 << 12; + // exception bits in the status word + var EX_SF = 1 << 6, + EX_P = 1 << 5, + EX_U = 1 << 4, + EX_O = 1 << 3, + EX_Z = 1 << 2, + EX_D = 1 << 1, + EX_I = 1 << 0; + var + // Why no Float80Array :-( + st = new Float64Array(8), + st8 = new Uint8Array(st.buffer), + st32 = new Uint32Array(st.buffer), + // bitmap of which stack registers are empty + stack_empty = 0xff, + stack_ptr = 0, + // used for conversion + float32 = new Float32Array(1), + float32_byte = new Uint8Array(float32.buffer), + float32_int = new Uint32Array(float32.buffer), + float64 = new Float64Array(1), + float64_byte = new Uint8Array(float64.buffer), + float64_int = new Uint32Array(float64.buffer), + float80_int = new Uint8Array(10), + control_word = 0x37F, + status_word = 0, + fpu_ip = 0, + fpu_ip_selector = 0, + fpu_opcode = 0, + fpu_dp = 0, + fpu_dp_selector = 0, + /** @const */ + indefinite_nan = NaN; + var constants = new Float64Array([ + 1, Math.log(10) / Math.LN2, Math.LOG2E, Math.PI, + Math.log(2) / Math.LN10, Math.LN2, 0 + ]); + function fpu_unimpl() + { + dbg_trace(); + if(DEBUG) throw "fpu: unimplemented"; + else trigger_ud(); + } + function stack_fault() + { + // TODO: Interrupt + status_word |= EX_SF | EX_I; + } + function invalid_arithmatic() + { + status_word |= EX_I; + } + function fcom(y) + { + var x = get_st0(); + status_word &= ~RESULT_FLAGS; + if(x > y) + { + } + else if(y > x) + { + status_word |= C0; + } + else if(x === y) + { + status_word |= C3; + } + else + { + status_word |= C0 | C2 | C3; + } + } + function fucom(y) + { + // TODO + fcom(y); + } + function fcomi(y) + { + var x = st[stack_ptr]; + flags_changed &= ~(1 | flag_parity | flag_zero); + flags &= ~(1 | flag_parity | flag_zero); + if(x > y) + { + } + else if(y > x) + { + flags |= 1; + } + else if(x === y) + { + flags |= flag_zero; + } + else + { + flags |= 1 | flag_parity | flag_zero; + } + } + function fucomi(y) + { + // TODO + fcomi(y); + } + function ftst() + { + var st0 = get_st0(); + status_word &= ~RESULT_FLAGS; + if(isNaN(st0)) + { + status_word |= C3 | C2 | C0; + } + else if(st0 === 0) + { + status_word |= C3; + } + else if(st0 < 0) + { + status_word |= C0; + } + // TODO: unordered (st0 is nan, etc) + } + function fxam() + { + var x = get_st0(); + status_word &= ~RESULT_FLAGS; + status_word |= sign(0) << 9; + if(stack_empty >> stack_ptr & 1) + { + status_word |= C3 | C0; + } + else if(isNaN(x)) + { + status_word |= C0; + } + else if(x === 0) + { + status_word |= C3; + } + else if(x === Infinity || x === -Infinity) + { + status_word |= C2 | C0; + } + else + { + status_word |= C2; + } + // TODO: + // Unsupported, Denormal + } + function finit() + { + control_word = 0x37F; + status_word = 0; + fpu_ip = 0; + fpu_dp = 0; + fpu_opcode = 0; + stack_empty = 0xFF; + stack_ptr = 0; + } + function load_status_word() + { + return status_word & ~(7 << 11) | stack_ptr << 11; + } + function safe_status_word(sw) + { + status_word = sw & ~(7 << 11); + stack_ptr = sw >> 11 & 7; + } + function load_tag_word() + { + var tag_word = 0, + value; + for(var i = 0; i < 8; i++) + { + value = st[i]; + if(stack_empty >> i & 1) + { + tag_word |= 3 << (i << 1); + } + else if(value === 0) + { + tag_word |= 1 << (i << 1); + } + else if(isNaN(value) || value === Infinity || value === -Infinity) + { + tag_word |= 2 << (i << 1); + } + } + //dbg_log("load tw=" + h(tag_word) + " se=" + h(stack_empty) + " sp=" + stack_ptr, LOG_FPU); + return tag_word; + } + function safe_tag_word(tag_word) + { + stack_empty = 0; + for(var i = 0; i < 8; i++) + { + stack_empty |= (tag_word >> i) & (tag_word >> i + 1) & 1 << i; + } + //dbg_log("safe tw=" + h(tag_word) + " se=" + h(stack_empty), LOG_FPU); + } + function fstenv(addr) + { + if(operand_size_32) + { + safe_write16(addr, control_word); + safe_write16(addr + 4, load_status_word()); + safe_write16(addr + 8, load_tag_word()); + safe_write32(addr + 12, fpu_ip); + safe_write16(addr + 16, fpu_ip_selector); + safe_write16(addr + 18, fpu_opcode); + safe_write32(addr + 20, fpu_dp); + safe_write16(addr + 24, fpu_dp_selector); + } + else + { + fpu_unimpl(); + } + } + function fldenv(addr) + { + if(operand_size_32) + { + control_word = safe_read16(addr); + safe_status_word(safe_read16(addr + 4)); + safe_tag_word(safe_read16(addr + 8)); + fpu_ip = (safe_read32s(addr + 12) >>> 0); + fpu_ip_selector = safe_read16(addr + 16); + fpu_opcode = safe_read16(addr + 18); + fpu_dp = (safe_read32s(addr + 20) >>> 0); + fpu_dp_selector = safe_read16(addr + 24); + } + else + { + fpu_unimpl(); + } + } + function fsave(addr) + { + fstenv(addr); + addr += 28; + for(var i = 0; i < 8; i++) + { + store_m80(addr, i - stack_ptr & 7); + addr += 10; + } + //dbg_log("save " + [].slice.call(st), LOG_FPU); + finit(); + } + function frstor(addr) + { + fldenv(addr); + addr += 28; + for(var i = 0; i < 8; i++) + { + st[i] = load_m80(addr); + addr += 10; + } + //dbg_log("rstor " + [].slice.call(st), LOG_FPU); + } + function integer_round(f) + { + var rc = control_word >> 10 & 3; + if(rc === 0) + { + // Round to nearest, or even if equidistant + var rounded = Math.round(f); + if(rounded - f === 0.5 && (rounded & 1)) + { + // Special case: Math.round rounds to positive infinity + // if equidistant + rounded--; + } + return rounded; + } + // rc=3 is truncate -> floor for positive numbers + else if(rc === 1 || (rc === 3 && f > 0)) + { + return Math.floor(f); + } + else + { + return Math.ceil(f); + } + } + function truncate(x) + { + return x > 0 ? Math.floor(x) : Math.ceil(x); + } + function push(x) + { + stack_ptr = stack_ptr - 1 & 7; + if(stack_empty >> stack_ptr & 1) + { + status_word &= ~C1; + stack_empty &= ~(1 << stack_ptr); + st[stack_ptr] = x; + } + else + { + status_word |= C1; + stack_fault(); + st[stack_ptr] = indefinite_nan; + } + } + function pop() + { + stack_empty |= 1 << stack_ptr; + stack_ptr = stack_ptr + 1 & 7; + } + function get_sti(i) + { + dbg_assert(typeof i === "number" && i >= 0 && i < 8); + i = i + stack_ptr & 7; + if(stack_empty >> i & 1) + { + status_word &= ~C1; + stack_fault(); + return indefinite_nan; + } + else + { + return st[i]; + } + } + function get_st0() + { + if(stack_empty >> stack_ptr & 1) + { + status_word &= ~C1; + stack_fault(); + return indefinite_nan; + } + else + { + return st[stack_ptr]; + } + } + function assert_not_empty(i) + { + if(stack_empty >> (i + stack_ptr & 7) & 1) + { + status_word &= ~C1; + } + else + { + } + } + function load_m80(addr) + { + var exponent = safe_read16(addr + 8), + sign, + low = (safe_read32s(addr) >>> 0), + high = (safe_read32s(addr + 4) >>> 0); + sign = exponent >> 15; + exponent &= ~0x8000; + if(exponent === 0) + { + // TODO: denormal numbers + return 0; + } + if(exponent < 0x7FFF) + { + exponent -= 0x3FFF; + } + else + { + // TODO: NaN, Infinity + //dbg_log("Load m80 TODO", LOG_FPU); + float64_byte[7] = 0x7F | sign << 7; + float64_byte[6] = 0xF0 | high >> 30 << 3 & 0x08; + float64_byte[5] = 0; + float64_byte[4] = 0; + float64_int[0] = 0; + return float64[0]; + } + // Note: some bits might be lost at this point + var mantissa = low + 0x100000000 * high; + if(sign) + { + mantissa = -mantissa; + } + //console.log("m: " + mantissa); + //console.log("e: " + exponent); + //console.log("s: " + sign); + //console.log("f: " + mantissa * Math.pow(2, exponent - 63)); + // Simply compute the 64 bit floating point number. + // An alternative write the mantissa, sign and exponent in the + // float64_byte and return float64[0] + return mantissa * Math.pow(2, exponent - 63); + } + function store_m80(addr, i) + { + float64[0] = st[stack_ptr + i & 7]; + var sign = float64_byte[7] & 0x80, + exponent = (float64_byte[7] & 0x7f) << 4 | float64_byte[6] >> 4, + low, + high; + if(exponent === 0x7FF) + { + // all bits set (NaN and infinity) + exponent = 0x7FFF; + low = 0; + high = 0x80000000 | (float64_int[1] & 0x80000) << 11; + } + else if(exponent === 0) + { + // zero and denormal numbers + // Just assume zero for now + low = 0; + high = 0; + } + else + { + exponent += 0x3FFF - 0x3FF; + // does the mantissa need to be adjusted? + low = float64_int[0] << 11; + high = 0x80000000 | (float64_int[1] & 0xFFFFF) << 11 | (float64_int[0] >>> 21); + } + dbg_assert(exponent >= 0 && exponent < 0x8000); + safe_write32(addr, low); + safe_write32(addr + 4, high); + safe_write16(addr + 8, sign << 8 | exponent); + } + function load_m64(addr) + { + float64_int[0] = safe_read32s(addr); + float64_int[1] = safe_read32s(addr + 4); + return float64[0]; + }; + function store_m64(addr, i) + { + // protect against writing only a single dword + // and then page-faulting + translate_address_write(addr + 7); + float64[0] = get_sti(i); + safe_write32(addr, float64_int[0]); + safe_write32(addr + 4, float64_int[1]); + }; + function load_m32(addr) + { + float32_int[0] = safe_read32s(addr); + return float32[0]; + }; + function store_m32(addr, i) + { + float32[0] = get_sti(i); + safe_write32(addr, float32_int[0]); + }; + // sign of a number on the stack + function sign(i) + { + return st8[(stack_ptr + i & 7) << 3 | 7] >> 7; + }; + function dbg_log_fpu_op(op, imm8) + { + if(!FPU_LOG_OP) + { + return; + } + if(imm8 >= 0xC0) + { + dbg_log(h(op, 2) + " " + h(imm8, 2) + "/" + (imm8 >> 3 & 7) + "/" + (imm8 & 7) + + " @" + h(instruction_pointer, 8) + " sp=" + stack_ptr + " st=" + h(stack_empty, 2), LOG_FPU); + } + else + { + dbg_log(h(op, 2) + " /" + (imm8 >> 3 & 7) + + " @" + h(instruction_pointer, 8) + " sp=" + stack_ptr + " st=" + h(stack_empty, 2), LOG_FPU); + } + } + this.fwait = function() + { + // TODO: + // Exceptions + }; + this.op_D8_reg = function(imm8) + { + dbg_log_fpu_op(0xD8, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7, + sti = get_sti(low), + st0 = get_st0(); + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + sti; + break; + case 1: + // fmul + st[stack_ptr] = st0 * sti; + break; + case 2: + // fcom + fcom(sti); + break; + case 3: + // fcomp + fcom(sti); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - sti; + break; + case 5: + // fsubr + st[stack_ptr] = sti - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / sti; + break; + case 7: + // fdivr + st[stack_ptr] = sti / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_D8_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xD8, imm8); + var mod = imm8 >> 3 & 7, + m32 = load_m32(addr); + var st0 = get_st0(); + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m32; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m32; + break; + case 2: + // fcom + fcom(m32); + break; + case 3: + // fcomp + fcom(m32); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m32; + break; + case 5: + // fsubr + st[stack_ptr] = m32 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m32; + break; + case 7: + // fdivr + st[stack_ptr] = m32 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_D9_reg = function(imm8) + { + dbg_log_fpu_op(0xD9, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + switch(mod) + { + case 0: + // fld + var sti = get_sti(low); + push(sti); + break; + case 1: + // fxch + var sti = get_sti(low); + st[stack_ptr + low & 7] = get_st0(); + st[stack_ptr] = sti; + break; + case 4: + switch(low) + { + case 0: + // fchs + st[stack_ptr] = -get_st0(); + break; + case 1: + // fabs + st[stack_ptr] = Math.abs(get_st0()); + break; + case 4: + ftst(); + break; + case 5: + fxam(); + break; + default: + dbg_log(low); fpu_unimpl(); + } + break; + case 5: + push(constants[low]); + break; + case 6: + switch(low) + { + case 0: + // f2xm1 + st[stack_ptr] = Math.pow(2, get_st0()) - 1; + break; + case 1: + // fyl2x + st[stack_ptr + 1 & 7] = get_sti(1) * Math.log(get_st0()) / Math.LN2; + pop(); + break; + case 2: + // fptan + st[stack_ptr] = Math.tan(get_st0()); + push(1); // no bug: push constant 1 + break; + case 3: + // fpatan + //st[stack_ptr + 1 & 7] = Math.atan(get_sti(1) / get_st0()); + st[stack_ptr + 1 & 7] = Math.atan2(get_sti(1), get_st0()); + pop(); + break; + case 5: + // fprem1 + st[stack_ptr] = get_st0() % get_sti(1); + break; + default: + dbg_log(low); fpu_unimpl(); + } + break; + case 7: + switch(low) + { + case 0: + // fprem + st[stack_ptr] = get_st0() % get_sti(1); + break; + case 2: + st[stack_ptr] = Math.sqrt(get_st0()); + break; + case 3: + var st0 = get_st0(); + st[stack_ptr] = Math.sin(st0); + push(Math.cos(st0)); + break; + case 4: + // frndint + st[stack_ptr] = integer_round(get_st0()); + break; + case 5: + // fscale + st[stack_ptr] = get_st0() * Math.pow(2, truncate(get_sti(1))); + break; + case 6: + st[stack_ptr] = Math.sin(get_st0()); + break; + case 7: + st[stack_ptr] = Math.cos(get_st0()); + break; + default: + dbg_log(low); fpu_unimpl(); + } + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_D9_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xD9, imm8); + var mod = imm8 >> 3 & 7; + switch(mod) + { + case 0: + var data = load_m32(addr); + push(data); + break; + case 2: + store_m32(addr, 0); + break; + case 3: + store_m32(addr, 0); + pop(); + break; + case 4: + fldenv(addr); + break; + case 5: + var word = safe_read16(addr); + control_word = word; + break; + case 6: + fstenv(addr); + break; + case 7: + safe_write16(addr, control_word); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DA_reg = function(imm8) + { + dbg_log_fpu_op(0xDA, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + switch(mod) + { + case 0: + // fcmovb + if(test_b()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 1: + // fcmove + if(test_z()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 2: + // fcmovbe + if(test_be()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 3: + // fcmovu + if(test_p()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 5: + if(low === 1) + { + // fucompp + fucom(get_sti(1)); + pop(); + pop(); + } + else + { + dbg_log(mod); fpu_unimpl(); + } + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DA_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDA, imm8); + var mod = imm8 >> 3 & 7, + m32 = safe_read32s(addr); + var st0 = get_st0(); + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m32; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m32; + break; + case 2: + // fcom + fcom(m32); + break; + case 3: + // fcomp + fcom(m32); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m32; + break; + case 5: + // fsubr + st[stack_ptr] = m32 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m32; + break; + case 7: + // fdivr + st[stack_ptr] = m32 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DB_reg = function(imm8) + { + dbg_log_fpu_op(0xDB, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + switch(mod) + { + case 0: + // fcmovnb + if(!test_b()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 1: + // fcmovne + if(!test_z()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 2: + // fcmovnbe + if(!test_be()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 3: + // fcmovnu + if(!test_p()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 4: + if(imm8 === 0xE3) + { + finit(); + } + else if(imm8 === 0xE4) + { + // fsetpm + // treat as nop + } + else + { + fpu_unimpl(); + } + break; + case 5: + fucomi(get_sti(low)); + break; + case 6: + fcomi(get_sti(low)); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DB_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDB, imm8); + var mod = imm8 >> 3 & 7; + switch(mod) + { + case 0: + // fild + var int32 = safe_read32s(addr); + push(int32); + break; + case 2: + // fist + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFFFFFF || st0 < -0x80000000) + { + invalid_arithmatic(); + safe_write32(addr, 0x80000000); + } + else + { + // TODO: Invalid operation + safe_write32(addr, integer_round(st0)); + } + break; + case 3: + // fistp + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFFFFFF || st0 < -0x80000000) + { + invalid_arithmatic(); + safe_write32(addr, 0x80000000); + } + else + { + safe_write32(addr, integer_round(st0)); + } + pop(); + break; + case 5: + // fld + push(load_m80(addr)); + break; + case 7: + // fstp + store_m80(addr, 0); + pop(); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DC_reg = function(imm8) + { + dbg_log_fpu_op(0xDC, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7, + low_ptr = stack_ptr + low & 7, + sti = get_sti(low), + st0 = get_st0(); + switch(mod) + { + case 0: + // fadd + st[low_ptr] = sti + st0; + break; + case 1: + // fmul + st[low_ptr] = sti * st0; + break; + case 2: + // fcom + fcom(sti); + break; + case 3: + // fcomp + fcom(sti); + pop(); + break; + case 4: + // fsubr + st[low_ptr] = st0 - sti; + break; + case 5: + // fsub + st[low_ptr] = sti - st0; + break; + case 6: + // fdivr + st[low_ptr] = st0 / sti; + break; + case 7: + // fdiv + st[low_ptr] = sti / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DC_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDC, imm8); + var + mod = imm8 >> 3 & 7, + m64 = load_m64(addr); + var st0 = get_st0(); + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m64; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m64; + break; + case 2: + // fcom + fcom(m64); + break; + case 3: + // fcomp + fcom(m64); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m64; + break; + case 5: + // fsubr + st[stack_ptr] = m64 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m64; + break; + case 7: + // fdivr + st[stack_ptr] = m64 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DD_reg = function(imm8) + { + dbg_log_fpu_op(0xDD, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + switch(mod) + { + case 0: + // ffree + stack_empty |= 1 << (stack_ptr + low & 7); + break; + case 2: + // fst + st[stack_ptr + low & 7] = get_st0(); + break; + case 3: + // fstp + if(low === 0) + { + pop(); + } + else + { + st[stack_ptr + low & 7] = get_st0(); + pop(); + } + break; + case 4: + fucom(get_sti(low)); + break; + case 5: + // fucomp + fucom(get_sti(low)); + pop(); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DD_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDD, imm8); + var mod = imm8 >> 3 & 7; + switch(mod) + { + case 0: + // fld + var data = load_m64(addr); + push(data); + break; + case 2: + // fst + store_m64(addr, 0); + break; + case 3: + // fstp + store_m64(addr, 0); + pop(); + break; + case 4: + frstor(addr); + break; + case 6: + // fsave + fsave(addr); + break; + case 7: + // fnstsw / store status word + safe_write16(addr, load_status_word()); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DE_reg = function(imm8) + { + dbg_log_fpu_op(0xDE, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7, + low_ptr = stack_ptr + low & 7, + sti = get_sti(low), + st0 = get_st0(); + switch(mod) + { + case 0: + // faddp + st[low_ptr] = sti + st0; + break; + case 1: + // fmulp + st[low_ptr] = sti * st0; + break; + case 2: + // fcomp + fcom(sti); + break; + case 3: + // fcompp + if(low === 1) + { + fcom(st[low_ptr]); + pop(); + } + else + { + // not a valid encoding + dbg_log(mod); + fpu_unimpl(); + } + break; + case 4: + // fsubrp + st[low_ptr] = st0 - sti; + break; + case 5: + // fsubp + st[low_ptr] = sti - st0; + break; + case 6: + // fdivrp + st[low_ptr] = st0 / sti; + break; + case 7: + // fdivp + st[low_ptr] = sti / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + pop(); + }; + this.op_DE_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDE, imm8); + var mod = imm8 >> 3 & 7, + m16 = (safe_read16(addr) << 16 >> 16); + var st0 = get_st0(); + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m16; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m16; + break; + case 2: + // fcom + fcom(m16); + break; + case 3: + // fcomp + fcom(m16); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m16; + break; + case 5: + // fsubr + st[stack_ptr] = m16 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m16; + break; + case 7: + // fdivr + st[stack_ptr] = m16 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DF_reg = function(imm8) + { + dbg_log_fpu_op(0xDF, imm8); + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + switch(mod) + { + case 4: + if(imm8 === 0xE0) + { + // fnstsw + reg16[reg_ax] = load_status_word(); + } + else + { + dbg_log(imm8); + fpu_unimpl(); + } + break; + case 5: + // fucomip + fucomi(get_sti(low)); + pop(); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + this.op_DF_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDF, imm8); + var mod = imm8 >> 3 & 7; + switch(mod) + { + case 0: + var m16 = (safe_read16(addr) << 16 >> 16); + push(m16); + break; + case 2: + // fist + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFF || st0 < -0x8000) + { + invalid_arithmatic(); + safe_write16(addr, 0x8000); + } + else + { + safe_write16(addr, integer_round(st0)); + } + break; + case 3: + // fistp + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFF || st0 < -0x8000) + { + invalid_arithmatic(); + safe_write16(addr, 0x8000); + } + else + { + safe_write16(addr, integer_round(st0)); + } + pop(); + break; + case 5: + // fild + var low = (safe_read32s(addr) >>> 0); + var high = (safe_read32s(addr + 4) >>> 0); + var m64 = low + 0x100000000 * high; + if(high >> 31) + { + m64 -= 0x10000000000000000; + } + push(m64); + break; + case 7: + // fistp + var st0 = integer_round(get_st0()); + if(isNaN(st0) || st0 > 0x7FFFFFFFFFFFFFFF || st0 < -0x8000000000000000) + { + st0 = 0x8000000000000000; + invalid_arithmatic(); + } + pop(); + safe_write32(addr, st0); + st0 /= 0x100000000; + if(st0 < 0 && st0 > -1) + st0 = -1; + safe_write32(addr + 4, st0); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; +} +"use strict"; +var table16 = [], + table32 = [], + table0F_16 = [], + table0F_32 = []; +// no cmp, because it uses different arguments +// very special, should be somewhere else? +// equivalent to switch(modrm_byte >> 3 & 7) +//#define sub_op(i0, i1, i2, i3, i4, i5, i6, i7) // if(modrm_byte & 0x20) { sub_op1(i4, i5, i6, i7) }// else { sub_op1(i0, i1, i2, i3) } +// +//#define sub_op1(i0, i1, i2, i3)// if(modrm_byte & 0x10) { sub_op2(i2, i3) }// else { sub_op2(i0, i1) } +// +//#define sub_op2(i0, i1)// if(modrm_byte & 0x08) { i1 }// else { i0 } +// use modrm_byte to write a value to memory or register +// (without reading it beforehand) +// use modrm_byte to write a value to memory or register, +// using the previous data from memory or register. +// op is a function call that needs to return the result +// opcode with modrm byte +// opcode that has a 16 and a 32 bit version +// instructions start here +table16[0x00] = table32[0x00] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, add8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1])); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = add8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } } }; table16[0x00 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, add16(data, reg16[modrm_byte >> 2 & 14])); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, add16(data, reg16[modrm_byte >> 2 & 14])); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = add16(data, reg16[modrm_byte >> 2 & 14]); } } }; table32[0x00 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, add32(data, reg32[modrm_byte >> 3 & 7])); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, add32(data, reg32[modrm_byte >> 3 & 7])); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = add32(data, reg32[modrm_byte >> 3 & 7]); } } }; table16[0x00 | 2] = table32[0x00 | 2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = add8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; table16[0x00 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = add16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x00 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = add32(reg32[modrm_byte >> 3 & 7], data); } }; table16[0x00 | 4] = table32[0x00 | 4] = function() { { reg8[reg_al] = add8(reg8[reg_al], read_imm8()); } }; table16[0x00 | 5] = function() { { reg16[reg_ax] = add16(reg16[reg_ax], read_imm16()); } }; table32[0x00 | 5] = function() { { reg32[reg_eax] = add32(reg32[reg_eax], (read_imm32s() >>> 0)); } };; +table16[0x06] = function() { { push16(sreg[reg_es]); } }; table32[0x06] = function() { { push32(sreg[reg_es]); } };; +table16[0x07] = function() { { switch_seg(reg_es, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 2; } }; table32[0x07] = function() { { switch_seg(reg_es, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 4; } };;; +//op2(0x07, +// { safe_pop16(sreg[reg_es]); switch_seg(reg_es, memory.read16(get_esp_read(0))); }, +// { safe_pop32s(sreg[reg_es]); switch_seg(reg_es); }); +table16[0x08] = table32[0x08] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, or8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1])); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = or8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } } }; table16[0x08 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, or16(data, reg16[modrm_byte >> 2 & 14])); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, or16(data, reg16[modrm_byte >> 2 & 14])); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = or16(data, reg16[modrm_byte >> 2 & 14]); } } }; table32[0x08 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, or32(data, reg32s[modrm_byte >> 3 & 7])); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, or32(data, reg32s[modrm_byte >> 3 & 7])); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = or32(data, reg32s[modrm_byte >> 3 & 7]); } } }; table16[0x08 | 2] = table32[0x08 | 2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = or8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; table16[0x08 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = or16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x08 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = or32(reg32s[modrm_byte >> 3 & 7], data); } }; table16[0x08 | 4] = table32[0x08 | 4] = function() { { reg8[reg_al] = or8(reg8[reg_al], read_imm8()); } }; table16[0x08 | 5] = function() { { reg16[reg_ax] = or16(reg16[reg_ax], read_imm16()); } }; table32[0x08 | 5] = function() { { reg32[reg_eax] = or32(reg32s[reg_eax], read_imm32s()); } };; +table16[0x0E] = function() { { push16(sreg[reg_cs]); } }; table32[0x0E] = function() { { push32(sreg[reg_cs]); } };; +table16[0x0F] = table32[0x0F] = function() { { table0F[read_imm8()](); } };; +table16[0x10] = table32[0x10] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, adc8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1])); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = adc8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } } }; table16[0x10 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, adc16(data, reg16[modrm_byte >> 2 & 14])); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, adc16(data, reg16[modrm_byte >> 2 & 14])); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = adc16(data, reg16[modrm_byte >> 2 & 14]); } } }; table32[0x10 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, adc32(data, reg32[modrm_byte >> 3 & 7])); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, adc32(data, reg32[modrm_byte >> 3 & 7])); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = adc32(data, reg32[modrm_byte >> 3 & 7]); } } }; table16[0x10 | 2] = table32[0x10 | 2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = adc8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; table16[0x10 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = adc16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x10 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = adc32(reg32[modrm_byte >> 3 & 7], data); } }; table16[0x10 | 4] = table32[0x10 | 4] = function() { { reg8[reg_al] = adc8(reg8[reg_al], read_imm8()); } }; table16[0x10 | 5] = function() { { reg16[reg_ax] = adc16(reg16[reg_ax], read_imm16()); } }; table32[0x10 | 5] = function() { { reg32[reg_eax] = adc32(reg32[reg_eax], (read_imm32s() >>> 0)); } };; +table16[0x16] = function() { { push16(sreg[reg_ss]); } }; table32[0x16] = function() { { push32(sreg[reg_ss]); } };; +table16[0x17] = function() { { switch_seg(reg_ss, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 2; } }; table32[0x17] = function() { { switch_seg(reg_ss, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 4; } };;; +//op2(0x17, +// { safe_pop16(sreg[reg_ss]); switch_seg(reg_ss); }, +// { safe_pop32s(sreg[reg_ss]); switch_seg(reg_ss); }); +table16[0x18] = table32[0x18] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, sbb8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1])); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = sbb8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } } }; table16[0x18 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sbb16(data, reg16[modrm_byte >> 2 & 14])); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sbb16(data, reg16[modrm_byte >> 2 & 14])); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sbb16(data, reg16[modrm_byte >> 2 & 14]); } } }; table32[0x18 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sbb32(data, reg32[modrm_byte >> 3 & 7])); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sbb32(data, reg32[modrm_byte >> 3 & 7])); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sbb32(data, reg32[modrm_byte >> 3 & 7]); } } }; table16[0x18 | 2] = table32[0x18 | 2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = sbb8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; table16[0x18 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = sbb16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x18 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = sbb32(reg32[modrm_byte >> 3 & 7], data); } }; table16[0x18 | 4] = table32[0x18 | 4] = function() { { reg8[reg_al] = sbb8(reg8[reg_al], read_imm8()); } }; table16[0x18 | 5] = function() { { reg16[reg_ax] = sbb16(reg16[reg_ax], read_imm16()); } }; table32[0x18 | 5] = function() { { reg32[reg_eax] = sbb32(reg32[reg_eax], (read_imm32s() >>> 0)); } };; +table16[0x1E] = function() { { push16(sreg[reg_ds]); } }; table32[0x1E] = function() { { push32(sreg[reg_ds]); } };; +table16[0x1F] = function() { { switch_seg(reg_ds, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 2; } }; table32[0x1F] = function() { { switch_seg(reg_ds, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 4; } };;; +//op2(0x1F, +// { safe_pop16(sreg[reg_ds]); switch_seg(reg_ds); }, +// { safe_pop32s(sreg[reg_ds]); switch_seg(reg_ds); }); +table16[0x20] = table32[0x20] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, and8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1])); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = and8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } } }; table16[0x20 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, and16(data, reg16[modrm_byte >> 2 & 14])); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, and16(data, reg16[modrm_byte >> 2 & 14])); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = and16(data, reg16[modrm_byte >> 2 & 14]); } } }; table32[0x20 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, and32(data, reg32s[modrm_byte >> 3 & 7])); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, and32(data, reg32s[modrm_byte >> 3 & 7])); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = and32(data, reg32s[modrm_byte >> 3 & 7]); } } }; table16[0x20 | 2] = table32[0x20 | 2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = and8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; table16[0x20 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = and16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x20 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = and32(reg32s[modrm_byte >> 3 & 7], data); } }; table16[0x20 | 4] = table32[0x20 | 4] = function() { { reg8[reg_al] = and8(reg8[reg_al], read_imm8()); } }; table16[0x20 | 5] = function() { { reg16[reg_ax] = and16(reg16[reg_ax], read_imm16()); } }; table32[0x20 | 5] = function() { { reg32[reg_eax] = and32(reg32s[reg_eax], read_imm32s()); } };; +table16[0x26] = table32[0x26] = function() { { seg_prefix(reg_es); } };; +table16[0x27] = table32[0x27] = function() { { bcd_daa(); } };; +table16[0x28] = table32[0x28] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, sub8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1])); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = sub8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } } }; table16[0x28 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sub16(data, reg16[modrm_byte >> 2 & 14])); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sub16(data, reg16[modrm_byte >> 2 & 14])); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sub16(data, reg16[modrm_byte >> 2 & 14]); } } }; table32[0x28 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sub32(data, reg32[modrm_byte >> 3 & 7])); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sub32(data, reg32[modrm_byte >> 3 & 7])); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sub32(data, reg32[modrm_byte >> 3 & 7]); } } }; table16[0x28 | 2] = table32[0x28 | 2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = sub8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; table16[0x28 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = sub16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x28 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = sub32(reg32[modrm_byte >> 3 & 7], data); } }; table16[0x28 | 4] = table32[0x28 | 4] = function() { { reg8[reg_al] = sub8(reg8[reg_al], read_imm8()); } }; table16[0x28 | 5] = function() { { reg16[reg_ax] = sub16(reg16[reg_ax], read_imm16()); } }; table32[0x28 | 5] = function() { { reg32[reg_eax] = sub32(reg32[reg_eax], (read_imm32s() >>> 0)); } };; +table16[0x2E] = table32[0x2E] = function() { { seg_prefix(reg_cs); } };; +table16[0x2F] = table32[0x2F] = function() { { bcd_das(); } };; +table16[0x30] = table32[0x30] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, xor8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1])); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = xor8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } } }; table16[0x30 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, xor16(data, reg16[modrm_byte >> 2 & 14])); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, xor16(data, reg16[modrm_byte >> 2 & 14])); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = xor16(data, reg16[modrm_byte >> 2 & 14]); } } }; table32[0x30 | 1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, xor32(data, reg32s[modrm_byte >> 3 & 7])); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, xor32(data, reg32s[modrm_byte >> 3 & 7])); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = xor32(data, reg32s[modrm_byte >> 3 & 7]); } } }; table16[0x30 | 2] = table32[0x30 | 2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = xor8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; table16[0x30 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = xor16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x30 | 3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = xor32(reg32s[modrm_byte >> 3 & 7], data); } }; table16[0x30 | 4] = table32[0x30 | 4] = function() { { reg8[reg_al] = xor8(reg8[reg_al], read_imm8()); } }; table16[0x30 | 5] = function() { { reg16[reg_ax] = xor16(reg16[reg_ax], read_imm16()); } }; table32[0x30 | 5] = function() { { reg32[reg_eax] = xor32(reg32s[reg_eax], read_imm32s()); } };; +table16[0x36] = table32[0x36] = function() { { seg_prefix(reg_ss); } };; +table16[0x37] = table32[0x37] = function() { { bcd_aaa(); } };; +table16[0x38] = table32[0x38] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; cmp8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } }; +table16[0x39] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; cmp16(data, reg16[modrm_byte >> 2 & 14]); } }; table32[0x39] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; cmp32(data, reg32[modrm_byte >> 3 & 7]); } }; +table16[0x3A] = table32[0x3A] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; cmp8(reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1], data); } }; +table16[0x3B] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; cmp16(reg16[modrm_byte >> 2 & 14], data); } }; table32[0x3B] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; cmp32(reg32[modrm_byte >> 3 & 7], data); } }; +table16[0x3C] = table32[0x3C] = function() { { cmp8(reg8[reg_al], read_imm8()); } }; +table16[0x3D] = function() { { cmp16(reg16[reg_ax], read_imm16()); } }; table32[0x3D] = function() { { cmp32(reg32[reg_eax], (read_imm32s() >>> 0)); } }; +table16[0x3E] = table32[0x3E] = function() { { seg_prefix(reg_ds); } };; +table16[0x3F] = table32[0x3F] = function() { { bcd_aas(); } };; +table16[0x40 | 0] = function() { { reg16[reg_ax] = inc16(reg16[reg_ax]); } }; table32[0x40 | 0] = function() { { reg32[reg_eax] = inc32(reg32[reg_eax]); } };; table16[0x40 | 1] = function() { { reg16[reg_cx] = inc16(reg16[reg_cx]); } }; table32[0x40 | 1] = function() { { reg32[reg_ecx] = inc32(reg32[reg_ecx]); } };; table16[0x40 | 2] = function() { { reg16[reg_dx] = inc16(reg16[reg_dx]); } }; table32[0x40 | 2] = function() { { reg32[reg_edx] = inc32(reg32[reg_edx]); } };; table16[0x40 | 3] = function() { { reg16[reg_bx] = inc16(reg16[reg_bx]); } }; table32[0x40 | 3] = function() { { reg32[reg_ebx] = inc32(reg32[reg_ebx]); } };; table16[0x40 | 4] = function() { { reg16[reg_sp] = inc16(reg16[reg_sp]); } }; table32[0x40 | 4] = function() { { reg32[reg_esp] = inc32(reg32[reg_esp]); } };; table16[0x40 | 5] = function() { { reg16[reg_bp] = inc16(reg16[reg_bp]); } }; table32[0x40 | 5] = function() { { reg32[reg_ebp] = inc32(reg32[reg_ebp]); } };; table16[0x40 | 6] = function() { { reg16[reg_si] = inc16(reg16[reg_si]); } }; table32[0x40 | 6] = function() { { reg32[reg_esi] = inc32(reg32[reg_esi]); } };; table16[0x40 | 7] = function() { { reg16[reg_di] = inc16(reg16[reg_di]); } }; table32[0x40 | 7] = function() { { reg32[reg_edi] = inc32(reg32[reg_edi]); } };;; +table16[0x48 | 0] = function() { { reg16[reg_ax] = dec16(reg16[reg_ax]); } }; table32[0x48 | 0] = function() { { reg32[reg_eax] = dec32(reg32[reg_eax]); } };; table16[0x48 | 1] = function() { { reg16[reg_cx] = dec16(reg16[reg_cx]); } }; table32[0x48 | 1] = function() { { reg32[reg_ecx] = dec32(reg32[reg_ecx]); } };; table16[0x48 | 2] = function() { { reg16[reg_dx] = dec16(reg16[reg_dx]); } }; table32[0x48 | 2] = function() { { reg32[reg_edx] = dec32(reg32[reg_edx]); } };; table16[0x48 | 3] = function() { { reg16[reg_bx] = dec16(reg16[reg_bx]); } }; table32[0x48 | 3] = function() { { reg32[reg_ebx] = dec32(reg32[reg_ebx]); } };; table16[0x48 | 4] = function() { { reg16[reg_sp] = dec16(reg16[reg_sp]); } }; table32[0x48 | 4] = function() { { reg32[reg_esp] = dec32(reg32[reg_esp]); } };; table16[0x48 | 5] = function() { { reg16[reg_bp] = dec16(reg16[reg_bp]); } }; table32[0x48 | 5] = function() { { reg32[reg_ebp] = dec32(reg32[reg_ebp]); } };; table16[0x48 | 6] = function() { { reg16[reg_si] = dec16(reg16[reg_si]); } }; table32[0x48 | 6] = function() { { reg32[reg_esi] = dec32(reg32[reg_esi]); } };; table16[0x48 | 7] = function() { { reg16[reg_di] = dec16(reg16[reg_di]); } }; table32[0x48 | 7] = function() { { reg32[reg_edi] = dec32(reg32[reg_edi]); } };;; +table16[0x50 | 0] = function() { { push16(reg16[reg_ax]); } }; table32[0x50 | 0] = function() { { push32(reg32s[reg_eax]); } }; table16[0x50 | 1] = function() { { push16(reg16[reg_cx]); } }; table32[0x50 | 1] = function() { { push32(reg32s[reg_ecx]); } }; table16[0x50 | 2] = function() { { push16(reg16[reg_dx]); } }; table32[0x50 | 2] = function() { { push32(reg32s[reg_edx]); } }; table16[0x50 | 3] = function() { { push16(reg16[reg_bx]); } }; table32[0x50 | 3] = function() { { push32(reg32s[reg_ebx]); } }; table16[0x50 | 4] = function() { { push16(reg16[reg_sp]); } }; table32[0x50 | 4] = function() { { push32(reg32s[reg_esp]); } }; table16[0x50 | 5] = function() { { push16(reg16[reg_bp]); } }; table32[0x50 | 5] = function() { { push32(reg32s[reg_ebp]); } }; table16[0x50 | 6] = function() { { push16(reg16[reg_si]); } }; table32[0x50 | 6] = function() { { push32(reg32s[reg_esi]); } }; table16[0x50 | 7] = function() { { push16(reg16[reg_di]); } }; table32[0x50 | 7] = function() { { push32(reg32s[reg_edi]); } };; +table16[0x58 | 0] = function() { { reg16[reg_ax] = pop16();; } }; table32[0x58 | 0] = function() { { reg32[reg_eax] = pop32s();; } }; table16[0x58 | 1] = function() { { reg16[reg_cx] = pop16();; } }; table32[0x58 | 1] = function() { { reg32[reg_ecx] = pop32s();; } }; table16[0x58 | 2] = function() { { reg16[reg_dx] = pop16();; } }; table32[0x58 | 2] = function() { { reg32[reg_edx] = pop32s();; } }; table16[0x58 | 3] = function() { { reg16[reg_bx] = pop16();; } }; table32[0x58 | 3] = function() { { reg32[reg_ebx] = pop32s();; } }; table16[0x58 | 4] = function() { { reg16[reg_sp] = pop16();; } }; table32[0x58 | 4] = function() { { reg32[reg_esp] = pop32s();; } }; table16[0x58 | 5] = function() { { reg16[reg_bp] = pop16();; } }; table32[0x58 | 5] = function() { { reg32[reg_ebp] = pop32s();; } }; table16[0x58 | 6] = function() { { reg16[reg_si] = pop16();; } }; table32[0x58 | 6] = function() { { reg32[reg_esi] = pop32s();; } }; table16[0x58 | 7] = function() { { reg16[reg_di] = pop16();; } }; table32[0x58 | 7] = function() { { reg32[reg_edi] = pop32s();; } };; +table16[0x60] = function() { { pusha16(); } }; table32[0x60] = function() { { pusha32(); } };; +table16[0x61] = function() { { popa16(); } }; table32[0x61] = function() { { popa32(); } };; +table16[0x62] = table32[0x62] = function() { { throw unimpl("bound instruction"); } };; +table16[0x63] = table32[0x63] = function() { var modrm_byte = read_imm8(); { /* arpl*/ var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, arpl(data, modrm_byte >> 2 & 14)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, arpl(data, modrm_byte >> 2 & 14)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = arpl(data, modrm_byte >> 2 & 14); }; } };; +table16[0x64] = table32[0x64] = function() { { seg_prefix(reg_fs); } };; +table16[0x65] = table32[0x65] = function() { { seg_prefix(reg_gs); } };; +table16[0x66] = table32[0x66] = function() { { /* Operand-size override prefix*/ dbg_assert(operand_size_32 === is_32); operand_size_32 = !is_32; update_operand_size(); table[read_imm8()](); operand_size_32 = is_32; update_operand_size(); } };; +table16[0x67] = table32[0x67] = function() { { /* Address-size override prefix*/ dbg_assert(address_size_32 === is_32); address_size_32 = !is_32; update_address_size(); table[read_imm8()](); address_size_32 = is_32; update_address_size(); } };; +table16[0x68] = function() { { push16(read_imm16()); } }; table32[0x68] = function() { { push32(read_imm32s()); } };; +table16[0x69] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read16(modrm_resolve(modrm_byte)) << 16 >> 16); } else { data = reg16s[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = imul_reg16((read_imm16() << 16 >> 16), data); } }; table32[0x69] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32[modrm_byte >> 3 & 7] = imul_reg32(read_imm32s(), data); } };; +table16[0x6A] = function() { { push16(read_imm8s()); } }; table32[0x6A] = function() { { push32(read_imm8s()); } };; +table16[0x6B] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read16(modrm_resolve(modrm_byte)) << 16 >> 16); } else { data = reg16s[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = imul_reg16(read_imm8s(), data); } }; table32[0x6B] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32[modrm_byte >> 3 & 7] = imul_reg32(read_imm8s(), data); } };; +table16[0x6C] = table32[0x6C] = function() { { insb(); } };; +table16[0x6D] = function() { { insw(); } }; table32[0x6D] = function() { { insd(); } };; +table16[0x6E] = table32[0x6E] = function() { { outsb(); } };; +table16[0x6F] = function() { { outsw(); } }; table32[0x6F] = function() { { outsd(); } };; +table16[0x70 | 0x0] = table32[0x70 | 0x0] = function() { { if((test_o())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x1] = table32[0x70 | 0x1] = function() { { if((!test_o())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x2] = table32[0x70 | 0x2] = function() { { if((test_b())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x3] = table32[0x70 | 0x3] = function() { { if((!test_b())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x4] = table32[0x70 | 0x4] = function() { { if((test_z())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x5] = table32[0x70 | 0x5] = function() { { if((!test_z())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x6] = table32[0x70 | 0x6] = function() { { if((test_be())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x7] = table32[0x70 | 0x7] = function() { { if((!test_be())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x8] = table32[0x70 | 0x8] = function() { { if((test_s())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0x9] = table32[0x70 | 0x9] = function() { { if((!test_s())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0xA] = table32[0x70 | 0xA] = function() { { if((test_p())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0xB] = table32[0x70 | 0xB] = function() { { if((!test_p())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0xC] = table32[0x70 | 0xC] = function() { { if((test_l())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0xD] = table32[0x70 | 0xD] = function() { { if((!test_l())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0xE] = table32[0x70 | 0xE] = function() { { if((test_le())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;; table16[0x70 | 0xF] = table32[0x70 | 0xF] = function() { { if((!test_le())) { instruction_pointer = instruction_pointer + read_imm8s() | 0; } instruction_pointer++; } };;;; +table16[0x80] = table32[0x80] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, add8(data, read_imm8())); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = add8(data, read_imm8()); }; }; break; case 1: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, or8(data, read_imm8())); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = or8(data, read_imm8()); }; }; break; case 2: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, adc8(data, read_imm8())); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = adc8(data, read_imm8()); }; }; break; case 3: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, sbb8(data, read_imm8())); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = sbb8(data, read_imm8()); }; }; break; case 4: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, and8(data, read_imm8())); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = and8(data, read_imm8()); }; }; break; case 5: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, sub8(data, read_imm8())); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = sub8(data, read_imm8()); }; }; break; case 6: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, xor8(data, read_imm8())); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = xor8(data, read_imm8()); }; }; break; case 7: { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; cmp8(data, read_imm8()); }; break; } } };; +table16[0x81] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, add16(data, read_imm16())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, add16(data, read_imm16())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = add16(data, read_imm16()); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, or16(data, read_imm16())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, or16(data, read_imm16())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = or16(data, read_imm16()); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, adc16(data, read_imm16())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, adc16(data, read_imm16())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = adc16(data, read_imm16()); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sbb16(data, read_imm16())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sbb16(data, read_imm16())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sbb16(data, read_imm16()); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, and16(data, read_imm16())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, and16(data, read_imm16())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = and16(data, read_imm16()); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sub16(data, read_imm16())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sub16(data, read_imm16())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sub16(data, read_imm16()); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, xor16(data, read_imm16())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, xor16(data, read_imm16())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = xor16(data, read_imm16()); }; }; break; case 7: { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; cmp16(data, read_imm16()); }; break; } } }; table32[0x81] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, add32(data, (read_imm32s() >>> 0))); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, add32(data, (read_imm32s() >>> 0))); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = add32(data, (read_imm32s() >>> 0)); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, or32(data, read_imm32s())); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, or32(data, read_imm32s())); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = or32(data, read_imm32s()); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, adc32(data, (read_imm32s() >>> 0))); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, adc32(data, (read_imm32s() >>> 0))); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = adc32(data, (read_imm32s() >>> 0)); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sbb32(data, (read_imm32s() >>> 0))); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sbb32(data, (read_imm32s() >>> 0))); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sbb32(data, (read_imm32s() >>> 0)); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, and32(data, read_imm32s())); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, and32(data, read_imm32s())); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = and32(data, read_imm32s()); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sub32(data, (read_imm32s() >>> 0))); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sub32(data, (read_imm32s() >>> 0))); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sub32(data, (read_imm32s() >>> 0)); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, xor32(data, read_imm32s())); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, xor32(data, read_imm32s())); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = xor32(data, read_imm32s()); }; }; break; case 7: { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; cmp32(data, (read_imm32s() >>> 0)); }; break; } } };; +table16[0x82] = table32[0x82] = function() { { table[0x80](); /* alias*/ } };; +table16[0x83] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, add16(data, read_imm8s() & 0xFFFF)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, add16(data, read_imm8s() & 0xFFFF)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = add16(data, read_imm8s() & 0xFFFF); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, or16(data, read_imm8s())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, or16(data, read_imm8s())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = or16(data, read_imm8s()); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, adc16(data, read_imm8s() & 0xFFFF)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, adc16(data, read_imm8s() & 0xFFFF)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = adc16(data, read_imm8s() & 0xFFFF); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sbb16(data, read_imm8s() & 0xFFFF)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sbb16(data, read_imm8s() & 0xFFFF)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sbb16(data, read_imm8s() & 0xFFFF); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, and16(data, read_imm8s())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, and16(data, read_imm8s())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = and16(data, read_imm8s()); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sub16(data, read_imm8s() & 0xFFFF)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sub16(data, read_imm8s() & 0xFFFF)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sub16(data, read_imm8s() & 0xFFFF); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, xor16(data, read_imm8s())); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, xor16(data, read_imm8s())); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = xor16(data, read_imm8s()); }; }; break; case 7: { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; cmp16(data, read_imm8s() & 0xFFFF); }; break; } } }; table32[0x83] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, add32(data, read_imm8s() >>> 0)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, add32(data, read_imm8s() >>> 0)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = add32(data, read_imm8s() >>> 0); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, or32(data, read_imm8s())); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, or32(data, read_imm8s())); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = or32(data, read_imm8s()); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, adc32(data, read_imm8s() >>> 0)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, adc32(data, read_imm8s() >>> 0)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = adc32(data, read_imm8s() >>> 0); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sbb32(data, read_imm8s() >>> 0)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sbb32(data, read_imm8s() >>> 0)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sbb32(data, read_imm8s() >>> 0); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, and32(data, read_imm8s())); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, and32(data, read_imm8s())); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = and32(data, read_imm8s()); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sub32(data, read_imm8s() >>> 0)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sub32(data, read_imm8s() >>> 0)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sub32(data, read_imm8s() >>> 0); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high); virt_boundary_write32(phys_addr, phys_addr_high, xor32(data, read_imm8s())); } else { data = memory.read32s(phys_addr); memory.write32(phys_addr, xor32(data, read_imm8s())); } } else { data = reg32s[modrm_byte & 7]; reg32s[modrm_byte & 7] = xor32(data, read_imm8s()); }; }; break; case 7: { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; cmp32(data, read_imm8s() >>> 0); }; break; } } };; +table16[0x84] = table32[0x84] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; test8(data, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } }; +table16[0x85] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; test16(data, reg16[modrm_byte >> 2 & 14]); } }; table32[0x85] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; test32(data, reg32s[modrm_byte >> 3 & 7]); } }; +table16[0x86] = table32[0x86] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, xchg8(data, modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = xchg8(data, modrm_byte); }; } };; +table16[0x87] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, xchg16(data, modrm_byte)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, xchg16(data, modrm_byte)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = xchg16(data, modrm_byte); }; } }; table32[0x87] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, xchg32(data, modrm_byte)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, xchg32(data, modrm_byte)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = xchg32(data, modrm_byte); }; } };; +table16[0x88] = table32[0x88] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]; }; } }; +table16[0x89] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write16(modrm_resolve(modrm_byte), reg16[modrm_byte >> 2 & 14]); } else { reg16[modrm_byte << 1 & 14] = reg16[modrm_byte >> 2 & 14]; }; } }; table32[0x89] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write32(modrm_resolve(modrm_byte), reg32s[modrm_byte >> 3 & 7]); } else { reg32[modrm_byte & 7] = reg32s[modrm_byte >> 3 & 7]; }; } }; +table16[0x8A] = table32[0x8A] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] = data; } };; +table16[0x8B] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } }; table32[0x8B] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } };; +table16[0x8C] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write16(modrm_resolve(modrm_byte), sreg[modrm_byte >> 3 & 7]); } else { reg16[modrm_byte << 1 & 14] = sreg[modrm_byte >> 3 & 7]; }; } }; table32[0x8C] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write32(modrm_resolve(modrm_byte), sreg[modrm_byte >> 3 & 7]); } else { reg32[modrm_byte & 7] = sreg[modrm_byte >> 3 & 7]; }; } }; +table16[0x8D] = function() { { lea16(); } }; table32[0x8D] = function() { { lea32(); } };; +table16[0x8E] = table32[0x8E] = function() { var modrm_byte = read_imm8(); { var mod = modrm_byte >> 3 & 7; if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; switch_seg(mod, data); if(mod === reg_ss) { /* TODO*/ /* run next instruction, so no irqs are handled*/ } } };; +table16[0x8F] = table32[0x8F] = function() { var modrm_byte = read_imm8(); { /* pop*/ if(operand_size_32) { /* change esp first, then resolve modrm address*/ var sp = get_esp_read(0); /* TODO unsafe*/ stack_reg[reg_vsp] += 4; if(modrm_byte < 0xC0) { safe_write32(modrm_resolve(modrm_byte), memory.read32s(sp)); } else { reg32[modrm_byte & 7] = memory.read32s(sp); }; } else { var sp = get_esp_read(0); stack_reg[reg_vsp] += 2; if(modrm_byte < 0xC0) { safe_write16(modrm_resolve(modrm_byte), memory.read16(sp)); } else { reg16[modrm_byte << 1 & 14] = memory.read16(sp); }; } } };; +table16[0x90 | 0] = function() { { xchg16r(reg_ax) } }; table32[0x90 | 0] = function() { { xchg32r(reg_eax) } }; table16[0x90 | 1] = function() { { xchg16r(reg_cx) } }; table32[0x90 | 1] = function() { { xchg32r(reg_ecx) } }; table16[0x90 | 2] = function() { { xchg16r(reg_dx) } }; table32[0x90 | 2] = function() { { xchg32r(reg_edx) } }; table16[0x90 | 3] = function() { { xchg16r(reg_bx) } }; table32[0x90 | 3] = function() { { xchg32r(reg_ebx) } }; table16[0x90 | 4] = function() { { xchg16r(reg_sp) } }; table32[0x90 | 4] = function() { { xchg32r(reg_esp) } }; table16[0x90 | 5] = function() { { xchg16r(reg_bp) } }; table32[0x90 | 5] = function() { { xchg32r(reg_ebp) } }; table16[0x90 | 6] = function() { { xchg16r(reg_si) } }; table32[0x90 | 6] = function() { { xchg32r(reg_esi) } }; table16[0x90 | 7] = function() { { xchg16r(reg_di) } }; table32[0x90 | 7] = function() { { xchg32r(reg_edi) } }; +table16[0x90] = table32[0x90] = function() { /* nop */ };; +table16[0x98] = function() { { /* cbw */ reg16[reg_ax] = reg8s[reg_al]; } }; table32[0x98] = function() { { /* cwde */ reg32[reg_eax] = reg16s[reg_ax]; } };; +table16[0x99] = function() { { /* cwd */ reg16[reg_dx] = reg16s[reg_ax] >> 15; } }; table32[0x99] = function() { { /* cdq */ reg32[reg_edx] = reg32s[reg_eax] >> 31; } };; +table16[0x9A] = function() { { /* callf*/ if(protected_mode) { throw unimpl("16 bit callf in protected mode"); } else { var new_ip = read_imm16(); var new_cs = read_imm16(); push16(sreg[reg_cs]); push16(get_real_ip()); switch_seg(reg_cs, new_cs); instruction_pointer = get_seg(reg_cs) + new_ip | 0; } } }; table32[0x9A] = function() { { if(protected_mode) { throw unimpl("callf"); } else { var new_ip = read_imm32s(); var new_cs = read_imm16(); push32(sreg[reg_cs]); push32(get_real_ip()); switch_seg(reg_cs, new_cs); instruction_pointer = get_seg(reg_cs) + new_ip | 0; } } };; +table16[0x9B] = table32[0x9B] = function() { { /* fwait: check for pending fpu exceptions*/ fpu.fwait(); } };; +table16[0x9C] = function() { { /* pushf*/ load_flags(); push16(flags); } }; table32[0x9C] = function() { { /* pushf*/ load_flags(); push32(flags); } };; +table16[0x9D] = function() { { /* popf*/ var tmp; tmp = pop16();; update_flags(tmp); handle_irqs(); } }; table32[0x9D] = function() { { /* popf*/ update_flags(pop32s()); handle_irqs(); } };; +table16[0x9E] = table32[0x9E] = function() { { /* sahf*/ flags = (flags & ~0xFF) | reg8[reg_ah]; flags = (flags & flags_mask) | flags_default; flags_changed = 0; } };; +table16[0x9F] = table32[0x9F] = function() { { /* lahf*/ load_flags(); reg8[reg_ah] = flags; } };; +table16[0xA0] = table32[0xA0] = function() { { /* mov*/ var data = safe_read8(read_moffs()); reg8[reg_al] = data; } };; +table16[0xA1] = function() { { /* mov*/ var data = safe_read16(read_moffs()); reg16[reg_ax] = data; } }; table32[0xA1] = function() { { var data = safe_read32s(read_moffs()); reg32[reg_eax] = data; } };; +table16[0xA2] = table32[0xA2] = function() { { /* mov*/ safe_write8(read_moffs(), reg8[reg_al]); } };; +table16[0xA3] = function() { { /* mov*/ safe_write16(read_moffs(), reg16[reg_ax]); } }; table32[0xA3] = function() { { safe_write32(read_moffs(), reg32s[reg_eax]); } };; +table16[0xA4] = table32[0xA4] = function() { { movsb(); } };; +table16[0xA5] = function() { { movsw(); } }; table32[0xA5] = function() { { movsd(); } };; +table16[0xA6] = table32[0xA6] = function() { { cmpsb(); } };; +table16[0xA7] = function() { { cmpsw(); } }; table32[0xA7] = function() { { cmpsd(); } };; +table16[0xA8] = table32[0xA8] = function() { { test8(reg8[reg_al], read_imm8()); } };; +table16[0xA9] = function() { { test16(reg16[reg_ax], read_imm16()); } }; table32[0xA9] = function() { { test32(reg32s[reg_eax], read_imm32s()); } };; +table16[0xAA] = table32[0xAA] = function() { { stosb(); } };; +table16[0xAB] = function() { { stosw(); } }; table32[0xAB] = function() { { stosd(); } };; +table16[0xAC] = table32[0xAC] = function() { { lodsb(); } };; +table16[0xAD] = function() { { lodsw(); } }; table32[0xAD] = function() { { lodsd(); } };; +table16[0xAE] = table32[0xAE] = function() { { scasb(); } };; +table16[0xAF] = function() { { scasw(); } }; table32[0xAF] = function() { { scasd(); } };; +table16[0xB0 | 0] = table32[0xB0 | 0] = function() { { reg8[reg_al] = read_imm8(); } };; table16[0xB0 | 1] = table32[0xB0 | 1] = function() { { reg8[reg_cl] = read_imm8(); } };; table16[0xB0 | 2] = table32[0xB0 | 2] = function() { { reg8[reg_dl] = read_imm8(); } };; table16[0xB0 | 3] = table32[0xB0 | 3] = function() { { reg8[reg_bl] = read_imm8(); } };; table16[0xB0 | 4] = table32[0xB0 | 4] = function() { { reg8[reg_ah] = read_imm8(); } };; table16[0xB0 | 5] = table32[0xB0 | 5] = function() { { reg8[reg_ch] = read_imm8(); } };; table16[0xB0 | 6] = table32[0xB0 | 6] = function() { { reg8[reg_dh] = read_imm8(); } };; table16[0xB0 | 7] = table32[0xB0 | 7] = function() { { reg8[reg_bh] = read_imm8(); } };;; +table16[0xB8 | 0] = function() { { reg16[reg_ax] = read_imm16(); } }; table32[0xB8 | 0] = function() { { reg32s[reg_eax] = read_imm32s(); } };; table16[0xB8 | 1] = function() { { reg16[reg_cx] = read_imm16(); } }; table32[0xB8 | 1] = function() { { reg32s[reg_ecx] = read_imm32s(); } };; table16[0xB8 | 2] = function() { { reg16[reg_dx] = read_imm16(); } }; table32[0xB8 | 2] = function() { { reg32s[reg_edx] = read_imm32s(); } };; table16[0xB8 | 3] = function() { { reg16[reg_bx] = read_imm16(); } }; table32[0xB8 | 3] = function() { { reg32s[reg_ebx] = read_imm32s(); } };; table16[0xB8 | 4] = function() { { reg16[reg_sp] = read_imm16(); } }; table32[0xB8 | 4] = function() { { reg32s[reg_esp] = read_imm32s(); } };; table16[0xB8 | 5] = function() { { reg16[reg_bp] = read_imm16(); } }; table32[0xB8 | 5] = function() { { reg32s[reg_ebp] = read_imm32s(); } };; table16[0xB8 | 6] = function() { { reg16[reg_si] = read_imm16(); } }; table32[0xB8 | 6] = function() { { reg32s[reg_esi] = read_imm32s(); } };; table16[0xB8 | 7] = function() { { reg16[reg_di] = read_imm16(); } }; table32[0xB8 | 7] = function() { { reg32s[reg_edi] = read_imm32s(); } };;; +table16[0xC0] = table32[0xC0] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rol8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rol8(data, read_imm8() & 31); }; }; break; case 1: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, ror8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = ror8(data, read_imm8() & 31); }; }; break; case 2: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rcl8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rcl8(data, read_imm8() & 31); }; }; break; case 3: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rcr8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rcr8(data, read_imm8() & 31); }; }; break; case 4: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shl8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shl8(data, read_imm8() & 31); }; }; break; case 5: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shr8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shr8(data, read_imm8() & 31); }; }; break; case 6: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shl8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shl8(data, read_imm8() & 31); }; }; break; case 7: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, sar8(data, read_imm8() & 31)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = sar8(data, read_imm8() & 31); }; }; break; } } };; +table16[0xC1] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rol16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rol16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rol16(data, read_imm8() & 31); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, ror16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, ror16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = ror16(data, read_imm8() & 31); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rcl16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rcl16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rcl16(data, read_imm8() & 31); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rcr16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rcr16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rcr16(data, read_imm8() & 31); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shl16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shl16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shl16(data, read_imm8() & 31); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shr16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shr16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shr16(data, read_imm8() & 31); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shl16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shl16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shl16(data, read_imm8() & 31); }; }; break; case 7: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sar16(data, read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sar16(data, read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sar16(data, read_imm8() & 31); }; }; break; } } }; table32[0xC1] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rol32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rol32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rol32(data, read_imm8() & 31); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, ror32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, ror32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = ror32(data, read_imm8() & 31); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rcl32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rcl32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rcl32(data, read_imm8() & 31); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rcr32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rcr32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rcr32(data, read_imm8() & 31); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shl32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shl32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shl32(data, read_imm8() & 31); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shr32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shr32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shr32(data, read_imm8() & 31); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shl32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shl32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shl32(data, read_imm8() & 31); }; }; break; case 7: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sar32(data, read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sar32(data, read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sar32(data, read_imm8() & 31); }; }; break; } } };; +table16[0xC2] = function() { { /* retn*/ var imm16 = read_imm16(); instruction_pointer = get_seg(reg_cs) + pop16() | 0; /* TODO regv*/ reg32[reg_esp] += imm16; } }; table32[0xC2] = function() { { /* retn*/ var imm16 = read_imm16(); instruction_pointer = get_seg(reg_cs) + pop32s() | 0; reg32[reg_esp] += imm16; } };; +table16[0xC3] = function() { { /* retn*/ instruction_pointer = get_seg(reg_cs) + pop16() | 0;; } }; table32[0xC3] = function() { { /* retn*/ instruction_pointer = get_seg(reg_cs) + pop32s() | 0;; } };; +table16[0xC4] = table32[0xC4] = function() { var modrm_byte = read_imm8(); { if(modrm_byte >= 0xC0) { raise_exception(6); return; } if(operand_size_32) { lss32(reg_es, modrm_resolve(modrm_byte), modrm_byte >> 3 & 7); } else { lss16(reg_es, modrm_resolve(modrm_byte), modrm_byte >> 2 & 14); }; } };; +table16[0xC5] = table32[0xC5] = function() { var modrm_byte = read_imm8(); { if(modrm_byte >= 0xC0) { raise_exception(6); return; } if(operand_size_32) { lss32(reg_ds, modrm_resolve(modrm_byte), modrm_byte >> 3 & 7); } else { lss16(reg_ds, modrm_resolve(modrm_byte), modrm_byte >> 2 & 14); }; } };; +table16[0xC6] = table32[0xC6] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), read_imm8()); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = read_imm8(); }; } }; +table16[0xC7] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write16(modrm_resolve(modrm_byte), read_imm16()); } else { reg16[modrm_byte << 1 & 14] = read_imm16(); }; } }; table32[0xC7] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write32(modrm_resolve(modrm_byte), read_imm32s()); } else { reg32[modrm_byte & 7] = read_imm32s(); }; } }; +table16[0xC8] = function() { { enter16(); } }; table32[0xC8] = function() { { enter32(); } };; +table16[0xC9] = function() { { /* leave*/ stack_reg[reg_vsp] = stack_reg[reg_vbp]; reg16[reg_bp] = pop16(); } }; table32[0xC9] = function() { { stack_reg[reg_vsp] = stack_reg[reg_vbp]; reg32[reg_ebp] = pop32s(); } };; +table16[0xCA] = function() { { /* retf*/ if(protected_mode) { throw unimpl("16 bit retf in protected mode"); } var imm16 = read_imm16(); var ip = pop16(); switch_seg(reg_cs, pop16()); instruction_pointer = get_seg(reg_cs) + ip | 0; reg16[reg_sp] += imm16; } }; table32[0xCA] = function() { { /* retf */ var imm16 = read_imm16(); if(protected_mode) { /*dbg_log("retf");*/ var ip = pop32s(); switch_seg(reg_cs, pop32s() & 0xFFFF); instruction_pointer = get_seg(reg_cs) + ip | 0; stack_reg[reg_vsp] += imm16; } else { throw unimpl("32 bit retf in real mode"); } } };; +table16[0xCB] = function() { { /* retf*/ if(protected_mode) { throw unimpl("16 bit retf in protected mode"); } else { var ip = pop16(); switch_seg(reg_cs, pop16()); instruction_pointer = get_seg(reg_cs) + ip | 0; } } }; table32[0xCB] = function() { { /* retf */ if(protected_mode) { var ip = pop32s(); switch_seg(reg_cs, pop32s() & 0xFFFF); instruction_pointer = get_seg(reg_cs) + ip | 0; } else { var ip = pop32s(); switch_seg(reg_cs, pop32s() & 0xFFFF); instruction_pointer = get_seg(reg_cs) + ip | 0; } } };; +table16[0xCC] = table32[0xCC] = function() { { /* INT3*/ call_interrupt_vector(3, true, false); } };; +table16[0xCD] = table32[0xCD] = function() { { /* INT */ var imm8 = read_imm8(); call_interrupt_vector(imm8, true, false); } };; +table16[0xCE] = table32[0xCE] = function() { { /* INTO*/ if(getof()) { call_interrupt_vector(4, true, false); } } };; +table16[0xCF] = function() { { /* iret*/ if(protected_mode) { throw unimpl("16 bit iret in protected mode"); } var ip = pop16(); switch_seg(reg_cs, pop16()); var new_flags = pop16(); instruction_pointer = ip + get_seg(reg_cs) | 0; flags = new_flags; flags_changed = 0; handle_irqs(); } }; table32[0xCF] = function() { { /* iret*/ if(!protected_mode) { throw unimpl("32 bit iret in real mode"); } else { if(flags & flag_nt) { if(DEBUG) throw "unimplemented nt"; } if(flags & flag_vm) { if(DEBUG) throw "unimplemented vm"; } } /*dbg_log("pop eip from " + h(reg32[reg_esp], 8));*/ instruction_pointer = pop32s(); /*dbg_log("IRET | from " + h(previous_ip) + " to " + h(instruction_pointer));*/ sreg[reg_cs] = pop32s(); /*instruction_pointer += get_seg(reg_cs);*/ var new_flags = pop32s(); if(new_flags & flag_vm) { if(DEBUG) throw "unimplemented"; } /* protected mode return*/ var info = lookup_segment_selector(sreg[reg_cs]); if(info.is_null) { throw unimpl("is null"); } if(!info.is_present) { throw unimpl("not present"); } if(!info.is_executable) { throw unimpl("not exec"); } if(info.rpl < cpl) { throw unimpl("rpl < cpl"); } if(info.dc_bit && info.dpl > info.rpl) { throw unimpl("conforming and dpl > rpl"); } if(info.rpl > cpl) { /* outer privilege return*/ var temp_esp = pop32s(); var temp_ss = pop32s(); reg32[reg_esp] = temp_esp; update_flags(new_flags); cpl = info.rpl; switch_seg(reg_ss, temp_ss & 0xFFFF); /*dbg_log("iret cpl=" + cpl + " to " + h(instruction_pointer) + */ /* " cs:eip=" + h(sreg[reg_cs],4) + ":" + h(get_real_ip(), 8) +*/ /* " ss:esp=" + h(temp_ss & 0xFFFF, 2) + ":" + h(temp_esp, 8), LOG_CPU);*/ cpl_changed(); } else { update_flags(new_flags); /* same privilege return*/ /*dbg_log(h(new_flags) + " " + h(flags));*/ /*dbg_log("iret to " + h(instruction_pointer));*/ } /*dbg_log("iret if=" + (flags & flag_interrupt) + " cpl=" + cpl);*/ dbg_assert(!page_fault); handle_irqs(); } };; +table16[0xD0] = table32[0xD0] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rol8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rol8(data, 1); }; }; break; case 1: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, ror8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = ror8(data, 1); }; }; break; case 2: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rcl8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rcl8(data, 1); }; }; break; case 3: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rcr8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rcr8(data, 1); }; }; break; case 4: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shl8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shl8(data, 1); }; }; break; case 5: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shr8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shr8(data, 1); }; }; break; case 6: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shl8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shl8(data, 1); }; }; break; case 7: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, sar8(data, 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = sar8(data, 1); }; }; break; } } };; +table16[0xD1] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rol16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rol16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rol16(data, 1); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, ror16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, ror16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = ror16(data, 1); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rcl16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rcl16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rcl16(data, 1); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rcr16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rcr16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rcr16(data, 1); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shl16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shl16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shl16(data, 1); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shr16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shr16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shr16(data, 1); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shl16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shl16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shl16(data, 1); }; }; break; case 7: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sar16(data, 1)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sar16(data, 1)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sar16(data, 1); }; }; break; } } }; table32[0xD1] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rol32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rol32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rol32(data, 1); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, ror32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, ror32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = ror32(data, 1); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rcl32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rcl32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rcl32(data, 1); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rcr32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rcr32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rcr32(data, 1); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shl32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shl32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shl32(data, 1); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shr32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shr32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shr32(data, 1); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shl32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shl32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shl32(data, 1); }; }; break; case 7: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sar32(data, 1)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sar32(data, 1)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sar32(data, 1); }; }; break; } } };; +table16[0xD2] = table32[0xD2] = function() { var modrm_byte = read_imm8(); { var shift = reg8[reg_cl] & 31; switch(modrm_byte >> 3 & 7) { case 0: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rol8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rol8(data, shift); }; }; break; case 1: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, ror8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = ror8(data, shift); }; }; break; case 2: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rcl8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rcl8(data, shift); }; }; break; case 3: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, rcr8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = rcr8(data, shift); }; }; break; case 4: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shl8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shl8(data, shift); }; }; break; case 5: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shr8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shr8(data, shift); }; }; break; case 6: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, shl8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = shl8(data, shift); }; }; break; case 7: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, sar8(data, shift)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = sar8(data, shift); }; }; break; } } };; +table16[0xD3] = function() { var modrm_byte = read_imm8(); { var shift = reg8[reg_cl] & 31; switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rol16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rol16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rol16(data, shift); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, ror16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, ror16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = ror16(data, shift); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rcl16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rcl16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rcl16(data, shift); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, rcr16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, rcr16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = rcr16(data, shift); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shl16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shl16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shl16(data, shift); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shr16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shr16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shr16(data, shift); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shl16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shl16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shl16(data, shift); }; }; break; case 7: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, sar16(data, shift)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, sar16(data, shift)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = sar16(data, shift); }; }; break; } } }; table32[0xD3] = function() { var modrm_byte = read_imm8(); { var shift = reg8[reg_cl] & 31; switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rol32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rol32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rol32(data, shift); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, ror32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, ror32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = ror32(data, shift); }; }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rcl32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rcl32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rcl32(data, shift); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, rcr32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, rcr32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = rcr32(data, shift); }; }; break; case 4: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shl32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shl32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shl32(data, shift); }; }; break; case 5: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shr32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shr32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shr32(data, shift); }; }; break; case 6: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shl32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shl32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shl32(data, shift); }; }; break; case 7: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, sar32(data, shift)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, sar32(data, shift)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = sar32(data, shift); }; }; break; } } };; +table16[0xD4] = table32[0xD4] = function() { { bcd_aam(); } };; +table16[0xD5] = table32[0xD5] = function() { { bcd_aad(); } };; +table16[0xD6] = table32[0xD6] = function() { { /* salc*/ throw unimpl("salc instruction"); } };; +table16[0xD7] = table32[0xD7] = function() { { /* xlat*/ if(address_size_32) { reg8[reg_al] = safe_read8(get_seg_prefix(reg_ds) + reg32s[reg_ebx] + reg8[reg_al]); } else { reg8[reg_al] = safe_read8(get_seg_prefix(reg_ds) + reg16[reg_bx] + reg8[reg_al]); } } };; +// fpu instructions +table16[0xD8] = table32[0xD8] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_D8_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_D8_reg(modrm_byte); } };; +table16[0xD9] = table32[0xD9] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_D9_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_D9_reg(modrm_byte); } };; +table16[0xDA] = table32[0xDA] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_DA_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_DA_reg(modrm_byte); } };; +table16[0xDB] = table32[0xDB] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_DB_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_DB_reg(modrm_byte); } };; +table16[0xDC] = table32[0xDC] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_DC_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_DC_reg(modrm_byte); } };; +table16[0xDD] = table32[0xDD] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_DD_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_DD_reg(modrm_byte); } };; +table16[0xDE] = table32[0xDE] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_DE_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_DE_reg(modrm_byte); } };; +table16[0xDF] = table32[0xDF] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) fpu.op_DF_mem(modrm_byte, modrm_resolve(modrm_byte)); else fpu.op_DF_reg(modrm_byte); } };; +table16[0xE0] = table32[0xE0] = function() { { loopne(); } };; +table16[0xE1] = table32[0xE1] = function() { { loope(); } };; +table16[0xE2] = table32[0xE2] = function() { { loop(); } };; +table16[0xE3] = table32[0xE3] = function() { { jcxz(); } };; +table16[0xE4] = table32[0xE4] = function() { { reg8[reg_al] = in8(read_imm8()); } };; +table16[0xE5] = function() { { reg16[reg_ax] = in16(read_imm8()); } }; table32[0xE5] = function() { { reg32[reg_eax] = in32(read_imm8()); } };; +table16[0xE6] = table32[0xE6] = function() { { out8(read_imm8(), reg8[reg_al]); } };; +table16[0xE7] = function() { { out16(read_imm8(), reg16[reg_ax]); } }; table32[0xE7] = function() { { out32(read_imm8(), reg32s[reg_eax]); } };; +table16[0xE8] = function() { { /* call*/ var imm16s = (read_imm16() << 16 >> 16); push16(get_real_ip()); jmp_rel16(imm16s); } }; table32[0xE8] = function() { { /* call*/ var imm32s = read_imm32s(); push32(get_real_ip()); instruction_pointer = instruction_pointer + imm32s | 0; } };; +table16[0xE9] = function() { { /* jmp*/ var imm16s = (read_imm16() << 16 >> 16); jmp_rel16(imm16s); } }; table32[0xE9] = function() { { /* jmp*/ var imm32s = read_imm32s(); instruction_pointer = instruction_pointer + imm32s | 0; } };; +table16[0xEA] = function() { { /* jmpf*/ var ip = read_imm16(); switch_seg(reg_cs, read_imm16()); instruction_pointer = ip + get_seg(reg_cs) | 0; } }; table32[0xEA] = function() { { /* jmpf*/ var ip = read_imm32s(); switch_seg(reg_cs, read_imm16()); instruction_pointer = ip + get_seg(reg_cs) | 0; } };; +table16[0xEB] = table32[0xEB] = function() { { /* jmp near*/ var imm8 = read_imm8s(); instruction_pointer = instruction_pointer + imm8 | 0; } };; +table16[0xEC] = table32[0xEC] = function() { { reg8[reg_al] = in8(reg16[reg_dx]); } };; +table16[0xED] = function() { { reg16[reg_ax] = in16(reg16[reg_dx]); } }; table32[0xED] = function() { { reg32[reg_eax] = in32(reg16[reg_dx]); } };; +table16[0xEE] = table32[0xEE] = function() { { out8(reg16[reg_dx], reg8[reg_al]); } };; +table16[0xEF] = function() { { out16(reg16[reg_dx], reg16[reg_ax]); } }; table32[0xEF] = function() { { out32(reg16[reg_dx], reg32s[reg_eax]); } };; +table16[0xF0] = table32[0xF0] = function() { { /* lock*/ /* TODO*/ /* This triggers UD when used with*/ /* some instructions that don't write to memory*/ } };; +table16[0xF1] = table32[0xF1] = function() { { /* INT1*/ /* https://code.google.com/p/corkami/wiki/x86oddities#IceBP*/ throw unimpl("int1 instruction"); } };; +table16[0xF2] = table32[0xF2] = function() { { /* repnz*/ dbg_assert(!repeat_string_prefix); repeat_string_prefix = true; repeat_string_type = false; table[read_imm8()](); repeat_string_prefix = false; } };; +table16[0xF3] = table32[0xF3] = function() { { /* repz*/ dbg_assert(!repeat_string_prefix); repeat_string_prefix = true; repeat_string_type = true; table[read_imm8()](); repeat_string_prefix = false; } };; +table16[0xF4] = table32[0xF4] = function() { { if(cpl) { trigger_gp(0); } /* hlt*/ if((flags & flag_interrupt) === 0) { log("cpu halted"); stopped = true; if(DEBUG) dump_regs(); throw "HALT"; } else { /* infinite loop until an irq happens*/ /* this is handled in call_interrupt_vector*/ instruction_pointer--; in_hlt = true; } } };; +table16[0xF5] = table32[0xF5] = function() { { /* cmc*/ flags = (flags | 1) ^ getcf(); flags_changed &= ~1; } };; +table16[0xF6] = table32[0xF6] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; test8(data, read_imm8()); }; break; case 1: { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; test8(data, read_imm8()); }; break; case 2: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, not8(data)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = not8(data); }; }; break; case 3: { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, neg8(data)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = neg8(data); }; }; break; case 4: { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; mul8(data); }; break; case 5: { if(modrm_byte < 0xC0) { var data = safe_read8s(modrm_resolve(modrm_byte)); } else { data = reg8s[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; imul8(data); }; break; case 6: { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; div8(data); }; break; case 7: { if(modrm_byte < 0xC0) { var data = safe_read8s(modrm_resolve(modrm_byte)); } else { data = reg8s[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; idiv8(data); }; break; } } };; +table16[0xF7] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; test16(data, read_imm16()); }; break; case 1: { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; test16(data, read_imm16()); }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, not16(data)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, not16(data)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = not16(data); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, neg16(data)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, neg16(data)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = neg16(data); }; }; break; case 4: { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; mul16(data); }; break; case 5: { if(modrm_byte < 0xC0) { var data = (safe_read16(modrm_resolve(modrm_byte)) << 16 >> 16); } else { data = reg16s[modrm_byte << 1 & 14]; }; imul16(data); }; break; case 6: { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; div16(data); }; break; case 7: { if(modrm_byte < 0xC0) { var data = (safe_read16(modrm_resolve(modrm_byte)) << 16 >> 16); } else { data = reg16s[modrm_byte << 1 & 14]; }; idiv16(data); }; break; } } }; table32[0xF7] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; test32(data, read_imm32s()); }; break; case 1: { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; test32(data, read_imm32s()); }; break; case 2: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, not32(data)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, not32(data)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = not32(data); }; }; break; case 3: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, neg32(data)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, neg32(data)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = neg32(data); }; }; break; case 4: { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; mul32(data); }; break; case 5: { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; imul32(data); }; break; case 6: { if(modrm_byte < 0xC0) { var data = (safe_read32s(modrm_resolve(modrm_byte)) >>> 0); } else { data = reg32[modrm_byte & 7]; }; div32(data); }; break; case 7: { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; idiv32(data); }; break; } } };; +table16[0xF8] = table32[0xF8] = function() { { /* clc*/ flags &= ~flag_carry; flags_changed &= ~1; } };; +table16[0xF9] = table32[0xF9] = function() { { /* stc*/ flags |= flag_carry; flags_changed &= ~1; } };; +table16[0xFA] = table32[0xFA] = function() { { /* cli*/ /*dbg_log("interrupts off");*/ if(!privileges_for_io()) { trigger_gp(0); } else { flags &= ~flag_interrupt; } } };; +table16[0xFB] = table32[0xFB] = function() { { /* sti*/ /*dbg_log("interrupts on");*/ if(!privileges_for_io()) { trigger_gp(0); } else { flags |= flag_interrupt; handle_irqs(); } } };; +table16[0xFC] = table32[0xFC] = function() { { /* cld*/ flags &= ~flag_direction; } };; +table16[0xFD] = table32[0xFD] = function() { { /* std*/ flags |= flag_direction; } };; +table16[0xFE] = table32[0xFE] = function() { var modrm_byte = read_imm8(); { var mod = modrm_byte & 56; if(mod === 0) { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, inc8(data)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = inc8(data); }; } else if(mod === 8) { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, dec8(data)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = dec8(data); }; } else { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; } } };; +table16[0xFF] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, inc16(data)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, inc16(data)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = inc16(data); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, dec16(data)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, dec16(data)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = dec16(data); }; }; break; case 2: { /* 2, call near*/ if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; push16(get_real_ip()); instruction_pointer = get_seg(reg_cs) + data | 0; }; break; case 3: { /* 3, callf*/ if(modrm_byte >= 0xC0) { raise_exception(6); dbg_assert(false); } var virt_addr = modrm_resolve(modrm_byte); push16(sreg[reg_cs]); push16(get_real_ip()); switch_seg(reg_cs, safe_read16(virt_addr + 2)); instruction_pointer = get_seg(reg_cs) + safe_read16(virt_addr) | 0; dbg_assert(!page_fault); }; break; case 4: { /* 4, jmp near*/ if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; instruction_pointer = get_seg(reg_cs) + data | 0; }; break; case 5: { /* 5, jmpf*/ if(modrm_byte >= 0xC0) { raise_exception(6); dbg_assert(false); } var virt_addr = modrm_resolve(modrm_byte); switch_seg(reg_cs, safe_read16(virt_addr + 2)); instruction_pointer = get_seg(reg_cs) + safe_read16(virt_addr) | 0; /* TODO safe read*/ }; break; case 6: { /* 6, push*/ if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; push16(data); }; break; case 7: { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; }; break; } } }; table32[0xFF] = function() { var modrm_byte = read_imm8(); { switch(modrm_byte >> 3 & 7) { case 0: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, inc32(data)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, inc32(data)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = inc32(data); }; }; break; case 1: { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, dec32(data)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, dec32(data)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = dec32(data); }; }; break; case 2: { /* 2, call near*/ if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; push32(get_real_ip()); instruction_pointer = get_seg(reg_cs) + data | 0; }; break; case 3: { /* 3, callf*/ if(modrm_byte >= 0xC0) { raise_exception(6); dbg_assert(false); } var virt_addr = modrm_resolve(modrm_byte); var new_cs = safe_read16(virt_addr + 4); var new_ip = safe_read32s(virt_addr); push32(sreg[reg_cs]); push32(get_real_ip()); switch_seg(reg_cs, new_cs); instruction_pointer = get_seg(reg_cs) + new_ip | 0; }; break; case 4: { /* 4, jmp near*/ if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; instruction_pointer = get_seg(reg_cs) + data | 0; }; break; case 5: { /* 5, jmpf*/ if(modrm_byte >= 0xC0) { raise_exception(6); dbg_assert(false); } var virt_addr = modrm_resolve(modrm_byte); var new_cs = safe_read16(virt_addr + 4); var new_ip = safe_read32s(virt_addr); switch_seg(reg_cs, new_cs); instruction_pointer = get_seg(reg_cs) + new_ip | 0; }; break; case 6: { /* push*/ if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; push32(data); }; break; case 7: { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; }; break; } } };; +// 0F ops start here +table0F_16[0x00] = table0F_32[0x00] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; if(!protected_mode) { /* No GP, UD is correct*/ trigger_ud(); } if(cpl) { trigger_gp(0); } switch(modrm_byte >> 3 & 7) { case 2: load_ldt(data); break; case 3: load_tr(data); break; default: dbg_log(modrm_byte >> 3 & 7, LOG_CPU); if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; } } };; +table0F_16[0x01] = table0F_32[0x01] = function() { var modrm_byte = read_imm8(); { if(cpl) { trigger_gp(0); } var mod = modrm_byte >> 3 & 7; if(mod === 4) { /* smsw*/ if(modrm_byte < 0xC0) { safe_write16(modrm_resolve(modrm_byte), cr0); } else { reg16[modrm_byte << 1 & 14] = cr0; }; return; } else if(mod === 6) { /* lmsw*/ if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; cr0 = (cr0 & ~0xF) | (data & 0xF); cr0_changed(); return; } if(modrm_byte >= 0xC0) { /* only memory*/ raise_exception(6); dbg_assert(false); } if((mod === 2 || mod === 3) && protected_mode) { /* override prefix, so modrm_resolve does not return the segment part*/ /* only lgdt and lidt and only in protected mode*/ segment_prefix = reg_noseg; } var addr = modrm_resolve(modrm_byte); segment_prefix = -1; switch(mod) { case 0: /* sgdt*/ safe_write16(addr, gdtr_size); safe_write32(addr + 2, gdtr_offset); break; case 1: /* sidt*/ safe_write16(addr, idtr_size); safe_write32(addr + 2, idtr_offset); break; case 2: /* lgdt*/ var size = safe_read16(addr); var offset = safe_read32s(addr + 2); gdtr_size = size; gdtr_offset = offset; if(!operand_size_32) { gdtr_offset &= 0xFFFFFF; } dbg_log("eax " + h(reg32[reg_eax]), LOG_CPU); dbg_log("gdt loaded from " + h(addr), LOG_CPU); dbg_log("gdt at " + h(gdtr_offset) + ", " + gdtr_size + " bytes", LOG_CPU); /*dump_gdt_ldt();*/ break; case 3: /* lidt*/ var size = safe_read16(addr); var offset = safe_read32s(addr + 2); idtr_size = size; idtr_offset = offset; if(!operand_size_32) { idtr_offset &= 0xFFFFFF; } /*dbg_log("[" + h(instruction_pointer) + "] idt at " + */ /* h(idtr_offset) + ", " + idtr_size + " bytes " + h(addr), LOG_CPU);*/ break; case 7: /* flush translation lookaside buffer*/ invlpg(addr); break; default: dbg_log(mod); if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; } } };; +table0F_16[0x02] = table0F_32[0x02] = function() { var modrm_byte = read_imm8(); { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; /* lar*/ } };; +table0F_16[0x03] = table0F_32[0x03] = function() { var modrm_byte = read_imm8(); { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; /* lsl*/ } };; +table0F_16[0x04] = table0F_32[0x04] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x05] = table0F_32[0x05] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x06] = table0F_32[0x06] = function() { { /* clts*/ if(cpl) { trigger_gp(0); } else { /*dbg_log("clts", LOG_CPU);*/ cr0 &= ~8; /* do something here ?*/ } } };; +table0F_16[0x07] = table0F_32[0x07] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +// invd +table0F_16[0x08] = table0F_32[0x08] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0x09] = table0F_32[0x09] = function() { { if(cpl) { trigger_gp(0); } /* wbinvd*/ } };; +table0F_16[0x0A] = table0F_32[0x0A] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x0B] = table0F_32[0x0B] = function() { { trigger_ud(); } };; +table0F_16[0x0C] = table0F_32[0x0C] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x0D] = table0F_32[0x0D] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0x0E] = table0F_32[0x0E] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x0F] = table0F_32[0x0F] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x10] = table0F_32[0x10] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x11] = table0F_32[0x11] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x12] = table0F_32[0x12] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x13] = table0F_32[0x13] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x14] = table0F_32[0x14] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x15] = table0F_32[0x15] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x16] = table0F_32[0x16] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x17] = table0F_32[0x17] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x18] = table0F_32[0x18] = function() { var modrm_byte = read_imm8(); { /* prefetch*/ /* nop for us */ if(operand_size_32) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; } else { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; } } };; +table0F_16[0x19] = table0F_32[0x19] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x1A] = table0F_32[0x1A] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x1B] = table0F_32[0x1B] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x1C] = table0F_32[0x1C] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x1D] = table0F_32[0x1D] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x1E] = table0F_32[0x1E] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x1F] = table0F_32[0x1F] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x20] = table0F_32[0x20] = function() { var modrm_byte = read_imm8(); { if(cpl) { trigger_gp(0); } /*dbg_log("cr" + mod + " read", LOG_CPU);*/ /* mov addr, cr*/ /* mod = which control register*/ switch(modrm_byte >> 3 & 7) { case 0: reg32[modrm_byte & 7] = cr0; break; case 2: reg32[modrm_byte & 7] = cr2; break; case 3: /*dbg_log("read cr3 (" + h(cr3, 8) + ")", LOG_CPU);*/ reg32[modrm_byte & 7] = cr3; break; case 4: reg32[modrm_byte & 7] = cr4; break; default: dbg_log(modrm_byte >> 3 & 7); if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; } } };; +table0F_16[0x21] = table0F_32[0x21] = function() { var modrm_byte = read_imm8(); { if(cpl) { trigger_gp(0); } /* TODO: mov from debug register*/ dbg_assert(modrm_byte >= 0xC0); } };; +table0F_16[0x22] = table0F_32[0x22] = function() { var modrm_byte = read_imm8(); { if(cpl) { trigger_gp(0); } var data = reg32[modrm_byte & 7]; /*dbg_log("cr" + mod + " written: " + h(reg32[reg]), LOG_CPU);*/ /* mov cr, addr*/ /* mod = which control register*/ switch(modrm_byte >> 3 & 7) { case 0: if((data & 0x80000001) === (0x80000000 | 0)) { /* cannot load PG without PE*/ throw unimpl("#GP handler"); } if((cr0 & 0x80000000) && !(data & 0x80000000)) { full_clear_tlb(); } cr0 = data; cr0_changed(); /*dbg_log("cr1 = " + bits(memory.read32s(addr)), LOG_CPU);*/ break; case 3: cr3 = data; dbg_assert((cr3 & 0xFFF) === 0); clear_tlb(); /*dump_page_directory();*/ /*dbg_log("page directory loaded at " + h(cr3, 8), LOG_CPU);*/ break; case 4: if((cr4 ^ data) & 128) { full_clear_tlb(); } cr4 = data; page_size_extensions = (cr4 & 16) ? PSE_ENABLED : 0; dbg_log("cr4 set to " + h(cr4), LOG_CPU); break; default: dbg_log(modrm_byte >> 3 & 7); if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; } } };; +table0F_16[0x23] = table0F_32[0x23] = function() { var modrm_byte = read_imm8(); { if(cpl) { trigger_gp(0); } /* TODO: mov to debug register*/ dbg_assert(modrm_byte >= 0xC0); } };; +table0F_16[0x24] = table0F_32[0x24] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x25] = table0F_32[0x25] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x26] = table0F_32[0x26] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x27] = table0F_32[0x27] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0x28] = table0F_32[0x28] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x29] = table0F_32[0x29] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x2A] = table0F_32[0x2A] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x2B] = table0F_32[0x2B] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x2C] = table0F_32[0x2C] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x2D] = table0F_32[0x2D] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x2E] = table0F_32[0x2E] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x2F] = table0F_32[0x2F] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +// wrmsr +table0F_16[0x30] = table0F_32[0x30] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0x31] = table0F_32[0x31] = function() { { /* rdtsc - read timestamp counter*/ /*var cycles = (Date.now() - emulation_start) / 1000 * 3000000;*/ /*reg32[reg_eax] = cycles;*/ /*reg32[reg_edx] = cycles / 0x100000000;*/ reg32[reg_eax] = cpu_timestamp_counter; reg32[reg_edx] = cpu_timestamp_counter / 0x100000000; } };; +// rdmsr +table0F_16[0x32] = table0F_32[0x32] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +// rdpmc +table0F_16[0x33] = table0F_32[0x33] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +// sysenter +table0F_16[0x34] = table0F_32[0x34] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +// sysexit +table0F_16[0x35] = table0F_32[0x35] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0x36] = table0F_32[0x36] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +// getsec +table0F_16[0x37] = table0F_32[0x37] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0x38] = table0F_32[0x38] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x39] = table0F_32[0x39] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x3A] = table0F_32[0x3A] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x3B] = table0F_32[0x3B] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x3C] = table0F_32[0x3C] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x3D] = table0F_32[0x3D] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x3E] = table0F_32[0x3E] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x3F] = table0F_32[0x3F] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x40 | 0x0] = function() { var modrm_byte = read_imm8(); { if((test_o())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x0] = function() { var modrm_byte = read_imm8(); { if((test_o())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x1] = function() { var modrm_byte = read_imm8(); { if((!test_o())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x1] = function() { var modrm_byte = read_imm8(); { if((!test_o())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x2] = function() { var modrm_byte = read_imm8(); { if((test_b())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x2] = function() { var modrm_byte = read_imm8(); { if((test_b())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x3] = function() { var modrm_byte = read_imm8(); { if((!test_b())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x3] = function() { var modrm_byte = read_imm8(); { if((!test_b())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x4] = function() { var modrm_byte = read_imm8(); { if((test_z())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x4] = function() { var modrm_byte = read_imm8(); { if((test_z())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x5] = function() { var modrm_byte = read_imm8(); { if((!test_z())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x5] = function() { var modrm_byte = read_imm8(); { if((!test_z())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x6] = function() { var modrm_byte = read_imm8(); { if((test_be())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x6] = function() { var modrm_byte = read_imm8(); { if((test_be())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x7] = function() { var modrm_byte = read_imm8(); { if((!test_be())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x7] = function() { var modrm_byte = read_imm8(); { if((!test_be())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x8] = function() { var modrm_byte = read_imm8(); { if((test_s())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x8] = function() { var modrm_byte = read_imm8(); { if((test_s())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0x9] = function() { var modrm_byte = read_imm8(); { if((!test_s())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0x9] = function() { var modrm_byte = read_imm8(); { if((!test_s())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0xA] = function() { var modrm_byte = read_imm8(); { if((test_p())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0xA] = function() { var modrm_byte = read_imm8(); { if((test_p())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0xB] = function() { var modrm_byte = read_imm8(); { if((!test_p())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0xB] = function() { var modrm_byte = read_imm8(); { if((!test_p())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0xC] = function() { var modrm_byte = read_imm8(); { if((test_l())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0xC] = function() { var modrm_byte = read_imm8(); { if((test_l())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0xD] = function() { var modrm_byte = read_imm8(); { if((!test_l())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0xD] = function() { var modrm_byte = read_imm8(); { if((!test_l())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0xE] = function() { var modrm_byte = read_imm8(); { if((test_le())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0xE] = function() { var modrm_byte = read_imm8(); { if((test_le())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;; table0F_16[0x40 | 0xF] = function() { var modrm_byte = read_imm8(); { if((!test_le())) { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } }; table0F_32[0x40 | 0xF] = function() { var modrm_byte = read_imm8(); { if((!test_le())) { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32s[modrm_byte >> 3 & 7] = data; } else if(modrm_byte < 0xC0) modrm_resolve(modrm_byte) } };;;; +table0F_16[0x50] = table0F_32[0x50] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x51] = table0F_32[0x51] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x52] = table0F_32[0x52] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x53] = table0F_32[0x53] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x54] = table0F_32[0x54] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x55] = table0F_32[0x55] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x56] = table0F_32[0x56] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x57] = table0F_32[0x57] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x58] = table0F_32[0x58] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x59] = table0F_32[0x59] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x5A] = table0F_32[0x5A] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x5B] = table0F_32[0x5B] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x5C] = table0F_32[0x5C] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x5D] = table0F_32[0x5D] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x5E] = table0F_32[0x5E] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x5F] = table0F_32[0x5F] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x60] = table0F_32[0x60] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x61] = table0F_32[0x61] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x62] = table0F_32[0x62] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x63] = table0F_32[0x63] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x64] = table0F_32[0x64] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x65] = table0F_32[0x65] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x66] = table0F_32[0x66] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x67] = table0F_32[0x67] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x68] = table0F_32[0x68] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x69] = table0F_32[0x69] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x6A] = table0F_32[0x6A] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x6B] = table0F_32[0x6B] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x6C] = table0F_32[0x6C] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x6D] = table0F_32[0x6D] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x6E] = table0F_32[0x6E] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x6F] = table0F_32[0x6F] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x70] = table0F_32[0x70] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x71] = table0F_32[0x71] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x72] = table0F_32[0x72] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x73] = table0F_32[0x73] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x74] = table0F_32[0x74] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x75] = table0F_32[0x75] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x76] = table0F_32[0x76] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x77] = table0F_32[0x77] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x78] = table0F_32[0x78] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x79] = table0F_32[0x79] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x7A] = table0F_32[0x7A] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x7B] = table0F_32[0x7B] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x7C] = table0F_32[0x7C] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x7D] = table0F_32[0x7D] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x7E] = table0F_32[0x7E] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x7F] = table0F_32[0x7F] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0x80 | 0x0] = function() { { jmpcc16((test_o())); } }; table0F_32[0x80 | 0x0] = function() { { jmpcc32((test_o())); } };; table0F_16[0x80 | 0x1] = function() { { jmpcc16((!test_o())); } }; table0F_32[0x80 | 0x1] = function() { { jmpcc32((!test_o())); } };; table0F_16[0x80 | 0x2] = function() { { jmpcc16((test_b())); } }; table0F_32[0x80 | 0x2] = function() { { jmpcc32((test_b())); } };; table0F_16[0x80 | 0x3] = function() { { jmpcc16((!test_b())); } }; table0F_32[0x80 | 0x3] = function() { { jmpcc32((!test_b())); } };; table0F_16[0x80 | 0x4] = function() { { jmpcc16((test_z())); } }; table0F_32[0x80 | 0x4] = function() { { jmpcc32((test_z())); } };; table0F_16[0x80 | 0x5] = function() { { jmpcc16((!test_z())); } }; table0F_32[0x80 | 0x5] = function() { { jmpcc32((!test_z())); } };; table0F_16[0x80 | 0x6] = function() { { jmpcc16((test_be())); } }; table0F_32[0x80 | 0x6] = function() { { jmpcc32((test_be())); } };; table0F_16[0x80 | 0x7] = function() { { jmpcc16((!test_be())); } }; table0F_32[0x80 | 0x7] = function() { { jmpcc32((!test_be())); } };; table0F_16[0x80 | 0x8] = function() { { jmpcc16((test_s())); } }; table0F_32[0x80 | 0x8] = function() { { jmpcc32((test_s())); } };; table0F_16[0x80 | 0x9] = function() { { jmpcc16((!test_s())); } }; table0F_32[0x80 | 0x9] = function() { { jmpcc32((!test_s())); } };; table0F_16[0x80 | 0xA] = function() { { jmpcc16((test_p())); } }; table0F_32[0x80 | 0xA] = function() { { jmpcc32((test_p())); } };; table0F_16[0x80 | 0xB] = function() { { jmpcc16((!test_p())); } }; table0F_32[0x80 | 0xB] = function() { { jmpcc32((!test_p())); } };; table0F_16[0x80 | 0xC] = function() { { jmpcc16((test_l())); } }; table0F_32[0x80 | 0xC] = function() { { jmpcc32((test_l())); } };; table0F_16[0x80 | 0xD] = function() { { jmpcc16((!test_l())); } }; table0F_32[0x80 | 0xD] = function() { { jmpcc32((!test_l())); } };; table0F_16[0x80 | 0xE] = function() { { jmpcc16((test_le())); } }; table0F_32[0x80 | 0xE] = function() { { jmpcc32((test_le())); } };; table0F_16[0x80 | 0xF] = function() { { jmpcc16((!test_le())); } }; table0F_32[0x80 | 0xF] = function() { { jmpcc32((!test_le())); } };; +table0F_16[0x90 | 0x0] = table0F_32[0x90 | 0x0] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_o()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_o()) ^ 1; }; } };;; table0F_16[0x90 | 0x1] = table0F_32[0x90 | 0x1] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_o()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_o()) ^ 1; }; } };;; table0F_16[0x90 | 0x2] = table0F_32[0x90 | 0x2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_b()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_b()) ^ 1; }; } };;; table0F_16[0x90 | 0x3] = table0F_32[0x90 | 0x3] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_b()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_b()) ^ 1; }; } };;; table0F_16[0x90 | 0x4] = table0F_32[0x90 | 0x4] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_z()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_z()) ^ 1; }; } };;; table0F_16[0x90 | 0x5] = table0F_32[0x90 | 0x5] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_z()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_z()) ^ 1; }; } };;; table0F_16[0x90 | 0x6] = table0F_32[0x90 | 0x6] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_be()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_be()) ^ 1; }; } };;; table0F_16[0x90 | 0x7] = table0F_32[0x90 | 0x7] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_be()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_be()) ^ 1; }; } };;; table0F_16[0x90 | 0x8] = table0F_32[0x90 | 0x8] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_s()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_s()) ^ 1; }; } };;; table0F_16[0x90 | 0x9] = table0F_32[0x90 | 0x9] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_s()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_s()) ^ 1; }; } };;; table0F_16[0x90 | 0xA] = table0F_32[0x90 | 0xA] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_p()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_p()) ^ 1; }; } };;; table0F_16[0x90 | 0xB] = table0F_32[0x90 | 0xB] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_p()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_p()) ^ 1; }; } };;; table0F_16[0x90 | 0xC] = table0F_32[0x90 | 0xC] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_l()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_l()) ^ 1; }; } };;; table0F_16[0x90 | 0xD] = table0F_32[0x90 | 0xD] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_l()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_l()) ^ 1; }; } };;; table0F_16[0x90 | 0xE] = table0F_32[0x90 | 0xE] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(test_le()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(test_le()) ^ 1; }; } };;; table0F_16[0x90 | 0xF] = table0F_32[0x90 | 0xF] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { safe_write8(modrm_resolve(modrm_byte), !(!test_le()) ^ 1); } else { reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = !(!test_le()) ^ 1; }; } };;;; +table0F_16[0xA0] = function() { { push16(sreg[reg_fs]); } }; table0F_32[0xA0] = function() { { push32(sreg[reg_fs]); } };; +table0F_16[0xA1] = function() { { switch_seg(reg_fs, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 2; } }; table0F_32[0xA1] = function() { { switch_seg(reg_fs, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 4; } };;; +//op2(0xA1, +// { safe_pop16(sreg[reg_fs]); switch_seg(reg_fs); }, +// { safe_pop32s(sreg[reg_fs]); switch_seg(reg_fs); }); +table0F_16[0xA2] = table0F_32[0xA2] = function() { { cpuid(); } };; +table0F_16[0xA3] = table0F_32[0xA3] = function() { var modrm_byte = read_imm8(); { if(operand_size_32) { if(modrm_byte < 0xC0) { bt_mem(modrm_resolve(modrm_byte), reg32s[modrm_byte >> 3 & 7]); } else { bt_reg(reg32[modrm_byte & 7], reg32[modrm_byte >> 3 & 7] & 31); } } else { if(modrm_byte < 0xC0) { bt_mem(modrm_resolve(modrm_byte), reg16s[modrm_byte >> 2 & 14]); } else { bt_reg(reg16[modrm_byte << 1 & 14], reg16[modrm_byte >> 2 & 14] & 15); } } } };; +table0F_16[0xA4] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shld16(data, reg16[modrm_byte >> 2 & 14], read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shld16(data, reg16[modrm_byte >> 2 & 14], read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shld16(data, reg16[modrm_byte >> 2 & 14], read_imm8() & 31); }; } }; table0F_32[0xA4] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shld32(data, reg32[modrm_byte >> 3 & 7], read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shld32(data, reg32[modrm_byte >> 3 & 7], read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shld32(data, reg32[modrm_byte >> 3 & 7], read_imm8() & 31); }; } };; +table0F_16[0xA5] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shld16(data, reg16[modrm_byte >> 2 & 14], reg8[reg_cl] & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shld16(data, reg16[modrm_byte >> 2 & 14], reg8[reg_cl] & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shld16(data, reg16[modrm_byte >> 2 & 14], reg8[reg_cl] & 31); }; } }; table0F_32[0xA5] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shld32(data, reg32[modrm_byte >> 3 & 7], reg8[reg_cl] & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shld32(data, reg32[modrm_byte >> 3 & 7], reg8[reg_cl] & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shld32(data, reg32[modrm_byte >> 3 & 7], reg8[reg_cl] & 31); }; } };; +table0F_16[0xA6] = table0F_32[0xA6] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0xA7] = table0F_32[0xA7] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +table0F_16[0xA8] = function() { { push16(sreg[reg_gs]); } }; table0F_32[0xA8] = function() { { push32(sreg[reg_gs]); } };; +table0F_16[0xA9] = function() { { switch_seg(reg_gs, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 2; } }; table0F_32[0xA9] = function() { { switch_seg(reg_gs, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 4; } };;; +//op2(0xA9, +// { safe_pop16(sreg[reg_gs]); switch_seg(reg_gs); }, +// { safe_pop32s(sreg[reg_gs]); switch_seg(reg_gs); }); +// rsm +table0F_16[0xAA] = table0F_32[0xAA] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0xAB] = table0F_32[0xAB] = function() { var modrm_byte = read_imm8(); { if(operand_size_32) { if(modrm_byte < 0xC0) { bts_mem(modrm_resolve(modrm_byte), reg32s[modrm_byte >> 3 & 7]); } else { reg32[modrm_byte & 7] = bts_reg(reg32s[modrm_byte & 7], reg32s[modrm_byte >> 3 & 7] & 31); } } else { if(modrm_byte < 0xC0) { bts_mem(modrm_resolve(modrm_byte), reg16s[modrm_byte >> 2 & 14]); } else { reg16[modrm_byte << 1 & 14] = bts_reg(reg16[modrm_byte << 1 & 14], reg16s[modrm_byte >> 2 & 14] & 15); } }; } };; +table0F_16[0xAC] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shrd16(data, reg16[modrm_byte >> 2 & 14], read_imm8() & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shrd16(data, reg16[modrm_byte >> 2 & 14], read_imm8() & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shrd16(data, reg16[modrm_byte >> 2 & 14], read_imm8() & 31); }; } }; table0F_32[0xAC] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shrd32(data, reg32[modrm_byte >> 3 & 7], read_imm8() & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shrd32(data, reg32[modrm_byte >> 3 & 7], read_imm8() & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shrd32(data, reg32[modrm_byte >> 3 & 7], read_imm8() & 31); }; } };; +table0F_16[0xAD] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, shrd16(data, reg16[modrm_byte >> 2 & 14], reg8[reg_cl] & 31)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, shrd16(data, reg16[modrm_byte >> 2 & 14], reg8[reg_cl] & 31)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = shrd16(data, reg16[modrm_byte >> 2 & 14], reg8[reg_cl] & 31); }; } }; table0F_32[0xAD] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, shrd32(data, reg32[modrm_byte >> 3 & 7], reg8[reg_cl] & 31)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, shrd32(data, reg32[modrm_byte >> 3 & 7], reg8[reg_cl] & 31)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = shrd32(data, reg32[modrm_byte >> 3 & 7], reg8[reg_cl] & 31); }; } };; +table0F_16[0xAE] = table0F_32[0xAE] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0xAF] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = (safe_read16(modrm_resolve(modrm_byte)) << 16 >> 16); } else { data = reg16s[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = imul_reg16(reg16s[modrm_byte >> 2 & 14], data); } }; table0F_32[0xAF] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32[modrm_byte >> 3 & 7] = imul_reg32(reg32s[modrm_byte >> 3 & 7], data); } };; +table0F_16[0xB0] = table0F_32[0xB0] = function() { var modrm_byte = read_imm8(); { /* cmpxchg8*/ if(modrm_byte < 0xC0) { var virt_addr = modrm_resolve(modrm_byte); var data = safe_read8(virt_addr); } else data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; cmp8(data, reg8[reg_al]); if(getzf()) { if(modrm_byte < 0xC0) safe_write8(virt_addr, reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]); else reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1]; } else { reg8[reg_al] = data; } } };; +table0F_16[0xB1] = table0F_32[0xB1] = function() { var modrm_byte = read_imm8(); { /* cmpxchg16/32*/ if(operand_size_32) { if(modrm_byte < 0xC0) { var virt_addr = modrm_resolve(modrm_byte); var data = (safe_read32s(virt_addr) >>> 0); } else data = reg32[modrm_byte & 7]; cmp32(data, reg32[reg_eax]); if(getzf()) { if(modrm_byte < 0xC0) safe_write32(virt_addr, reg32[modrm_byte >> 3 & 7]); else reg32[modrm_byte & 7] = reg32[modrm_byte >> 3 & 7]; } else { reg32[reg_eax] = data; } } else { if(modrm_byte < 0xC0) { var virt_addr = modrm_resolve(modrm_byte); var data = safe_read16(virt_addr); } else data = reg16[modrm_byte << 1 & 14]; cmp16(data, reg16[reg_ax]); if(getzf()) { if(modrm_byte < 0xC0) safe_write16(virt_addr, reg16[modrm_byte >> 2 & 14]); else reg16[modrm_byte << 1 & 14] = reg16[modrm_byte >> 2 & 14]; } else { reg16[reg_ax] = data; } } } };; +// lss +table0F_16[0xB2] = table0F_32[0xB2] = function() { var modrm_byte = read_imm8(); { if(modrm_byte >= 0xC0) { raise_exception(6); return; } if(operand_size_32) { lss32(reg_ss, modrm_resolve(modrm_byte), modrm_byte >> 3 & 7); } else { lss16(reg_ss, modrm_resolve(modrm_byte), modrm_byte >> 2 & 14); }; } };; +table0F_16[0xB3] = table0F_32[0xB3] = function() { var modrm_byte = read_imm8(); { if(operand_size_32) { if(modrm_byte < 0xC0) { btr_mem(modrm_resolve(modrm_byte), reg32s[modrm_byte >> 3 & 7]); } else { reg32[modrm_byte & 7] = btr_reg(reg32s[modrm_byte & 7], reg32s[modrm_byte >> 3 & 7] & 31); } } else { if(modrm_byte < 0xC0) { btr_mem(modrm_resolve(modrm_byte), reg16s[modrm_byte >> 2 & 14]); } else { reg16[modrm_byte << 1 & 14] = btr_reg(reg16[modrm_byte << 1 & 14], reg16s[modrm_byte >> 2 & 14] & 15); } }; } };; +// lfs, lgs +table0F_16[0xB4] = table0F_32[0xB4] = function() { var modrm_byte = read_imm8(); { if(modrm_byte >= 0xC0) { raise_exception(6); return; } if(operand_size_32) { lss32(reg_fs, modrm_resolve(modrm_byte), modrm_byte >> 3 & 7); } else { lss16(reg_fs, modrm_resolve(modrm_byte), modrm_byte >> 2 & 14); }; } };; +table0F_16[0xB5] = table0F_32[0xB5] = function() { var modrm_byte = read_imm8(); { if(modrm_byte >= 0xC0) { raise_exception(6); return; } if(operand_size_32) { lss32(reg_gs, modrm_resolve(modrm_byte), modrm_byte >> 3 & 7); } else { lss16(reg_gs, modrm_resolve(modrm_byte), modrm_byte >> 2 & 14); }; } };; +table0F_16[0xB6] = function() { var modrm_byte = read_imm8(); { /* movzx*/ if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg16[modrm_byte >> 2 & 14] = data; } }; table0F_32[0xB6] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8(modrm_resolve(modrm_byte)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg32[modrm_byte >> 3 & 7] = data; } };; +table0F_16[0xB7] = table0F_32[0xB7] = function() { var modrm_byte = read_imm8(); { /* movzx*/ if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg32[modrm_byte >> 3 & 7] = data; } };; +// popcnt +table0F_16[0xB8] = table0F_32[0xB8] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +// UD +table0F_16[0xB9] = table0F_32[0xB9] = function() { { if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();;} };; +table0F_16[0xBA] = table0F_32[0xBA] = function() { var modrm_byte = read_imm8(); { /*dbg_log("BA " + mod + " " + imm8);*/ switch(modrm_byte >> 3 & 7) { case 4: if(operand_size_32) { if(modrm_byte < 0xC0) { bt_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { bt_reg(reg32[modrm_byte & 7], read_imm8() & 31); } } else { if(modrm_byte < 0xC0) { bt_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { bt_reg(reg16[modrm_byte << 1 & 14], read_imm8() & 15); } } break; case 5: if(operand_size_32) { if(modrm_byte < 0xC0) { bts_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { reg32[modrm_byte & 7] = bts_reg(reg32s[modrm_byte & 7], read_imm8() & 31 & 31); } } else { if(modrm_byte < 0xC0) { bts_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { reg16[modrm_byte << 1 & 14] = bts_reg(reg16[modrm_byte << 1 & 14], read_imm8() & 31 & 15); } }; break; case 6: if(operand_size_32) { if(modrm_byte < 0xC0) { btr_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { reg32[modrm_byte & 7] = btr_reg(reg32s[modrm_byte & 7], read_imm8() & 31 & 31); } } else { if(modrm_byte < 0xC0) { btr_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { reg16[modrm_byte << 1 & 14] = btr_reg(reg16[modrm_byte << 1 & 14], read_imm8() & 31 & 15); } }; break; case 7: if(operand_size_32) { if(modrm_byte < 0xC0) { btc_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { reg32[modrm_byte & 7] = btc_reg(reg32s[modrm_byte & 7], read_imm8() & 31 & 31); } } else { if(modrm_byte < 0xC0) { btc_mem(modrm_resolve(modrm_byte), read_imm8() & 31); } else { reg16[modrm_byte << 1 & 14] = btc_reg(reg16[modrm_byte << 1 & 14], read_imm8() & 31 & 15); } }; break; default: dbg_log(modrm_byte >> 3 & 7); if(DEBUG) { dbg_trace(); throw "TODO"; } trigger_ud();; } } };; +table0F_16[0xBB] = table0F_32[0xBB] = function() { var modrm_byte = read_imm8(); { if(operand_size_32) { if(modrm_byte < 0xC0) { btc_mem(modrm_resolve(modrm_byte), reg32s[modrm_byte >> 3 & 7]); } else { reg32[modrm_byte & 7] = btc_reg(reg32s[modrm_byte & 7], reg32s[modrm_byte >> 3 & 7] & 31); } } else { if(modrm_byte < 0xC0) { btc_mem(modrm_resolve(modrm_byte), reg16s[modrm_byte >> 2 & 14]); } else { reg16[modrm_byte << 1 & 14] = btc_reg(reg16[modrm_byte << 1 & 14], reg16s[modrm_byte >> 2 & 14] & 15); } }; } };; +table0F_16[0xBC] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = bsf16(reg16[modrm_byte >> 2 & 14], data); } }; table0F_32[0xBC] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32[modrm_byte >> 3 & 7] = bsf32(reg32[modrm_byte >> 3 & 7], data); } };; +table0F_16[0xBD] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read16(modrm_resolve(modrm_byte)); } else { data = reg16[modrm_byte << 1 & 14]; }; reg16[modrm_byte >> 2 & 14] = bsr16(reg16[modrm_byte >> 2 & 14], data); } }; table0F_32[0xBD] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read32s(modrm_resolve(modrm_byte)); } else { data = reg32s[modrm_byte & 7]; }; reg32[modrm_byte >> 3 & 7] = bsr32(reg32[modrm_byte >> 3 & 7], data); } };; +table0F_16[0xBE] = function() { var modrm_byte = read_imm8(); { /* movsx*/ if(modrm_byte < 0xC0) { var data = safe_read8s(modrm_resolve(modrm_byte)); } else { data = reg8s[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg16[modrm_byte >> 2 & 14] = data; } }; table0F_32[0xBE] = function() { var modrm_byte = read_imm8(); { if(modrm_byte < 0xC0) { var data = safe_read8s(modrm_resolve(modrm_byte)); } else { data = reg8s[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; }; reg32s[modrm_byte >> 3 & 7] = data; } };; +table0F_16[0xBF] = table0F_32[0xBF] = function() { var modrm_byte = read_imm8(); { /* movsx*/ if(modrm_byte < 0xC0) { var data = (safe_read16(modrm_resolve(modrm_byte)) << 16 >> 16); } else { data = reg16s[modrm_byte << 1 & 14]; }; reg32s[modrm_byte >> 3 & 7] = data; } };; +table0F_16[0xC0] = table0F_32[0xC0] = function() { var modrm_byte = read_imm8(); { var data; var addr; if(modrm_byte < 0xC0) { addr = translate_address_write(modrm_resolve(modrm_byte)); data = memory.read8(addr); memory.write8(addr, xadd8(data, modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1)); } else { data = reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1]; reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] = xadd8(data, modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1); }; } };; +table0F_16[0xC1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) === 0xFFF) { phys_addr_high = translate_address_write(virt_addr + 1); data = virt_boundary_read16(phys_addr, phys_addr_high); virt_boundary_write16(phys_addr, phys_addr_high, xadd16(data, modrm_byte >> 2 & 14)); } else { data = memory.read16(phys_addr); memory.write16(phys_addr, xadd16(data, modrm_byte >> 2 & 14)); } } else { data = reg16[modrm_byte << 1 & 14]; reg16[modrm_byte << 1 & 14] = xadd16(data, modrm_byte >> 2 & 14); }; } }; table0F_32[0xC1] = function() { var modrm_byte = read_imm8(); { var data; var virt_addr; var phys_addr; var phys_addr_high; if(modrm_byte < 0xC0) { virt_addr = modrm_resolve(modrm_byte); phys_addr = translate_address_write(virt_addr); if(paging && (virt_addr & 0xFFF) >= 0xFFD) { phys_addr_high = translate_address_write(virt_addr + 3); data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0; virt_boundary_write32(phys_addr, phys_addr_high, xadd32(data, modrm_byte >> 3 & 7)); } else { data = memory.read32s(phys_addr) >>> 0; memory.write32(phys_addr, xadd32(data, modrm_byte >> 3 & 7)); } } else { data = reg32[modrm_byte & 7]; reg32s[modrm_byte & 7] = xadd32(data, modrm_byte >> 3 & 7); }; } };; +table0F_16[0xC2] = table0F_32[0xC2] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xC3] = table0F_32[0xC3] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xC4] = table0F_32[0xC4] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xC5] = table0F_32[0xC5] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xC6] = table0F_32[0xC6] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xC7] = table0F_32[0xC7] = function() { var modrm_byte = read_imm8(); { /* cmpxchg8b*/ var addr = modrm_resolve(modrm_byte); var m64_low = (safe_read32s(addr) >>> 0); var m64_high = (safe_read32s(addr + 4) >>> 0); if(reg32[reg_eax] === m64_low && reg32[reg_edx] === m64_high) { flags |= flag_zero; safe_write32(addr, reg32[reg_ebx]); safe_write32(addr + 4, reg32[reg_ecx]); } else { flags &= ~flag_zero; reg32[reg_eax] = m64_low; reg32[reg_edx] = m64_high; } flags_changed &= ~flag_zero; } };; +table0F_16[0xC8 | 0] = table0F_32[0xC8 | 0] = function() { { bswap(reg_eax); } };; table0F_16[0xC8 | 1] = table0F_32[0xC8 | 1] = function() { { bswap(reg_ecx); } };; table0F_16[0xC8 | 2] = table0F_32[0xC8 | 2] = function() { { bswap(reg_edx); } };; table0F_16[0xC8 | 3] = table0F_32[0xC8 | 3] = function() { { bswap(reg_ebx); } };; table0F_16[0xC8 | 4] = table0F_32[0xC8 | 4] = function() { { bswap(reg_esp); } };; table0F_16[0xC8 | 5] = table0F_32[0xC8 | 5] = function() { { bswap(reg_ebp); } };; table0F_16[0xC8 | 6] = table0F_32[0xC8 | 6] = function() { { bswap(reg_esi); } };; table0F_16[0xC8 | 7] = table0F_32[0xC8 | 7] = function() { { bswap(reg_edi); } };; +table0F_16[0xD0] = table0F_32[0xD0] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD1] = table0F_32[0xD1] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD2] = table0F_32[0xD2] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD3] = table0F_32[0xD3] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD4] = table0F_32[0xD4] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD5] = table0F_32[0xD5] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD6] = table0F_32[0xD6] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD7] = table0F_32[0xD7] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD8] = table0F_32[0xD8] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xD9] = table0F_32[0xD9] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xDA] = table0F_32[0xDA] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xDB] = table0F_32[0xDB] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xDC] = table0F_32[0xDC] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xDD] = table0F_32[0xDD] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xDE] = table0F_32[0xDE] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xDF] = table0F_32[0xDF] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE0] = table0F_32[0xE0] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE1] = table0F_32[0xE1] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE2] = table0F_32[0xE2] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE3] = table0F_32[0xE3] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE4] = table0F_32[0xE4] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE5] = table0F_32[0xE5] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE6] = table0F_32[0xE6] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE7] = table0F_32[0xE7] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE8] = table0F_32[0xE8] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xE9] = table0F_32[0xE9] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xEA] = table0F_32[0xEA] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xEB] = table0F_32[0xEB] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xEC] = table0F_32[0xEC] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xED] = table0F_32[0xED] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xEE] = table0F_32[0xEE] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xEF] = table0F_32[0xEF] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF0] = table0F_32[0xF0] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF1] = table0F_32[0xF1] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF2] = table0F_32[0xF2] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF3] = table0F_32[0xF3] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF4] = table0F_32[0xF4] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF5] = table0F_32[0xF5] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF6] = table0F_32[0xF6] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF7] = table0F_32[0xF7] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF8] = table0F_32[0xF8] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xF9] = table0F_32[0xF9] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xFA] = table0F_32[0xFA] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xFB] = table0F_32[0xFB] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xFC] = table0F_32[0xFC] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xFD] = table0F_32[0xFD] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +table0F_16[0xFE] = table0F_32[0xFE] = function() { { dbg_log("No SSE", LOG_CPU); trigger_ud();} };; +// NSA backdoor instruction +table0F_16[0xFF] = table0F_32[0xFF] = function() { { if(DEBUG) throw "Possible fault: undefined instruction"; trigger_ud();} };; +} diff --git a/src/cpu.macro.js b/src/cpu.macro.js new file mode 100644 index 00000000..5bc82c5e --- /dev/null +++ b/src/cpu.macro.js @@ -0,0 +1,2384 @@ +"use strict"; + +#define read_imm16s() (read_imm16() << 16 >> 16) +#define read_imm32() (read_imm32s() >>> 0) + +#define safe_read16s(addr) (safe_read16(addr) << 16 >> 16) +#define safe_read32(addr) (safe_read32s(addr) >>> 0) + +var debug = {}; + + +/** @constructor */ +function v86() +{ + +var cpu = this; + +this.run = function() +{ + if(!running) + { + cpu_run(); + } +} + +this.stop = cpu_stop; +this.init = cpu_init; +this.restart = cpu_restart; + +this.dev = {}; + +this.instr_counter = 0; + + +var + segment_is_null, + segment_offsets, + segment_limits, + segment_infos, + + /* + * Translation Lookaside Buffer + */ + tlb_user_read, + tlb_user_write, + tlb_system_read, + tlb_system_write, + + /* + * Information about which pages are cached in the tlb. + * By bit: + * 0 system, read + * 1 system, write + * 2 user, read + * 3 user, write + */ + tlb_info, + + /* + * Same as tlb_info, except it only contains global pages + */ + tlb_info_global, + + /** + * Wheter or not in protected mode + * @type {boolean} + */ + protected_mode, + + /** + * interrupt descriptor table + * @type {number} + */ + idtr_size, + /** @type {number} */ + idtr_offset, + + /** + * global descriptor table register + * @type {number} + */ + gdtr_size, + /** @type {number} */ + gdtr_offset, + + /** + * local desciptor table + * @type {number} + */ + ldtr_size, + /** @type {number} */ + ldtr_offset, + + /** + * task register + * @type {number} + */ + tsr_size, + /** @type {number} */ + tsr_offset, + + /* + * whether or not a page fault occured + */ + page_fault, + + /** @type {number} */ + cr0, + /** @type {number} */ + cr2, + /** @type {number} */ + cr3, + /** @type {number} */ + cr4, + + // current privilege level + /** @type {number} */ + cpl, + + // paging enabled + /** @type {boolean} */ + paging, + + // if false, pages are 4 KiB, else 4 Mib + /** @type {number} */ + page_size_extensions, + + // current operand/address/stack size + /** @type {boolean} */ + is_32, + /** @type {boolean} */ + operand_size_32, + /** @type {boolean} */ + stack_size_32, + + /** + * Cycles since last cpu reset, used by rdtsc instruction + * @type {number} + */ + cpu_timestamp_counter, + + /** @type {number} */ + previous_ip, + + /** + * wheter or not in step mode + * used for debugging + * @type {boolean} + */ + step_mode, + + /** + * was the last instruction a hlt + * @type {boolean} + */ + in_hlt, + + /** @type {VGAScreen} */ + vga, + + /** @type {PS2} */ + ps2, + + /** + * Programmable interval timer + * @type {PIT} + */ + timer, + + + /** + * Real Time Clock + * @type {RTC} + */ + rtc, + + /** + * Floppy Disk controller + * @type {FloppyController} + */ + fdc, + + /** + * Serial controller + * @type {UART} + */ + uart, + + /** @type {boolean} */ + running, + + /** @type {boolean} */ + stopped, + + /** @type {number} */ + loop_counter, + + /** @type {Memory} */ + memory, + + /** @type {(FPU|NoFPU)} */ + fpu, + + + /** + * Programmable interrupt controller + * @type {PIC} + */ + pic, + + /** + * @type {IO} + */ + io, + + /** + * @type {PCI} + */ + pci, + + /** + * @type {CDRom} + */ + cdrom, + + /** + * @type {HDD} + */ + hda, + + /** + * @type {HDD} + */ + hdb, + + /** + * Direct Memory Access Controller + * @type {DMA} + */ + dma, + + translate_address_read, + translate_address_write, + + ops, + + /** @type {boolean} */ + address_size_32, + + /** @type {number} */ + instruction_pointer, + + /** @type {number} */ + last_virt_eip, + + /** @type {number} */ + eip_phys, + + /** @type {number} */ + last_virt_esp, + + /** @type {number} */ + esp_phys, + + + // current state of prefixes + segment_prefix, + + + /** @type {boolean} */ + repeat_string_prefix, + + /** @type {boolean} */ + repeat_string_type, + + /** @type {number} */ + last_result, + + /** @type {number} */ + flags, + + /** + * bitmap of flags which are not updated in the flags variable + * changed by arithmetic instructions, so only relevant to arithmetic flags + * @type {number} + */ + flags_changed, + + /** + * the last 2 operators and the result and size of the last arithmetic operation + * @type {number} + */ + last_op1, + /** @type {number} */ + last_op2, + /** @type {number} */ + last_op_size, + + + // registers + reg32, + reg32s, + reg16, + reg16s, + reg8, + reg8s, + + sreg, + + + // sp or esp, depending on stack size attribute + stack_reg, + reg_vsp, + reg_vbp, + + // reg16 or reg32, depending on address size attribute + regv, + reg_vcx, + reg_vsi, + reg_vdi, + + // functions that are set depending on whether paging is enabled or not + read_imm8, + read_imm8s, + read_imm16, + read_imm32s, + + safe_read8, + safe_read8s, + safe_read16, + safe_read32s, + + get_esp_read, + get_esp_write, + + + table, + table0F, + + modrm_resolve, + + + current_settings +; + + +function cpu_run() +{ + if(stopped) + { + stopped = running = false; + return; + } + + running = true; + + try { + do_run(); + } + catch(e) + { + if(e === 0xDEADBEE) + { + // A legit CPU exception (for instance, a page fault happened) + // call_interrupt_vector has already been called at this point, + // so we just need to reset some state + + page_fault = false; + repeat_string_prefix = false; + segment_prefix = -1; + + address_size_32 = is_32; + update_address_size(); + operand_size_32 = is_32; + update_operand_size(); + + cpu_run(); + } + else + { + throw e; + } + } +}; + +function cpu_stop() +{ + if(running) + { + stopped = true; + } +} + +function cpu_restart() +{ + var was_running = running; + + stopped = true; + running = false; + + setTimeout(function() + { + ps2.destroy(); + vga.destroy(); + + cpu_init(current_settings); + + if(was_running) + { + cpu_run(); + } + }, 10); +} + +function cpu_reboot_internal() +{ + dbg_assert(running); + + ps2.destroy(); + vga.destroy(); + + cpu_init(current_settings); + + throw 0xDEADBEE; +} + +function cpu_init(settings) +{ + // see browser/main.js or node/main.js + if(typeof set_tick !== "undefined") + { + set_tick(cpu_run); + } + + current_settings = settings; + + cpu.memory = memory = new Memory(new ArrayBuffer(memory_size), memory_size); + + segment_is_null = new Uint8Array(8); + segment_limits = new Uint32Array(8); + segment_infos = new Uint32Array(8); + segment_offsets = new Int32Array(8); + + // 16 MB in total + tlb_user_read = new Int32Array(1 << 20); + tlb_user_write = new Int32Array(1 << 20); + tlb_system_read = new Int32Array(1 << 20); + tlb_system_write = new Int32Array(1 << 20); + + tlb_info = new Uint8Array(1 << 20); + tlb_info_global = new Uint8Array(1 << 20); + + + reg32 = new Uint32Array(8); + reg32s = new Int32Array(reg32.buffer); + reg16 = new Uint16Array(reg32.buffer); + reg16s = new Int16Array(reg32.buffer); + reg8 = new Uint8Array(reg32.buffer); + reg8s = new Int8Array(reg32.buffer); + sreg = new Uint16Array(8); + protected_mode = false; + + idtr_size = 0; + idtr_offset = 0; + + gdtr_size = 0; + gdtr_offset = 0; + + ldtr_size = 0; + ldtr_offset = 0; + + tsr_size = 0; + tsr_offset = 0; + + page_fault = false; + cr0 = 0; + cr2 = 0; + cr3 = 0; + cr4 = 0; + cpl = 0; + paging = false; + page_size_extensions = 0; + is_32 = false; + operand_size_32 = false; + stack_size_32 = false; + address_size_32 = false; + + paging_changed(); + + update_operand_size(); + update_address_size(); + + stack_reg = reg16; + reg_vsp = reg_sp; + reg_vbp = reg_bp; + + cpu_timestamp_counter = 0; + previous_ip = 0; + step_mode = false; + in_hlt = false; + + running = false; + stopped = false; + loop_counter = 20; + + translate_address_read = translate_address_disabled; + translate_address_write = translate_address_disabled; + + segment_prefix = -1; + repeat_string_prefix = false; + last_result = 0; + flags = flags_default; + flags_changed = 0; + last_op1 = 0; + last_op2 = 0; + last_op_size = 0; + + + + if(settings.bios) + { + // load bios + var data = new Uint8Array(settings.bios), + start = 0x100000 - settings.bios.byteLength; + + for(var i = 0; i < settings.bios.byteLength; i++) + { + memory.mem8[start + i] = data[i]; + } + + if(settings.vga_bios) + { + // load vga bios + data = new Uint8Array(settings.vga_bios); + + for(var i = 0; i < settings.vga_bios.byteLength; i++) + { + memory.mem8[0xC0000 + i] = data[i]; + } + } + + // ip initial value + instruction_pointer = 0xFFFF0; + + // ss and sp inital value + switch_seg(reg_ss, 0x30); + reg16[reg_sp] = 0x100; + } + else if(settings.linux) + { + instruction_pointer = 0x10000; + + memory.write_blob(new Uint8Array(settings.linux.vmlinux), 0x100000); + memory.write_blob(new Uint8Array(settings.linux.linuxstart), instruction_pointer); + + if(settings.linux.root) + { + memory.write_blob(new Uint8Array(settings.linux.root), 0x00400000); + reg32[reg_ebx] = settings.linux.root.byteLength; + } + + memory.write_string(settings.linux.cmdline, 0xF800); + + reg32[reg_eax] = memory_size; + reg32[reg_ecx] = 0xF800; + + switch_seg(reg_cs, 0); + switch_seg(reg_ss, 0); + switch_seg(reg_ds, 0); + switch_seg(reg_es, 0); + switch_seg(reg_gs, 0); + switch_seg(reg_fs, 0); + + is_32 = true; + address_size_32 = true; + operand_size_32 = true; + stack_size_32 = true; + protected_mode = true; + + update_operand_size(); + update_address_size(); + + regv = reg32; + reg_vsp = reg_esp; + reg_vbp = reg_ebp; + + cr0 = 1; + } + else + { + switch_seg(reg_ss, 0x30); + reg16[reg_sp] = 0x100; + + instruction_pointer = 0; + } + + + cpu.dev = {}; + + if(settings.load_devices) + { + var devapi = { + memory: memory, + reboot: cpu_reboot_internal, + }; + + devapi.io = cpu.dev.io = io = new IO(); + devapi.pic = pic = new PIC(devapi, call_interrupt_vector, handle_irqs); + devapi.pci = pci = new PCI(devapi); + devapi.dma = dma = new DMA(devapi); + + + cpu.dev.vga = vga = new VGAScreen(devapi, settings.screen_adapter) + cpu.dev.ps2 = ps2 = new PS2(devapi, settings.keyboard_adapter, settings.mouse_adapter); + + //fpu = new NoFPU(); + fpu = new FPU(devapi); + + uart = new UART(devapi); + + cpu.dev.fdc = fdc = new FloppyController(devapi, settings.floppy_disk); + + if(settings.cdrom_disk) + { + cpu.dev.cdrom = cdrom = new CDRom(devapi, settings.cdrom_disk); + } + + if(settings.hda_disk) + { + cpu.dev.hda = hda = new HDD(devapi, settings.hda_disk, 0); + } + if(settings.hdb_disk) + { + cpu.dev.hdb = hdb = new HDD(devapi, settings.hdb_disk, 1); + } + + timer = new PIT(devapi); + rtc = new RTC(devapi, fdc.type); + } + + if(DEBUG) + { + // used for debugging + ops = new CircularQueue(30000); + + if(typeof window !== "undefined") + { + window.memory = memory; + window.vga = vga; + } + + if(io) + { + // write seabios debug output to console + var seabios_debug = ""; + + io.register_write(0x402, function(out_byte) + { + // seabios debug + // + if(out_byte === 10) + { + dbg_log(seabios_debug, LOG_BIOS); + seabios_debug = ""; + } + else + { + seabios_debug += String.fromCharCode(out_byte); + } + }); + } + } +} + +function do_run() +{ + var + /** + * @type {number} + */ + now, + start = Date.now(); + + vga.timer(start); + + // outer loop: + // runs cycles + timers + for(var j = loop_counter; j--;) + { + // inner loop: + // runs only cycles + for(var k = LOOP_COUNTER; k--;) + { + previous_ip = instruction_pointer; + + cycle(); + cpu_timestamp_counter++; + } + + now = Date.now(); + timer.timer(now); + rtc.timer(now); + } + + cpu.instr_counter += loop_counter * LOOP_COUNTER; + + if(now - start > TIME_PER_FRAME) + { + loop_counter--; + } + else + { + loop_counter++; + } + + next_tick(); +} + +// do_run must not be inlined into cpu_run, because then more code +// is in the deoptimized try-catch. +// This trick is a bit ugly, but it works without further complication. +if(typeof window !== "undefined") +{ + window.__no_inline = do_run; +} + + +/** + * execute a single instruction cycle on the cpu + * this includes reading all prefixes and the whole instruction + */ +function cycle() +{ + var opcode = read_imm8(); + + logop(instruction_pointer - 1, opcode); + + // call the instruction + table[opcode](); + + // TODO + //if(flags & flag_trap) + //{ + // + //} +} + +cpu.cycle = function() +{ + table[read_imm8()](); +} + +function cr0_changed() +{ + //protected_mode = (cr0 & 1) === 1; + //dbg_log("cr0 = " + h(cr0)); + + var new_paging = (cr0 & 0x80000000) !== 0; + + if(fpu.is_fpu) + { + cr0 &= ~4; + } + else + { + cr0 |= 4; + } + + if(new_paging !== paging) + { + paging = new_paging; + + paging_changed(); + } +} + +function paging_changed() +{ + var table = paging ? pe_functions : npe_functions; + + read_imm8 = table.read_imm8; + read_imm8s = table.read_imm8s; + read_imm16 = table.read_imm16; + read_imm32s = table.read_imm32s; + + safe_read8 = table.safe_read8; + safe_read8s = table.safe_read8s; + safe_read16 = table.safe_read16; + safe_read32s = table.safe_read32s; + + get_esp_read = table.get_esp_read; + get_esp_write = table.get_esp_write; + + + // set translate_address_* depending on cpl and paging + cpl_changed(); +} + +function cpl_changed() +{ + last_virt_eip = -1; + last_virt_esp = -1; + + if(!paging) + { + translate_address_write = translate_address_disabled; + translate_address_read = translate_address_disabled; + } + else if(cpl) + { + translate_address_write = translate_address_user_write; + translate_address_read = translate_address_user_read; + } + else + { + translate_address_write = translate_address_system_write; + translate_address_read = translate_address_system_read; + } +} + + +// functions that are used when paging is disabled +var npe_functions = { + get_esp_read: get_esp_npe, + get_esp_write: get_esp_npe, + + read_imm8: function() + { + return memory.mem8[instruction_pointer++]; + }, + + read_imm8s: function() + { + return memory.mem8s[instruction_pointer++]; + }, + + read_imm16 : function() + { + var data16 = memory.read16(instruction_pointer); + instruction_pointer = instruction_pointer + 2 | 0; + return data16; + }, + + read_imm32s : function() + { + var data32 = memory.read32s(instruction_pointer); + instruction_pointer = instruction_pointer + 4 | 0; + return data32; + }, + + safe_read8 : function(addr) { return memory.read8(addr) }, + safe_read8s : function(addr) { return memory.read8s(addr); }, + safe_read16 : function(addr) { return memory.read16(addr); }, + safe_read32s : function(addr) { return memory.read32s(addr); }, +}; + +// functions that are used when paging is enabled +var pe_functions = +{ + get_esp_read: get_esp_pe_read, + get_esp_write: get_esp_pe_write, + + read_imm8 : function() + { + if((instruction_pointer & ~0xFFF) ^ last_virt_eip) + { + eip_phys = translate_address_read(instruction_pointer) ^ instruction_pointer; + last_virt_eip = instruction_pointer & ~0xFFF; + } + + // memory.read8 inlined under the assumption that code never runs in + // memory-mapped io + return memory.mem8[eip_phys ^ instruction_pointer++]; + }, + + read_imm8s : function() + { + if((instruction_pointer & ~0xFFF) ^ last_virt_eip) + { + eip_phys = translate_address_read(instruction_pointer) ^ instruction_pointer; + last_virt_eip = instruction_pointer & ~0xFFF; + } + + return memory.mem8s[eip_phys ^ instruction_pointer++]; + }, + + read_imm16 : function() + { + // Two checks in one comparison: + // 1. Did the high 20 bits of eip change + // or 2. Are the low 12 bits of eip 0xFFF (and this read crosses a page boundary) + if((instruction_pointer ^ last_virt_eip) > 0xFFE) + { + return read_imm8() | read_imm8() << 8; + } + + var data16 = memory.read16(eip_phys ^ instruction_pointer); + instruction_pointer = instruction_pointer + 2 | 0; + + return data16; + }, + + + read_imm32s : function() + { + // Analogue to the above comment + if((instruction_pointer ^ last_virt_eip) > 0xFFC) + { + return read_imm16() | read_imm16() << 16; + } + + var data32 = memory.read32s(eip_phys ^ instruction_pointer); + instruction_pointer = instruction_pointer + 4 | 0; + + return data32; + }, + + safe_read8 : do_safe_read8, + safe_read8s : do_safe_read8s, + safe_read16 : do_safe_read16, + safe_read32s : do_safe_read32s, +}; + + +// read word from a page boundary, given 2 physical addresses +function virt_boundary_read16(low, high) +{ + dbg_assert((low & 0xFFF) === 0xFFF); + dbg_assert((high & 0xFFF) === 0); + + return memory.read8(low) | memory.read8(high) << 8; +} + +// read doubleword from a page boundary, given 2 addresses +function virt_boundary_read32s(low, high) +{ + dbg_assert((low & 0xFFF) >= 0xFFD); + dbg_assert((high - 3 & 0xFFF) === (low & 0xFFF)); + + var result = memory.read8(low) | memory.read8(high) << 24; + + if(low & 1) + { + if(low & 2) + { + // 0xFFF + result |= memory.read8(high - 2) << 8 | + memory.read8(high - 1) << 16; + } + else + { + // 0xFFD + result |= memory.read8(low + 1) << 8 | + memory.read8(low + 2) << 16; + } + } + else + { + // 0xFFE + result |= memory.read8(low + 1) << 8 | + memory.read8(high - 1) << 16; + } + + return result; +} + +function virt_boundary_write16(low, high, value) +{ + dbg_assert((low & 0xFFF) === 0xFFF); + dbg_assert((high & 0xFFF) === 0); + + memory.write8(low, value); + memory.write8(high, value >> 8); +} + +function virt_boundary_write32(low, high, value) +{ + dbg_assert((low & 0xFFF) >= 0xFFD); + dbg_assert((high - 3 & 0xFFF) === (low & 0xFFF)); + + memory.write8(low, value); + memory.write8(high, value >> 24); + + if(low & 1) + { + if(low & 2) + { + // 0xFFF + memory.write8(high - 2, value >> 8); + memory.write8(high - 1, value >> 16); + } + else + { + // 0xFFD + memory.write8(low + 1, value >> 8); + memory.write8(low + 2, value >> 16); + } + } + else + { + // 0xFFE + memory.write8(low + 1, value >> 8); + memory.write8(high - 1, value >> 16); + } +} + +// safe_read, safe_write +// read or write byte, word or dword to the given *virtual* address, +// and be safe on page boundaries + +function do_safe_read8(addr) +{ + return memory.read8(translate_address_read(addr)); +} + +function do_safe_read8s(addr) +{ + return memory.read8s(translate_address_read(addr)); +} + +function do_safe_read16(addr) +{ + if((addr & 0xFFF) === 0xFFF) + { + return safe_read8(addr) | safe_read8(addr + 1) << 8; + } + else + { + return memory.read16(translate_address_read(addr)); + } +} + +function do_safe_read32s(addr) +{ + if((addr & 0xFFF) >= 0xFFD) + { + return safe_read16(addr) | safe_read16(addr + 2) << 16; + } + else + { + return memory.read32s(translate_address_read(addr)); + } +} + +function safe_write8(addr, value) +{ + memory.write8(translate_address_write(addr), value); +} + +function safe_write16(addr, value) +{ + var phys_low = translate_address_write(addr); + + if((addr & 0xFFF) === 0xFFF) + { + virt_boundary_write16(phys_low, translate_address_write(addr + 1), value); + } + else + { + memory.write16(phys_low, value); + } +} + +function safe_write32(addr, value) +{ + var phys_low = translate_address_write(addr); + + if((addr & 0xFFF) >= 0xFFD) + { + virt_boundary_write32(phys_low, translate_address_write(addr + 3), value); + } + else + { + memory.write32(phys_low, value); + } +} + +// read 2 or 4 byte from ip, depending on address size attribute +function read_moffs() +{ + if(address_size_32) + { + return get_seg_prefix(reg_ds) + read_imm32s(); + } + else + { + return get_seg_prefix(reg_ds) + read_imm16(); + } +} + +function get_flags() +{ + return (flags & ~flags_all) | getcf() | getpf() | getaf() | getzf() | getsf() | getof(); +} + +function load_flags() +{ + flags = get_flags(); + flags_changed = 0; +} + +// get esp with paging disabled +function get_esp_npe(mod) +{ + if(stack_size_32) + { + return get_seg(reg_ss) + stack_reg[reg_vsp] + mod; + } + else + { + return get_seg(reg_ss) + (stack_reg[reg_vsp] + mod & 0xFFFF); + } +} + +function get_esp_pe_read(mod) +{ + // UNSAFE: stack_reg[reg_vsp]+mod needs to be masked in 16 bit mode + // (only if paging is enabled and in 16 bit mode) + + return translate_address_read(get_seg(reg_ss) + stack_reg[reg_vsp] + mod); +} + +function get_esp_pe_write(mod) +{ + return translate_address_write(get_seg(reg_ss) + stack_reg[reg_vsp] + mod); +} + + +/* + * returns the "real" instruction pointer, + * without segment offset + */ +function get_real_ip() +{ + return instruction_pointer - get_seg(reg_cs); +} + +function call_interrupt_vector(interrupt_nr, is_software_int, error_code) +{ + if(DEBUG) + { + ops.add(instruction_pointer); + ops.add("-- INT " + h(interrupt_nr)); + ops.add(1); + } + + //if(interrupt_nr == 0x13) + //{ + // dbg_log("INT 13"); + // dbg_log(memory.read8(ch) + "/" + memory.read8(dh) + "/" + memory.read8(cl) + " |" + memory.read8(al)); + // dbg_log("=> ", h(memory.read16(es) * 16 + memory.read16(bx))); + //} + + + //if(interrupt_nr == 0x10) + //{ + // dbg_log("int10 ax=" + h(reg16[reg_ax], 4) + " '" + String.fromCharCode(reg8[reg_al]) + "'"); + // dump_regs_short(); + // if(reg8[reg_ah] == 0xe) vga.tt_write(reg8[reg_al]); + //} + + //dbg_log("int " + h(interrupt_nr)); + + //if(interrupt_nr === 0x13) + //{ + // dump_regs_short(); + //} + + //if(interrupt_nr === 0x80) + //{ + // dbg_log("linux syscall"); + // dump_regs_short(); + //} + + + if(interrupt_nr === 14) + { + dbg_log("int14 error_code=" + error_code + " cr2=" + h(cr2) + " prev=" + h(previous_ip) + " cpl=" + cpl, LOG_CPU); + } + + + if(in_hlt) + { + // return to the instruction following the hlt + instruction_pointer++; + in_hlt = false; + } + + if(protected_mode) + { + if((interrupt_nr << 3 | 7) > idtr_size) + { + dbg_log(interrupt_nr, LOG_CPU); + dbg_trace(); + throw unimpl("#GP handler"); + } + + + var addr = idtr_offset + (interrupt_nr << 3) | 0; + dbg_assert((addr & 0xFFF) < 0xFF8); + + if(paging) + { + addr = translate_address_system_read(addr); + } + + var base = memory.read16(addr) | memory.read16(addr + 6) << 16, + selector = memory.read16(addr + 2), + type = memory.read8(addr + 5), + dpl = type >> 5 & 3, + is_trap; + + if((type & 128) === 0) + { + // present bit not set + throw unimpl("#NP handler"); + } + + if(is_software_int && dpl < cpl) + { + trigger_gp(interrupt_nr << 3 | 2); + } + + type &= 31; + + if(type === 14) + { + is_trap = false; + } + else if(type === 15) + { + is_trap = true; + } + else if(type === 5) + { + throw unimpl("call int to task gate"); + } + else if(type === 6) + { + throw unimpl("16 bit interrupt gate"); + } + else if(type === 7) + { + throw unimpl("16 bit trap gate"); + } + else + { + // invalid type + dbg_trace(); + dbg_log("invalid type: " + h(type)); + dbg_log(h(addr) + " " + h(base) + " " + h(selector)); + throw unimpl("#GP handler"); + } + + var info = lookup_segment_selector(selector); + + if(info.is_null) + { + dbg_log("is null"); + throw unimpl("#GP handler"); + } + if(info === -1) + { + dbg_log("is -1"); + throw unimpl("#GP handler"); + } + if(!info.is_executable || info.dpl > cpl) + { + dbg_log("not exec"); + throw unimpl("#GP handler"); + } + if(!info.is_present) + { + dbg_log("not present"); + throw unimpl("#NP handler"); + } + + if(flags & flag_vm) + { + throw unimpl("VM flag"); + } + + + if(!info.dc_bit && info.dpl < cpl) + { + // inter privilege level interrupt + + var tss_stack_addr = (info.dpl << 3) + 4; + + if(tss_stack_addr + 5 > tsr_size) + { + throw unimpl("#TS handler"); + } + + tss_stack_addr += tsr_offset; + + if(paging) + { + tss_stack_addr = translate_address_system_read(tss_stack_addr); + } + + var new_esp = memory.read32s(tss_stack_addr), + new_ss = memory.read16(tss_stack_addr + 4), + ss_info = lookup_segment_selector(new_ss); + + if(ss_info.is_null) + { + throw unimpl("#TS handler"); + } + if(ss_info.rpl !== info.dpl) + { + throw unimpl("#TS handler"); + } + if(ss_info.dpl !== info.dpl || !ss_info.rw_bit) + { + throw unimpl("#TS handler"); + } + if(!ss_info.is_present) + { + throw unimpl("#TS handler"); + } + + var old_esp = reg32s[reg_esp], + old_ss = sreg[reg_ss]; + + reg32[reg_esp] = new_esp; + sreg[reg_ss] = new_ss; + + cpl = info.dpl; + //dbg_log("int" + h(interrupt_nr, 2) +" from=" + h(instruction_pointer, 8) + // + " cpl=" + cpl + " old ss:esp=" + h(old_ss,4) + ":" + h(old_esp,8), LOG_CPU); + + cpl_changed(); + + push32(old_ss); + push32(old_esp); + } + else if(info.dc_bit || info.dpl === cpl) + { + // intra privilege level interrupt + + //dbg_log("int" + h(interrupt_nr, 2) +" from=" + h(instruction_pointer, 8), LOG_CPU); + } + + + load_flags(); + push32(flags); + + push32(sreg[reg_cs]); + push32(get_real_ip()); + //dbg_log("pushed eip to " + h(reg32[reg_esp], 8), LOG_CPU); + + + if(error_code !== false) + { + dbg_assert(typeof error_code == "number"); + push32(error_code); + } + + + // TODO + sreg[reg_cs] = selector; + //switch_seg(reg_cs); + + //dbg_log("current esp: " + h(reg32[reg_esp]), LOG_CPU); + //dbg_log("call int " + h(interrupt_nr) + " from " + h(instruction_pointer) + " to " + h(base) + " with error_code=" + error_code, LOG_CPU); + + instruction_pointer = get_seg(reg_cs) + base | 0; + + //dbg_log("int" + h(interrupt_nr) + " trap=" + is_trap + " if=" + +!!(flags & flag_interrupt)); + + if(!is_trap) + { + // clear int flag for interrupt gates + flags &= ~flag_interrupt; + } + else + { + handle_irqs(); + } + } + else + { + // call 4 byte cs:ip interrupt vector from ivt at memory 0 + + //logop(instruction_pointer, "callu " + h(interrupt_nr) + "." + h(memory.read8(ah))); + //dbg_log("callu " + h(interrupt_nr) + "." + h(memory.read8(ah)) + " at " + h(instruction_pointer, 8), LOG_CPU, LOG_CPU); + + // push flags, cs:ip + load_flags(); + push16(flags); + push16(sreg[reg_cs]); + push16(get_real_ip()); + + flags = flags & ~flag_interrupt; + + switch_seg(reg_cs, memory.read16((interrupt_nr << 2) + 2)); + instruction_pointer = get_seg(reg_cs) + memory.read16(interrupt_nr << 2) | 0; + } +} + +// assumes ip to point to the byte before the next instruction +function raise_exception(interrupt_nr) +{ + if(DEBUG) + { + // warn about error + dbg_log("Exception " + h(interrupt_nr), LOG_CPU); + dbg_trace(); + //throw "exception: " + interrupt_nr; + } + + + // TODO + + call_interrupt_vector(interrupt_nr, false, false); + throw 0xDEADBEE; +} + +function raise_exception_with_code(interrupt_nr, error_code) +{ + if(DEBUG) + { + dbg_log("Exception " + h(interrupt_nr) + " err=" + h(error_code), LOG_CPU); + dbg_trace(); + //throw "exception: " + interrupt_nr; + } + + call_interrupt_vector(interrupt_nr, false, error_code); + throw 0xDEADBEE; +} + +function trigger_de() +{ + instruction_pointer = previous_ip; + raise_exception(0); +} + +function trigger_ud() +{ + instruction_pointer = previous_ip; + raise_exception(6); +} + +function trigger_gp(code) +{ + instruction_pointer = previous_ip; + raise_exception_with_code(13, code); +} + +function trigger_np(code) +{ + instruction_pointer = previous_ip; + raise_exception_with_code(11, code); +} + +function trigger_ss(code) +{ + instruction_pointer = previous_ip; + raise_exception_with_code(12, code); +} + + +/** + * @param {number} seg + */ +function seg_prefix(seg) +{ + dbg_assert(segment_prefix === -1); + dbg_assert(seg >= 0 && seg <= 5); + + segment_prefix = seg; + table[read_imm8()](); + segment_prefix = -1; +} + +/** + * Get segment base by prefix or default + * @param {number} default_segment + */ +function get_seg_prefix(default_segment /*, offset*/) +{ + if(segment_prefix === -1) + { + return get_seg(default_segment /*, offset*/); + } + else + { + return get_seg(segment_prefix /*, offset*/); + } +} + +/** + * Get segment base + * @param {number} segment + */ +function get_seg(segment /*, offset*/) +{ + dbg_assert(segment >= 0 && segment < 8); + dbg_assert(protected_mode || (sreg[segment] << 4) == segment_offsets[segment]); + + if(protected_mode) + { + if(segment_is_null[segment]) + { + // trying to access null segment + if(DEBUG) + { + dbg_log("Load null segment: " + h(segment), LOG_CPU); + throw unimpl("#GP handler"); + } + } + + // TODO: + // - validate segment limits + // - validate if segment is writable + // - set accessed bit + } + + return segment_offsets[segment]; +} + +function arpl(seg, r16) +{ + flags_changed &= ~flag_zero; + + if((seg & 3) < (reg16[r16] & 3)) + { + flags |= flag_zero; + return seg & ~3 | reg16[r16] & 3; + } + else + { + flags &= ~flag_zero; + return seg; + } +} + + +function handle_irqs() +{ + if(pic) + { + if((flags & flag_interrupt) && !page_fault) + { + pic.handle_irqs(); + } + } +} + +// any two consecutive 8-bit ports can be treated as a 16-bit port; +// and four consecutive 8-bit ports can be treated as a 32-bit port +// +// http://css.csail.mit.edu/6.858/2012/readings/i386/s08_01.htm + +function out8(port_addr, out_byte) +{ + if(privileges_for_io()) + { + io.port_write(port_addr, out_byte); + } + else + { + trigger_gp(0); + } +} + +function out16(port_addr, out_word) +{ + if(privileges_for_io()) + { + io.port_write(port_addr, out_word & 0xFF); + io.port_write(port_addr + 1, out_word >> 8 & 0xFF); + } + else + { + trigger_gp(0); + } +} + +function out32(port_addr, out_dword) +{ + if(privileges_for_io()) + { + io.port_write(port_addr, out_dword & 0xFF); + io.port_write(port_addr + 1, out_dword >> 8 & 0xFF); + io.port_write(port_addr + 2, out_dword >> 16 & 0xFF); + io.port_write(port_addr + 3, out_dword >> 24 & 0xFF); + } + else + { + trigger_gp(0); + } +} + +function in8(port_addr) +{ + if(privileges_for_io()) + { + return io.port_read(port_addr); + } + else + { + trigger_gp(0); + } +} + +function in16(port_addr) +{ + if(privileges_for_io()) + { + return io.port_read(port_addr) | + io.port_read(port_addr + 1) << 8; + } + else + { + trigger_gp(0); + } +} + +function in32(port_addr) +{ + if(privileges_for_io()) + { + return io.port_read(port_addr) | + io.port_read(port_addr + 1) << 8 | + io.port_read(port_addr + 2) << 16 | + io.port_read(port_addr + 3) << 24; + } + else + { + trigger_gp(0); + } +} + + +/** + * returns the current iopl from the eflags register + */ +function getiopl() +{ + return flags >> 12 & 3; +} + +function privileges_for_io() +{ + return !protected_mode || cpl <= getiopl(); +} + +function cpuid() +{ + // cpuid + // TODO: Fill in with less bogus values + + // http://lxr.linux.no/linux+%2a/arch/x86/include/asm/cpufeature.h + + var id = reg32s[reg_eax]; + + if((id & 0x7FFFFFFF) === 0) + { + reg32[reg_eax] = 2; + + if(id === 0) + { + reg32[reg_ebx] = 0x756E6547; // Genu + reg32[reg_edx] = 0x49656E69; // ineI + reg32[reg_ecx] = 0x6C65746E; // ntel + } + } + else if(id === 1) + { + // pentium + reg32[reg_eax] = 0x513; + reg32[reg_ebx] = 0; + reg32[reg_ecx] = 0; + reg32[reg_edx] = fpu.is_fpu | 1 << 3 | 1 << 4 | 1 << 8| 1 << 13 | 1 << 15; + } + else if(id === 2) + { + // Taken from http://siyobik.info.gf/main/reference/instruction/CPUID + reg32[reg_eax] = 0x665B5001; + reg32[reg_ebx] = 0; + reg32[reg_ecx] = 0; + reg32[reg_edx] = 0x007A7000; + } + else if(id === (0x80860000 | 0)) + { + reg32[reg_eax] = 0; + reg32[reg_ebx] = 0; + reg32[reg_ecx] = 0; + reg32[reg_edx] = 0; + } + else if((id & 0xF0000000) === ~~0x40000000) + { + // Invalid + } + else + { + if(DEBUG) throw "cpuid: unimplemented eax: " + h(id); + } +} + +/** + * Update the flags register depending on iopl and cpl + */ +function update_flags(new_flags) +{ + if(cpl === 0 || !protected_mode) + { + // can update all flags + flags = new_flags; + } + else if(cpl <= getiopl()) + { + // cpl != 0 and iopl <= cpl + // can update interrupt flag but not iopl + flags = (new_flags & ~flag_iopl) | (flags & flag_iopl); + } + else + { + // cannot update interrupt flag or iopl + flags = (new_flags & ~flag_iopl & ~flag_interrupt) | (flags & (flag_iopl | flag_interrupt)); + } + + flags_changed = 0; + //flags = (flags & flags_mask) | flags_default; +} + +function update_operand_size() +{ + if(operand_size_32) + { + table = table32; + table0F = table0F_32; + } + else + { + table = table16; + table0F = table0F_16; + } +} + +function update_address_size() +{ + if(address_size_32) + { + modrm_resolve = modrm_resolve32; + + regv = reg32; + reg_vcx = reg_ecx; + reg_vsi = reg_esi; + reg_vdi = reg_edi; + } + else + { + modrm_resolve = modrm_resolve16; + + regv = reg16; + reg_vcx = reg_cx; + reg_vsi = reg_si; + reg_vdi = reg_di; + } +} + +/** + * @param {number} selector + */ +function lookup_segment_selector(selector) +{ + var is_gdt = (selector & 4) === 0, + selector_offset = selector & ~7, + info, + table_offset, + table_limit; + + info = { + rpl: selector & 3, + from_gdt: is_gdt, + is_null: false, + is_valid: true, + }; + + if(is_gdt) + { + table_offset = gdtr_offset; + table_limit = gdtr_size; + } + else + { + table_offset = ldtr_offset + table_limit = ldtr_size; + } + + if(selector_offset === 0) + { + info.is_null = true; + return info; + } + + // limit is the number of entries in the table minus one + if((selector_offset >> 3) > table_limit) + { + info.is_valid = false; + return info; + } + + table_offset += selector_offset; + + if(paging) + { + table_offset = translate_address_system_read(table_offset); + } + + info.base = memory.read16(table_offset + 2) | memory.read8(table_offset + 4) << 16 | + memory.read8(table_offset + 7) << 24, + info.access = memory.read8(table_offset + 5), + info.flags = memory.read8(table_offset + 6) >> 4, + info.limit = memory.read16(table_offset) | (memory.read8(table_offset + 6) & 0xF) << 16, + + // used if system + info.type = info.access & 0xF; + + info.dpl = info.access >> 5 & 3; + + info.is_system = (info.access & 0x10) === 0; + info.is_present = (info.access & 0x80) === 0x80; + info.is_executable = (info.access & 8) === 8; + + info.rw_bit = (info.access & 2) === 2; + info.dc_bit = (info.access & 4) === 4; + + info.size = (info.flags & 4) === 4; + info.granularity = (info.flags & 8) === 8; + + + if(info.gr_bit) + { + info.real_limit = (info.limit << 12 | 0xFFF) >>> 0; + } + else + { + info.real_limit = info.limit; + } + + info.is_writable = info.rw_bit && !info.is_executable; + info.is_readable = info.rw_bit || !info.is_executable; + + return info; +} + +/** + * @param {number} reg + * @param {number} selector + */ +function switch_seg(reg, selector) +{ + dbg_assert(reg >= 0 && reg <= 5); + dbg_assert(typeof selector === "number" && selector < 0x10000 && selector >= 0); + + if(reg === reg_cs) + { + protected_mode = (cr0 & 1) === 1; + } + + if(!protected_mode) + { + sreg[reg] = selector; + segment_is_null[reg] = 0; + segment_limits[reg] = 0xFFFFF; + segment_offsets[reg] = selector << 4; + return; + } + + var info = lookup_segment_selector(selector); + + if(reg === reg_ss) + { + if(info.is_null) + { + trigger_gp(0); + return false; + } + if(!info.is_valid || + info.is_system || + info.rpl !== cpl || + !info.is_writable || + info.dpl !== cpl) + { + trigger_gp(selector & ~3); + return false; + } + if(!info.is_present) + { + trigger_ss(selector & ~3); + return false; + } + + stack_size_32 = info.size; + + if(info.size) + { + stack_reg = reg32s; + reg_vsp = reg_esp; + reg_vbp = reg_ebp; + } + else + { + stack_reg = reg16; + reg_vsp = reg_sp; + reg_vbp = reg_bp; + } + } + else if(reg === reg_cs) + { + if(!info.is_executable) + { + // cs not executable + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("#GP handler"); + } + + if(info.is_system) + { + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("load system segment descriptor, type = " + (info.access & 15)); + } + + if(info.dc_bit && (info.dpl !== info.rpl)) + { + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("#GP handler"); + } + + if(info.rpl !== cpl) + { + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("privilege change"); + } + + dbg_assert(cpl === info.dpl); + + if(!info.dc_bit && info.dpl < cpl) + { + throw unimpl("inter privilege interrupt"); + } + else + { + if(info.dc_bit || info.dpl === cpl) + { + // ok + } + else + { + // PE = 1, interrupt or trap gate, nonconforming code segment, DPL > CPL + dbg_log(info + " " + h(selector & ~3), LOG_CPU); + throw unimpl("#GP handler"); + } + } + + + operand_size_32 = address_size_32 = is_32 = info.size; + + update_operand_size(); + update_address_size(); + } + else + { + // es, ds, fs, gs + if(info.is_null) + { + sreg[reg] = selector; + segment_is_null[reg] = 1; + return true; + } + if(!info.is_valid || + info.is_system || + !info.is_readable || + ((!info.is_executable || !info.dc_bit) && + info.rpl > info.dpl && + cpl > info.dpl)) + { + trigger_gp(selector & ~3); + return false; + } + if(!info.is_present) + { + trigger_np(selector & ~3); + return false; + } + } + + //dbg_log("seg " + reg + " " + h(info.base)); + + segment_is_null[reg] = 0; + segment_limits[reg] = info.real_limit; + segment_infos[reg] = 0; // TODO + + segment_offsets[reg] = info.base; + + sreg[reg] = selector; + + return true; +} + +function load_tr(selector) +{ + var info = lookup_segment_selector(selector); + + //dbg_log("load tr"); + + if(!info.from_gdt) + { + throw unimpl("TR can only be loaded from GDT"); + } + + if(info.is_null) + { + dbg_log("#GP(0) | tried to load null selector (ltr)"); + throw unimpl("#GP handler"); + } + + if(!info.is_present) + { + dbg_log("#GP | present bit not set (ltr)"); + throw unimpl("#GP handler"); + } + + if(!info.is_system) + { + dbg_log("#GP | ltr: not a system entry"); + throw unimpl("#GP handler"); + } + + if(info.type !== 9) + { + dbg_log("#GP | ltr: invalid type (type = " + info.type + ")"); + throw unimpl("#GP handler"); + } + + tsr_size = info.limit; + tsr_offset = info.base; + + //dbg_log("tsr at " + h(tsr_offset) + "; (" + tsr_size + " bytes)"); +} + +function load_ldt(selector) +{ + var info = lookup_segment_selector(selector); + + if(info.is_null) + { + // invalid + ldtr_size = 0; + ldtr_offset = 0; + return; + } + + if(!info.from_gdt) + { + throw unimpl("LDTR can only be loaded from GDT"); + } + + if(!info.is_present) + { + dbg_log("lldt: present bit not set"); + throw unimpl("#GP handler"); + } + + if(!info.is_system) + { + dbg_log("lldt: not a system entry"); + throw unimpl("#GP handler"); + } + + if(info.type !== 2) + { + dbg_log("lldt: invalid type (" + info.type + ")"); + throw unimpl("#GP handler"); + } + + ldtr_size = info.limit; + ldtr_offset = info.base; + + //dbg_log("ldt at " + h(ldtr_offset) + "; (" + ldtr_size + " bytes)"); +} + + + +function clear_tlb() +{ + // clear tlb excluding global pages + last_virt_eip = -1; + last_virt_esp = -1; + + tlb_info.set(tlb_info_global); + + //dbg_log("page table loaded", LOG_CPU); +} + +function full_clear_tlb() +{ + // clear tlb including global pages + tlb_info_global = new Uint8Array(1 << 20); + + clear_tlb(); + +} + +function invlpg(addr) +{ + var page = addr >>> 12; + dbg_log("invlpg: " + h(page), LOG_CPU); + + tlb_info[page] = 0; + tlb_info_global[page] = 0; + + last_virt_eip = -1; + last_virt_esp = -1; +} + +/** + * @param {number} addr + */ +function translate_address_disabled(addr) +{ + return addr; +} + +function translate_address_user_write(addr) +{ + var base = addr >>> 12; + + if(tlb_info[base] & TLB_USER_WRITE) + { + return tlb_user_write[base] ^ addr; + } + else + { + return do_page_translation(addr, 1, 1) | addr & 0xFFF; + } +} + +function translate_address_user_read(addr) +{ + var base = addr >>> 12; + + if(tlb_info[base] & TLB_USER_READ) + { + return tlb_user_read[base] ^ addr; + } + else + { + return do_page_translation(addr, 0, 1) | addr & 0xFFF; + } +} + +function translate_address_system_write(addr) +{ + var base = addr >>> 12; + + if(tlb_info[base] & TLB_SYSTEM_WRITE) + { + return tlb_system_write[base] ^ addr; + } + else + { + return do_page_translation(addr, 1, 0) | addr & 0xFFF; + } +} + +function translate_address_system_read(addr) +{ + var base = addr >>> 12; + + if(tlb_info[base] & TLB_SYSTEM_READ) + { + return tlb_system_read[base] ^ addr; + } + else + { + return do_page_translation(addr, 0, 0) | addr & 0xFFF; + } +} + +/** + * @return {number} + */ +function do_page_translation(addr, for_writing, user) +{ + var page = addr >>> 12, + page_dir_addr = (cr3 >>> 2) + (page >> 10), + page_dir_entry = memory.mem32s[page_dir_addr], + high, + can_write = true, + global, + cachable = true, + allow_user = true; + + if(!(page_dir_entry & 1)) + { + // to do at this place: + // + // - set cr2 = addr (which caused the page fault) + // - call_interrupt_vector with id 14, error code 0-7 (requires information if read or write) + // - prevent execution of the function that triggered this call + dbg_log("#PF not present", LOG_CPU); + + cr2 = addr; + trigger_pagefault(for_writing, user, 0); + + // never reached as trigger_pagefault throws up + dbg_assert(false); + } + + if((page_dir_entry & 2) === 0) + { + can_write = false; + + if(for_writing) + { + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + + if((page_dir_entry & 4) === 0) + { + allow_user = false; + + if(user) + { + // "Page Fault: page table accessed by non-supervisor"; + dbg_log("#PF supervisor", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + + if((page_dir_entry & 0x10) === 0) + { + cachable = false; + } + + if(page_dir_entry & page_size_extensions) + { + // size bit is set + + // set the accessed and dirty bits + memory.mem32s[page_dir_addr] = page_dir_entry | 0x20 | for_writing << 6; + + high = (page_dir_entry & 0xFFC00000) | (page << 12 & 0x3FF000); + + global = page_dir_entry & 0x100; + } + else + { + var page_table_addr = ((page_dir_entry & 0xFFFFF000) >>> 2) + (page & 0x3FF), + page_table_entry = memory.mem32s[page_table_addr]; + + if(!(page_table_entry & 1)) + { + dbg_log("#PF not present table", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 0); + dbg_assert(false); + } + + if((page_table_entry & 2) === 0) + { + can_write = false; + + if(for_writing) + { + dbg_log("#PF not writable page", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + + if((page_table_entry & 4) === 0) + { + allow_user = false; + + if(user) + { + dbg_log("#PF not supervisor page", LOG_CPU); + cr2 = addr; + trigger_pagefault(for_writing, user, 1); + dbg_assert(false); + } + } + + if((page_table_entry & 0x10) === 0) + { + cachable = false; + } + + // set the accessed and dirty bits + memory.mem32s[page_dir_addr] = page_dir_entry | 0x20; + memory.mem32s[page_table_addr] = page_table_entry | 0x20 | for_writing << 6; + + high = page_table_entry & 0xFFFFF000; + + global = page_table_entry & 0x100; + } + + if(cachable) + { + var cache_entry = high ^ page << 12, + info = 0; + + if(allow_user) + { + tlb_user_read[page] = cache_entry; + info |= TLB_USER_READ; + + if(can_write) + { + tlb_user_write[page] = cache_entry; + info |= TLB_USER_WRITE; + } + } + + tlb_system_read[page] = cache_entry; + info |= TLB_SYSTEM_READ; + + if(can_write) + { + tlb_system_write[page] = cache_entry; + info |= TLB_SYSTEM_WRITE; + } + + tlb_info[page] |= info; + + if(global) + { + tlb_info_global[page] = info; + } + } + + return high ; +} + +function trigger_pagefault(write, user, present) +{ + if(LOG_LEVEL & LOG_CPU) + { + dbg_trace(); + } + + if(page_fault) + { + dbg_trace(); + throw unimpl("Double fault"); + } + + instruction_pointer = previous_ip; + page_fault = true; + call_interrupt_vector(14, false, user << 2 | write << 1 | present); + + throw 0xDEADBEE; +} + + +// it looks pointless to have these two here, but +// Closure Compiler is able to remove unused functions +//#include "test_helpers.js" +#include "debug.macro.js" + + +#include "modrm.macro.js" +#include "arith.macro.js" +#include "misc_instr.macro.js" +#include "string.macro.js" + +#include "fpu.macro.js" + +#include "instructions.macro.js" + + +} diff --git a/src/debug.macro.js b/src/debug.macro.js new file mode 100644 index 00000000..71a41ffd --- /dev/null +++ b/src/debug.macro.js @@ -0,0 +1,445 @@ +"use strict"; + +debug.dump_regs = dump_regs; +debug.dump_regs_short = dump_regs_short; +debug.dump_stack = dump_stack; + +debug.dump_page_directory = dump_page_directory; +debug.dump_gdt_ldt = dump_gdt_ldt; +debug.dump_idt = dump_idt; + +debug.step = step; +debug.run_until = run_until; + +debug.debugger = function() +{ + debugger; +} + +function step() +{ + step_mode = true; + + if(!running) + { + cycle(); + } + + dump_regs(); + var now = Date.now(); + + vga.timer(now); + timer.timer(now); + rtc.timer(now); + + running = false; +} + +function run_until() +{ + running = false; + var a = parseInt(prompt("input hex", ""), 16); + if(a) while(instruction_pointer != a) cycle() + dump_regs(); +} + +// http://ref.x86asm.net/x86reference.xml +// for debuggin' purposes +var opcode_map = [ + "ADD", "ADD", "ADD", "ADD", "ADD", "ADD", "PUSH", "POP", + "OR", "OR", "OR", "OR", "OR", "OR", "PUSH", "0F:", + "ADC", "ADC", "ADC", "ADC", "ADC", "ADC", "PUSH", "POP", + "SBB", "SBB", "SBB", "SBB", "SBB", "SBB", "PUSH", "POP", + "AND", "AND", "AND", "AND", "AND", "AND", "ES", "DAA", + "SUB", "SUB", "SUB", "SUB", "SUB", "SUB", "CS", "DAS", + "XOR", "XOR", "XOR", "XOR", "XOR", "XOR", "SS", "AAA", + "CMP", "CMP", "CMP", "CMP", "CMP", "CMP", "DS", "AAS", + "INC", "INC", "INC", "INC", "INC", "INC", "INC", "INC", + "DEC", "DEC", "DEC", "DEC", "DEC", "DEC", "DEC", "DEC", + "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", "PUSH", + "POP", "POP", "POP", "POP", "POP", "POP", "POP", "POP", + "PUSHA", "POPA", "BOUND", "ARPL", "FS", "GS", "none", "none", + "PUSH", "IMUL", "PUSH", "IMUL", "INS", "INS", "OUTS", "OUTS", + "JO", "JNO", "JB", "JNB", "JZ", "JNZ", "JBE", "JNBE", + "JS", "JNS", "JP", "JNP", "JL", "JNL", "JLE", "JNLE", + "ADD", "ADD", "ADD", "ADD", "TEST", "TEST", "XCHG", "XCHG", + "MOV", "MOV", "MOV", "MOV", "MOV", "LEA", "MOV", "POP", + "NOP", "XCHG", "XCHG", "XCHG", "XCHG", "XCHG", "XCHG", "XCHG", + "CBW", "CWD", "CALLF", "FWAIT", "PUSHF", "POPF", "SAHF", "LAHF", + "MOV", "MOV", "MOV", "MOV", "MOVS", "MOVS", "CMPS", "CMPS", + "TEST", "TEST", "STOS", "STOS", "LODS", "LODS", "SCAS", "SCAS", + "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", + "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", "MOV", + "ROL", "ROL", "RETN", "RETN", "LES", "LDS", "MOV", "MOV", + "ENTER", "LEAVE", "RETF", "RETF", "INT", "INT", "INTO", "IRET", + "ROL", "ROL", "ROL", "ROL", "AAM", "AAD", "none", "XLAT", + "FADD", "FLD", "FIADD", "FILD", "FADD", "FLD", "FIADD", "FILD", + "LOOPNZ", "LOOPZ", "LOOP", "JCXZ", "IN", "IN", "OUT", "OUT", + "CALL", "JMP", "JMPF", "JMP", "IN", "IN", "OUT", "OUT", + "LOCK", "none", "REPNZ", "REPZ", "HLT", "CMC", "TEST", "TEST", + "CLC", "STC", "CLI", "STI", "CLD", "STD", "INC", "INC" +]; + +function logop(_ip, op) +{ + if(!DEBUG || !ops) + { + return; + } + if(!step_mode) + { + //return; + } + + + ops.add(_ip); + ops.add(opcode_map[op] || "unkown"); + ops.add(op); +} + +function dump_stack(start, end) +{ + var esp = reg32[reg_esp]; + dbg_log("========= STACK =========="); + + if(end >= start || end === undefined) + { + start = 5; + end = -5; + } + + for(var i = start; i > end; i--) + { + var line = " "; + + if(!i) line = "=> "; + + line += h(i, 2) + " | "; + + dbg_log(line + h(esp + 4 * i, 8) + " | " + h(memory.read32s(esp + 4 * i) >>> 0)); + } +} + +function dump_regs_short() +{ + var + r32 = { "eax": reg_eax, "ecx": reg_ecx, "edx": reg_edx, "ebx": reg_ebx, + "esp": reg_esp, "ebp": reg_ebp, "esi": reg_esi, "edi": reg_edi }, + r32_names = ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"], + s = { "cs": reg_cs, "ds": reg_ds, "es": reg_es, "fs": reg_fs, "gs": reg_gs, "ss": reg_ss }, + line1 = "", + line2 = ""; + + + + for(var i = 0; i < 4; i++) + { + line1 += r32_names[i] + "=" + h(reg32[r32[r32_names[i]]], 8) + " "; + line2 += r32_names[i+4] + "=" + h(reg32[r32[r32_names[i+4]]], 8) + " "; + } + + line1 += " eip=" + h(get_real_ip(), 8); + line2 += " flg=" + h(get_flags()); + + line1 += " ds=" + h(sreg[reg_ds], 4) + " es=" + h(sreg[reg_es], 4) + " fs=" + h(sreg[reg_fs], 4); + line2 += " gs=" + h(sreg[reg_gs], 4) + " cs=" + h(sreg[reg_cs], 4) + " ss=" + h(sreg[reg_ss], 4); + + dbg_log(line1); + dbg_log(line2); +} + +function dump_regs() +{ + var + r32 = { "eax": reg_eax, "ecx": reg_ecx, "edx": reg_edx, "ebx": reg_ebx, + "esp": reg_esp, "ebp": reg_ebp, "esi": reg_esi, "edi": reg_edi }, + + s = { "cs": reg_cs, "ds": reg_ds, "es": reg_es, + "fs": reg_fs, "gs": reg_gs, "ss": reg_ss }, + + out = ""; + + + var opcodes = ops.toArray(); + for(var i = 0; i < opcodes.length; i += 3) + { + if(opcodes[i]) + { + out += h(opcodes[i], 6) + ": " + + String.pads(opcodes[i + 1], 20) + h(opcodes[i + 2], 2) + "\n"; + } + } + + log(out.substr(0, out.length - 1)); + ops.clear(); + + dbg_log("----- DUMP (ip = 0x" + h(instruction_pointer >>> 0) + ") ----------") + dbg_log("protected mode: " + protected_mode); + + for(i in r32) + { + dbg_log(i + " = 0x" + h(reg32[r32[i]], 8)); + } + dbg_log("eip = 0x" + h(get_real_ip(), 8)); + + for(i in s) + { + dbg_log(i + " = 0x" + h(sreg[s[i]], 4)); + } + + out = ""; + + var flg = { "cf": getcf, "pf": getpf, "zf": getzf, "sf": getsf, + "of": getof, "df": flag_direction, "if": flag_interrupt }; + + for(var i in flg) + { + if(+flg[i]) + { + out += i + "=" + Number(!!(flags & flg[i])) + " | "; + } + else + { + out += i + "=" + Number(!!flg[i]()) + " | "; + } + } + out += "iopl=" + getiopl(); + dbg_log(out); + + + //dbg_log("last operation: " + h(last_op1 | 0) + ", " + h(last_op2 | 0) + " = " + + //h(last_result | 0) + " (" + last_op_size + " bit)") + +} + +function dump_gdt_ldt() +{ + dbg_log("gdt: (len = " + h(gdtr_size) + ")"); + dump_table(translate_address_read(gdtr_offset), gdtr_size); + + dbg_log("\nldt: (len = " + h(ldtr_size) + ")"); + dump_table(translate_address_read(ldtr_offset), ldtr_size); + + function dump_table(addr, size) + { + for(var i = 0; i < size; i += 8, addr += 8) + { + var base = memory.read16(addr + 2) | + memory.read8(addr + 4) << 16 | + memory.read8(addr + 7) << 24, + + limit = (memory.read16(addr) | memory.read8(addr + 6) & 0xF) + 1, + access = memory.read8(addr + 5), + flags = memory.read8(addr + 6) >> 4, + flags_str = '', + dpl = access >> 5 & 3; + + if(!(access & 128)) + { + // present bit not set + //continue; + flags_str += 'NP '; + } + else + { + flags_str += ' P '; + } + + if(access & 16) + { + if(flags & 4) + { + flags_str += '32b '; + } + else + { + flags_str += '16b '; + } + + if(access & 8) + { + // executable + flags_str += 'X '; + + if(access & 4) + { + flags_str += 'C '; + } + } + else + { + // data + flags_str += 'R '; + } + } + else + { + // system + flags_str += 'sys: ' + h(access & 15); + } + + if(flags & 8) + { + limit <<= 12; + } + + dbg_log(h(i & ~7, 4) + " " + h(base >>> 0, 8) + " (" + h(limit, 8) + " bytes) " + + flags_str + "; dpl = " + dpl + ", a = " + access.toString(2) + + ", f = " + flags.toString(2)); + } + } +} + +function dump_idt() +{ + for(var i = 0; i < idtr_size; i += 8) + { + var addr = do_page_translation(idtr_offset + i, 0, 0), + base = memory.read16(addr) | memory.read16(addr + 6) << 16, + selector = memory.read16(addr + 2), + type = memory.read8(addr + 5), + line, + dpl = type >> 5 & 3; + + if((type & 31) === 5) + { + line = 'task gate '; + } + else if((type & 31) === 14) + { + line = 'intr gate '; + } + else if((type & 31) === 15) + { + line = 'trap gate '; + } + else + { + line = 'invalid '; + } + + + if(type & 128) + { + line += ' P'; + } + else + { + // present bit not set + //continue; + line += 'NP'; + } + + + dbg_log(h(i >> 3, 4) + " " + h(base >>> 0, 8) + ", " + + h(selector, 4) + "; " + line + "; dpl = " + dpl + ", t = " + type.toString(2)); + } +} + +function load_page_entry(dword_entry, is_directory) +{ + if(!(dword_entry & 1)) + { + // present bit not set + return false; + } + + var size = (dword_entry & 128) === 128, + address; + + if(size && !is_directory) + { + address = dword_entry & 0xFFC00000; + } + else + { + address = dword_entry & 0xFFFFF000; + } + + return { + size: size, + global: (dword_entry & 256) === 256, + accessed: (dword_entry & 0x20) === 0x20, + dirty: (dword_entry & 0x40) === 0x40, + cache : (dword_entry & 16) === 16, + user : (dword_entry & 4) === 4, + read_write : (dword_entry & 2) === 2, + address : address >>> 0 + }; +} + +function dump_page_directory() +{ + for(var i = 0; i < 1024; i++) + { + var dword = memory.read32s(cr3 + 4 * i), + entry = load_page_entry(dword, true); + + if(!entry) + { + continue; + } + + var flags = ''; + + if(entry.size) + flags += 'S '; + + if(entry.cache) + flags += 'D '; + + if(entry.user) + flags += 'U '; + + if(entry.read_write) + flags += 'R '; + + if(entry.accessed) + flags += 'A '; + + dbg_log("=== " + h(entry.address >>> 0, 8) + " | " + flags); + + if(entry.size) + { + continue; + } + + for(var j = 0; j < 1024; j++) + { + dword = memory.read32s(entry.address + 4 * j); + + var subentry = load_page_entry(dword, false); + + if(subentry) + { + flags = ''; + + if(subentry.size) + flags += 'S '; + + if(subentry.cache) + flags += 'D '; + + if(subentry.user) + flags += 'U '; + + if(subentry.read_write) + flags += 'R '; + + if(subentry.global) + flags += 'G '; + + if(subentry.accessed) + flags += 'A '; + + if(subentry.dirty) + flags += 'Di '; + + dbg_log("# " + h((i << 22 | j << 12) >>> 0, 8) + " -> " + + h(subentry.address, 8) + " | " + flags); + } + } + } +} + + diff --git a/src/disk.js b/src/disk.js new file mode 100644 index 00000000..b13e5a87 --- /dev/null +++ b/src/disk.js @@ -0,0 +1,545 @@ +"use strict"; + + +var + /** @const */ + CDROM_SECTOR_SIZE = 2048, + /** @const */ + HD_SECTOR_SIZE = 512; + + +/** @constructor */ +function CDRom(dev, cd_buffer) +{ + this.io = dev.io; + this.memory = dev.memory; + this.pic = dev.pic; + this.pci = dev.pci; + + this.vendor_id = 0x1002; + this.class_revision = 0x106 << 16 | 0x01 << 8; + this.irq = 14; + this.iobase = 0xFFF10000; + this.sector_size = CDROM_SECTOR_SIZE; + this.buffer = cd_buffer; + this.atapi = true; + this.pci_id = 8; + + this.init(); +} +CDRom.prototype = new AHCIDevice(); + +/** @constructor */ +function HDD(dev, disk_buffer, nr) +{ + var port = nr === 0 ? 0x1F0 : 0x170, + irq = nr === 0 ? 14 : 15; + + var pic = dev.pic; + + this.io = dev.io; + this.memory = dev.memory; + this.pic = dev.pic; + this.pci = dev.pci; + + this.vendor_id = 0x1002; + this.class_revision = 0x106 << 16 | 0x01 << 8; + this.irq = irq; + this.iobase = 0xFFF00000; + this.sector_size = HD_SECTOR_SIZE; + this.sector_count = disk_buffer.byteLength / this.sector_size; + this.buffer = disk_buffer; + this.atapi = false; + this.pci_id = 0x10; + + this.head_count = 16; + this.sectors_per_track = 63; + + this.cylinder_count = disk_buffer.byteLength / + this.head_count / (this.sectors_per_track + 1) / this.sector_size; + + dbg_assert(this.cylinder_count === (this.cylinder_count | 0)); + dbg_assert(this.cylinder_count <= 16383); + + var me = this; + + // status + this.io.register_read(port | 7, read_status); + + // alternate status, starting at 3f6/376 + this.io.register_read(port | 0x206, read_status); + + function read_status() + { + dbg_log("ATA read status", LOG_DISK); + + var status = 0x50; + + if(data_pointer < pio_data.length) + status |= 8; + + return status; + } + + var last_drive = 0xFF, + data_pointer = 0, + pio_data = [], + drq = false, + is_lba = 0, + slave = 0, + bytecount = 0, + sector = 0, + cylinder = 0, + head = 0; + + + function push_irq() + { + pic.push_irq(me.irq); + } + + this.io.register_write(port | 6, function(data) + { + dbg_log("1F6 write " + h(data), LOG_DISK); + + var slave = data & 0x10, + mode = data & 0xE0, + low = data & 0xF; + + + if(slave) + { + //drq = false; + return; + } + + is_lba = data >> 6 & 1; + head = data & 0xF; + last_drive = data; + }); + + this.io.register_write(port | 2, function(data) + { + dbg_log("1F2 write: " + data, LOG_DISK); + if(data) + { + bytecount = data << 9; + } + else + { + bytecount = 256 << 9; + } + //bytecount = 1 << 9; + }); + this.io.register_write(port | 3, function(data) + { + sector = data; + }); + this.io.register_write(port | 4, function(data) + { + cylinder = cylinder & 0xFF00 | data; + }); + this.io.register_write(port | 5, function(data) + { + cylinder = cylinder & 0xFF | data << 8; + }); + + this.io.register_write(port | 7, function(cmd) + { + if(cmd === 0xEC) + { + dbg_log("ATA identify device", LOG_DISK); + // identify device + // http://bochs.sourceforge.net/cgi-bin/lxr/source/iodev/harddrv.cc#L2821 + + data_pointer = 0; + + pio_data = new Uint8Array([ + 0x40, 0, + // 1 cylinders + me.cylinder_count, me.cylinder_count >> 8, + 0, 0, + + // 3 heads + me.head_count, me.head_count >> 8, + 0, 0, + // 5 + 0, 0, + // sectors per track + me.sectors_per_track, 0, + 0, 0, 0, 0, 0, 0, + // 10-19 serial number + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 15 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 20 + 3, 0, 0, 2, 4, 0, + // 23-26 firmware revision + 0, 0, 0, 0, 0, 0, 0, 0, + + // 27 model number + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + + // 47 + 0, 0, + 1, 0, + 0, 3, // capabilities + // 50 + 0, 0, + 0, 2, + 0, 2, + 7, 0, + + // 54 cylinders + me.cylinder_count, me.cylinder_count >> 8, + // 55 heads + me.head_count, me.head_count >> 8, + // 56 sectors per track + me.sectors_per_track, 0, + // capacity in sectors + this.sector_count & 0xFF, this.sector_count >> 8 & 0xFF, + this.sector_count >> 16 & 0xFF, this.sector_count >> 24 & 0xFF, + + 0, 0, + // 60 + this.sector_count & 0xFF, this.sector_count >> 8 & 0xFF, + this.sector_count >> 16 & 0xFF, this.sector_count >> 24 & 0xFF, + + 0, 0, 0, 0, 0, 0, + // 65 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 70 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 75 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 80 + 0x7E, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 85 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 90 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 95 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // 100 + this.sector_count & 0xFF, this.sector_count >> 8 & 0xFF, + this.sector_count >> 16 & 0xFF, this.sector_count >> 24 & 0xFF, + + + ]); + + push_irq(); + } + else if(cmd === 0x91) + { + dbg_log("ATA cmd 91", LOG_DISK); + push_irq(); + } + else if(cmd === 0x10) + { + // obsolete + dbg_log("ATA cmd 10", LOG_DISK); + push_irq(); + } + else if(cmd = 0x27) + { + // READ NATIVE MAX ADDRESS EXT - read the actual size of the HD + // https://en.wikipedia.org/wiki/Host_protected_area + dbg_log("ATA cmd 27", LOG_DISK); + push_irq(); + pio_data = [ + 0, 0, // error + 0, 0, // count + + // result + disk_buffer.byteLength & 0xff, + disk_buffer.byteLength >> 8 & 0xff, + disk_buffer.byteLength >> 16 & 0xff, + disk_buffer.byteLength >> 24 & 0xff, + 0, 0, + + 0, 0, // + ]; + } + else if(cmd === 0x20) + { + if(DEBUG && is_lba) + throw "unimplemented"; + + var lba = (cylinder * me.head_count + head) * me.sectors_per_track + sector - 1; + dbg_log("ATA read: from=" + h(lba * me.sector_size) + " chs=" + cylinder + "/" + head + "/" + sector + " length=" + h(bytecount), LOG_DISK); + + me.buffer.get(lba * me.sector_size, bytecount, function(data) + { + data_pointer = 0; + pio_data = data; + + push_irq(); + }); + } + else + { + dbg_log("New ATA cmd on 1F7: " + h(cmd), LOG_DISK); + } + }); + + this.io.register_read(port | 0, function() + { + if(data_pointer < pio_data.length) + { + dbg_log("Read 1F0: " + h(pio_data[data_pointer], 2), LOG_DISK); + + if((data_pointer & 511) === 0) + push_irq(); + + return pio_data[data_pointer++] & 0xFF; + } + else + { + dbg_log("Read 1F0: empty", LOG_DISK); + return 0; + } + }); + + + this.io.register_read(port | 1, function() + { + dbg_log("Read 1F1", LOG_DISK); + return 0xFF; + }); + + this.io.register_read(port | 2, function() + { + dbg_log("Read 1F2", LOG_DISK); + return 0xFF; + }); + + + this.io.register_read(port | 3, function() + { + dbg_log("Read 1F3", LOG_DISK); + return 0xFF; + }); + + this.io.register_read(port | 6, function() + { + dbg_log("Read 1F6", LOG_DISK); + return last_drive; + }); + + this.init(); +} +HDD.prototype = new AHCIDevice(); + + +/** @constructor */ +function AHCIDevice() +{ + var me, + memory; + + this.init = function() + { + me = this; + memory = this.memory; + + this.pci.register_device(this, this.pci_id); + + this.memory.mmap_register(this.iobase, 0x4000, true, mmio_read, mmio_write); + + }; + + var host_ctl = 0, + host_caps = 1, + host_ports_impl = 1, + host_intbits = 1, + port_lst_addr, + port_fis_addr; + + function atapi_command_read(atapi, dest, byte_len) + { + var lba = Math.to_be32(memory.read32s(atapi + 2)), + count = Math.to_be16(memory.read16(atapi + 7)), + flags = memory.read8(atapi + 1), + + //bytecount = Math.min(count * me.sector_size, byte_len + 1); + bytecount = count * me.sector_size; + + dbg_log("CD read lba=" + h(lba) + + " lbacount=" + h(count) + + " bytelen=" + h(byte_len) + + " copycount=" + h(bytecount) + + " flags=" + h(flags) + + " buf=" + h(dest, 8), LOG_CD); + + me.buffer.get(lba * me.sector_size, bytecount, function(data) + { + memory.write_blob(data, dest); + }); + + //pic.push_irq(me.irq); + } + + function ata_command_rw(cmd_fis, dest, is_read) + { + var lba = memory.read32s(cmd_fis + 4) & 0xFFFFFF, + count = memory.read16(cmd_fis + 12), + bytecount = count * me.sector_size; + + dbg_log("ahci " + (is_read ? "read" : "write") + ": lba=" + h(lba, 8) + + " count=" + h(count, 4) + + " dest=" + h(dest, 8)); + + if(is_read) + { + this.buffer.get(lba * me.sector_size, bytecount, function(data) + { + memory.write_blob(data, dest); + }); + } + else + { + this.buffer.set(lba * me.sector_size, + new Uint8Array(memory.buffer, dest, bytecount), + function() + { + }); + } + } + + + function mmio_read(addr) + { + switch(addr) + { + case 0: + return host_caps; + + case 4: + return host_ctl; + + case 0xC: + return host_ports_impl; + + case 0x128: + return 0x03; + + case 0x110: + return host_intbits; + + default: + dbg_log("New PCI mmio read from " + h(addr, 8), LOG_CD); + } + } + + function mmio_write(addr, value) + { + switch(addr) + { + case 0x100: + port_lst_addr = value; + dbg_log("lst at " + h(value, 8), LOG_CD); + break; + case 0x108: + port_fis_addr = value; + dbg_log("fis at " + h(value, 8), LOG_CD); + break; + + case 0x118: + dbg_log("port cmd: " + h(value, 8), LOG_CD); + break; + + case 0x138: + var + + ctba_addr = memory.read32s(port_lst_addr + 8), + + first_prdt_start = ctba_addr + 0x80, + flags = memory.read16(port_lst_addr), + prdt_addr = memory.read32s(first_prdt_start) + 0x100000000 * memory.read32s(first_prdt_start + 4), + prdt_len = memory.read32s(ctba_addr + 0x80 + 0xC) & 0xFFF, + atapi_command = memory.read8(ctba_addr + 0x40), + fis_command = memory.read8(ctba_addr + 2), + + dma_fis_start = port_fis_addr + 0, + pio_fis_start = port_fis_addr + 0x20, + d2h_fis_start = port_fis_addr + 0x40, + ufis_start = port_fis_addr + 0x60, + + command_fis_start = ctba_addr + 0, + atapi_command_start = ctba_addr + 0x40; + + if((fis_command === 0xA0 || fis_command === 0xA1) && + !me.atapi) + { + return; + } + + // status success + memory.write8(d2h_fis_start + 2, 0x40); + + dbg_log("ctba at " + h(ctba_addr), LOG_CD); + dbg_log("prdt at " + h(prdt_addr), LOG_CD); + dbg_log("flags: " + h(flags, 2), LOG_CD); + dbg_log("cmd fis command: " + h(fis_command, 2), LOG_CD); + + dbg_log("fis LBA=" + h(memory.read32s(command_fis_start + 4) & 0xffffff), LOG_CD); + + dbg_log("Prdts count: " + h(memory.read16(port_lst_addr + 2)), LOG_CD); + dbg_log("PRD byte count: " + h(memory.read32s(port_lst_addr + 4)), LOG_CD); + + dbg_log("First prdt byte count: " + h(memory.read32s(ctba_addr + 0x80 + 0xC)), LOG_CD); + + if(fis_command === 0xC8 || fis_command === 0xCA) + { + ata_command_rw(command_fis_start, prdt_addr, fis_command === 0xC8); + } + else if(fis_command === 0xEC) + { + // ATA_CMD_IDENTIFY_DEVICE + + // number of sectors + memory.write32(prdt_addr + 120, me.buffer.byteLength / me.sector_size); + } + else if(fis_command === 0xA1) + { + // ATA_CMD_IDENTIFY_PACKET_DEVICE + + // is CD + memory.write32(prdt_addr, 0x0500); + } + else if(fis_command === 0xA0) + { + // ATA_CMD_PACKET + if(atapi_command === 0x28) + { + atapi_command_read(ctba_addr + 0x40, prdt_addr, prdt_len); + } + else if(atapi_command === 0x2a) + { + // write + dbg_log("atapi - unimplemented write", LOG_CD); + } + else if(atapi_command === 0x25) + { + // read capacity + dbg_log("atapi - unimplemented read cap", LOG_CD); + } + else + { + dbg_log("atapi - unimplemented " + h(atapi_command, 2), LOG_CD); + } + } + else + { + dbg_log("unimplemented fis command: " + h(fis_command, 2)); + } + + break; + + default: + dbg_log("PCI mmio write addr=" + h(addr, 8) + " value=" + h(value, 8), LOG_CD); + } + } +} + diff --git a/src/dma.js b/src/dma.js new file mode 100644 index 00000000..4c10c5d6 --- /dev/null +++ b/src/dma.js @@ -0,0 +1,149 @@ +"use strict"; + +/** + * @constructor + */ +function DMA(dev) +{ + var io = dev.io, + memory = dev.memory, + + channels = [ + { address: 0, count: 0 }, + { address: 0, count: 0 }, + { address: 0, count: 0 }, + { address: 0, count: 0 } + ], + + lsb_msb_flipflop = 0; + + io.register_write(0x04, port_write.bind(0, 0x04)); + io.register_write(0x05, port_write.bind(0, 0x05)); + io.register_write(0x0A, portA_write); + io.register_write(0x0B, portB_write); + io.register_write(0x0C, portC_write); + io.register_write(0x81, port81_write); + + function port_write(port, data_byte) + { + dbg_log("port " + port + " write " + data_byte, LOG_DMA); + + if(port < 8) + { + var channel = port >> 1; + + if(port & 1) + { + channels[channel].count = flipflop_get(channels[channel].count, data_byte); + } + else + { + channels[channel].address = flipflop_get(channels[channel].address, data_byte); + } + } + }; + + function port_read(port) + { + if(port < 8) + { + var channel = port >> 1; + + if(port & 1) + { + return channels[channel].count; + } + else + { + // Bug? + return channels[channel].address; + } + } + else + { + dbg_log("port " + h(port) + " read", LOG_DMA); + } + }; + + function portA_write(data_byte) + { + dbg_log("port A write: " + h(data_byte), LOG_DMA); + }; + + function portB_write(data_byte) + { + dbg_log("port B write: " + h(data_byte), LOG_DMA); + }; + + function portC_write(data_byte) + { + lsb_msb_flipflop = 0; + } + + function port81_write(data_byte) + { + channels[2].address = channels[2].address & 0xFFFF | data_byte << 16; + } + + // read data, write to memory + this.do_read = function(buffer, start, len, channel, fn) + { + var read_count = channels[channel].count, + addr = channels[channel].address; + + dbg_log("DMA write channel " + channel, LOG_DMA); + dbg_log("to " + h(addr) + " len " + h(read_count), LOG_DMA); + + if(len < read_count) + { + dbg_log("DMA should read more than provided: " + h(len) + " " + h(read_count), LOG_DMA); + } + + channels[channel].address += len; + + buffer.get(start, len, function(data) + { + memory.write_blob(data, addr); + fn(); + }); + }; + + // write data, read memory + this.do_write = function(buffer, start, len, channel, fn) + { + var read_count = channels[channel].count, + addr = channels[channel].address; + + dbg_log("DMA write channel " + channel, LOG_DMA); + dbg_log("to " + h(addr) + " len " + h(read_count), LOG_DMA); + dbg_log(channels[channel], LOG_DMA); + + if(len < read_count) + { + dbg_log("DMA should read more than provided", LOG_DMA); + } + + buffer.set(start, + new Uint8Array(memory.buffer, addr, read_count + 1), + function() { + fn(); + } + ); + } + + function flipflop_get(old_dword, new_byte) + { + lsb_msb_flipflop ^= 1; + + if(lsb_msb_flipflop) + { + // low byte + return old_dword & ~0xFF | new_byte; + } + else + { + // high byte + return old_dword & ~0xFF00 | new_byte << 8; + } + } +} diff --git a/src/externs.js b/src/externs.js new file mode 100644 index 00000000..95d5d856 --- /dev/null +++ b/src/externs.js @@ -0,0 +1 @@ +var console = {}; diff --git a/src/floppy.js b/src/floppy.js new file mode 100644 index 00000000..92c315e1 --- /dev/null +++ b/src/floppy.js @@ -0,0 +1,396 @@ +"use strict"; + +/** @constructor */ +function FloppyController(dev, floppy_image) +{ + var + io = dev.io, + pic = dev.pic, + dma = dev.dma, + + bytes_expecting = 0, + receiving_command = new Uint8Array(10), + receiving_index = 0, + next_command, + + response_data = new Uint8Array(10), + response_index = 0, + response_length = 0, + + /** @const */ + byte_per_sector = 512, + + /** @const */ + number_of_heads = 2; + + this.buffer = floppy_image; + + if(!floppy_image) + { + this.type = 0; + return; + } + + var number_of_cylinders, + number_of_sectors, + sectors_per_track; + + if(floppy_image.byteLength === 1024 * 360) + { + this.type = 1; + number_of_cylinders = 40; + number_of_sectors = 2880; + sectors_per_track = 9; + } + if(floppy_image.byteLength === 1024 * 1200) + { + this.type = 2; + number_of_cylinders = 80; + number_of_sectors = 2400; + sectors_per_track = 15; + } + else if(floppy_image.byteLength === 1024 * 720) + { + this.type = 3; + number_of_cylinders = 80; + number_of_sectors = 2880; + sectors_per_track = 9; + } + else if(floppy_image.byteLength === 1024 * 1440) + { + this.type = 4; + number_of_cylinders = 80; + number_of_sectors = 2880; + sectors_per_track = 18; + } + else if(floppy_image.byteLength === 1024 * 2880) + { + this.type = 5; + number_of_cylinders = 80; + number_of_sectors = 5760; + sectors_per_track = 36; + } + else if(floppy_image.byteLength === 1024 * 1722) + { + // type is wrong, but only this works for seabios + this.type = 5; + number_of_cylinders = 82; + number_of_sectors = 3444; + sectors_per_track = 21; + } + else + { + throw unimpl("Unknown floppy size: " + h(floppy_image.byteLength)); + } + + var status_reg0 = 0, + status_reg1 = 0, + status_reg2 = 0, + drive = 0; + + var last_cylinder = 0, + last_head = 0, + last_sector = 1; + + io.register_read(0x3F0, port3F0_read); + io.register_read(0x3F4, port3F4_read); + io.register_read(0x3F5, port3F5_read); + io.register_read(0x3F7, port3F7_read); + + io.register_write(0x3F5, port3F5_write); + + function port3F0_read() + { + dbg_log("3F0 read", LOG_DISK); + + return 0; + }; + + + function port3F4_read() + { + dbg_log("3F4 read", LOG_DISK); + + var return_byte = 0x80; + + if(response_index < response_length) + { + return_byte |= 0x40 | 0x10; + } + + if((dor & 8) === 0) + { + return_byte |= 0x20; + } + + return return_byte; + }; + + function port3F7_read() + { + dbg_log("3F7 read", LOG_DISK); + return 0x00; + } + + function port3F5_read() + { + if(response_index < response_length) + { + dbg_log("3F5 read: " + response_data[response_index], LOG_DISK); + return response_data[response_index++]; + } + else + { + dbg_log("3F5 read, empty", LOG_DISK); + return 0xFF; + } + }; + + function port3F5_write(reg_byte) + { + dbg_log("3F5 write " + h(reg_byte), LOG_DISK); + + if(bytes_expecting > 0) + { + receiving_command[receiving_index++] = reg_byte; + + bytes_expecting--; + + if(bytes_expecting === 0) + { + if(DEBUG) + { + var log = "3F5 command received: "; + for(var i = 0; i < receiving_index; i++) + log += h(receiving_command[i]) + " "; + dbg_log(log, LOG_DISK); + } + + next_command(receiving_command); + } + } + else + { + switch(reg_byte) + { + // TODO + //case 2: + //next_command = read_complete_track; + //bytes_expecting = 8; + //break; + case 0x03: + next_command = fix_drive_data; + bytes_expecting = 2; + break; + case 0x04: + next_command = check_drive_status; + bytes_expecting = 1; + break; + case 0x05: + case 0xC5: + next_command = function(args) { do_sector(true, args); }; + bytes_expecting = 8; + break; + case 0xE6: + next_command = function(args) { do_sector(false, args); }; + bytes_expecting = 8; + break; + case 0x07: + next_command = calibrate; + bytes_expecting = 1; + break; + case 0x08: + check_interrupt_status(); + break; + case 0x4A: + next_command = read_sector_id; + bytes_expecting = 1; + break; + case 0x0F: + bytes_expecting = 2; + next_command = seek; + break; + case 0x0E: + // dump regs + dbg_log("dump registers", LOG_DISK); + response_data[0] = 0x80; + response_index = 0; + response_length = 1; + + bytes_expecting = 0; + break; + default: + if(DEBUG) throw "unimpl floppy command call " + h(reg_byte); + } + + receiving_index = 0; + } + }; + + + // this should actually be write-only ... but people read it anyway + var dor = 0; + + function port3F2_read() + { + dbg_log("read 3F2: DOR", LOG_DISK); + return dor; + } + io.register_read(0x3F2, port3F2_read); + + function port3F2_write(value) + { + if((value & 4) === 4 && (dor & 4) === 0) + { + // reset + pic.push_irq(6); + } + + dbg_log("start motors: " + h(value >> 4), LOG_DISK); + dbg_log("enable dma: " + !!(value & 8), LOG_DISK); + dbg_log("reset fdc: " + !!(value & 4), LOG_DISK); + dbg_log("drive select: " + (value & 3), LOG_DISK); + dbg_log("DOR = " + h(value), LOG_DISK); + + dor = value; + + } + io.register_write(0x3F2, port3F2_write); + + function check_drive_status(args) + { + dbg_log("check drive status", LOG_DISK); + + response_index = 0; + response_length = 1; + response_data[0] = 1 << 5; + } + + function seek(args) + { + dbg_log("seek", LOG_DISK); + + last_cylinder = args[1]; + last_head = args[0] >> 2 & 1; + + if(dor & 8) + { + pic.push_irq(6); + } + } + + function calibrate(args) + { + dbg_log("floppy calibrate", LOG_DISK); + + if(dor & 8) + { + pic.push_irq(6); + } + } + + function check_interrupt_status() + { + // do not trigger an interrupt here + dbg_log("floppy check interrupt status", LOG_DISK); + + response_index = 0; + response_length = 2; + + response_data[0] = 1 << 5; + response_data[1] = last_cylinder; + } + + function do_sector(is_write, args) + { + var head = args[2], + cylinder = args[1], + sector = args[3], + sector_size = 128 * (1 << args[4]), + read_count = args[5] - args[3] + 1, + + read_offset = ((head + number_of_heads * cylinder) * sectors_per_track + sector - 1) * sector_size; + + dbg_log("Floppy Read", LOG_DISK); + dbg_log("from " + h(read_offset) + " length " + h(read_count * sector_size), LOG_DISK); + dbg_log(cylinder + " / " + head + " / " + sector, LOG_DISK); + + if(!args[4]) + { + dbg_log("FDC: sector count is zero, use data length instead", LOG_DISK); + } + + if(is_write) + { + dma.do_write(floppy_image, read_offset, read_count * sector_size, 2, done); + } + else + { + dma.do_read(floppy_image, read_offset, read_count * sector_size, 2, done); + } + + function done() + { + sector++; + + if(sector > sectors_per_track) + { + sector = 1; + head++; + + if(head > 1) + { + head = 0; + cylinder++; + } + } + + last_cylinder = cylinder; + last_head = head; + last_sector = sector; + + response_index = 0; + response_length = 7; + + response_data[0] = head << 2 | 0x20; + response_data[1] = 0; + response_data[2] = 0; + response_data[3] = cylinder; + response_data[4] = head; + response_data[5] = sector; + response_data[6] = args[4]; + + if(dor & 8) + { + pic.push_irq(6); + } + } + } + + function fix_drive_data(args) + { + dbg_log("floppy fix drive data " + args, LOG_DISK); + } + + function read_sector_id(args) + { + dbg_log("floppy read sector id " + args, LOG_DISK); + + response_index = 0; + response_length = 7; + + response_data[0] = 0; + response_data[1] = 0; + response_data[2] = 0; + response_data[3] = 0; + response_data[4] = 0; + response_data[5] = 0; + response_data[6] = 0; + + if(dor & 8) + { + pic.push_irq(6); + } + } +} + diff --git a/src/fpu.macro.js b/src/fpu.macro.js new file mode 100644 index 00000000..3e587294 --- /dev/null +++ b/src/fpu.macro.js @@ -0,0 +1,1656 @@ +"use strict"; + +/** @const */ +var FPU_LOG_OP = true; + + +/** + * this behaves as if no x87 fpu existed + * @constructor + */ +function NoFPU(io) +{ + this.is_fpu = 0; + //cr0 |= 4; + + this.fwait = function() + { + + }; + + this.op_D8_reg = function(imm8) + { + trigger_ud(); + }; + + this.op_D8_mem = function(imm8, addr) + { + trigger_ud(); + }; + + this.op_D9_reg = function(imm8) + { + trigger_ud(); + }; + + this.op_D9_mem = function(imm8, addr) + { + var mod = imm8 >> 3 & 7; + + if(mod === 7) + { + // FNSTCW + dbg_log("Unimplemented D9", LOG_FPU); + safe_write16(addr, 0); + } + else + { + trigger_ud(); + } + }; + + this.op_DA = function(imm8) + { + trigger_ud(); + }; + + this.op_DA_mem = function(imm8, addr) + { + trigger_ud(); + }; + + this.op_DB_reg = function(imm8) + { + if(imm8 === 0xE3) + { + // fninit + // don't error, even if no fpu is present + dbg_log("Unimplemented DB", LOG_FPU); + } + else + { + trigger_ud(); + } + }; + + this.op_DB_mem = function(imm8, addr) + { + trigger_ud(); + }; + + this.op_DC_reg = function(imm8) + { + trigger_ud(); + }; + + this.op_DC_mem = function(imm8, addr) + { + trigger_ud(); + }; + + this.op_DD_reg = function(imm8) + { + trigger_ud(); + }; + + this.op_DD_mem = function(imm8, addr) + { + var mod = imm8 >> 3 & 7; + + switch(mod) + { + case 7: + // fnstsw / store status word + // no fpu -> write nonzero + dbg_log("Unimplemented DD", LOG_FPU); + safe_write16(addr, 1); + break; + default: + trigger_ud(); + } + }; + + this.op_DE_reg = function(imm8) + { + trigger_ud(); + }; + + this.op_DE_mem = function(imm8, addr) + { + trigger_ud(); + }; + + this.op_DF_reg = function(imm8) + { + if(imm8 === 0xE0) + { + // fnstsw + // no fpu -> write nonzero + dbg_log("Unimplemented DF", LOG_FPU); + reg16[reg_ax] = 1; + } + else + { + trigger_ud(); + } + }; + + this.op_DF_mem = function(imm8, addr) + { + trigger_ud(); + }; +} + +/** + * @constructor + */ +function FPU(io) +{ + this.is_fpu = 1; + + // TODO: + // - Precision Control + // - QNaN, unordered comparison + // - Exceptions + + var + /** @const */ + C0 = 0x100, + /** @const */ + C1 = 0x200, + /** @const */ + C2 = 0x400, + /** @const */ + C3 = 0x4000, + /** @const */ + RESULT_FLAGS = C0 | C1 | C2 | C3, + /** @const */ + STACK_TOP = 0x3800; + + var + // precision, round & infinity control + /** @const */ + PC = 3 << 8, + /** @const */ + RC = 3 << 10, + /** @const */ + IF = 1 << 12; + + // exception bits in the status word + var EX_SF = 1 << 6, + EX_P = 1 << 5, + EX_U = 1 << 4, + EX_O = 1 << 3, + EX_Z = 1 << 2, + EX_D = 1 << 1, + EX_I = 1 << 0; + + var + // Why no Float80Array :-( + st = new Float64Array(8), + st8 = new Uint8Array(st.buffer), + st32 = new Uint32Array(st.buffer), + + // bitmap of which stack registers are empty + stack_empty = 0xff, + stack_ptr = 0, + + // used for conversion + float32 = new Float32Array(1), + float32_byte = new Uint8Array(float32.buffer), + float32_int = new Uint32Array(float32.buffer), + + float64 = new Float64Array(1), + float64_byte = new Uint8Array(float64.buffer), + float64_int = new Uint32Array(float64.buffer), + + float80_int = new Uint8Array(10), + + + control_word = 0x37F, + status_word = 0, + fpu_ip = 0, + fpu_ip_selector = 0, + fpu_opcode = 0, + fpu_dp = 0, + fpu_dp_selector = 0, + + + /** @const */ + indefinite_nan = NaN; + + + var constants = new Float64Array([ + 1, Math.log(10) / Math.LN2, Math.LOG2E, Math.PI, + Math.log(2) / Math.LN10, Math.LN2, 0 + ]); + + function fpu_unimpl() + { + dbg_trace(); + if(DEBUG) throw "fpu: unimplemented"; + else trigger_ud(); + } + + function stack_fault() + { + // TODO: Interrupt + status_word |= EX_SF | EX_I; + } + + function invalid_arithmatic() + { + status_word |= EX_I; + } + + function fcom(y) + { + var x = get_st0(); + + status_word &= ~RESULT_FLAGS; + + if(x > y) + { + } + else if(y > x) + { + status_word |= C0; + } + else if(x === y) + { + status_word |= C3; + } + else + { + status_word |= C0 | C2 | C3; + } + } + + function fucom(y) + { + // TODO + fcom(y); + } + + + function fcomi(y) + { + var x = st[stack_ptr]; + + flags_changed &= ~(1 | flag_parity | flag_zero); + flags &= ~(1 | flag_parity | flag_zero); + + if(x > y) + { + } + else if(y > x) + { + flags |= 1; + } + else if(x === y) + { + flags |= flag_zero; + } + else + { + flags |= 1 | flag_parity | flag_zero; + } + } + + function fucomi(y) + { + // TODO + fcomi(y); + } + + function ftst() + { + var st0 = get_st0(); + + status_word &= ~RESULT_FLAGS; + + if(isNaN(st0)) + { + status_word |= C3 | C2 | C0; + } + else if(st0 === 0) + { + status_word |= C3; + } + else if(st0 < 0) + { + status_word |= C0; + } + + // TODO: unordered (st0 is nan, etc) + } + + function fxam() + { + var x = get_st0(); + + status_word &= ~RESULT_FLAGS; + status_word |= sign(0) << 9; + + if(stack_empty >> stack_ptr & 1) + { + status_word |= C3 | C0; + } + else if(isNaN(x)) + { + status_word |= C0; + } + else if(x === 0) + { + status_word |= C3; + } + else if(x === Infinity || x === -Infinity) + { + status_word |= C2 | C0; + } + else + { + status_word |= C2; + } + // TODO: + // Unsupported, Denormal + } + + function finit() + { + control_word = 0x37F; + status_word = 0; + fpu_ip = 0; + fpu_dp = 0; + fpu_opcode = 0; + + stack_empty = 0xFF; + stack_ptr = 0; + } + + function load_status_word() + { + return status_word & ~(7 << 11) | stack_ptr << 11; + } + + function safe_status_word(sw) + { + status_word = sw & ~(7 << 11); + stack_ptr = sw >> 11 & 7; + } + + function load_tag_word() + { + var tag_word = 0, + value; + + for(var i = 0; i < 8; i++) + { + value = st[i]; + + if(stack_empty >> i & 1) + { + tag_word |= 3 << (i << 1); + } + else if(value === 0) + { + tag_word |= 1 << (i << 1); + } + else if(isNaN(value) || value === Infinity || value === -Infinity) + { + tag_word |= 2 << (i << 1); + } + } + + //dbg_log("load tw=" + h(tag_word) + " se=" + h(stack_empty) + " sp=" + stack_ptr, LOG_FPU); + + return tag_word; + } + + function safe_tag_word(tag_word) + { + stack_empty = 0; + + for(var i = 0; i < 8; i++) + { + stack_empty |= (tag_word >> i) & (tag_word >> i + 1) & 1 << i; + } + + //dbg_log("safe tw=" + h(tag_word) + " se=" + h(stack_empty), LOG_FPU); + } + + function fstenv(addr) + { + if(operand_size_32) + { + safe_write16(addr, control_word); + + safe_write16(addr + 4, load_status_word()); + safe_write16(addr + 8, load_tag_word()); + + safe_write32(addr + 12, fpu_ip); + safe_write16(addr + 16, fpu_ip_selector); + safe_write16(addr + 18, fpu_opcode); + safe_write32(addr + 20, fpu_dp); + safe_write16(addr + 24, fpu_dp_selector); + } + else + { + fpu_unimpl(); + } + } + + function fldenv(addr) + { + if(operand_size_32) + { + control_word = safe_read16(addr); + + safe_status_word(safe_read16(addr + 4)); + safe_tag_word(safe_read16(addr + 8)); + + fpu_ip = safe_read32(addr + 12); + fpu_ip_selector = safe_read16(addr + 16); + fpu_opcode = safe_read16(addr + 18); + fpu_dp = safe_read32(addr + 20); + fpu_dp_selector = safe_read16(addr + 24); + } + else + { + fpu_unimpl(); + } + } + + function fsave(addr) + { + fstenv(addr); + addr += 28; + + for(var i = 0; i < 8; i++) + { + store_m80(addr, i - stack_ptr & 7); + addr += 10; + } + + //dbg_log("save " + [].slice.call(st), LOG_FPU); + + finit(); + } + + function frstor(addr) + { + fldenv(addr); + addr += 28; + + for(var i = 0; i < 8; i++) + { + st[i] = load_m80(addr); + addr += 10; + } + + //dbg_log("rstor " + [].slice.call(st), LOG_FPU); + } + + function integer_round(f) + { + var rc = control_word >> 10 & 3; + + if(rc === 0) + { + // Round to nearest, or even if equidistant + var rounded = Math.round(f); + + if(rounded - f === 0.5 && (rounded & 1)) + { + // Special case: Math.round rounds to positive infinity + // if equidistant + rounded--; + } + + return rounded; + } + // rc=3 is truncate -> floor for positive numbers + else if(rc === 1 || (rc === 3 && f > 0)) + { + return Math.floor(f); + } + else + { + return Math.ceil(f); + } + } + + function truncate(x) + { + return x > 0 ? Math.floor(x) : Math.ceil(x); + } + + function push(x) + { + stack_ptr = stack_ptr - 1 & 7; + + if(stack_empty >> stack_ptr & 1) + { + status_word &= ~C1; + stack_empty &= ~(1 << stack_ptr); + st[stack_ptr] = x; + } + else + { + status_word |= C1; + stack_fault(); + st[stack_ptr] = indefinite_nan; + } + } + + function pop() + { + stack_empty |= 1 << stack_ptr; + stack_ptr = stack_ptr + 1 & 7; + } + + function get_sti(i) + { + dbg_assert(typeof i === "number" && i >= 0 && i < 8); + + i = i + stack_ptr & 7; + + if(stack_empty >> i & 1) + { + status_word &= ~C1; + stack_fault(); + return indefinite_nan; + } + else + { + return st[i]; + } + } + + function get_st0() + { + if(stack_empty >> stack_ptr & 1) + { + status_word &= ~C1; + stack_fault(); + return indefinite_nan; + } + else + { + return st[stack_ptr]; + } + } + + function assert_not_empty(i) + { + if(stack_empty >> (i + stack_ptr & 7) & 1) + { + status_word &= ~C1; + } + else + { + } + } + + function load_m80(addr) + { + var exponent = safe_read16(addr + 8), + sign, + + low = safe_read32(addr), + high = safe_read32(addr + 4); + + sign = exponent >> 15; + exponent &= ~0x8000; + + if(exponent === 0) + { + // TODO: denormal numbers + return 0; + } + + if(exponent < 0x7FFF) + { + exponent -= 0x3FFF; + } + else + { + // TODO: NaN, Infinity + //dbg_log("Load m80 TODO", LOG_FPU); + float64_byte[7] = 0x7F | sign << 7; + float64_byte[6] = 0xF0 | high >> 30 << 3 & 0x08; + + float64_byte[5] = 0; + float64_byte[4] = 0; + + float64_int[0] = 0; + + return float64[0]; + } + + // Note: some bits might be lost at this point + var mantissa = low + 0x100000000 * high; + + if(sign) + { + mantissa = -mantissa; + } + + //console.log("m: " + mantissa); + //console.log("e: " + exponent); + //console.log("s: " + sign); + //console.log("f: " + mantissa * Math.pow(2, exponent - 63)); + + // Simply compute the 64 bit floating point number. + // An alternative write the mantissa, sign and exponent in the + // float64_byte and return float64[0] + + return mantissa * Math.pow(2, exponent - 63); + } + + function store_m80(addr, i) + { + float64[0] = st[stack_ptr + i & 7]; + + var sign = float64_byte[7] & 0x80, + exponent = (float64_byte[7] & 0x7f) << 4 | float64_byte[6] >> 4, + low, + high; + + if(exponent === 0x7FF) + { + // all bits set (NaN and infinity) + exponent = 0x7FFF; + low = 0; + high = 0x80000000 | (float64_int[1] & 0x80000) << 11; + } + else if(exponent === 0) + { + // zero and denormal numbers + // Just assume zero for now + low = 0; + high = 0; + } + else + { + exponent += 0x3FFF - 0x3FF; + + // does the mantissa need to be adjusted? + low = float64_int[0] << 11; + high = 0x80000000 | (float64_int[1] & 0xFFFFF) << 11 | (float64_int[0] >>> 21); + } + + dbg_assert(exponent >= 0 && exponent < 0x8000); + + safe_write32(addr, low); + safe_write32(addr + 4, high); + + safe_write16(addr + 8, sign << 8 | exponent); + } + + function load_m64(addr) + { + float64_int[0] = safe_read32s(addr); + float64_int[1] = safe_read32s(addr + 4); + + return float64[0]; + }; + + function store_m64(addr, i) + { + // protect against writing only a single dword + // and then page-faulting + translate_address_write(addr + 7); + + float64[0] = get_sti(i); + + safe_write32(addr, float64_int[0]); + safe_write32(addr + 4, float64_int[1]); + }; + + function load_m32(addr) + { + float32_int[0] = safe_read32s(addr); + + return float32[0]; + }; + + function store_m32(addr, i) + { + float32[0] = get_sti(i); + + safe_write32(addr, float32_int[0]); + }; + + // sign of a number on the stack + function sign(i) + { + return st8[(stack_ptr + i & 7) << 3 | 7] >> 7; + }; + + + function dbg_log_fpu_op(op, imm8) + { + if(!FPU_LOG_OP) + { + return; + } + + if(imm8 >= 0xC0) + { + dbg_log(h(op, 2) + " " + h(imm8, 2) + "/" + (imm8 >> 3 & 7) + "/" + (imm8 & 7) + + " @" + h(instruction_pointer, 8) + " sp=" + stack_ptr + " st=" + h(stack_empty, 2), LOG_FPU); + } + else + { + dbg_log(h(op, 2) + " /" + (imm8 >> 3 & 7) + + " @" + h(instruction_pointer, 8) + " sp=" + stack_ptr + " st=" + h(stack_empty, 2), LOG_FPU); + } + } + + + this.fwait = function() + { + // TODO: + // Exceptions + }; + + + this.op_D8_reg = function(imm8) + { + dbg_log_fpu_op(0xD8, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7, + sti = get_sti(low), + st0 = get_st0(); + + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + sti; + break; + case 1: + // fmul + st[stack_ptr] = st0 * sti; + break; + case 2: + // fcom + fcom(sti); + break; + case 3: + // fcomp + fcom(sti); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - sti; + break; + case 5: + // fsubr + st[stack_ptr] = sti - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / sti; + break; + case 7: + // fdivr + st[stack_ptr] = sti / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_D8_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xD8, imm8); + + var mod = imm8 >> 3 & 7, + m32 = load_m32(addr); + + var st0 = get_st0(); + + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m32; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m32; + break; + case 2: + // fcom + fcom(m32); + break; + case 3: + // fcomp + fcom(m32); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m32; + break; + case 5: + // fsubr + st[stack_ptr] = m32 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m32; + break; + case 7: + // fdivr + st[stack_ptr] = m32 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_D9_reg = function(imm8) + { + dbg_log_fpu_op(0xD9, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + + switch(mod) + { + case 0: + // fld + var sti = get_sti(low); + push(sti); + break; + case 1: + // fxch + var sti = get_sti(low); + + st[stack_ptr + low & 7] = get_st0(); + st[stack_ptr] = sti; + break; + case 4: + switch(low) + { + case 0: + // fchs + st[stack_ptr] = -get_st0(); + break; + case 1: + // fabs + st[stack_ptr] = Math.abs(get_st0()); + break; + case 4: + ftst(); + break; + case 5: + fxam(); + break; + default: + dbg_log(low); fpu_unimpl(); + } + break; + case 5: + push(constants[low]); + break; + case 6: + switch(low) + { + case 0: + // f2xm1 + st[stack_ptr] = Math.pow(2, get_st0()) - 1; + break; + case 1: + // fyl2x + st[stack_ptr + 1 & 7] = get_sti(1) * Math.log(get_st0()) / Math.LN2; + pop(); + break; + case 2: + // fptan + st[stack_ptr] = Math.tan(get_st0()); + push(1); // no bug: push constant 1 + break; + case 3: + // fpatan + //st[stack_ptr + 1 & 7] = Math.atan(get_sti(1) / get_st0()); + st[stack_ptr + 1 & 7] = Math.atan2(get_sti(1), get_st0()); + pop(); + break; + case 5: + // fprem1 + st[stack_ptr] = get_st0() % get_sti(1); + break; + default: + dbg_log(low); fpu_unimpl(); + } + break; + case 7: + switch(low) + { + case 0: + // fprem + st[stack_ptr] = get_st0() % get_sti(1); + break; + case 2: + st[stack_ptr] = Math.sqrt(get_st0()); + break; + case 3: + var st0 = get_st0(); + + st[stack_ptr] = Math.sin(st0); + push(Math.cos(st0)); + break; + case 4: + // frndint + st[stack_ptr] = integer_round(get_st0()); + break; + case 5: + // fscale + st[stack_ptr] = get_st0() * Math.pow(2, truncate(get_sti(1))); + break; + case 6: + st[stack_ptr] = Math.sin(get_st0()); + break; + case 7: + st[stack_ptr] = Math.cos(get_st0()); + break; + default: + dbg_log(low); fpu_unimpl(); + } + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_D9_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xD9, imm8); + + var mod = imm8 >> 3 & 7; + + switch(mod) + { + case 0: + var data = load_m32(addr); + + push(data); + break; + case 2: + store_m32(addr, 0); + break; + case 3: + store_m32(addr, 0); + pop(); + break; + case 4: + fldenv(addr); + break; + case 5: + var word = safe_read16(addr); + control_word = word; + break; + case 6: + fstenv(addr); + break; + case 7: + safe_write16(addr, control_word); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DA_reg = function(imm8) + { + dbg_log_fpu_op(0xDA, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + + switch(mod) + { + case 0: + // fcmovb + if(test_b()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 1: + // fcmove + if(test_z()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 2: + // fcmovbe + if(test_be()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 3: + // fcmovu + if(test_p()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 5: + if(low === 1) + { + // fucompp + fucom(get_sti(1)); + pop(); + pop(); + } + else + { + dbg_log(mod); fpu_unimpl(); + } + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DA_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDA, imm8); + + var mod = imm8 >> 3 & 7, + m32 = safe_read32s(addr); + + var st0 = get_st0(); + + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m32; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m32; + break; + case 2: + // fcom + fcom(m32); + break; + case 3: + // fcomp + fcom(m32); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m32; + break; + case 5: + // fsubr + st[stack_ptr] = m32 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m32; + break; + case 7: + // fdivr + st[stack_ptr] = m32 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DB_reg = function(imm8) + { + dbg_log_fpu_op(0xDB, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + + switch(mod) + { + case 0: + // fcmovnb + if(!test_b()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 1: + // fcmovne + if(!test_z()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 2: + // fcmovnbe + if(!test_be()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 3: + // fcmovnu + if(!test_p()) + { + st[stack_ptr] = get_sti(low); + stack_empty &= ~(1 << stack_ptr); + } + break; + case 4: + if(imm8 === 0xE3) + { + finit(); + } + else if(imm8 === 0xE4) + { + // fsetpm + // treat as nop + } + else + { + fpu_unimpl(); + } + break; + case 5: + fucomi(get_sti(low)); + break; + case 6: + fcomi(get_sti(low)); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DB_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDB, imm8); + + var mod = imm8 >> 3 & 7; + + switch(mod) + { + case 0: + // fild + var int32 = safe_read32s(addr); + push(int32); + break; + case 2: + // fist + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFFFFFF || st0 < -0x80000000) + { + invalid_arithmatic(); + safe_write32(addr, 0x80000000); + } + else + { + // TODO: Invalid operation + safe_write32(addr, integer_round(st0)); + } + break; + case 3: + // fistp + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFFFFFF || st0 < -0x80000000) + { + invalid_arithmatic(); + safe_write32(addr, 0x80000000); + } + else + { + safe_write32(addr, integer_round(st0)); + } + pop(); + break; + case 5: + // fld + push(load_m80(addr)); + break; + case 7: + // fstp + store_m80(addr, 0); + pop(); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DC_reg = function(imm8) + { + dbg_log_fpu_op(0xDC, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7, + low_ptr = stack_ptr + low & 7, + sti = get_sti(low), + st0 = get_st0(); + + switch(mod) + { + case 0: + // fadd + st[low_ptr] = sti + st0; + break; + case 1: + // fmul + st[low_ptr] = sti * st0; + break; + case 2: + // fcom + fcom(sti); + break; + case 3: + // fcomp + fcom(sti); + pop(); + break; + case 4: + // fsubr + st[low_ptr] = st0 - sti; + break; + case 5: + // fsub + st[low_ptr] = sti - st0; + break; + case 6: + // fdivr + st[low_ptr] = st0 / sti; + break; + case 7: + // fdiv + st[low_ptr] = sti / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DC_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDC, imm8); + + var + mod = imm8 >> 3 & 7, + m64 = load_m64(addr); + + var st0 = get_st0(); + + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m64; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m64; + break; + case 2: + // fcom + fcom(m64); + break; + case 3: + // fcomp + fcom(m64); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m64; + break; + case 5: + // fsubr + st[stack_ptr] = m64 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m64; + break; + case 7: + // fdivr + st[stack_ptr] = m64 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DD_reg = function(imm8) + { + dbg_log_fpu_op(0xDD, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + + switch(mod) + { + case 0: + // ffree + stack_empty |= 1 << (stack_ptr + low & 7); + break; + case 2: + // fst + st[stack_ptr + low & 7] = get_st0(); + break; + case 3: + // fstp + if(low === 0) + { + pop(); + } + else + { + st[stack_ptr + low & 7] = get_st0(); + pop(); + } + break; + case 4: + fucom(get_sti(low)); + break; + case 5: + // fucomp + fucom(get_sti(low)); + pop(); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DD_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDD, imm8); + + var mod = imm8 >> 3 & 7; + + switch(mod) + { + case 0: + // fld + var data = load_m64(addr); + push(data); + break; + case 2: + // fst + store_m64(addr, 0); + break; + case 3: + // fstp + store_m64(addr, 0); + pop(); + break; + case 4: + frstor(addr); + break; + case 6: + // fsave + fsave(addr); + break; + case 7: + // fnstsw / store status word + safe_write16(addr, load_status_word()); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + + this.op_DE_reg = function(imm8) + { + dbg_log_fpu_op(0xDE, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7, + low_ptr = stack_ptr + low & 7, + sti = get_sti(low), + st0 = get_st0(); + + switch(mod) + { + case 0: + // faddp + st[low_ptr] = sti + st0; + break; + case 1: + // fmulp + st[low_ptr] = sti * st0; + break; + case 2: + // fcomp + fcom(sti); + break; + case 3: + // fcompp + if(low === 1) + { + fcom(st[low_ptr]); + pop(); + } + else + { + // not a valid encoding + dbg_log(mod); + fpu_unimpl(); + } + break; + case 4: + // fsubrp + st[low_ptr] = st0 - sti; + break; + case 5: + // fsubp + st[low_ptr] = sti - st0; + break; + case 6: + // fdivrp + st[low_ptr] = st0 / sti; + break; + case 7: + // fdivp + st[low_ptr] = sti / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + + pop(); + }; + + this.op_DE_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDE, imm8); + + var mod = imm8 >> 3 & 7, + m16 = safe_read16s(addr); + + var st0 = get_st0(); + + switch(mod) + { + case 0: + // fadd + st[stack_ptr] = st0 + m16; + break; + case 1: + // fmul + st[stack_ptr] = st0 * m16; + break; + case 2: + // fcom + fcom(m16); + break; + case 3: + // fcomp + fcom(m16); + pop(); + break; + case 4: + // fsub + st[stack_ptr] = st0 - m16; + break; + case 5: + // fsubr + st[stack_ptr] = m16 - st0; + break; + case 6: + // fdiv + st[stack_ptr] = st0 / m16; + break; + case 7: + // fdivr + st[stack_ptr] = m16 / st0; + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DF_reg = function(imm8) + { + dbg_log_fpu_op(0xDF, imm8); + + var mod = imm8 >> 3 & 7, + low = imm8 & 7; + + switch(mod) + { + case 4: + if(imm8 === 0xE0) + { + // fnstsw + reg16[reg_ax] = load_status_word(); + } + else + { + dbg_log(imm8); + fpu_unimpl(); + } + break; + case 5: + // fucomip + fucomi(get_sti(low)); + pop(); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; + + this.op_DF_mem = function(imm8, addr) + { + dbg_log_fpu_op(0xDF, imm8); + + var mod = imm8 >> 3 & 7; + + switch(mod) + { + case 0: + var m16 = safe_read16s(addr); + + push(m16); + break; + case 2: + // fist + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFF || st0 < -0x8000) + { + invalid_arithmatic(); + safe_write16(addr, 0x8000); + } + else + { + safe_write16(addr, integer_round(st0)); + } + break; + case 3: + // fistp + var st0 = get_st0(); + if(isNaN(st0) || st0 > 0x7FFF || st0 < -0x8000) + { + invalid_arithmatic(); + safe_write16(addr, 0x8000); + } + else + { + safe_write16(addr, integer_round(st0)); + } + pop(); + break; + case 5: + // fild + var low = safe_read32(addr); + + var high = safe_read32(addr + 4); + + var m64 = low + 0x100000000 * high; + + if(high >> 31) + { + m64 -= 0x10000000000000000; + } + + push(m64); + break; + case 7: + // fistp + var st0 = integer_round(get_st0()); + + if(isNaN(st0) || st0 > 0x7FFFFFFFFFFFFFFF || st0 < -0x8000000000000000) + { + st0 = 0x8000000000000000; + invalid_arithmatic(); + } + pop(); + safe_write32(addr, st0); + + st0 /= 0x100000000; + + if(st0 < 0 && st0 > -1) + st0 = -1; + + safe_write32(addr + 4, st0); + break; + default: + dbg_log(mod); + fpu_unimpl(); + } + }; +} diff --git a/src/instructions.macro.js b/src/instructions.macro.js new file mode 100644 index 00000000..34005bde --- /dev/null +++ b/src/instructions.macro.js @@ -0,0 +1,2263 @@ +"use strict"; + + + +var table16 = [], + table32 = [], + table0F_16 = [], + table0F_32 = []; + + +#define do_op() table[read_imm8()]() + +#define unimplemented_sse(num) op(num, {\ + dbg_log("No SSE", LOG_CPU);\ + trigger_ud();\ +}) + +#define undefined_instruction(num) op(num, {\ + if(DEBUG) throw "Possible fault: undefined instruction"; \ + trigger_ud();\ +}) + +#define todo_op(num) op(num, {\ + todo();\ +}) + +#define todo()\ + if(DEBUG) { dbg_trace(); throw "TODO"; }\ + trigger_ud(); + + +#define each_jcc(macro)\ + macro(0x0, (test_o()));\ + macro(0x1, (!test_o()));\ + macro(0x2, (test_b()));\ + macro(0x3, (!test_b()));\ + macro(0x4, (test_z()));\ + macro(0x5, (!test_z()));\ + macro(0x6, (test_be()));\ + macro(0x7, (!test_be()));\ + macro(0x8, (test_s()));\ + macro(0x9, (!test_s()));\ + macro(0xA, (test_p()));\ + macro(0xB, (!test_p()));\ + macro(0xC, (test_l()));\ + macro(0xD, (!test_l()));\ + macro(0xE, (test_le()));\ + macro(0xF, (!test_le())); + +#define each_reg(macro)\ + macro(0, reg_ax, reg_eax)\ + macro(1, reg_cx, reg_ecx)\ + macro(2, reg_dx, reg_edx)\ + macro(3, reg_bx, reg_ebx)\ + macro(4, reg_sp, reg_esp)\ + macro(5, reg_bp, reg_ebp)\ + macro(6, reg_si, reg_esi)\ + macro(7, reg_di, reg_edi) + +#define each_reg8(macro)\ + macro(0, reg_al)\ + macro(1, reg_cl)\ + macro(2, reg_dl)\ + macro(3, reg_bl)\ + macro(4, reg_ah)\ + macro(5, reg_ch)\ + macro(6, reg_dh)\ + macro(7, reg_bh) + +// no cmp, because it uses different arguments +#define each_arith(macro)\ + macro(0, add)\ + macro(1, or)\ + macro(2, adc)\ + macro(3, sbb)\ + macro(4, and)\ + macro(5, sub)\ + macro(6, xor) + + + +#define safe_pop32s(dest) dest = pop32s(); +#define safe_pop16(dest) dest = pop16(); + + +// very special, should be somewhere else? +#define lss_op(sreg)\ + if(modrm_byte >= 0xC0) { raise_exception(6); return; }\ + if(operand_size_32) { lss32(sreg, modrm_resolve(modrm_byte), modrm_byte >> 3 & 7); }\ + else { lss16(sreg, modrm_resolve(modrm_byte), modrm_byte >> 2 & 14); } + + +#define bt_op(op, arg16, arg32)\ + if(operand_size_32) {\ + if(modrm_byte < 0xC0) {\ + op ## _mem(modrm_resolve(modrm_byte), arg32);\ + } else {\ + reg_e32 = op ## _reg(reg_e32s, arg32 & 31);\ + }\ + } else {\ + if(modrm_byte < 0xC0) {\ + op ## _mem(modrm_resolve(modrm_byte), arg16);\ + } else {\ + reg_e16 = op ## _reg(reg_e16, arg16 & 15);\ + }\ + } + + +// equivalent to switch(modrm_byte >> 3 & 7) +//#define sub_op(i0, i1, i2, i3, i4, i5, i6, i7) \ +// if(modrm_byte & 0x20) { sub_op1(i4, i5, i6, i7) }\ +// else { sub_op1(i0, i1, i2, i3) } +// +//#define sub_op1(i0, i1, i2, i3)\ +// if(modrm_byte & 0x10) { sub_op2(i2, i3) }\ +// else { sub_op2(i0, i1) } +// +//#define sub_op2(i0, i1)\ +// if(modrm_byte & 0x08) { i1 }\ +// else { i0 } + + +#define sub_op(i0, i1, i2, i3, i4, i5, i6, i7) \ + switch(modrm_byte >> 3 & 7) {\ + case 0: i0; break;\ + case 1: i1; break;\ + case 2: i2; break;\ + case 3: i3; break;\ + case 4: i4; break;\ + case 5: i5; break;\ + case 6: i6; break;\ + case 7: i7; break;\ + } + +#define pop_sreg_op(n, reg)\ + op2(n, \ + { switch_seg(reg, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 2; }, \ + { switch_seg(reg, memory.read16(get_esp_read(0))); stack_reg[reg_vsp] += 4; }); + + +#define reg_e8 reg8[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] +#define reg_e8s reg8s[modrm_byte << 2 & 0xC | modrm_byte >> 2 & 1] +#define reg_g8 reg8[modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1] + +#define reg_e16 reg16[modrm_byte << 1 & 14] +#define reg_e16s reg16s[modrm_byte << 1 & 14] +#define reg_g16 reg16[modrm_byte >> 2 & 14] +#define reg_g16s reg16s[modrm_byte >> 2 & 14] + +#define reg_e32 reg32[modrm_byte & 7] +#define reg_e32s reg32s[modrm_byte & 7] +#define reg_g32 reg32[modrm_byte >> 3 & 7] +#define reg_g32s reg32s[modrm_byte >> 3 & 7] + + +#define modrm_read(size)\ + if(modrm_byte < 0xC0) {\ + var data = safe_read ## size(modrm_resolve(modrm_byte)); \ + } else {\ + data = reg_e ## size;\ + } + + +#define read_e8 modrm_read(8) +#define read_e8s modrm_read(8s) +#define read_e16 modrm_read(16) +#define read_e16s modrm_read(16s) +#define read_e32 modrm_read(32) +#define read_e32s modrm_read(32s) + + + +// use modrm_byte to write a value to memory or register +// (without reading it beforehand) +#define modrm_set(arg, size) \ + if(modrm_byte < 0xC0) {\ + safe_write ## size(modrm_resolve(modrm_byte), arg);\ + } else {\ + reg_e ## size = arg;\ + } + +#define set_eb(arg) modrm_set(arg, 8) +#define set_ev16(arg) modrm_set(arg, 16) +#define set_ev32(arg) modrm_set(arg, 32) + + +// use modrm_byte to write a value to memory or register, +// using the previous data from memory or register. +// op is a function call that needs to return the result +#define write_e8(op)\ + var data;\ + var addr;\ + if(modrm_byte < 0xC0) {\ + addr = translate_address_write(modrm_resolve(modrm_byte));\ + data = memory.read8(addr);\ + memory.write8(addr, op);\ + } else {\ + data = reg_e8;\ + reg_e8 = op;\ + } + + +#define write_ev16(op)\ + var data;\ + var virt_addr;\ + var phys_addr;\ + var phys_addr_high;\ + if(modrm_byte < 0xC0) {\ + virt_addr = modrm_resolve(modrm_byte);\ + phys_addr = translate_address_write(virt_addr);\ + if(paging && (virt_addr & 0xFFF) === 0xFFF) {\ + phys_addr_high = translate_address_write(virt_addr + 1);\ + data = virt_boundary_read16(phys_addr, phys_addr_high);\ + virt_boundary_write16(phys_addr, phys_addr_high, op);\ + } else {\ + data = memory.read16(phys_addr);\ + memory.write16(phys_addr, op);\ + }\ + } else {\ + data = reg_e16;\ + reg_e16 = op;\ + } + + +#define write_ev32(op)\ + var data;\ + var virt_addr;\ + var phys_addr;\ + var phys_addr_high;\ + if(modrm_byte < 0xC0) {\ + virt_addr = modrm_resolve(modrm_byte);\ + phys_addr = translate_address_write(virt_addr);\ + if(paging && (virt_addr & 0xFFF) >= 0xFFD) {\ + phys_addr_high = translate_address_write(virt_addr + 3);\ + data = virt_boundary_read32s(phys_addr, phys_addr_high) >>> 0;\ + virt_boundary_write32(phys_addr, phys_addr_high, op);\ + } else {\ + data = memory.read32s(phys_addr) >>> 0;\ + memory.write32(phys_addr, op);\ + }\ + } else {\ + data = reg_e32;\ + reg_e32s = op;\ + } + + + +#define write_ev32s(op)\ + var data;\ + var virt_addr;\ + var phys_addr;\ + var phys_addr_high;\ + if(modrm_byte < 0xC0) {\ + virt_addr = modrm_resolve(modrm_byte);\ + phys_addr = translate_address_write(virt_addr);\ + if(paging && (virt_addr & 0xFFF) >= 0xFFD) {\ + phys_addr_high = translate_address_write(virt_addr + 3);\ + data = virt_boundary_read32s(phys_addr, phys_addr_high);\ + virt_boundary_write32(phys_addr, phys_addr_high, op);\ + } else {\ + data = memory.read32s(phys_addr);\ + memory.write32(phys_addr, op);\ + }\ + } else {\ + data = reg_e32s;\ + reg_e32s = op;\ + } + + +#define op(n, code) table16[n] = table32[n] = function() { code }; + +// opcode with modrm byte +#define opm(n, code)\ + table16[n] = table32[n] = function() { var modrm_byte = read_imm8(); code }; + +// opcode that has a 16 and a 32 bit version +#define op2(n, code16, code32)\ + table16[n] = function() { code16 };\ + table32[n] = function() { code32 };\ + +#define opm2(n, code16, code32)\ + table16[n] = function() { var modrm_byte = read_imm8(); code16 };\ + table32[n] = function() { var modrm_byte = read_imm8(); code32 };\ + + +#define arith_group(n, instr, sign)\ + opm(n, { write_e8(instr ## 8(data, reg_g8)) })\ + opm2(n | 1, { write_ev16(instr ## 16(data, reg_g16)) }, { write_ev32 ## sign(instr ## 32(data, reg_g32 ## sign)) })\ + opm(n | 2, { read_e8; reg_g8 = instr ## 8(reg_g8, data); })\ + opm2(n | 3, { read_e16; reg_g16 = instr ## 16(reg_g16, data); }, { read_e32 ## sign; reg_g32s = instr ## 32(reg_g32 ## sign, data); })\ + op(n | 4, { reg8[reg_al] = instr ## 8(reg8[reg_al], read_imm8()); })\ + op2(n | 5, { reg16[reg_ax] = instr ## 16(reg16[reg_ax], read_imm16()); }, { reg32[reg_eax] = instr ## 32(reg32 ## sign[reg_eax], read_imm32 ## sign()); })\ + + + +// instructions start here + +arith_group(0x00, add, ); + +op2(0x06, { push16(sreg[reg_es]); }, { push32(sreg[reg_es]); }); +pop_sreg_op(0x07, reg_es); +//op2(0x07, +// { safe_pop16(sreg[reg_es]); switch_seg(reg_es, memory.read16(get_esp_read(0))); }, +// { safe_pop32s(sreg[reg_es]); switch_seg(reg_es); }); + +arith_group(0x08, or, s); + +op2(0x0E, { push16(sreg[reg_cs]); }, { push32(sreg[reg_cs]); }); +op(0x0F, { table0F[read_imm8()](); }); + +arith_group(0x10, adc, ); + +op2(0x16, { push16(sreg[reg_ss]); }, { push32(sreg[reg_ss]); }); +pop_sreg_op(0x17, reg_ss); +//op2(0x17, +// { safe_pop16(sreg[reg_ss]); switch_seg(reg_ss); }, +// { safe_pop32s(sreg[reg_ss]); switch_seg(reg_ss); }); + +arith_group(0x18, sbb, ); + +op2(0x1E, { push16(sreg[reg_ds]); }, { push32(sreg[reg_ds]); }); +pop_sreg_op(0x1F, reg_ds); +//op2(0x1F, +// { safe_pop16(sreg[reg_ds]); switch_seg(reg_ds); }, +// { safe_pop32s(sreg[reg_ds]); switch_seg(reg_ds); }); + +arith_group(0x20, and, s); + +op(0x26, { seg_prefix(reg_es); }); +op(0x27, { bcd_daa(); }); + +arith_group(0x28, sub, ); + +op(0x2E, { seg_prefix(reg_cs); }); +op(0x2F, { bcd_das(); }); + +arith_group(0x30, xor, s); + +op(0x36, { seg_prefix(reg_ss); }); +op(0x37, { bcd_aaa(); }); + +opm(0x38, { read_e8; cmp8(data, reg_g8); }) +opm2(0x39, { read_e16; cmp16(data, reg_g16); }, { read_e32; cmp32(data, reg_g32); }) +opm(0x3A, { read_e8; cmp8(reg_g8, data); }) +opm2(0x3B, { read_e16; cmp16(reg_g16, data); }, { read_e32; cmp32(reg_g32, data); }) +op(0x3C, { cmp8(reg8[reg_al], read_imm8()); }) +op2(0x3D, { cmp16(reg16[reg_ax], read_imm16()); }, { cmp32(reg32[reg_eax], read_imm32()); }) + +op(0x3E, { seg_prefix(reg_ds); }); +op(0x3F, { bcd_aas(); }); + + +#define group40(n, r16, r32)\ + op2(0x40 | n, { reg16[r16] = inc16(reg16[r16]); }, { reg32[r32] = inc32(reg32[r32]); }); +each_reg(group40); + + +#define group48(n, r16, r32)\ + op2(0x48 | n, { reg16[r16] = dec16(reg16[r16]); }, { reg32[r32] = dec32(reg32[r32]); }); +each_reg(group48); + + +#define group50(n, r16, r32)\ + op2(0x50 | n, { push16(reg16[r16]); }, { push32(reg32s[r32]); }) +each_reg(group50); + +#define group58(n, r16, r32)\ + op2(0x58 | n, { safe_pop16(reg16[r16]); }, { safe_pop32s(reg32[r32]); }) +each_reg(group58); + + +op2(0x60, { pusha16(); }, { pusha32(); }); +op2(0x61, { popa16(); }, { popa32(); }); + +op(0x62, { throw unimpl("bound instruction"); }); +opm(0x63, { + // arpl + write_ev16(arpl(data, modrm_byte >> 2 & 14)); +}); + +op(0x64, { seg_prefix(reg_fs); }); +op(0x65, { seg_prefix(reg_gs); }); + +op(0x66, { + // Operand-size override prefix + dbg_assert(operand_size_32 === is_32); + + operand_size_32 = !is_32; + update_operand_size(); + + do_op(); + + operand_size_32 = is_32; + update_operand_size(); +}); + +op(0x67, { + // Address-size override prefix + dbg_assert(address_size_32 === is_32); + + address_size_32 = !is_32; + update_address_size(); + + do_op(); + + address_size_32 = is_32; + update_address_size(); +}); + +op2(0x68, { push16(read_imm16()); }, { push32(read_imm32s()); }); + +opm2(0x69, { + read_e16s; + reg_g16 = imul_reg16(read_imm16s(), data); +}, { + read_e32s; + reg_g32 = imul_reg32(read_imm32s(), data); +}); + +op2(0x6A, { push16(read_imm8s()); }, { push32(read_imm8s()); }); + +opm2(0x6B, { + read_e16s; + reg_g16 = imul_reg16(read_imm8s(), data); +}, { + read_e32s; + reg_g32 = imul_reg32(read_imm8s(), data); +}); + +op(0x6C, { insb(); }); +op2(0x6D, { insw(); }, { insd(); }); +op(0x6E, { outsb(); }); +op2(0x6F, { outsw(); }, { outsd(); }); + + +#define group70(n, test) \ + op(0x70 | n, { \ + if(test) { \ + instruction_pointer = instruction_pointer + read_imm8s() | 0;\ + }\ + instruction_pointer++;\ + }); + +each_jcc(group70); + + +opm(0x80, { + sub_op( + { write_e8(add8(data, read_imm8())); }, + { write_e8( or8(data, read_imm8())); }, + { write_e8(adc8(data, read_imm8())); }, + { write_e8(sbb8(data, read_imm8())); }, + { write_e8(and8(data, read_imm8())); }, + { write_e8(sub8(data, read_imm8())); }, + { write_e8(xor8(data, read_imm8())); }, + { read_e8; cmp8(data, read_imm8()); } + ) +}); +opm2(0x81, { + sub_op( + { write_ev16(add16(data, read_imm16())); }, + { write_ev16( or16(data, read_imm16())); }, + { write_ev16(adc16(data, read_imm16())); }, + { write_ev16(sbb16(data, read_imm16())); }, + { write_ev16(and16(data, read_imm16())); }, + { write_ev16(sub16(data, read_imm16())); }, + { write_ev16(xor16(data, read_imm16())); }, + { read_e16; cmp16(data, read_imm16()); } + ) +}, { + sub_op( + { write_ev32(add32(data, read_imm32())); }, + { write_ev32s( or32(data, read_imm32s())); }, + { write_ev32(adc32(data, read_imm32())); }, + { write_ev32(sbb32(data, read_imm32())); }, + { write_ev32s(and32(data, read_imm32s())); }, + { write_ev32(sub32(data, read_imm32())); }, + { write_ev32s(xor32(data, read_imm32s())); }, + { read_e32; cmp32(data, read_imm32()); } + ) +}); +op(0x82, { + table[0x80](); // alias +}); +opm2(0x83, { + sub_op( + { write_ev16(add16(data, read_imm8s() & 0xFFFF)); }, + { write_ev16( or16(data, read_imm8s())); }, + { write_ev16(adc16(data, read_imm8s() & 0xFFFF)); }, + { write_ev16(sbb16(data, read_imm8s() & 0xFFFF)); }, + { write_ev16(and16(data, read_imm8s())); }, + { write_ev16(sub16(data, read_imm8s() & 0xFFFF)); }, + { write_ev16(xor16(data, read_imm8s())); }, + { read_e16; cmp16(data, read_imm8s() & 0xFFFF); } + ) +}, { + sub_op( + { write_ev32(add32(data, read_imm8s() >>> 0)); }, + { write_ev32s( or32(data, read_imm8s())); }, + { write_ev32(adc32(data, read_imm8s() >>> 0)); }, + { write_ev32(sbb32(data, read_imm8s() >>> 0)); }, + { write_ev32s(and32(data, read_imm8s())); }, + { write_ev32(sub32(data, read_imm8s() >>> 0)); }, + { write_ev32s(xor32(data, read_imm8s())); }, + { read_e32; cmp32(data, read_imm8s() >>> 0); } + ) +}); + +opm(0x84, { read_e8; test8(data, reg_g8); }) +opm2(0x85, { read_e16; test16(data, reg_g16); }, { read_e32s; test32(data, reg_g32s); }) + + +opm(0x86, { write_e8(xchg8(data, modrm_byte)); }); +opm2(0x87, { + write_ev16(xchg16(data, modrm_byte)); +}, { + write_ev32(xchg32(data, modrm_byte)); +}); + +opm(0x88, { set_eb(reg_g8); }) +opm2(0x89, { set_ev16(reg_g16); }, { set_ev32(reg_g32s); }) + +opm(0x8A, { + read_e8; + reg_g8 = data; +}); +opm2(0x8B, { + read_e16; + reg_g16 = data; +}, { + read_e32s; + reg_g32s = data; +}); + +opm2(0x8C, { set_ev16(sreg[modrm_byte >> 3 & 7]); }, { set_ev32(sreg[modrm_byte >> 3 & 7]); }) + +op2(0x8D, { lea16(); }, { lea32(); }); + +opm(0x8E, { + var mod = modrm_byte >> 3 & 7; + + read_e16; + + switch_seg(mod, data); + + if(mod === reg_ss) + { + // TODO + // run next instruction, so no irqs are handled + } +}); + +opm(0x8F, { + // pop + if(operand_size_32) + { + // change esp first, then resolve modrm address + var sp = get_esp_read(0); + // TODO unsafe + + stack_reg[reg_vsp] += 4; + set_ev32(memory.read32s(sp)); + } + else + { + var sp = get_esp_read(0); + + stack_reg[reg_vsp] += 2; + set_ev16(memory.read16(sp)); + } +}); + +#define group90(n, r16, r32) op2(0x90 | n, { xchg16r(r16) }, { xchg32r(r32) }) +each_reg(group90) + +op(0x90, /* nop */ ); + + +op2(0x98, + { /* cbw */ reg16[reg_ax] = reg8s[reg_al]; }, + { /* cwde */ reg32[reg_eax] = reg16s[reg_ax]; }); + +op2(0x99, + { /* cwd */ reg16[reg_dx] = reg16s[reg_ax] >> 15; }, + { /* cdq */ reg32[reg_edx] = reg32s[reg_eax] >> 31; }); + +op2(0x9A, { + // callf + + if(protected_mode) + { + throw unimpl("16 bit callf in protected mode"); + } + else + { + var new_ip = read_imm16(); + var new_cs = read_imm16(); + + push16(sreg[reg_cs]); + push16(get_real_ip()); + + switch_seg(reg_cs, new_cs); + instruction_pointer = get_seg(reg_cs) + new_ip | 0; + } +}, { + if(protected_mode) + { + throw unimpl("callf"); + } + else + { + var new_ip = read_imm32s(); + var new_cs = read_imm16(); + + push32(sreg[reg_cs]); + push32(get_real_ip()); + + switch_seg(reg_cs, new_cs); + instruction_pointer = get_seg(reg_cs) + new_ip | 0; + } +}); + +op(0x9B, { + // fwait: check for pending fpu exceptions + fpu.fwait(); +}); +op2(0x9C, { + // pushf + load_flags(); + push16(flags); +}, { + // pushf + load_flags(); + push32(flags); +}); +op2(0x9D, { + // popf + var tmp; + safe_pop16(tmp); + update_flags(tmp); + + handle_irqs(); +}, { + // popf + update_flags(pop32s()); + + handle_irqs(); +}); +op(0x9E, { + // sahf + flags = (flags & ~0xFF) | reg8[reg_ah]; + flags = (flags & flags_mask) | flags_default; + flags_changed = 0; +}); +op(0x9F, { + // lahf + load_flags(); + reg8[reg_ah] = flags; +}); + +op(0xA0, { + // mov + var data = safe_read8(read_moffs()); + reg8[reg_al] = data; +}); +op2(0xA1, { + // mov + var data = safe_read16(read_moffs()); + reg16[reg_ax] = data; +}, { + var data = safe_read32s(read_moffs()); + reg32[reg_eax] = data; +}); +op(0xA2, { + // mov + safe_write8(read_moffs(), reg8[reg_al]); +}); +op2(0xA3, { + // mov + safe_write16(read_moffs(), reg16[reg_ax]); +}, { + safe_write32(read_moffs(), reg32s[reg_eax]); +}); + +op(0xA4, { movsb(); }); +op2(0xA5, { movsw(); }, { movsd(); }); +op(0xA6, { cmpsb(); }); +op2(0xA7, { cmpsw(); }, { cmpsd(); }); + +op(0xA8, { + test8(reg8[reg_al], read_imm8()); +}); +op2(0xA9, { + test16(reg16[reg_ax], read_imm16()); +}, { + test32(reg32s[reg_eax], read_imm32s()); +}); + +op(0xAA, { stosb(); }); +op2(0xAB, { stosw(); }, { stosd(); }); +op(0xAC, { lodsb(); }); +op2(0xAD, { lodsw(); }, { lodsd(); }); +op(0xAE, { scasb(); }); +op2(0xAF, { scasw(); }, { scasd(); }); + + +#define groupB0(n, r8) op(0xB0 | n, { reg8[r8] = read_imm8(); }); +each_reg8(groupB0); + + +#define groupB8(n, r16, r32)\ + op2(0xB8 | n, { reg16[r16] = read_imm16(); }, { reg32s[r32] = read_imm32s(); }); +each_reg(groupB8); + + +opm(0xC0, { + sub_op( + { write_e8(rol8(data, read_imm8() & 31)); }, + { write_e8(ror8(data, read_imm8() & 31)); }, + { write_e8(rcl8(data, read_imm8() & 31)); }, + { write_e8(rcr8(data, read_imm8() & 31)); }, + { write_e8(shl8(data, read_imm8() & 31)); }, + { write_e8(shr8(data, read_imm8() & 31)); }, + { write_e8(shl8(data, read_imm8() & 31)); }, + { write_e8(sar8(data, read_imm8() & 31)); } + ) +}); +opm2(0xC1, { + sub_op( + { write_ev16(rol16(data, read_imm8() & 31)); }, + { write_ev16(ror16(data, read_imm8() & 31)); }, + { write_ev16(rcl16(data, read_imm8() & 31)); }, + { write_ev16(rcr16(data, read_imm8() & 31)); }, + { write_ev16(shl16(data, read_imm8() & 31)); }, + { write_ev16(shr16(data, read_imm8() & 31)); }, + { write_ev16(shl16(data, read_imm8() & 31)); }, + { write_ev16(sar16(data, read_imm8() & 31)); } + ) +}, { + sub_op( + { write_ev32(rol32(data, read_imm8() & 31)); }, + { write_ev32(ror32(data, read_imm8() & 31)); }, + { write_ev32(rcl32(data, read_imm8() & 31)); }, + { write_ev32(rcr32(data, read_imm8() & 31)); }, + { write_ev32(shl32(data, read_imm8() & 31)); }, + { write_ev32(shr32(data, read_imm8() & 31)); }, + { write_ev32(shl32(data, read_imm8() & 31)); }, + { write_ev32(sar32(data, read_imm8() & 31)); } + ) +}); + +op2(0xC2, { + // retn + var imm16 = read_imm16(); + + instruction_pointer = get_seg(reg_cs) + pop16() | 0; + // TODO regv + reg32[reg_esp] += imm16; +}, { + // retn + var imm16 = read_imm16(); + + instruction_pointer = get_seg(reg_cs) + pop32s() | 0; + reg32[reg_esp] += imm16; +}); +op2(0xC3, { + // retn + instruction_pointer = get_seg(reg_cs) + pop16() | 0;; +}, { + // retn + instruction_pointer = get_seg(reg_cs) + pop32s() | 0;; +}); + +opm(0xC4, { + lss_op(reg_es); +}); +opm(0xC5, { + lss_op(reg_ds); +}); + +opm(0xC6, { set_eb(read_imm8()); }) +opm2(0xC7, { set_ev16(read_imm16()); }, { set_ev32(read_imm32s()); }) + +op2(0xC8, { enter16(); }, { enter32(); }); +op2(0xC9, { + // leave + stack_reg[reg_vsp] = stack_reg[reg_vbp]; + reg16[reg_bp] = pop16(); +}, { + stack_reg[reg_vsp] = stack_reg[reg_vbp]; + reg32[reg_ebp] = pop32s(); +}); +op2(0xCA, { + // retf + if(protected_mode) + { + throw unimpl("16 bit retf in protected mode"); + } + var imm16 = read_imm16(); + var ip = pop16(); + + switch_seg(reg_cs, pop16()); + instruction_pointer = get_seg(reg_cs) + ip | 0; + reg16[reg_sp] += imm16; +}, { + // retf + var imm16 = read_imm16(); + + if(protected_mode) + { + //dbg_log("retf"); + var ip = pop32s(); + + switch_seg(reg_cs, pop32s() & 0xFFFF); + instruction_pointer = get_seg(reg_cs) + ip | 0; + + stack_reg[reg_vsp] += imm16; + } + else + { + throw unimpl("32 bit retf in real mode"); + } +}); +op2(0xCB, { + // retf + if(protected_mode) + { + throw unimpl("16 bit retf in protected mode"); + } + else + { + var ip = pop16(); + switch_seg(reg_cs, pop16()); + instruction_pointer = get_seg(reg_cs) + ip | 0; + } +}, { + // retf + + if(protected_mode) + { + var ip = pop32s(); + + switch_seg(reg_cs, pop32s() & 0xFFFF); + instruction_pointer = get_seg(reg_cs) + ip | 0; + } + else + { + var ip = pop32s(); + + switch_seg(reg_cs, pop32s() & 0xFFFF); + instruction_pointer = get_seg(reg_cs) + ip | 0; + } +}); + +op(0xCC, { + // INT3 + call_interrupt_vector(3, true, false); +}); +op(0xCD, { + // INT + var imm8 = read_imm8(); + + call_interrupt_vector(imm8, true, false); +}); +op(0xCE, { + // INTO + if(getof()) + { + call_interrupt_vector(4, true, false); + } +}); + +op2(0xCF, { + // iret + if(protected_mode) + { + throw unimpl("16 bit iret in protected mode"); + } + var ip = pop16(); + + switch_seg(reg_cs, pop16()); + var new_flags = pop16(); + + instruction_pointer = ip + get_seg(reg_cs) | 0; + flags = new_flags; + flags_changed = 0; + + handle_irqs(); +}, { + // iret + if(!protected_mode) + { + throw unimpl("32 bit iret in real mode"); + } + else + { + if(flags & flag_nt) + { + if(DEBUG) throw "unimplemented nt"; + } + if(flags & flag_vm) + { + if(DEBUG) throw "unimplemented vm"; + } + + } + //dbg_log("pop eip from " + h(reg32[reg_esp], 8)); + instruction_pointer = pop32s(); + //dbg_log("IRET | from " + h(previous_ip) + " to " + h(instruction_pointer)); + + sreg[reg_cs] = pop32s(); + + //instruction_pointer += get_seg(reg_cs); + + var new_flags = pop32s(); + + if(new_flags & flag_vm) + { + if(DEBUG) throw "unimplemented"; + } + + // protected mode return + + var info = lookup_segment_selector(sreg[reg_cs]); + + if(info.is_null) + { + throw unimpl("is null"); + } + if(!info.is_present) + { + throw unimpl("not present"); + } + if(!info.is_executable) + { + throw unimpl("not exec"); + } + if(info.rpl < cpl) + { + throw unimpl("rpl < cpl"); + } + if(info.dc_bit && info.dpl > info.rpl) + { + throw unimpl("conforming and dpl > rpl"); + } + + if(info.rpl > cpl) + { + // outer privilege return + var temp_esp = pop32s(); + var temp_ss = pop32s(); + + + reg32[reg_esp] = temp_esp; + + update_flags(new_flags); + + cpl = info.rpl; + switch_seg(reg_ss, temp_ss & 0xFFFF); + + //dbg_log("iret cpl=" + cpl + " to " + h(instruction_pointer) + + // " cs:eip=" + h(sreg[reg_cs],4) + ":" + h(get_real_ip(), 8) + + // " ss:esp=" + h(temp_ss & 0xFFFF, 2) + ":" + h(temp_esp, 8), LOG_CPU); + + cpl_changed(); + } + else + { + update_flags(new_flags); + // same privilege return + + //dbg_log(h(new_flags) + " " + h(flags)); + //dbg_log("iret to " + h(instruction_pointer)); + } + + //dbg_log("iret if=" + (flags & flag_interrupt) + " cpl=" + cpl); + dbg_assert(!page_fault); + + handle_irqs(); + +}); + +opm(0xD0, { + sub_op( + { write_e8(rol8(data, 1)); }, + { write_e8(ror8(data, 1)); }, + { write_e8(rcl8(data, 1)); }, + { write_e8(rcr8(data, 1)); }, + { write_e8(shl8(data, 1)); }, + { write_e8(shr8(data, 1)); }, + { write_e8(shl8(data, 1)); }, + { write_e8(sar8(data, 1)); } + ) +}); +opm2(0xD1, { + sub_op( + { write_ev16(rol16(data, 1)); }, + { write_ev16(ror16(data, 1)); }, + { write_ev16(rcl16(data, 1)); }, + { write_ev16(rcr16(data, 1)); }, + { write_ev16(shl16(data, 1)); }, + { write_ev16(shr16(data, 1)); }, + { write_ev16(shl16(data, 1)); }, + { write_ev16(sar16(data, 1)); } + ) +}, { + sub_op( + { write_ev32(rol32(data, 1)); }, + { write_ev32(ror32(data, 1)); }, + { write_ev32(rcl32(data, 1)); }, + { write_ev32(rcr32(data, 1)); }, + { write_ev32(shl32(data, 1)); }, + { write_ev32(shr32(data, 1)); }, + { write_ev32(shl32(data, 1)); }, + { write_ev32(sar32(data, 1)); } + ) +}); + +opm(0xD2, { + var shift = reg8[reg_cl] & 31; + sub_op( + { write_e8(rol8(data, shift)); }, + { write_e8(ror8(data, shift)); }, + { write_e8(rcl8(data, shift)); }, + { write_e8(rcr8(data, shift)); }, + { write_e8(shl8(data, shift)); }, + { write_e8(shr8(data, shift)); }, + { write_e8(shl8(data, shift)); }, + { write_e8(sar8(data, shift)); } + ) +}); +opm2(0xD3, { + var shift = reg8[reg_cl] & 31; + sub_op( + { write_ev16(rol16(data, shift)); }, + { write_ev16(ror16(data, shift)); }, + { write_ev16(rcl16(data, shift)); }, + { write_ev16(rcr16(data, shift)); }, + { write_ev16(shl16(data, shift)); }, + { write_ev16(shr16(data, shift)); }, + { write_ev16(shl16(data, shift)); }, + { write_ev16(sar16(data, shift)); } + ) +}, { + var shift = reg8[reg_cl] & 31; + sub_op( + { write_ev32(rol32(data, shift)); }, + { write_ev32(ror32(data, shift)); }, + { write_ev32(rcl32(data, shift)); }, + { write_ev32(rcr32(data, shift)); }, + { write_ev32(shl32(data, shift)); }, + { write_ev32(shr32(data, shift)); }, + { write_ev32(shl32(data, shift)); }, + { write_ev32(sar32(data, shift)); } + ) +}); + +op(0xD4, { + bcd_aam(); +}); +op(0xD5, { + bcd_aad(); +}); + +op(0xD6, { + // salc + throw unimpl("salc instruction"); +}); +op(0xD7, { + // xlat + if(address_size_32) + { + reg8[reg_al] = safe_read8(get_seg_prefix(reg_ds) + reg32s[reg_ebx] + reg8[reg_al]); + } + else + { + reg8[reg_al] = safe_read8(get_seg_prefix(reg_ds) + reg16[reg_bx] + reg8[reg_al]); + } +}); + + +// fpu instructions +#define fpu_op(n, op)\ + opm(n, { \ + if(modrm_byte < 0xC0)\ + fpu.op_ ## op ## _mem(modrm_byte, modrm_resolve(modrm_byte));\ + else\ + fpu.op_ ## op ## _reg(modrm_byte);\ + }) + +fpu_op(0xD8, D8); +fpu_op(0xD9, D9); +fpu_op(0xDA, DA); +fpu_op(0xDB, DB); +fpu_op(0xDC, DC); +fpu_op(0xDD, DD); +fpu_op(0xDE, DE); +fpu_op(0xDF, DF); + + +op(0xE0, { loopne(); }); +op(0xE1, { loope(); }); +op(0xE2, { loop(); }); +op(0xE3, { jcxz(); }); + +op(0xE4, { reg8[reg_al] = in8(read_imm8()); }); +op2(0xE5, { reg16[reg_ax] = in16(read_imm8()); }, { reg32[reg_eax] = in32(read_imm8()); }); +op(0xE6, { out8(read_imm8(), reg8[reg_al]); }); +op2(0xE7, { out16(read_imm8(), reg16[reg_ax]); }, { out32(read_imm8(), reg32s[reg_eax]); }); + +op2(0xE8, { + // call + var imm16s = read_imm16s(); + push16(get_real_ip()); + + jmp_rel16(imm16s); +}, { + // call + var imm32s = read_imm32s(); + push32(get_real_ip()); + + instruction_pointer = instruction_pointer + imm32s | 0; +}); +op2(0xE9, { + // jmp + var imm16s = read_imm16s(); + jmp_rel16(imm16s); +}, { + // jmp + var imm32s = read_imm32s(); + instruction_pointer = instruction_pointer + imm32s | 0; +}); +op2(0xEA, { + // jmpf + var ip = read_imm16(); + switch_seg(reg_cs, read_imm16()); + + instruction_pointer = ip + get_seg(reg_cs) | 0; +}, { + // jmpf + var ip = read_imm32s(); + switch_seg(reg_cs, read_imm16()); + + instruction_pointer = ip + get_seg(reg_cs) | 0; +}); +op(0xEB, { + // jmp near + var imm8 = read_imm8s(); + instruction_pointer = instruction_pointer + imm8 | 0; +}); + +op(0xEC, { reg8[reg_al] = in8(reg16[reg_dx]); }); +op2(0xED, { reg16[reg_ax] = in16(reg16[reg_dx]); }, { reg32[reg_eax] = in32(reg16[reg_dx]); }); +op(0xEE, { out8(reg16[reg_dx], reg8[reg_al]); }); +op2(0xEF, { out16(reg16[reg_dx], reg16[reg_ax]); }, { out32(reg16[reg_dx], reg32s[reg_eax]); }); + +op(0xF0, { + // lock + + // TODO + // This triggers UD when used with + // some instructions that don't write to memory +}); +op(0xF1, { + // INT1 + // https://code.google.com/p/corkami/wiki/x86oddities#IceBP + throw unimpl("int1 instruction"); +}); + +op(0xF2, { + // repnz + dbg_assert(!repeat_string_prefix); + repeat_string_prefix = true; + repeat_string_type = false; + do_op(); + repeat_string_prefix = false; +}); +op(0xF3, { + // repz + dbg_assert(!repeat_string_prefix); + repeat_string_prefix = true; + repeat_string_type = true; + do_op(); + repeat_string_prefix = false; +}); + +op(0xF4, { + if(cpl) + { + trigger_gp(0); + } + + // hlt + if((flags & flag_interrupt) === 0) + { + log("cpu halted"); + stopped = true; + if(DEBUG) dump_regs(); + throw "HALT"; + } + else + { + // infinite loop until an irq happens + // this is handled in call_interrupt_vector + instruction_pointer--; + in_hlt = true; + } +}); + +op(0xF5, { + // cmc + flags = (flags | 1) ^ getcf(); + flags_changed &= ~1; +}); + +opm(0xF6, { + sub_op( + { read_e8; test8(data, read_imm8()); }, + { read_e8; test8(data, read_imm8()); }, + { write_e8(not8(data)); }, + { write_e8(neg8(data)); }, + { read_e8; mul8(data); }, + { read_e8s; imul8(data); }, + { read_e8; div8(data); }, + { read_e8s; idiv8(data); } + ) +}); + +opm2(0xF7, { + sub_op ( + { read_e16; test16(data, read_imm16()); }, + { read_e16; test16(data, read_imm16()); }, + { write_ev16(not16(data)); }, + { write_ev16(neg16(data)); }, + { read_e16; mul16(data); }, + { read_e16s; imul16(data); }, + { read_e16; div16(data); }, + { read_e16s; idiv16(data); } + ) +}, { + sub_op ( + { read_e32s; test32(data, read_imm32s()); }, + { read_e32s; test32(data, read_imm32s()); }, + { write_ev32(not32(data)); }, + { write_ev32(neg32(data)); }, + { read_e32; mul32(data); }, + { read_e32s; imul32(data); }, + { read_e32; div32(data); }, + { read_e32s; idiv32(data); } + ) +}); + +op(0xF8, { + // clc + flags &= ~flag_carry; + flags_changed &= ~1; +}); +op(0xF9, { + // stc + flags |= flag_carry; + flags_changed &= ~1; +}); + +op(0xFA, { + // cli + //dbg_log("interrupts off"); + if(!privileges_for_io()) + { + trigger_gp(0); + } + else + { + flags &= ~flag_interrupt; + } +}); +op(0xFB, { + // sti + //dbg_log("interrupts on"); + if(!privileges_for_io()) + { + trigger_gp(0); + } + else + { + flags |= flag_interrupt; + handle_irqs(); + } + +}); + +op(0xFC, { + // cld + flags &= ~flag_direction; +}); +op(0xFD, { + // std + flags |= flag_direction; +}); + +opm(0xFE, { + var mod = modrm_byte & 56; + + if(mod === 0) + { + write_e8(inc8(data)); + } + else if(mod === 8) + { + write_e8(dec8(data)); + } + else + { + todo(); + } +}); +opm2(0xFF, { + sub_op( + { write_ev16(inc16(data)); }, + { write_ev16(dec16(data)); }, + { + // 2, call near + read_e16; + push16(get_real_ip()); + + instruction_pointer = get_seg(reg_cs) + data | 0; + }, + { + // 3, callf + if(modrm_byte >= 0xC0) + { + raise_exception(6); + dbg_assert(false); + } + + var virt_addr = modrm_resolve(modrm_byte); + + push16(sreg[reg_cs]); + push16(get_real_ip()); + + switch_seg(reg_cs, safe_read16(virt_addr + 2)); + instruction_pointer = get_seg(reg_cs) + safe_read16(virt_addr) | 0; + dbg_assert(!page_fault); + }, + { + // 4, jmp near + read_e16; + instruction_pointer = get_seg(reg_cs) + data | 0; + }, + { + // 5, jmpf + if(modrm_byte >= 0xC0) + { + raise_exception(6); + dbg_assert(false); + } + + var virt_addr = modrm_resolve(modrm_byte); + + switch_seg(reg_cs, safe_read16(virt_addr + 2)); + instruction_pointer = get_seg(reg_cs) + safe_read16(virt_addr) | 0; + + // TODO safe read + }, + { + // 6, push + read_e16; + push16(data); + }, + { + todo(); + } + ) +}, { + sub_op( + + { write_ev32(inc32(data)); }, + { write_ev32(dec32(data)); }, + { + // 2, call near + read_e32s; + push32(get_real_ip()); + + instruction_pointer = get_seg(reg_cs) + data | 0; + }, + { + // 3, callf + if(modrm_byte >= 0xC0) + { + raise_exception(6); + dbg_assert(false); + } + + var virt_addr = modrm_resolve(modrm_byte); + var new_cs = safe_read16(virt_addr + 4); + var new_ip = safe_read32s(virt_addr); + + + push32(sreg[reg_cs]); + push32(get_real_ip()); + + switch_seg(reg_cs, new_cs); + instruction_pointer = get_seg(reg_cs) + new_ip | 0; + }, + { + // 4, jmp near + read_e32s; + instruction_pointer = get_seg(reg_cs) + data | 0; + }, + { + // 5, jmpf + if(modrm_byte >= 0xC0) + { + raise_exception(6); + dbg_assert(false); + } + + var virt_addr = modrm_resolve(modrm_byte); + var new_cs = safe_read16(virt_addr + 4); + var new_ip = safe_read32s(virt_addr); + + switch_seg(reg_cs, new_cs); + instruction_pointer = get_seg(reg_cs) + new_ip | 0; + }, + { + // push + read_e32s; + push32(data); + }, + { + todo(); + } + ) +}); + + +// 0F ops start here +#define table16 table0F_16 +#define table32 table0F_32 + + +opm(0x00, { + read_e16; + + if(!protected_mode) + { + // No GP, UD is correct + trigger_ud(); + } + + if(cpl) + { + trigger_gp(0); + } + + switch(modrm_byte >> 3 & 7) + { + case 2: + load_ldt(data); + break; + case 3: + load_tr(data); + break; + default: + dbg_log(modrm_byte >> 3 & 7, LOG_CPU); + todo(); + } +}); + +opm(0x01, { + if(cpl) + { + trigger_gp(0); + } + + var mod = modrm_byte >> 3 & 7; + + if(mod === 4) + { + // smsw + set_ev16(cr0); + return; + } + else if(mod === 6) + { + // lmsw + read_e16; + + cr0 = (cr0 & ~0xF) | (data & 0xF); + cr0_changed(); + return; + } + + if(modrm_byte >= 0xC0) + { + // only memory + raise_exception(6); + dbg_assert(false); + } + + if((mod === 2 || mod === 3) && protected_mode) + { + // override prefix, so modrm_resolve does not return the segment part + // only lgdt and lidt and only in protected mode + segment_prefix = reg_noseg; + } + + var addr = modrm_resolve(modrm_byte); + segment_prefix = -1; + + switch(mod) + { + case 0: + // sgdt + safe_write16(addr, gdtr_size); + safe_write32(addr + 2, gdtr_offset); + break; + case 1: + // sidt + safe_write16(addr, idtr_size); + safe_write32(addr + 2, idtr_offset); + break; + case 2: + // lgdt + var size = safe_read16(addr); + var offset = safe_read32s(addr + 2); + + gdtr_size = size; + gdtr_offset = offset; + + if(!operand_size_32) + { + gdtr_offset &= 0xFFFFFF; + } + + dbg_log("eax " + h(reg32[reg_eax]), LOG_CPU); + dbg_log("gdt loaded from " + h(addr), LOG_CPU); + dbg_log("gdt at " + h(gdtr_offset) + ", " + gdtr_size + " bytes", LOG_CPU); + //dump_gdt_ldt(); + break; + case 3: + // lidt + var size = safe_read16(addr); + var offset = safe_read32s(addr + 2); + + idtr_size = size; + idtr_offset = offset; + + if(!operand_size_32) + { + idtr_offset &= 0xFFFFFF; + } + + //dbg_log("[" + h(instruction_pointer) + "] idt at " + + // h(idtr_offset) + ", " + idtr_size + " bytes " + h(addr), LOG_CPU); + break; + case 7: + // flush translation lookaside buffer + invlpg(addr); + break; + default: + dbg_log(mod); + todo(); + } +}); + +opm(0x02, { + todo(); + // lar +}); + +opm(0x03, { + todo(); + // lsl +}); + +undefined_instruction(0x04); +undefined_instruction(0x05); + +op(0x06, { + // clts + if(cpl) + { + trigger_gp(0); + } + else + { + //dbg_log("clts", LOG_CPU); + cr0 &= ~8; + // do something here ? + } +}); + +undefined_instruction(0x07); +// invd +todo_op(0x08); + +op(0x09, { + if(cpl) + { + trigger_gp(0); + } + // wbinvd +}); + + +undefined_instruction(0x0A); +op(0x0B, { + trigger_ud(); +}); +undefined_instruction(0x0C); +todo_op(0x0D); +undefined_instruction(0x0E); +undefined_instruction(0x0F); + + +unimplemented_sse(0x10); +unimplemented_sse(0x11); +unimplemented_sse(0x12); +unimplemented_sse(0x13); +unimplemented_sse(0x14); +unimplemented_sse(0x15); +unimplemented_sse(0x16); +unimplemented_sse(0x17); + +opm(0x18, { + // prefetch + // nop for us + if(operand_size_32) { + read_e32s; + } + else { + read_e16; + } +}); + +unimplemented_sse(0x19); +unimplemented_sse(0x1A); +unimplemented_sse(0x1B); +unimplemented_sse(0x1C); +unimplemented_sse(0x1D); +unimplemented_sse(0x1E); +unimplemented_sse(0x1F); + + +opm(0x20, { + + if(cpl) + { + trigger_gp(0); + } + //dbg_log("cr" + mod + " read", LOG_CPU); + + // mov addr, cr + // mod = which control register + switch(modrm_byte >> 3 & 7) + { + case 0: + reg_e32 = cr0; + break; + case 2: + reg_e32 = cr2; + break; + case 3: + //dbg_log("read cr3 (" + h(cr3, 8) + ")", LOG_CPU); + reg_e32 = cr3; + break; + case 4: + reg_e32 = cr4; + break; + default: + dbg_log(modrm_byte >> 3 & 7); + todo(); + } +}); + +opm(0x21, { + if(cpl) + { + trigger_gp(0); + } + + // TODO: mov from debug register + dbg_assert(modrm_byte >= 0xC0); +}); + +opm(0x22, { + + if(cpl) + { + trigger_gp(0); + } + + var data = reg_e32; + //dbg_log("cr" + mod + " written: " + h(reg32[reg]), LOG_CPU); + + // mov cr, addr + // mod = which control register + switch(modrm_byte >> 3 & 7) + { + case 0: + if((data & 0x80000001) === (0x80000000 | 0)) + { + // cannot load PG without PE + throw unimpl("#GP handler"); + } + + if((cr0 & 0x80000000) && !(data & 0x80000000)) + { + full_clear_tlb(); + } + + cr0 = data; + cr0_changed(); + //dbg_log("cr1 = " + bits(memory.read32s(addr)), LOG_CPU); + break; + case 3: + cr3 = data; + dbg_assert((cr3 & 0xFFF) === 0); + clear_tlb(); + + //dump_page_directory(); + //dbg_log("page directory loaded at " + h(cr3, 8), LOG_CPU); + break; + case 4: + if((cr4 ^ data) & 128) + { + full_clear_tlb(); + } + + cr4 = data; + page_size_extensions = (cr4 & 16) ? PSE_ENABLED : 0; + dbg_log("cr4 set to " + h(cr4), LOG_CPU); + + break; + default: + dbg_log(modrm_byte >> 3 & 7); + todo(); + } +}); +opm(0x23, { + if(cpl) + { + trigger_gp(0); + } + + // TODO: mov to debug register + dbg_assert(modrm_byte >= 0xC0); +}); + +undefined_instruction(0x24); +undefined_instruction(0x25); +undefined_instruction(0x26); +undefined_instruction(0x27); + +unimplemented_sse(0x28); +unimplemented_sse(0x29); +unimplemented_sse(0x2A); +unimplemented_sse(0x2B); +unimplemented_sse(0x2C); +unimplemented_sse(0x2D); +unimplemented_sse(0x2E); +unimplemented_sse(0x2F); + +// wrmsr +todo_op(0x30); + +op(0x31, { + // rdtsc - read timestamp counter + + //var cycles = (Date.now() - emulation_start) / 1000 * 3000000; + //reg32[reg_eax] = cycles; + //reg32[reg_edx] = cycles / 0x100000000; + + reg32[reg_eax] = cpu_timestamp_counter; + reg32[reg_edx] = cpu_timestamp_counter / 0x100000000; +}); + +// rdmsr +todo_op(0x32); +// rdpmc +todo_op(0x33); +// sysenter +todo_op(0x34); +// sysexit +todo_op(0x35); + +undefined_instruction(0x36); + +// getsec +todo_op(0x37); + +unimplemented_sse(0x38); +unimplemented_sse(0x39); +unimplemented_sse(0x3A); +unimplemented_sse(0x3B); +unimplemented_sse(0x3C); +unimplemented_sse(0x3D); +unimplemented_sse(0x3E); +unimplemented_sse(0x3F); + + +#define group0F40(n, test)\ + opm2(0x40 | n, {\ + if(test) {\ + read_e16;\ + reg_g16 = data;\ + } else if(modrm_byte < 0xC0)\ + modrm_resolve(modrm_byte)\ + }, {\ + if(test) {\ + read_e32s;\ + reg_g32s = data;\ + } else if(modrm_byte < 0xC0)\ + modrm_resolve(modrm_byte)\ + }); + +each_jcc(group0F40); + + +unimplemented_sse(0x50); +unimplemented_sse(0x51); +unimplemented_sse(0x52); +unimplemented_sse(0x53); +unimplemented_sse(0x54); +unimplemented_sse(0x55); +unimplemented_sse(0x56); +unimplemented_sse(0x57); + +unimplemented_sse(0x58); +unimplemented_sse(0x59); +unimplemented_sse(0x5A); +unimplemented_sse(0x5B); +unimplemented_sse(0x5C); +unimplemented_sse(0x5D); +unimplemented_sse(0x5E); +unimplemented_sse(0x5F); + +unimplemented_sse(0x60); +unimplemented_sse(0x61); +unimplemented_sse(0x62); +unimplemented_sse(0x63); +unimplemented_sse(0x64); +unimplemented_sse(0x65); +unimplemented_sse(0x66); +unimplemented_sse(0x67); + +unimplemented_sse(0x68); +unimplemented_sse(0x69); +unimplemented_sse(0x6A); +unimplemented_sse(0x6B); +unimplemented_sse(0x6C); +unimplemented_sse(0x6D); +unimplemented_sse(0x6E); +unimplemented_sse(0x6F); + +unimplemented_sse(0x70); +unimplemented_sse(0x71); +unimplemented_sse(0x72); +unimplemented_sse(0x73); +unimplemented_sse(0x74); +unimplemented_sse(0x75); +unimplemented_sse(0x76); +unimplemented_sse(0x77); + +unimplemented_sse(0x78); +unimplemented_sse(0x79); +unimplemented_sse(0x7A); +unimplemented_sse(0x7B); +unimplemented_sse(0x7C); +unimplemented_sse(0x7D); +unimplemented_sse(0x7E); +unimplemented_sse(0x7F); + + +#define group0F80(n, test) op2(0x80 | n, { jmpcc16(test); }, { jmpcc32(test); }) +each_jcc(group0F80) + + +#define group0F90(n, test) opm(0x90 | n, { set_eb(!test ^ 1); }); +each_jcc(group0F90); + + +op2(0xA0, { push16(sreg[reg_fs]); }, { push32(sreg[reg_fs]); }); +pop_sreg_op(0xA1, reg_fs); +//op2(0xA1, +// { safe_pop16(sreg[reg_fs]); switch_seg(reg_fs); }, +// { safe_pop32s(sreg[reg_fs]); switch_seg(reg_fs); }); + +op(0xA2, { cpuid(); }); + +opm(0xA3, { + if(operand_size_32) + { + if(modrm_byte < 0xC0) + { + bt_mem(modrm_resolve(modrm_byte), reg_g32s); + } + else + { + bt_reg(reg_e32, reg_g32 & 31); + } + } + else + { + if(modrm_byte < 0xC0) + { + bt_mem(modrm_resolve(modrm_byte), reg_g16s); + } + else + { + bt_reg(reg_e16, reg_g16 & 15); + } + } +}); + +opm2(0xA4, { + write_ev16(shld16(data, reg_g16, read_imm8() & 31)); +}, { + write_ev32(shld32(data, reg_g32, read_imm8() & 31)); +}); +opm2(0xA5, { + write_ev16(shld16(data, reg_g16, reg8[reg_cl] & 31)); +}, { + write_ev32(shld32(data, reg_g32, reg8[reg_cl] & 31)); +}); + +undefined_instruction(0xA6); +undefined_instruction(0xA7); + +op2(0xA8, { push16(sreg[reg_gs]); }, { push32(sreg[reg_gs]); }); +pop_sreg_op(0xA9, reg_gs); +//op2(0xA9, +// { safe_pop16(sreg[reg_gs]); switch_seg(reg_gs); }, +// { safe_pop32s(sreg[reg_gs]); switch_seg(reg_gs); }); + +// rsm +todo_op(0xAA); + +opm(0xAB, { + bt_op(bts, reg_g16s, reg_g32s); +}); + + +opm2(0xAC, { + write_ev16(shrd16(data, reg_g16, read_imm8() & 31)); +}, { + write_ev32(shrd32(data, reg_g32, read_imm8() & 31)); +}); +opm2(0xAD, { + write_ev16(shrd16(data, reg_g16, reg8[reg_cl] & 31)); +}, { + write_ev32(shrd32(data, reg_g32, reg8[reg_cl] & 31)); +}); + +todo_op(0xAE); + +opm2(0xAF, { + read_e16s; + reg_g16 = imul_reg16(reg_g16s, data); +}, { + read_e32s; + reg_g32 = imul_reg32(reg_g32s, data); +}); + + +opm(0xB0, { + // cmpxchg8 + if(modrm_byte < 0xC0) + { + var virt_addr = modrm_resolve(modrm_byte); + var data = safe_read8(virt_addr); + } + else + data = reg_e8; + + + cmp8(data, reg8[reg_al]); + + if(getzf()) + { + if(modrm_byte < 0xC0) + safe_write8(virt_addr, reg_g8); + else + reg_e8 = reg_g8; + } + else + { + reg8[reg_al] = data; + } +}); +opm(0xB1, { + // cmpxchg16/32 + if(operand_size_32) + { + if(modrm_byte < 0xC0) + { + var virt_addr = modrm_resolve(modrm_byte); + var data = safe_read32(virt_addr); + } + else + data = reg_e32; + + cmp32(data, reg32[reg_eax]); + + if(getzf()) + { + if(modrm_byte < 0xC0) + safe_write32(virt_addr, reg_g32); + else + reg_e32 = reg_g32; + } + else + { + reg32[reg_eax] = data; + } + } + else + { + if(modrm_byte < 0xC0) + { + var virt_addr = modrm_resolve(modrm_byte); + var data = safe_read16(virt_addr); + } + else + data = reg_e16; + + cmp16(data, reg16[reg_ax]); + + if(getzf()) + { + if(modrm_byte < 0xC0) + safe_write16(virt_addr, reg_g16); + else + reg_e16 = reg_g16; + } + else + { + reg16[reg_ax] = data; + } + } +}); + +// lss +opm(0xB2, { + lss_op(reg_ss); +}); + +opm(0xB3, { + bt_op(btr, reg_g16s, reg_g32s); +}); + +// lfs, lgs +opm(0xB4, { + lss_op(reg_fs); +}); +opm(0xB5, { + lss_op(reg_gs); +}); + +opm2(0xB6, { + // movzx + read_e8; + reg_g16 = data; +}, { + read_e8; + reg_g32 = data; +}); + +opm(0xB7, { + // movzx + read_e16; + reg_g32 = data; +}); + +// popcnt +todo_op(0xB8); + +// UD +todo_op(0xB9); + +opm(0xBA, { + //dbg_log("BA " + mod + " " + imm8); + + switch(modrm_byte >> 3 & 7) + { + case 4: + if(operand_size_32) + { + if(modrm_byte < 0xC0) + { + bt_mem(modrm_resolve(modrm_byte), read_imm8() & 31); + } + else + { + bt_reg(reg_e32, read_imm8() & 31); + } + } + else + { + if(modrm_byte < 0xC0) + { + bt_mem(modrm_resolve(modrm_byte), read_imm8() & 31); + } + else + { + bt_reg(reg_e16, read_imm8() & 15); + } + } + break; + case 5: + bt_op(bts, read_imm8() & 31, read_imm8() & 31); + break; + case 6: + bt_op(btr, read_imm8() & 31, read_imm8() & 31); + break; + case 7: + bt_op(btc, read_imm8() & 31, read_imm8() & 31); + break; + default: + dbg_log(modrm_byte >> 3 & 7); + todo(); + } +}); +opm(0xBB, { + bt_op(btc, reg_g16s, reg_g32s); +}); + +opm2(0xBC, { + read_e16; + reg_g16 = bsf16(reg_g16, data); +}, { + read_e32s; + reg_g32 = bsf32(reg_g32, data); +}); + +opm2(0xBD, { + read_e16; + reg_g16 = bsr16(reg_g16, data); +}, { + read_e32s; + reg_g32 = bsr32(reg_g32, data); +}); + +opm2(0xBE, { + // movsx + read_e8s; + reg_g16 = data; +}, { + read_e8s; + reg_g32s = data; +}); + +opm(0xBF, { + // movsx + read_e16s; + reg_g32s = data; +}); + +opm(0xC0, { + write_e8(xadd8(data, modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1)); +}); + +opm2(0xC1, { + write_ev16(xadd16(data, modrm_byte >> 2 & 14)); +}, { + write_ev32(xadd32(data, modrm_byte >> 3 & 7)); +}); + + +unimplemented_sse(0xC2); +unimplemented_sse(0xC3); +unimplemented_sse(0xC4); +unimplemented_sse(0xC5); +unimplemented_sse(0xC6); + +opm(0xC7, { + // cmpxchg8b + var addr = modrm_resolve(modrm_byte); + + var m64_low = safe_read32(addr); + var m64_high = safe_read32(addr + 4); + + if(reg32[reg_eax] === m64_low && + reg32[reg_edx] === m64_high) + { + flags |= flag_zero; + + safe_write32(addr, reg32[reg_ebx]); + safe_write32(addr + 4, reg32[reg_ecx]); + } + else + { + flags &= ~flag_zero; + + reg32[reg_eax] = m64_low; + reg32[reg_edx] = m64_high; + } + + flags_changed &= ~flag_zero; +}); + +#define group0FC8(n, r16, r32) op(0xC8 | n, { bswap(r32); }); +each_reg(group0FC8) + +unimplemented_sse(0xD0); +unimplemented_sse(0xD1); +unimplemented_sse(0xD2); +unimplemented_sse(0xD3); +unimplemented_sse(0xD4); +unimplemented_sse(0xD5); +unimplemented_sse(0xD6); +unimplemented_sse(0xD7); + +unimplemented_sse(0xD8); +unimplemented_sse(0xD9); +unimplemented_sse(0xDA); +unimplemented_sse(0xDB); +unimplemented_sse(0xDC); +unimplemented_sse(0xDD); +unimplemented_sse(0xDE); +unimplemented_sse(0xDF); + +unimplemented_sse(0xE0); +unimplemented_sse(0xE1); +unimplemented_sse(0xE2); +unimplemented_sse(0xE3); +unimplemented_sse(0xE4); +unimplemented_sse(0xE5); +unimplemented_sse(0xE6); +unimplemented_sse(0xE7); + +unimplemented_sse(0xE8); +unimplemented_sse(0xE9); +unimplemented_sse(0xEA); +unimplemented_sse(0xEB); +unimplemented_sse(0xEC); +unimplemented_sse(0xED); +unimplemented_sse(0xEE); +unimplemented_sse(0xEF); + +unimplemented_sse(0xF0); +unimplemented_sse(0xF1); +unimplemented_sse(0xF2); +unimplemented_sse(0xF3); +unimplemented_sse(0xF4); +unimplemented_sse(0xF5); +unimplemented_sse(0xF6); +unimplemented_sse(0xF7); + +unimplemented_sse(0xF8); +unimplemented_sse(0xF9); +unimplemented_sse(0xFA); +unimplemented_sse(0xFB); +unimplemented_sse(0xFC); +unimplemented_sse(0xFD); +unimplemented_sse(0xFE); + +// NSA backdoor instruction +undefined_instruction(0xFF); + + +#undef table16 +#undef table32 diff --git a/src/io.js b/src/io.js new file mode 100644 index 00000000..8e6d2f11 --- /dev/null +++ b/src/io.js @@ -0,0 +1,175 @@ +"use strict"; + +/** + * The ISA IO bus + * Devices register their ports here + * + * @constructor + */ +function IO() +{ + var a20_byte = 0, + me = this; + + function get_port_description(addr) + { + // via seabios ioport.h + var ports = { + 0x0004: "PORT_DMA_ADDR_2", + 0x0005: "PORT_DMA_CNT_2", + 0x000a: "PORT_DMA1_MASK_REG", + 0x000b: "PORT_DMA1_MODE_REG", + 0x000c: "PORT_DMA1_CLEAR_FF_REG", + 0x000d: "PORT_DMA1_MASTER_CLEAR", + 0x0020: "PORT_PIC1_CMD", + 0x0021: "PORT_PIC1_DATA", + 0x0040: "PORT_PIT_COUNTER0", + 0x0041: "PORT_PIT_COUNTER1", + 0x0042: "PORT_PIT_COUNTER2", + 0x0043: "PORT_PIT_MODE", + 0x0060: "PORT_PS2_DATA", + 0x0061: "PORT_PS2_CTRLB", + 0x0064: "PORT_PS2_STATUS", + 0x0070: "PORT_CMOS_INDEX", + 0x0071: "PORT_CMOS_DATA", + 0x0080: "PORT_DIAG", + 0x0081: "PORT_DMA_PAGE_2", + 0x0092: "PORT_A20", + 0x00a0: "PORT_PIC2_CMD", + 0x00a1: "PORT_PIC2_DATA", + 0x00b2: "PORT_SMI_CMD", + 0x00b3: "PORT_SMI_STATUS", + 0x00d4: "PORT_DMA2_MASK_REG", + 0x00d6: "PORT_DMA2_MODE_REG", + 0x00da: "PORT_DMA2_MASTER_CLEAR", + 0x00f0: "PORT_MATH_CLEAR", + 0x0170: "PORT_ATA2_CMD_BASE", + 0x01f0: "PORT_ATA1_CMD_BASE", + 0x0278: "PORT_LPT2", + 0x02e8: "PORT_SERIAL4", + 0x02f8: "PORT_SERIAL2", + 0x0374: "PORT_ATA2_CTRL_BASE", + 0x0378: "PORT_LPT1", + 0x03e8: "PORT_SERIAL3", + //0x03f4: "PORT_ATA1_CTRL_BASE", + 0x03f0: "PORT_FD_BASE", + 0x03f2: "PORT_FD_DOR", + 0x03f4: "PORT_FD_STATUS", + 0x03f5: "PORT_FD_DATA", + 0x03f6: "PORT_HD_DATA", + 0x03f7: "PORT_FD_DIR", + 0x03f8: "PORT_SERIAL1", + 0x0cf8: "PORT_PCI_CMD", + 0x0cf9: "PORT_PCI_REBOOT", + 0x0cfc: "PORT_PCI_DATA", + 0x0402: "PORT_BIOS_DEBUG", + 0x0510: "PORT_QEMU_CFG_CTL", + 0x0511: "PORT_QEMU_CFG_DATA", + 0xb000: "PORT_ACPI_PM_BASE", + 0xb100: "PORT_SMB_BASE", + 0x8900: "PORT_BIOS_APM" + }; + + if(ports[addr]) + { + return " (" + ports[addr] + ")"; + } + else + { + return ""; + } + } + + function empty_port_read_debug(port_addr) + { + dbg_log( + "read port #" + h(port_addr, 3) + get_port_description(port_addr), + LOG_IO + ); + + return 0xFF; + } + + function empty_port_write_debug(port_addr, out_byte) + { + dbg_log( + "write port #" + h(port_addr, 3) + " <- " + h(out_byte, 2) + get_port_description(port_addr), + LOG_IO + ); + } + + function empty_port_read() + { + return 0xFF; + } + + function empty_port_write(x) + { + } + + var read_callbacks = [], + write_callbacks = []; + + for(var i = 0; i < 0x10000; i++) + { + // avoid sparse arrays + + if(DEBUG) + { + read_callbacks[i] = empty_port_read_debug.bind(0, i); + write_callbacks[i] = empty_port_write_debug.bind(0, i); + } + else + { + read_callbacks[i] = empty_port_read; + write_callbacks[i] = empty_port_write; + } + } + + /** + * @param {number} port_addr + * @param {function():number} callback + */ + this.register_read = function(port_addr, callback) + { + read_callbacks[port_addr] = callback; + }; + + /** + * @param {number} port_addr + * @param {function(number)} callback + */ + this.register_write = function(port_addr, callback) + { + write_callbacks[port_addr] = callback; + }; + + + // should maybe be somewhere else? + this.register_read(0x92, function() + { + return a20_byte; + }); + + this.register_write(0x92, function(out_byte) + { + a20_byte = out_byte; + }); + + // use by linux for timing + this.register_write(0x80, function(out_byte) + { + }); + + this.port_write = function(port_addr, out_byte) + { + write_callbacks[port_addr](out_byte); + }; + + // read byte from port + this.port_read = function(port_addr) + { + return read_callbacks[port_addr](); + }; +} + diff --git a/src/main.js b/src/main.js new file mode 100644 index 00000000..451c4974 --- /dev/null +++ b/src/main.js @@ -0,0 +1,339 @@ +"use strict"; + +Object.fromList = function(xs) +{ + var result = {}; + + for(var i = 0; i < xs.length; i++) + { + result[xs[i][0]] = xs[i][1]; + } + + return result; +}; + + + +var dbg_names = Object.fromList([ + [1, ""], + [LOG_CPU, "CPU"], + [LOG_DISK, "DISK"], + [LOG_FPU, "FPU"], + [LOG_MEM, "MEM"], + [LOG_DMA, "DMA"], + [LOG_IO, "IO"], + [LOG_PS2, "PS2"], + [LOG_PIC, "PIC"], + [LOG_VGA, "VGA"], + [LOG_PIT, "PIT"], + [LOG_MOUSE, "MOUS"], + [LOG_PCI, "PCI"], + [LOG_BIOS, "BIOS"], + [LOG_CD, "CD"], + [LOG_SERIAL, "SERI"], + [LOG_RTC, "RTC"], +]); + + +/** + * @param {number=} level + */ +function dbg_log(stuff, level) +{ + if(!DEBUG) return; + + level = level || 1; + + if(level & LOG_LEVEL) + { + var level_name = dbg_names[level] || ""; + + console.log("[" + String.pads(level_name, 4) + "] " + stuff); + } +}; + +function dbg_trace() +{ + if(!DEBUG) return; + + dbg_log(Error().stack); +} + +/** + * console.assert is fucking slow + * @param {string=} msg + */ +function dbg_assert(cond, msg) +{ + if(!DEBUG) return; + + if(!cond) + { + //dump_regs(); + console.log(Error().stack); + console.trace(); + if(msg) + { + throw "Assert failed: " + msg; + } + else + { + throw "Assert failed"; + } + } +}; + + +Object.extend = function(target, src) +{ + var keys = Object.keys(src); + + for(var i = 0; i < keys.length; i++) + { + target[keys[i]] = src[keys[i]]; + } +} + + +// pad string with spaces on the right +String.pads = function(str, len) +{ + str = str ? str + "" : ""; + + while(str.length < len) + { + str = str + " "; + } + + return str; +} + +// pad string with zeros on the left +String.pad0 = function(str, len) +{ + str = str ? str + "" : ""; + + while(str.length < len) + { + str = "0" + str; + } + + return str; +} + +Array.range = function(n) +{ + var a = []; + + for(var i = 0; i < n; i++) + { + a[i] = i; + } + + return a; +} + +/** + * number to hex + * @param {number=} len + */ +function h(n, len) +{ + //dbg_assert(typeof n === "number"); + + if(!n) return String.pad0("", len || 1); + + if(len) + { + return String.pad0(n.toString(16).toUpperCase(), len); + } + else + { + return n.toString(16).toUpperCase(); + } +} + +Number.bits = function(n) +{ + var result = []; + + for(var bit = 31; bit > -1; bit--) + { + if(n & 1 << bit) + { + result.push(bit); + } + } + + return result.join(', '); +} + +String.chr_repeat = function(chr, count) +{ + var result = ""; + + while(count--) + { + result += chr; + } + + return result; +} + + +Math.bcd_pack = function(n) +{ + var i = 0, + result = 0, + digit; + + while(n) + { + digit = n % 10; + + result |= digit << (4 * i); + i++; + n = (n - digit) / 10; + } + + return result; +} + +/** + * @param {string=} msg + * */ +function unimpl(msg) +{ + var s = "Unimplemented" + (msg ? ": " + msg : ""); + + log(s); + + if(DEBUG) + { + console.trace(); + return s; + } + else + { + log("Execution stopped"); + return s; + } + //this.name = "Unimplemented"; +} + +/** + * Synchronous access to ArrayBuffer + * @constructor + */ +function SyncBuffer(buffer) +{ + this.byteLength = buffer.byteLength; + + // warning: fn may be called synchronously or asynchronously + this.get = function(start, len, fn) + { + fn(new Uint8Array(buffer, start, len)); + }; + + this.set = function(start, slice, fn) + { + new Uint8Array(buffer, start, slice.byteLength).set(slice); + fn(); + }; + + this.get_buffer = function(fn) + { + fn(buffer); + }; +} + +/** + * Simple circular queue for logs + * + * @param {number} size + * @param {?=} Proto + * @constructor + */ +function CircularQueue(size, Proto) +{ + var data, + index; + + this.add = function(item) + { + data[index] = item; + + index = (index + 1) % size; + }; + + this.toArray = function() + { + return [].slice.call(data, index).concat([].slice.call(data, 0, index)); + }; + + this.clear = function() + { + if(Proto) + { + data = new Proto(size); + } + else + { + data = []; + } + + index = 0; + }; + + this.set = function(new_data) + { + data = new_data; + index = 0; + }; + + + this.clear(); +} + + + +// switch number to big endian +Math.to_be32 = function(dword) +{ + return dword >>> 24 | + dword >> 8 & 0xff00 | + dword << 8 & 0xff0000 | + dword << 24; +} + +Math.to_be16 = function(word) +{ + return word >>> 8 & 0xff | word << 8 & 0xff00; +} + + +// used in several places +// the first entry is -1 +// http://jsperf.com/integer-log2/2 +var log2_table = (function() +{ + var t = new Int8Array(256); + + for(var i = 0, b = -2; i < 256; i++) + { + if(!(i & i - 1)) + b++; + + t[i] = b; + } + + return t; +})(); + + +// round away from zero, opposite of truncation +Math.roundInfinity = function(x) +{ + return x > 0 ? Math.ceil(x) : Math.floor(x); +}; + diff --git a/src/memory.js b/src/memory.js new file mode 100644 index 00000000..08cc7b79 --- /dev/null +++ b/src/memory.js @@ -0,0 +1,486 @@ +"use strict"; + +/** + * @constructor + */ +function Memory(buffer, memory_size) +{ + var int8array = new Uint8Array(buffer), + int16array = new Uint16Array(buffer), + int8sarray = new Int8Array(buffer), + int32sarray = new Int32Array(buffer); + + this.mem8 = int8array; + this.mem8s = int8sarray; + this.mem32s = int32sarray; + + this.buffer = buffer; + + // debug function called by all memory reads and writes + + function debug_write(addr, size, value) + { + if(!DEBUG) + { + return; + } + + //dbg_assert(typeof value === "number" && !isNaN(value)); + debug_read(addr, size, true); + } + + /** @param {boolean=} is_write */ + function debug_read(addr, size, is_write) + { + if(!DEBUG) + { + return; + } + + dbg_assert(typeof addr === "number"); + dbg_assert(!isNaN(addr)); + + if((addr >= memory_size || addr < 0) && !memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + dbg_log("Read from unmapped memory space, addr=" + h(addr, 8) /*+ " at " + h(instruction_pointer, 8)*/, LOG_IO); + } + + //dbg_assert(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]); + }; + + this.dump_all = function(start, end) + { + start = start || 0; + end = end || 0x100000; + + + // textarea method: (slow) + //var result_string = ""; + + //for(var i = start; i < start + end; i++) + //{ + // result_string += String.fromCharCode(int8array[i]); + //} + + //dump_text(btoa(result_string)); + + // save as method: + dump_file(buffer.slice(start, end), "memory.bin"); + + }; + + this.dump = function(addr, length) + { + length = length || 4 * 0x10; + var line, byt; + + for(var i = 0; i < length >> 4; i++) + { + line = h(addr + (i << 4), 5) + " "; + + for(var j = 0; j < 0x10; j++) + { + byt = this.read8(addr + (i << 4) + j); + line += h(byt, 2) + " "; + } + + line += " "; + + for(j = 0; j < 0x10; j++) + { + byt = this.read8(addr + (i << 4) + j); + line += (byt < 33 || byt > 126) ? "." : String.fromCharCode(byt); + } + + dbg_log(line); + } + }; + + this.print_memory_map = function() + { + var width = 0x80, + height = 0x10, + block_size = memory_size / width / height | 0, + row; + + for(var i = 0; i < height; i++) + { + row = "0x" + h(i * width * block_size, 8) + " | "; + + for(var j = 0; j < width; j++) + { + var used = this.mem32s[(i * width + j) * block_size] > 0; + + row += used ? "X" : " "; + } + + dbg_log(row); + } + }; + + + var + /** + * Arbritary value, the minimum number of bytes that can be mapped + * by one device. This might be spec'd somewhere ... + * + * Written as a power of 2. + * + * @const + */ + MMAP_BLOCK_SIZE = 14, + + /** @const */ + MMAP_BYTEWISE = 1, + MMAP_DWORDWISE = 4, + + + // this only supports a 32 bit address space + memory_map_registered = new Int8Array(1 << 32 - MMAP_BLOCK_SIZE), + + memory_map_read = [], + memory_map_write = []; + + for(var i = 0; i < (1 << 32 - MMAP_BLOCK_SIZE); i++) + { + // avoid sparse arrays + memory_map_read[i] = memory_map_write[i] = undefined; + } + + /** + * @param addr {number} + * @param size {number} + * @param is_dword {boolean} true if the memory is addressed in dwords, otherwise byte + * + */ + this.mmap_register = function(addr, size, is_dword, read_func, write_func) + { + dbg_log("mmap_register32 " + h(addr, 8) + ": " + h(size, 8), LOG_IO); + dbg_assert((addr & (1 << MMAP_BLOCK_SIZE) - 1) === 0); + dbg_assert(size >= (1 << MMAP_BLOCK_SIZE) && (size & (1 << MMAP_BLOCK_SIZE) - 1) === 0); + + var aligned_addr = addr >>> MMAP_BLOCK_SIZE, + unit_size = is_dword ? MMAP_DWORDWISE : MMAP_BYTEWISE; + + for(; size > 0; aligned_addr++) + { + memory_map_registered[aligned_addr] = unit_size; + + memory_map_read[aligned_addr] = function(read_addr) + { + return read_func(read_addr - addr | 0); + }; + memory_map_write[aligned_addr] = function(write_addr, value) + { + write_func(write_addr - addr | 0, value); + } + + size -= 1 << MMAP_BLOCK_SIZE; + } + }; + + function mmap_read8(addr) + { + var aligned_addr = addr >>> MMAP_BLOCK_SIZE, + registered = memory_map_read[aligned_addr]; + + //dbg_log("mmap_read8 " + h(addr, 8), LOG_IO); + + if(memory_map_registered[aligned_addr] === MMAP_BYTEWISE) + { + return registered(addr); + } + else + { + return mmap_read32(addr & ~3) >> 8 * (addr & 3) & 0xFF; + } + }; + + function mmap_write8(addr, value) + { + var aligned_addr = addr >>> MMAP_BLOCK_SIZE, + registered = memory_map_write[addr >>> MMAP_BLOCK_SIZE]; + + //dbg_log("mmap_write8 " + h(addr, 8) + ": " + h(value, 2), LOG_IO); + + if(memory_map_registered[aligned_addr] === MMAP_BYTEWISE) + { + registered(addr, value); + } + else + { + // impossible without reading. Maybe this should do nothing + dbg_assert(false); + } + }; + + function mmap_read32(addr) + { + var registered = memory_map_read[addr >>> MMAP_BLOCK_SIZE]; + + //dbg_log("mmap_read32 " + h(addr, 8), LOG_IO); + //dbg_assert((addr & 3) === 0); + dbg_assert(registered); + + if((addr & 3) === 0 && + memory_map_registered[addr >>> MMAP_BLOCK_SIZE] === MMAP_DWORDWISE) + { + return registered(addr); + } + else + { + return mmap_read8(addr) | mmap_read8(addr + 1) << 8 | + mmap_read8(addr + 2) << 16 | mmap_read8(addr + 3) << 24; + } + }; + + function mmap_write32(addr, value) + { + var registered = memory_map_write[addr >>> MMAP_BLOCK_SIZE]; + + //dbg_log("mmap_write32 " + h(addr, 8) + ": " + h(value, 8), LOG_IO); + //dbg_assert((addr & 3) === 0); + dbg_assert(registered); + + if((addr & 3) === 0 && + memory_map_registered[addr >>> MMAP_BLOCK_SIZE] === MMAP_DWORDWISE) + { + registered(addr, value); + } + else + { + mmap_write8(addr, value & 0xFF); + mmap_write8(addr + 1, value >> 8 & 0xFF); + mmap_write8(addr + 2, value >> 16 & 0xFF); + mmap_write8(addr + 3, value >> 24 & 0xFF); + } + }; + + /** + * @param addr {number} + */ + this.read8s = function(addr) + { + debug_read(addr, 1); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + return mmap_read8(addr) << 24 >> 24; + } + else + { + return int8sarray[addr]; + } + }; + + /** + * @param addr {number} + */ + this.read8 = function(addr) + { + debug_read(addr, 1); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + return mmap_read8(addr); + } + else + { + return int8array[addr]; + } + }; + + /** + * @param addr {number} + */ + this.read16 = function(addr) + { + debug_read(addr, 2); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + return mmap_read8(addr) | mmap_read8(addr + 1) << 8; + } + else + { + return int8array[addr] | int8array[addr + 1] << 8; + } + }; + + /** + * @param addr {number} + */ + this.read_aligned16 = function(addr) + { + debug_read(addr, 2); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + return mmap_read8(addr) | mmap_read8(addr + 1) << 8; + } + else + { + return int16array[addr >> 1]; + } + }; + + /** + * @param addr {number} + */ + this.read32s = function(addr) + { + debug_read(addr, 4); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + return mmap_read32(addr) | 0; + } + else + { + return int8array[addr] | int8array[addr + 1] << 8 | + int8array[addr + 2] << 16 | int8array[addr + 3] << 24; + } + }; + + /** + * @param addr {number} + */ + this.read_aligned32 = function(addr) + { + debug_read(addr, 4); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + return mmap_read32(addr) | 0; + } + else + { + return int32sarray[addr >> 2]; + } + }; + + /** + * @param addr {number} + * @param value {number} + */ + this.write8 = function(addr, value) + { + debug_write(addr, 1, value); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + mmap_write8(addr, value); + } + else + { + int8array[addr] = value; + } + }; + + /** + * @param addr {number} + * @param value {number} + */ + this.write16 = function(addr, value) + { + debug_write(addr, 2, value); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + mmap_write8(addr, value & 0xff); + mmap_write8(addr + 1, value >> 8 & 0xff); + } + else + { + int8array[addr] = value; + int8array[addr + 1] = value >> 8; + } + }; + + /** + * @param addr {number} + * @param value {number} + */ + this.write_aligned16 = function(addr, value) + { + debug_write(addr, 2, value); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + mmap_write8(addr, value & 0xff); + mmap_write8(addr + 1, value >> 8 & 0xff); + } + else + { + int16array[addr >> 1] = value; + } + }; + + /** + * @param addr {number} + * @param value {number} + */ + this.write32 = function(addr, value) + { + debug_write(addr, 4, value); + + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + mmap_write32(addr, value); + } + else + { + int8array[addr] = value; + int8array[addr + 1] = value >> 8; + int8array[addr + 2] = value >> 16; + int8array[addr + 3] = value >> 24; + } + }; + + this.write_aligned32 = function(addr, value) + { + if(memory_map_registered[addr >>> MMAP_BLOCK_SIZE]) + { + mmap_write32(addr, value); + } + else + { + int32sarray[addr >> 2] = value; + } + }; + + /** + * @param offset {number} + * @param blob {Array.} + */ + this.write_blob = function(blob, offset) + { + dbg_assert(blob && blob.length); + int8array.set(blob, offset); + }; + + /** + * zero byte terminated string + */ + this.read_string = function(addr) + { + var str = "", + data_byte; + + while(data_byte = this.read8(addr)) + { + str += String.fromCharCode(data_byte); + addr++; + } + + return str; + }; + + this.write_string = function(str, addr) + { + for(var i = 0; i < str.length; i++) + { + this.write8(addr + i, str.charCodeAt(i)); + } + }; +} diff --git a/src/misc_instr.macro.js b/src/misc_instr.macro.js new file mode 100644 index 00000000..ea795fcb --- /dev/null +++ b/src/misc_instr.macro.js @@ -0,0 +1,458 @@ +/* + * Some miscellaneous instructions: + * + * jmpcc16, jmpcc32, jmp16 + * loop, loope, loopne, jcxz + * test_cc + * + * mov, push, pop + * pusha, popa + * xchg, lss + * lea + * enter + * bswap + * + * Gets #included by cpu.macro.js + */ +"use strict"; + +function jmp_rel16(rel16) +{ + var current_cs = get_seg(reg_cs); + + // limit ip to 16 bit + // ugly + instruction_pointer -= current_cs; + instruction_pointer = (instruction_pointer + rel16) & 0xFFFF; + instruction_pointer = instruction_pointer + current_cs | 0; +} + +function jmpcc16(condition) +{ + if(condition) + { + jmp_rel16(read_imm16()); + } + else + { + instruction_pointer += 2; + } +} + + +function jmpcc32(condition) +{ + if(condition) + { + // don't write `instruction_pointer += read_imm32s()` + var imm32s = read_imm32s(); + instruction_pointer = instruction_pointer + imm32s | 0; + } + else + { + instruction_pointer = instruction_pointer + 4 | 0; + } +} + +function loopne() +{ + if(--regv[reg_vcx] && !getzf()) + { + var imm8s = read_imm8s(); + instruction_pointer = instruction_pointer + imm8s | 0; + } + else + { + instruction_pointer++; + } +} + +function loope() +{ + if(--regv[reg_vcx] && getzf()) + { + var imm8s = read_imm8s(); + instruction_pointer = instruction_pointer + imm8s | 0; + } + else + { + instruction_pointer++; + } +} + +function loop() +{ + if(--regv[reg_vcx]) + { + var imm8s = read_imm8s(); + instruction_pointer = instruction_pointer + imm8s | 0; + } + else + { + instruction_pointer++; + } +} + +function jcxz() +{ + var imm8s = read_imm8s(); + + if(regv[reg_vcx] === 0) + { + instruction_pointer = instruction_pointer + imm8s | 0; + } +} + +var test_o = getof, + test_b = getcf, + test_z = getzf, + test_s = getsf, + test_p = getpf; + +function test_be() +{ + return getcf() || getzf(); +} + +function test_l() +{ + return !getsf() !== !getof(); +} + +function test_le() +{ + return getzf() || !getsf() !== !getof(); +} + +/** + * @return {number} + * @const + */ +function getcf() +{ + if(flags_changed & 1) + { + if(last_op_size === OPSIZE_32) + { + // cannot bit test above 2^32-1 + return last_result > 0xffffffff | last_result < 0; + //return ((last_op1 ^ last_result) & (last_op2 ^ last_result)) >>> 31; + } + else + { + return last_result >> last_op_size & 1; + } + + //return last_result >= (1 << last_op_size) | last_result < 0; + } + else + { + return flags & 1; + } +} + +/** @return {number} */ +function getpf() +{ + if(flags_changed & flag_parity) + { + // inverted lookup table + return 0x9669 << 2 >> ((last_result ^ last_result >> 4) & 0xF) & flag_parity; + } + else + { + return flags & flag_parity; + } +} + +/** @return {number} */ +function getaf() +{ + if(flags_changed & flag_adjust) + { + return (last_op1 ^ last_op2 ^ last_result ^ (last_op2 < 0) << 4) & flag_adjust; + } + else + { + return flags & flag_adjust; + } +} + +/** @return {number} */ +function getzf() +{ + if(flags_changed & flag_zero) + { + return (~last_result & last_result - 1) >> last_op_size - 7 & flag_zero; + } + else + { + return flags & flag_zero; + } +} + +/** @return {number} */ +function getsf() +{ + if(flags_changed & flag_sign) + { + return last_result >> last_op_size - 8 & flag_sign; + } + else + { + return flags & flag_sign; + } +} + +/** @return {number} */ +function getof() +{ + if(flags_changed & flag_overflow) + { + return (((last_op1 ^ last_result) & (last_op2 ^ last_result)) >> last_op_size - 1) << 11 & flag_overflow; + } + else + { + return flags & flag_overflow; + } +} + + +function push16(imm16) +{ + var sp = get_esp_write(-2); + + stack_reg[reg_vsp] -= 2; + memory.write16(sp, imm16); +} + +function push32(imm32) +{ + var sp = get_esp_write(-4); + + stack_reg[reg_vsp] -= 4; + memory.write32(sp, imm32); +} + +function pop16() +{ + var sp = get_esp_read(0); + + stack_reg[reg_vsp] += 2; + return memory.read16(sp); +} + +function pop32s() +{ + var sp = get_esp_read(0); + + stack_reg[reg_vsp] += 4; + return memory.read32s(sp); +} + +function pusha16() +{ + var temp = reg16[reg_sp]; + + // make sure we don't get a pagefault after having + // pushed several registers already + translate_address_write(temp - 15); + + push16(reg16[reg_ax]); + push16(reg16[reg_cx]); + push16(reg16[reg_dx]); + push16(reg16[reg_bx]); + push16(temp); + push16(reg16[reg_bp]); + push16(reg16[reg_si]); + push16(reg16[reg_di]); +} + +function pusha32() +{ + var temp = reg32s[reg_esp]; + + translate_address_write(temp - 31); + + push32(reg32s[reg_eax]); + push32(reg32s[reg_ecx]); + push32(reg32s[reg_edx]); + push32(reg32s[reg_ebx]); + push32(temp); + push32(reg32s[reg_ebp]); + push32(reg32s[reg_esi]); + push32(reg32s[reg_edi]); +} + +function popa16() +{ + translate_address_read(stack_reg[reg_vsp] + 15); + + reg16[reg_di] = pop16(); + reg16[reg_si] = pop16(); + reg16[reg_bp] = pop16(); + stack_reg[reg_vsp] += 2; + reg16[reg_bx] = pop16(); + reg16[reg_dx] = pop16(); + reg16[reg_cx] = pop16(); + reg16[reg_ax] = pop16(); +} + +function popa32() +{ + translate_address_read(stack_reg[reg_vsp] + 31); + + reg32[reg_edi] = pop32s(); + reg32[reg_esi] = pop32s(); + reg32[reg_ebp] = pop32s(); + stack_reg[reg_vsp] += 4; + reg32[reg_ebx] = pop32s(); + reg32[reg_edx] = pop32s(); + reg32[reg_ecx] = pop32s(); + reg32[reg_eax] = pop32s(); +} + +function xchg8(memory_data, modrm_byte) +{ + var mod = modrm_byte >> 1 & 0xC | modrm_byte >> 5 & 1, + tmp = reg8[mod]; + + reg8[mod] = memory_data; + + return tmp; +} + +function xchg16(memory_data, modrm_byte) +{ + var mod = modrm_byte >> 2 & 14, + tmp = reg16[mod]; + + reg16[mod] = memory_data; + + return tmp; +} + +function xchg16r(operand) +{ + var temp = reg16[reg_ax]; + reg16[reg_ax] = reg16[operand]; + reg16[operand] = temp; +} + +function xchg32(memory_data, modrm_byte) +{ + var mod = modrm_byte >> 3 & 7, + tmp = reg32s[mod]; + + reg32[mod] = memory_data; + + return tmp; +} + +function xchg32r(operand) +{ + var temp = reg32s[reg_eax]; + reg32[reg_eax] = reg32s[operand]; + reg32[operand] = temp; +} + +function lss16(seg, addr, mod) +{ + var new_reg = safe_read16(addr), + new_seg = safe_read16(addr + 2); + + switch_seg(seg, new_seg); + + reg16[mod] = new_reg; +} + +function lss32(seg, addr, mod) +{ + var new_reg = safe_read32s(addr), + new_seg = safe_read16(addr + 4); + + switch_seg(seg, new_seg); + + reg32[mod] = new_reg; +} + +function lea16() +{ + var modrm_byte = read_imm8(), + mod = modrm_byte >> 3 & 7; + + // override prefix, so modrm16 does not return the segment part + segment_prefix = reg_noseg; + + reg16[mod << 1] = modrm_resolve(modrm_byte); + + segment_prefix = -1; +} + +function lea32() +{ + var modrm_byte = read_imm8(), + mod = modrm_byte >> 3 & 7; + + segment_prefix = reg_noseg; + + reg32[mod] = modrm_resolve(modrm_byte); + + segment_prefix = -1; +} + +function enter16() +{ + var size = read_imm16(), + nesting_level = read_imm8(), + frame_temp; + + push16(reg16[reg_bp]); + frame_temp = reg16[reg_sp]; + + if(nesting_level > 0) + { + for(var i = 1; i < nesting_level; i++) + { + reg16[reg_bp] -= 2; + push16(reg16[reg_bp]); + } + push16(frame_temp); + } + reg16[reg_bp] = frame_temp; + reg16[reg_sp] = frame_temp - size; + + dbg_assert(!page_fault); +} + +function enter32() +{ + var size = read_imm16(), + nesting_level = read_imm8() & 31, + frame_temp; + + push32(reg32s[reg_ebp]); + frame_temp = reg32s[reg_esp]; + + if(nesting_level > 0) + { + for(var i = 1; i < nesting_level; i++) + { + reg32[reg_ebp] -= 4; + push32(reg32s[reg_ebp]); + } + push32(frame_temp); + } + reg32[reg_ebp] = frame_temp; + reg32[reg_esp] -= size; + + dbg_assert(!page_fault); +} + +function bswap(reg) +{ + var temp = reg32s[reg]; + + reg32[reg] = temp >>> 24 | temp << 24 | (temp >> 8 & 0xFF00) | (temp << 8 & 0xFF0000); +} + diff --git a/src/modrm.macro.js b/src/modrm.macro.js new file mode 100644 index 00000000..bd3251c4 --- /dev/null +++ b/src/modrm.macro.js @@ -0,0 +1,176 @@ +/* + * This file contains functions to decode the modrm and sib bytes + * + * These functions return a virtual address + * + * Gets #included by cpu.macro.js + */ +"use strict"; + +var modrm_resolve16, + modrm_resolve32; + +(function() { + +var modrm_table16 = Array(0xC0), + modrm_table32 = Array(0xC0), + sib_table = Array(0x100); + +#define ds get_seg_prefix(reg_ds) +#define ss get_seg_prefix(reg_ss) + +#define eax reg32s[reg_eax] +#define ecx reg32s[reg_ecx] +#define edx reg32s[reg_edx] +#define ebx reg32s[reg_ebx] +#define esp reg32s[reg_esp] +#define ebp reg32s[reg_ebp] +#define esi reg32s[reg_esi] +#define edi reg32s[reg_edi] + +#define imm32 read_imm32s() +#define imm16 read_imm16() +#define imm8 read_imm8() + +#define entry16(row, seg, value)\ + entry16_(0x00 | row, seg + ((value) & 0xFFFF))\ + entry16_(0x40 | row, seg + ((value) + read_imm8s() & 0xFFFF))\ + entry16_(0x80 | row, seg + ((value) + read_imm16() & 0xFFFF))\ + +#define entry16_(n, offset)\ + modrm_table16[n] = function() { return offset | 0; }; + + +entry16(0, ds, reg16[reg_bx] + reg16[reg_si]) +entry16(1, ds, reg16[reg_bx] + reg16[reg_di]) +entry16(2, ss, reg16[reg_bp] + reg16[reg_si]) +entry16(3, ss, reg16[reg_bp] + reg16[reg_di]) +entry16(4, ds, reg16[reg_si]) +entry16(5, ds, reg16[reg_di]) +entry16(6, ss, reg16[reg_bp]) +entry16(7, ds, reg16[reg_bx]) + +#define entry32(row, value)\ + entry32_(0x00 | row, (value))\ + entry32_(0x40 | row, (value) + read_imm8s())\ + entry32_(0x80 | row, (value) + read_imm32s())\ + +#define entry32_(n, offset)\ + modrm_table32[n] = function() { return offset | 0; }; + + +entry32(0, ds + eax); +entry32(1, ds + ecx); +entry32(2, ds + edx); +entry32(3, ds + ebx); +entry32(4, getsib(false)); +entry32(5, ss + ebp); +entry32(6, ds + esi); +entry32(7, ds + edi); + + +// special cases +modrm_table16[0x00 | 6] = function() { return ds + read_imm16() | 0; } + +modrm_table32[0x00 | 5] = function() { return ds + read_imm32s() | 0; }; + +modrm_table32[0x00 | 4] = function() { return getsib(false) | 0; }; +modrm_table32[0x40 | 4] = function() { return getsib(true) + read_imm8s() | 0; }; +modrm_table32[0x80 | 4] = function() { return getsib(true) + read_imm32s() | 0; }; + + +for(var low = 0; low < 8; low++) +{ + for(var high = 0; high < 3; high++) + { + for(var i = 1; i < 8; i++) + { + var x = low | high << 6; + + modrm_table32[x | i << 3] = modrm_table32[x]; + modrm_table16[x | i << 3] = modrm_table16[x]; + } + } +} + +#define entry_sib(n, reg1)\ + entry_sib2(0x00 | n << 3, reg1)\ + entry_sib2(0x40 | n << 3, reg1 << 1)\ + entry_sib2(0x80 | n << 3, reg1 << 2)\ + entry_sib2(0xC0 | n << 3, reg1 << 3) + +#define entry_sib2(n, offset)\ + entry_sib3(n | 0, (offset) + ds + eax)\ + entry_sib3(n | 1, (offset) + ds + ecx)\ + entry_sib3(n | 2, (offset) + ds + edx)\ + entry_sib3(n | 3, (offset) + ds + ebx)\ + entry_sib3(n | 4, (offset) + ss + esp)\ + entry_sib3(n | 5, (offset) + (mod ? ss + ebp : ds + imm32))\ + entry_sib3(n | 6, (offset) + ds + esi)\ + entry_sib3(n | 7, (offset) + ds + edi) + +#define entry_sib3(n, offset)\ + sib_table[n] = function(mod) { return offset | 0; }; + +entry_sib(0, eax); +entry_sib(1, ecx); +entry_sib(2, edx); +entry_sib(3, ebx); +entry_sib(4, 0); +entry_sib(5, ebp); +entry_sib(6, esi); +entry_sib(7, edi); + + +/** + * @param {number} modrm_byte + * @return {number} + */ +modrm_resolve16 = function(modrm_byte) +{ + return modrm_table16[modrm_byte](); +} + +/** + * @param {number} modrm_byte + * @return {number} + */ +modrm_resolve32 = function(modrm_byte) +{ + return modrm_table32[modrm_byte](); +} + +/** + * @param {boolean} mod + * @return {number} + */ +function getsib(mod) +{ + return sib_table[read_imm8()](mod); +} + +#undef ds +#undef ss + +#undef eax +#undef ecx +#undef edx +#undef ebx +#undef esp +#undef ebp +#undef esi +#undef edi + +#undef imm32 +#undef imm16 +#undef imm8 + +#undef entry16 +#undef entry16_ +#undef entry32_ + +#undef entry_sib +#undef entry_sib2 +#undef entry_sib3 + +})(); diff --git a/src/node/ascii.ttf b/src/node/ascii.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0bc3d538d61e3960e0c65d8a10f74fea478c5ea GIT binary patch literal 21136 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 T?C sudo apt-get install libsdl1.2-dev libsdl-image1.2-dev libsdl-ttf2.0-dev + +Now that your library dependencies are satisfied, check out the source from +github: + +

    git clone https://github.com/creationix/node-sdl.git
+ +Second, build the package: + +
    cd node-sdl
+    node-waf configure build
+ +You can test if the package was properly built by running one or more of the +example programs: + +
    cd examples
+    node img.js
+ +## 1. Usage + +### 1.1. Initialization and Shutdown + +Begin by requiring the node-sdl package and calling the init() function: + +
    var SDL = require( 'sdl' );
+    SDL.init( SDL.INIT.VIDEO )
+ +The init() function takes a numeric parameter telling the library what +subsystems to initialize. The node-sdl package defines the following +constants: + +
    SDL.INIT.TIMER - initializes timers (not currently supported)
+    SDL.INIT.AUDIO - initialize audio subsystem (not currently supported)
+    SDL.INIT.VIDEO - initialize video subsystem
+    SDL.INIT.CDROM - initialize CD playback subsystem (not currently supported)
+    SDL.INIT.JOYSTICK - initialize joystick support
+    SDL.INIT.EVERYTHING - all of the above
+    SDL.INIT.NOPARACHUTE - don't catch fatal signals
+
+ +Two or more of these parameters may be selected by or-ing them together: + +
    SDL.init( SDL.INIT.VIDEO | SDL.INIT.JOYSTICK );
+ +The QUIT event signals the closure of a SDL managed window, so adding a +function that exits the application when it is received may be useful: + +
    SDL.events.on( 'QUIT', function( evt ) { process.exit( 0 ); } );
+ +Exiting the application when the user presses Control-C or the Escape key +can be achieved by adding a listener to the KEYDOWN event: + +
    SDL.events.on( 'KEYDOWN', function ( evt ) {
+      if( ( ( evt.sym === 99 ) && ( evt.mod === 64 ) ) ||
+          ( ( evt.sym === 27 ) && ( evt.mod === 0  ) ) ) {
+        process.exit( 0 );
+      }
+    } );
+ +### 1.2. Video Functions + +To create a window under SDL control, use the setVideoMode() function to +create a "surface". + +
    var screen = SDL.setVideoMode( 640, 480, 32, SDL.SURFACE.SWSURFACE );
+ +The setVideoMode() function takes four parameters: surface width, surface +height, bit depth and surface flags. The flags parameter selects options for +the video buffer: + +
    SDL.SURFACE.SWSURFACE - video buffer created in system memory
+    SDL.SURFACE.HWSURFACE - video buffer created in video memory
+    SDL.SURFACE.ASYNCBLIT - enable async updates of display surface
+    SDL.SURFACE.ANYFORMAT - don't emulate unavailable BPPs with a shadow surface
+    SDL.SURFACE.HWPALETTE - give SDL exclusive palette access (not supported)
+    SDL.SURFACE.DOUBLEBUF - enable hardware double buffering. (only works with
+                            SDL.SURFACE.HWSURFACE)
+    SDL.SURFACE.FULLSCREEN - use fullscreen mode
+    SDL.SURFACE.OPENGL    - create an OpenGL rendering context (not supported)
+    SDL.SURFACE.RESIZABLE - create a resizable window
+    SDL.SURFACE.HWACCEL   - use hardware accelerated blitter
+    SDL.SURFACE.SRCCOLORKEY - use color key blitter
+    SDL.SURFACE.RLEACCEL  - color key blitting is accelerated with RLE
+    SDL.SURFACE.SRCALPHA  - surface blit uses alpha blending
+    SDL.SURFACE.PREALLOC  - surface uses preallocated memory
+
+ +Like other numeric constants, they may be combined with the or operator: + +
    var screen = SDL.setVideoMode( 640, 480, 32, SDL.SURFACE.HWSURFACE | SDL.SURFACE.HWACCEL );
+ +The surface created with the setVideoMode() call represents the contents of +the displayed window. It's common practice to create a buffer surface to hold +video contents in preparation for drawing on the screen. To create a buffer, +use the createRGBSurface() call. + +
    var surface = SDL.createRGBSurface( SDL.SURFACE.SWSURFACE, 24, 24 );
+ +The first parameter describes the type of surface to create, and the remaining +parameters are x and y sizes. + +After you're done using a surface, you *should* free it. The freeSurface() +function takes a surface (like one returned from the createRGBSurface() +function above) and frees memory associated with it: + +
    SDL.freeSurface( surface );
+ +The displayFormat() function copies a surface into a new surface suitable +for blitting into the frame buffer. It takes a surface as it's first (and only) +parameter and returns a new surface conformable with the system's frame buffer. +This call is extremely useful in conjunction with the SDL.IMG.load() call: + +
    var tempSheet = SDL.IMG.load( __dirname + "/sprites.png" );
+var sheet = SDL.displayFormat( tempSheet );
+SDL.freeSurface( tempSheet );
+ +SDL surfaces may have an Alpha value associated with them. This is a value from +0 to 255 and sets the transparency of the surface's contents when blitted into +another surface (like the frame buffer). + +
    SDL.setAlpha( sheet, SDL.SURFACE.SRCALPHA | SRC.SURFACE.RLEACCEL, 192 );
+ +Options to the setAlpha() function include: + +
    SDL.SURFACE.SRCALPHA - specifies that alpha blending should be used
+    SLD.SURFACE.RLEACCEL - specifies that RLE acceleration should be used for blitting
+ +You can set a specific color to be transparent (i.e. - the color key) using the +setColorKey() function. After setting this value, when the surface's contents +are blitted to another surface, pixels with the color key value won't be copied. + +
    SDL.setColorKey( sheet, SDL.SURFACE.SRCCOLORKEY, 0x01010100 );
+ +The first parameter is the surface whose color key you're setting. The second +is a set of flags that may be or'd together. The third is a 32 bit integer +representing the value of the color key you want to use. Values for the flags +include: + +
    SDL.SURFACE.SRCCOLORKEY - means you're setting the surface's color key
+    SDL.SURFACE.RLEACCEL    - you want to enable RLE accleration
+    0                       - means you want to clear the surface's color key
+
+ +It can sometimes be tricky to get the precise color key value if you're using +multiple surface geometries. Fortunately, you can use the mapRGB() function +to return a color value, modified to account for a surface's color geometry. +In other words, do this when you want to set the color key: + +
    var colorKey = [ 255, 0, 0 ]; // setting the color key to red
+    SDL.setColorKey( sheet,
+                     SDL.SURFACE.SRCCOLORKEY | SDL.SURFACE.RLEACCEL,
+                     SDL.mapRGB( sheet.format,
+                                 colorKey[0],
+                                 colorKey[1],
+                                 colorKey[2] ) );
+ +To fill a rectangle with a particular color, use the fillRect() function. + +
    SDL.fillRect( surface, [0, 0, 24, 24], 0xFF8080AF );
+ +To blit (copy) a portion of one surface into anotehr, use the blitSurface() +function. It takes as it's parameters: the source surface, a rectangle +describing the origin and extent of the pixels to be copied, the destination +surface, and a point in the destination you're copying pixels to. + +So the following example copies an 8x16 rectangle from position (10,25) in the +spriteSource surface into position (128,15) in the screen surface: + +
    SDL.blitSurface( spriteSource, [10, 25, 8, 16], screen, [128, 15] );
+ +After making changes to a surface, you use the flip() function to instruct +the system to make the changes apparent. In systems that support hardware +double-buffering, this call "does the right thing" and waits for a vertical +retrace to flip between video screens. On systems with a software surface, it +simply makes sure that the contents of the surface are made visible. + +It's very useful to call this command after you make updates to the screen. For +example: + +
    var screen = SDL.setVideoMode( 640, 480, 32, SDL.SURFACE.SWSURFACE );
+    SDL.fillRect( surface, [0, 0, 24, 24], 0xFF8080AF );
+    SDL.flip( screen );
+
+ +### 1.3. Image Related Functions + +This package uses a supplimentary image library intended to make it easy for +node-sdl applications to load and use JPG, PNG or TIFF images. Before using +Image functions, you should initalize them with the image init() function: + +
    SDL.IMG.init( 0 );
+ +To load an image into memory, use the image load() function. It takes a file +path as a parameter and returns a reference to it. The following line loads +a PNG file called "foo.png" into the variable foo. + +
    var foo = SDL.IMG.load( __dirname + '/foo.png' );
+ +The foo variable can now be used as a surface blit calls (see below.) + +After you are finished using the image functions, be sure to use the image +quit() function: + +
    SDL.IMG.quit();
+ +### 1.4. Joystick Functions + +If you are developing an application that uses joysticks, you'll need to pass +the SDL.INIT.JOYSTICK option along to the SDL.init() call: + +
    SDL.init( SDL.INIT.VIDEO | SDL.INIT.JOYSTICK );
+ +Now that your app knows you want to use joysticks, you can detect the number of +joysticks present with the numJoysticks() function. The following code checks +to see if there's at least one joystick and complains if there's not: + +
    var numPlayers = SDL.numJoysticks();
+    if( numPlayers < 1 ) {
+        console.log( 'Blargh! At least one joystick is required!' );
+        process.exit( 2 );
+    }
+ +On systems with multiple joysticks, it might be useful to offer a player a +selection of which joystick to use. The system assigns a human readable name +for a joystick which the app can query with the joystickName() function. The +following code prints out the name of each joystick: + +
    SDL.init( SDL.INIT.VIDEO | SDL.INIT.JOYSTICK );
+    var stickCount = SDL.numJoysticks();
+
+    for( var i = 0; i < stickCount; i ++ ) {
+        console.log( 'joystick ' + i + ': ' + SDL.joystickName( i ) );
+    }
+
+    // etc
+ +Now you must explicitly open each joystick you want to receive inputs from. Do +this with the joystickOpen() function. This function takes an integer as a +parameter and represents the index of the joystick you want to open. Here is +some code that opens joystick number zero: + +
    SDL.joystickOpen( 0 );
+ +After the joystick is opened, it will start to generate events. You can register +event handlers with the SDL.events.on() function. Joystick related events are +described in the events section below. + +### 1.5. Window Manager Functions + +node-sdl is capable of setting window manager related info with the SDL.WM.* +functions. + +To set the title of a SDL window, use the setCaption() function. This fragment +sets the window's title to "Window Title" and (if supported by your window +manager) sets the name of the minimized icon to "Icon Title" + +
    SDL.WM.setCaption( 'Window Title', 'Icon Title' );
+ +To set the application's icon, use the setIcon() function. It expects an image +to be passed as it's parameter, so it's common practice to use the image load() +function. The following example loads an icon from the file 'eight.png' and +uses it as the app's icon: + +
    SDL.WM.setIcon( SDL.IMG.load( __dirname + '/eight.png' ) );
+ +## 2. Events + +node-sdl uses javascript events to communicate certain conditions. The +events.on() function is used to set handlers for these events. Event handlers +are passed an object describing the event as a parameter. + +### 2.1. Quit + +As described above, the QUIT event is called when the user closes a SDL window. +The proper response is to free buffers, and exit: + +
    SDL.events.on( 'QUIT', function ( evt ) {
+        SDL.IMG.quit();
+       process.exit( 0 );
+    } );
+ +### 2.2. KEYDOWN & KEYUP + +The KEYDOWN and KEYUP events signal the app that the user has pressed (or +released) a key. The event passed to the handler includes the following +properties: + +
    scancode - the scancode of the key pressed
+    sym      - the symbol of the key pressed
+    mod      - key modifier
+ +Key scancodes are hardware and locale dependent; it's recommended they be +left alone unless you really are targeting a specific piece of hardware. Key +symbols are numbers representing keyboard glyphs. Key modifiers represent +shift, meta, alt and control keys. As you might expect, it's possible for +multiple modifiers to be pressed simultaneously, so the mod value is a bit +field with the following definitions: + +
+0x0000 - No modifiers pressed
+0x0001 - Left Shift
+0x0002 - Right Shift
+0x0040 - Left Control Key
+0x0080 - Right Control Key
+0x0100 - Left Alt Key
+0x0200 - Right Alt Key
+0x0400 - Left Meta Key (for hardware that has a meta key)
+0x0800 - Right Meta Key (for hardware that has a meta key)
+0x1000 - Num Lock on
+0x2000 - Caps Lock on
+0x4000 - Mode Key Pressed (bonus points if you can find hardware with a mode key)
+
+ +It should probably be noted that SDL keysyms are not exactly ASCII. Most +importantly, the system will not return a capital letter ASCII code when the +user hits a letter key and the shift key. Instead, you must manually check +for the shift key being pressed, check the modifier bits and adjust the key +code accordingly. + +The following code converts the modifier and symbol to an ascii value: + +
    SDL.events.on( 'KEYDOWN', function( evt ) {
+        var ascii = evt.sym;
+        
+        if( ( ascii < 123 ) && ( ascii > 96 ) ) {
+            if( 0 != ( evt.mod && 0x2003 ) ) {
+                ascii -= 32;
+            }
+        }
+    
+        console.log( 'ascii: ' + ascii );
+    } );
+ +### 2.3. MOUSEMOTION + +When the user moves a mouse over an SDL screen, the system will generate +MOUSEMOTION events. If you create a handler for these events, every time the +mouse moves, you'll receive an event with the following properties: + +
    state - button state (as described above)
+    x     - x position of the mouse pointer
+    y     - y position of the mouse pointer
+    xrel  - relative motion of the mouse pointer along the x axis
+    yrel  - relative motion of the mouse pointer along the y axis
+ +The button state is a bit field with the following values: + +
    0x0000 - no mouse button pressed
+    0x0001 - left mouse button pressed
+    0x0002 - middle mouse button pressed
+    0x0004 - right mouse button pressed
+ +Take mouse chords with a grain of salt, some systems may be configured to +emulate a 3 button mouse. In these systems, pressing the left and right button +together will generate a middle button press (code 0x0002) instead of the +mouse chord you might be expecting (code 0x0005). + +### 2.4. MOUSEBUTTONDOWN & MOUSEBUTTONUP + +The MOUSEBUTTONUP and MOUSEBUTTONDOWN events report more data and have +slightly different semantics than the button state in the MOUSEMOTION event. +Handlers for these events are passed an object with the following properties: + +
    button - mouse button clicked
+    x      - x position of the mouse
+    y      - y position of the mouse
+ +The button property IS NOT a bit field, but an integer. Instead of detecting +mouse chords, it reports multiple button clicks. Here is the list of mouse +buttons supported: + +
    1 - left button
+    2 - middle button
+    3 - right button
+    4 - scroll wheel up
+    5 - scroll wheel down
+ +### 2.5. JOYAXISMOTION (Joystick Axis Motion) + +The JOYAXISMOTION event reports movement of the joystick device along one of +its axes. Handlers for this event are passed an object with the following +properties: + +
    which - which joystick generated the event
+    axis  - which axis (x or y) the event is reporting movement upon
+    value - a value from -32768 to 32767 describing the logical position of the joystick
+ +### 2.6. JOYBALLMOTION (Joystick Trackball Motion) + +If a user's joystick is equipped with a trackball, it may generate these events +when motion along the trackball is detected. Handlers assigned to listen for +these events will receive an object with the following properties: + +
    which - which joystick generated the event
+    ball  - which trackball generated the event
+    xrel  - relative trackball motion along the x axis
+    yrel  - relative trackball motion along the y axis
+ +### 2.7. JOYHATMOTION (Joystick Hat Motion) + +If a user's joystick is equipped with a hat, it may generate these events when +hat motion is detected. Handlers for this event will be passed an object with +the following properties: + +
    which - which joystick generated the event
+    hat   - which hat on the joystick generated the event
+    value - the position of the hat
+ +### 2.8. JOYBUTTONDOWN & JOYBUTTONUP + +If a user's joystick is equipped with buttons, it may generate these events when +a button press is detected. Handlers for these events will be passed an object +with the following properties: + +
    which  - which joystick generated the event
+    button - which button was pressed
+ diff --git a/src/node/node_modules/node-sdl/Readme b/src/node/node_modules/node-sdl/Readme new file mode 100644 index 00000000..ac7f1fac --- /dev/null +++ b/src/node/node_modules/node-sdl/Readme @@ -0,0 +1,4 @@ +This is a fork from node-sdl (https://github.com/creationix/node-sdl) with a +couple of modifications. + +The build process is currently broken. Will be fixed at a later point. diff --git a/src/node/node_modules/node-sdl/binding.gyp b/src/node/node_modules/node-sdl/binding.gyp new file mode 100644 index 00000000..67812618 --- /dev/null +++ b/src/node/node_modules/node-sdl/binding.gyp @@ -0,0 +1,21 @@ +{ + 'targets': [ + { + # have to specify 'liblib' here since gyp will remove the first one :\ + 'target_name': 'nodesdl', + 'type': 'shared_library', + 'sources': [ + 'src/helpers.cc', + 'src/nodesdl.cc', + ], + 'ldflags': [ + ' (http://creationix.com/)", + "name": "sdl", + "description": "SDL bindings for node", + "version": "0.1.8", + "repository": { + "type": "git", + "url": "git://github.com/creationix/node-sdl.git" + }, + "main": "sdl.js", + "engines": { + "node": ">=0.4.4" + }, + "dependencies": {}, + "devDependencies": {} +} diff --git a/src/node/node_modules/node-sdl/sdl.js b/src/node/node_modules/node-sdl/sdl.js new file mode 100755 index 00000000..55853044 --- /dev/null +++ b/src/node/node_modules/node-sdl/sdl.js @@ -0,0 +1,25 @@ +var SDL = module.exports = require('./build/Release/nodesdl.node'); + +// Easy event emitter based event loop. Started automatically when the first +// listener is added. +var events; +Object.defineProperty(SDL, 'events', { + get: function () { + if (events) return events; + events = new (require('events').EventEmitter); + var now = Date.now(); + setInterval(function () { + var after = Date.now(); + var delta = after - now; + now = after; + var data; + while (data = SDL.pollEvent()) { + events.emit('event', data); + events.emit(data.type, data); + } + events.emit('tick', delta); + }, 16); + return events; + } +}); + diff --git a/src/node/node_modules/node-sdl/src/helpers.cc b/src/node/node_modules/node-sdl/src/helpers.cc new file mode 100644 index 00000000..584c11a7 --- /dev/null +++ b/src/node/node_modules/node-sdl/src/helpers.cc @@ -0,0 +1,437 @@ +#include +#include +#include +#include +#include + +#include "helpers.h" + +namespace sdl { + +// Helper for formatting error exceptions +Handle ThrowSDLException(const char* name) { + return ThrowException(MakeSDLException(name)); +} + +Local MakeSDLException(const char* name) { + return Exception::Error(String::Concat( + String::Concat(String::New(name), String::New(": ")), + String::New(SDL_GetError()) + )); +} + +// Wrap/Unwrap Surface + +static Persistent surface_template_; + +Handle GetSurfaceFlags(Local name, const AccessorInfo& info) { + SDL_Surface* surface = UnwrapSurface(info.Holder()); + return Number::New(surface->flags); +} +Handle GetSurfaceFormat(Local name, const AccessorInfo& info) { + HandleScope scope; + SDL_Surface* surface = UnwrapSurface(info.Holder()); + return scope.Close(WrapPixelFormat(surface->format)); +} +Handle GetSurfaceWidth(Local name, const AccessorInfo& info) { + SDL_Surface* surface = UnwrapSurface(info.Holder()); + return Number::New(surface->w); +} +Handle GetSurfaceHeight(Local name, const AccessorInfo& info) { + SDL_Surface* surface = UnwrapSurface(info.Holder()); + return Number::New(surface->h); +} +Handle GetSurfacePitch(Local name, const AccessorInfo& info) { + SDL_Surface* surface = UnwrapSurface(info.Holder()); + return Number::New(surface->pitch); +} +Handle GetSurfaceRect(Local name, const AccessorInfo& info) { + HandleScope scope; + SDL_Surface* surface = UnwrapSurface(info.Holder()); + return scope.Close(WrapRect(&surface->clip_rect)); +} + +Handle MakeSurfaceTemplate() { + HandleScope handle_scope; + + Handle result = ObjectTemplate::New(); + result->SetInternalFieldCount(1); + + // Add accessors for some of the fields of the surface. + result->SetAccessor(String::NewSymbol("flags"), GetSurfaceFlags); + result->SetAccessor(String::NewSymbol("format"), GetSurfaceFormat); + result->SetAccessor(String::NewSymbol("w"), GetSurfaceWidth); + result->SetAccessor(String::NewSymbol("h"), GetSurfaceHeight); + result->SetAccessor(String::NewSymbol("pitch"), GetSurfacePitch); + result->SetAccessor(String::NewSymbol("clip_rect"), GetSurfaceRect); + + // Again, return the result through the current handle scope. + return handle_scope.Close(result); +} + +Handle WrapSurface(SDL_Surface* surface) { + // Handle scope for temporary handles. + HandleScope handle_scope; + + // Fetch the template for creating JavaScript http request wrappers. + // It only has to be created once, which we do on demand. + if (surface_template_.IsEmpty()) { + Handle raw_template = MakeSurfaceTemplate(); + surface_template_ = Persistent::New(raw_template); + } + Handle templ = surface_template_; + + // Create an empty http request wrapper. + Handle result = templ->NewInstance(); + + // Wrap the raw C++ pointer in an External so it can be referenced + // from within JavaScript. + Handle request_ptr = External::New(surface); + + // Store the request pointer in the JavaScript wrapper. + result->SetInternalField(0, request_ptr); + + // Return the result through the current handle scope. Since each + // of these handles will go away when the handle scope is deleted + // we need to call Close to let one, the result, escape into the + // outer handle scope. + return handle_scope.Close(result); +} + +SDL_Surface* UnwrapSurface(Handle obj) { + Handle field = Handle::Cast(obj->GetInternalField(0)); + void* ptr = field->Value(); + return static_cast(ptr); +} + +// Wrap/Unwrap Rect + +static Persistent rect_template_; + +Handle GetRectX(Local name, const AccessorInfo& info) { + SDL_Rect* rect = UnwrapRect(info.Holder()); + return Number::New(rect->x); +} +Handle GetRectY(Local name, const AccessorInfo& info) { + SDL_Rect* rect = UnwrapRect(info.Holder()); + return Number::New(rect->y); +} +Handle GetRectW(Local name, const AccessorInfo& info) { + SDL_Rect* rect = UnwrapRect(info.Holder()); + return Number::New(rect->w); +} +Handle GetRectH(Local name, const AccessorInfo& info) { + SDL_Rect* rect = UnwrapRect(info.Holder()); + return Number::New(rect->h); +} + +Handle MakeRectTemplate() { + HandleScope handle_scope; + + Handle result = ObjectTemplate::New(); + result->SetInternalFieldCount(1); + + // Add accessors for some of the fields of the rect. + result->SetAccessor(String::NewSymbol("x"), GetRectX); + result->SetAccessor(String::NewSymbol("y"), GetRectY); + result->SetAccessor(String::NewSymbol("w"), GetRectW); + result->SetAccessor(String::NewSymbol("h"), GetRectH); + + // Again, return the result through the current handle scope. + return handle_scope.Close(result); +} + +Handle WrapRect(SDL_Rect* rect) { + // Handle scope for temporary handles. + HandleScope handle_scope; + + // Fetch the template for creating JavaScript http request wrappers. + // It only has to be created once, which we do on demand. + if (rect_template_.IsEmpty()) { + Handle raw_template = MakeRectTemplate(); + rect_template_ = Persistent::New(raw_template); + } + Handle templ = rect_template_; + + // Create an empty http request wrapper. + Handle result = templ->NewInstance(); + + // Wrap the raw C++ pointer in an External so it can be referenced + // from within JavaScript. + Handle request_ptr = External::New(rect); + + // Store the request pointer in the JavaScript wrapper. + result->SetInternalField(0, request_ptr); + + // Return the result through the current handle scope. Since each + // of these handles will go away when the handle scope is deleted + // we need to call Close to let one, the result, escape into the + // outer handle scope. + return handle_scope.Close(result); +} + +SDL_Rect* UnwrapRect(Handle obj) { + Handle field = Handle::Cast(obj->GetInternalField(0)); + void* ptr = field->Value(); + return static_cast(ptr); +} + +// Wrap/Unwrap PixelFormat + +static Persistent pixelformat_template_; + +Handle GetFormatBits(Local name, const AccessorInfo& info) { + SDL_PixelFormat* format = UnwrapPixelFormat(info.Holder()); + return Number::New(format->BitsPerPixel); +} +Handle GetFormatBytes(Local name, const AccessorInfo& info) { + SDL_PixelFormat* format = UnwrapPixelFormat(info.Holder()); + return Number::New(format->BytesPerPixel); +} +Handle GetFormatColorkey(Local name, const AccessorInfo& info) { + SDL_PixelFormat* format = UnwrapPixelFormat(info.Holder()); + return Number::New(format->colorkey); +} +Handle GetFormatAlpha(Local name, const AccessorInfo& info) { + SDL_PixelFormat* format = UnwrapPixelFormat(info.Holder()); + return Number::New(format->alpha); +} + +Handle MakePixelFormatTemplate() { + HandleScope handle_scope; + + Handle result = ObjectTemplate::New(); + result->SetInternalFieldCount(1); + + // Add accessors for some of the fields of the pixelformat. + result->SetAccessor(String::NewSymbol("bitsPerPixel"), GetFormatBits); + result->SetAccessor(String::NewSymbol("bytesPerPixel"), GetFormatBytes); + result->SetAccessor(String::NewSymbol("colorkey"), GetFormatColorkey); + result->SetAccessor(String::NewSymbol("alpha"), GetFormatAlpha); + + // Again, return the result through the current handle scope. + return handle_scope.Close(result); +} + +Handle WrapPixelFormat(SDL_PixelFormat* pixelformat) { + // Handle scope for temporary handles. + HandleScope handle_scope; + + // Fetch the template for creating JavaScript http request wrappers. + // It only has to be created once, which we do on demand. + if (pixelformat_template_.IsEmpty()) { + Handle raw_template = MakePixelFormatTemplate(); + pixelformat_template_ = Persistent::New(raw_template); + } + Handle templ = pixelformat_template_; + + // Create an empty http request wrapper. + Handle result = templ->NewInstance(); + + // Wrap the raw C++ pointer in an External so it can be referenced + // from within JavaScript. + Handle request_ptr = External::New(pixelformat); + + // Store the request pointer in the JavaScript wrapper. + result->SetInternalField(0, request_ptr); + + // Return the result through the current handle scope. Since each + // of these handles will go away when the handle scope is deleted + // we need to call Close to let one, the result, escape into the + // outer handle scope. + return handle_scope.Close(result); +} + +SDL_PixelFormat* UnwrapPixelFormat(Handle obj) { + Handle field = Handle::Cast(obj->GetInternalField(0)); + void* ptr = field->Value(); + return static_cast(ptr); +} + +// Wrap/Unwrap Joystick + +static Persistent joystick_template_; + +//Handle GetJoystickFlags(Local name, const AccessorInfo& info) { +// SDL_Joystick* joystick = UnwrapJoystick(info.Holder()); +// return Number::New(joystick->flags); +//} +//Handle GetJoystickFormat(Local name, const AccessorInfo& info) { +// HandleScope scope; +// SDL_Joystick* joystick = UnwrapJoystick(info.Holder()); +// return scope.Close(WrapPixelFormat(joystick->format)); +//} +//Handle GetJoystickWidth(Local name, const AccessorInfo& info) { +// SDL_Joystick* joystick = UnwrapJoystick(info.Holder()); +// return Number::New(joystick->w); +//} +//Handle GetJoystickHeight(Local name, const AccessorInfo& info) { +// SDL_Joystick* joystick = UnwrapJoystick(info.Holder()); +// return Number::New(joystick->h); +//} +//Handle GetJoystickPitch(Local name, const AccessorInfo& info) { +// SDL_Joystick* joystick = UnwrapJoystick(info.Holder()); +// return Number::New(joystick->pitch); +//} +//Handle GetJoystickRect(Local name, const AccessorInfo& info) { +// HandleScope scope; +// SDL_Joystick* joystick = UnwrapJoystick(info.Holder()); +// return scope.Close(WrapRect(&joystick->clip_rect)); +//} + +Handle MakeJoystickTemplate() { + HandleScope handle_scope; + + Handle result = ObjectTemplate::New(); + result->SetInternalFieldCount(1); + + // Add accessors for some of the fields of the joystick. +// result->SetAccessor(String::NewSymbol("flags"), GetJoystickFlags); +// result->SetAccessor(String::NewSymbol("format"), GetJoystickFormat); +// result->SetAccessor(String::NewSymbol("w"), GetJoystickWidth); +// result->SetAccessor(String::NewSymbol("h"), GetJoystickHeight); +// result->SetAccessor(String::NewSymbol("pitch"), GetJoystickPitch); +// result->SetAccessor(String::NewSymbol("clip_rect"), GetJoystickRect); + + // Again, return the result through the current handle scope. + return handle_scope.Close(result); +} + +Handle WrapJoystick(SDL_Joystick* joystick) { + // Handle scope for temporary handles. + HandleScope handle_scope; + + // Fetch the template for creating JavaScript http request wrappers. + // It only has to be created once, which we do on demand. + if (joystick_template_.IsEmpty()) { + Handle raw_template = MakeJoystickTemplate(); + joystick_template_ = Persistent::New(raw_template); + } + Handle templ = joystick_template_; + + // Create an empty http request wrapper. + Handle result = templ->NewInstance(); + + // Wrap the raw C++ pointer in an External so it can be referenced + // from within JavaScript. + Handle request_ptr = External::New(joystick); + + // Store the request pointer in the JavaScript wrapper. + result->SetInternalField(0, request_ptr); + + // Return the result through the current handle scope. Since each + // of these handles will go away when the handle scope is deleted + // we need to call Close to let one, the result, escape into the + // outer handle scope. + return handle_scope.Close(result); +} + +SDL_Joystick* UnwrapJoystick(Handle obj) { + Handle field = Handle::Cast(obj->GetInternalField(0)); + void* ptr = field->Value(); + return static_cast(ptr); +} + +// Wrap/Unwrap Font + +static Persistent font_template_; + +//Handle GetFontFlags(Local name, const AccessorInfo& info) { +// TTF_Font* font = UnwrapFont(info.Holder()); +// return Number::New(font->flags); +//} +//Handle GetFontFormat(Local name, const AccessorInfo& info) { +// HandleScope scope; +// TTF_Font* font = UnwrapFont(info.Holder()); +// return scope.Close(WrapPixelFormat(font->format)); +//} +//Handle GetFontWidth(Local name, const AccessorInfo& info) { +// TTF_Font* font = UnwrapFont(info.Holder()); +// return Number::New(font->w); +//} +//Handle GetFontHeight(Local name, const AccessorInfo& info) { +// TTF_Font* font = UnwrapFont(info.Holder()); +// return Number::New(font->h); +//} +//Handle GetFontPitch(Local name, const AccessorInfo& info) { +// TTF_Font* font = UnwrapFont(info.Holder()); +// return Number::New(font->pitch); +//} +//Handle GetFontRect(Local name, const AccessorInfo& info) { +// HandleScope scope; +// TTF_Font* font = UnwrapFont(info.Holder()); +// return scope.Close(WrapRect(&font->clip_rect)); +//} + +Handle MakeFontTemplate() { + HandleScope handle_scope; + + Handle result = ObjectTemplate::New(); + result->SetInternalFieldCount(1); + + // Add accessors for some of the fields of the font. +// result->SetAccessor(String::NewSymbol("flags"), GetFontFlags); +// result->SetAccessor(String::NewSymbol("format"), GetFontFormat); +// result->SetAccessor(String::NewSymbol("w"), GetFontWidth); +// result->SetAccessor(String::NewSymbol("h"), GetFontHeight); +// result->SetAccessor(String::NewSymbol("pitch"), GetFontPitch); +// result->SetAccessor(String::NewSymbol("clip_rect"), GetFontRect); + + // Again, return the result through the current handle scope. + return handle_scope.Close(result); +} + +Handle WrapFont(TTF_Font* font) { + // Handle scope for temporary handles. + HandleScope handle_scope; + + // Fetch the template for creating JavaScript http request wrappers. + // It only has to be created once, which we do on demand. + if (font_template_.IsEmpty()) { + Handle raw_template = MakeFontTemplate(); + font_template_ = Persistent::New(raw_template); + } + Handle templ = font_template_; + + // Create an empty http request wrapper. + Handle result = templ->NewInstance(); + + // Wrap the raw C++ pointer in an External so it can be referenced + // from within JavaScript. + Handle request_ptr = External::New(font); + + // Store the request pointer in the JavaScript wrapper. + result->SetInternalField(0, request_ptr); + + // Return the result through the current handle scope. Since each + // of these handles will go away when the handle scope is deleted + // we need to call Close to let one, the result, escape into the + // outer handle scope. + return handle_scope.Close(result); +} + +TTF_Font* UnwrapFont(Handle obj) { + Handle field = Handle::Cast(obj->GetInternalField(0)); + void* ptr = field->Value(); + return static_cast(ptr); +} + + +//char* BufferData(Buffer *b) { +// return Buffer::Data(b->handle_); +//} + +//size_t BufferLength(Buffer *b) { +// return Buffer::Length(b->handle_); +//} + +char* BufferData(Local buf_obj) { + return Buffer::Data(buf_obj); +} + +size_t BufferLength(Local buf_obj) { + return Buffer::Length(buf_obj); +} + +} // node_sdl + diff --git a/src/node/node_modules/node-sdl/src/helpers.h b/src/node/node_modules/node-sdl/src/helpers.h new file mode 100644 index 00000000..5fe43eaf --- /dev/null +++ b/src/node/node_modules/node-sdl/src/helpers.h @@ -0,0 +1,42 @@ +#ifndef HELPERS_H_ +#define HELPERS_H_ + +#include +#include +#include + +using namespace node; +using namespace v8; + +namespace sdl { + + // Error reporting helpers + Handle ThrowSDLException(const char* name); + Local MakeSDLException(const char* name); + + // Wrapper and Unwrappers + Handle WrapSurface(SDL_Surface* surface); + SDL_Surface* UnwrapSurface(Handle obj); + + Handle WrapRect(SDL_Rect* rect); + SDL_Rect* UnwrapRect(Handle obj); + + Handle WrapPixelFormat(SDL_PixelFormat* pixelformat); + SDL_PixelFormat* UnwrapPixelFormat(Handle obj); + + Handle WrapJoystick(SDL_Joystick* joystick); + SDL_Joystick* UnwrapJoystick(Handle obj); + + Handle WrapFont(TTF_Font* font); + TTF_Font* UnwrapFont(Handle obj); + + + // Helpers to work with buffers + //char* BufferData(Buffer *b); + //size_t BufferLength(Buffer *b); + char* BufferData(Local buf_obj); + size_t BufferLength(Local buf_obj); + +} // sdl + +#endif // HELPERS_H_ diff --git a/src/node/node_modules/node-sdl/src/nodesdl.cc b/src/node/node_modules/node-sdl/src/nodesdl.cc new file mode 100644 index 00000000..84216827 --- /dev/null +++ b/src/node/node_modules/node-sdl/src/nodesdl.cc @@ -0,0 +1,1078 @@ +#ifdef __APPLE__ +#include +#include +#endif + +#include "SDL.h" +#include "nodesdl.h" +#include + +using namespace v8; + +extern "C" void +init(Handle target) +{ +#ifdef __APPLE__ + // on the mac it is necessary to create to call [NSApplication sharedApplication] + // before we can create a rendering window + objc_msgSend(objc_lookUpClass("NSApplication"), sel_getUid("sharedApplication")); +#endif + + NODE_SET_METHOD(target, "init", sdl::Init); + NODE_SET_METHOD(target, "initSubSystem", sdl::InitSubSystem); + NODE_SET_METHOD(target, "quit", sdl::Quit); + NODE_SET_METHOD(target, "quitSubSystem", sdl::QuitSubSystem); + NODE_SET_METHOD(target, "wasInit", sdl::WasInit); + NODE_SET_METHOD(target, "clearError", sdl::ClearError); + NODE_SET_METHOD(target, "getError", sdl::GetError); + NODE_SET_METHOD(target, "setError", sdl::SetError); + NODE_SET_METHOD(target, "waitEvent", sdl::WaitEvent); + NODE_SET_METHOD(target, "pollEvent", sdl::PollEvent); + NODE_SET_METHOD(target, "setVideoMode", sdl::SetVideoMode); + NODE_SET_METHOD(target, "videoModeOK", sdl::VideoModeOK); + NODE_SET_METHOD(target, "numJoysticks", sdl::NumJoysticks); + NODE_SET_METHOD(target, "joystickOpen", sdl::JoystickOpen); + NODE_SET_METHOD(target, "joystickOpened", sdl::JoystickOpened); + NODE_SET_METHOD(target, "joystickName", sdl::JoystickName); + NODE_SET_METHOD(target, "joystickNumAxes", sdl::JoystickNumAxes); + NODE_SET_METHOD(target, "joystickNumButtons", sdl::JoystickNumButtons); + NODE_SET_METHOD(target, "joystickNumBalls", sdl::JoystickNumBalls); + NODE_SET_METHOD(target, "joystickNumHats", sdl::JoystickNumHats); + NODE_SET_METHOD(target, "joystickClose", sdl::JoystickClose); + NODE_SET_METHOD(target, "joystickUpdate", sdl::JoystickUpdate); + NODE_SET_METHOD(target, "joystickEventState", sdl::JoystickEventState); + NODE_SET_METHOD(target, "flip", sdl::Flip); + NODE_SET_METHOD(target, "putImageData", sdl::PutImageData); + NODE_SET_METHOD(target, "fillRect", sdl::FillRect); + NODE_SET_METHOD(target, "updateRect", sdl::UpdateRect); + NODE_SET_METHOD(target, "createRGBSurface", sdl::CreateRGBSurface); + NODE_SET_METHOD(target, "blitSurface", sdl::BlitSurface); + NODE_SET_METHOD(target, "freeSurface", sdl::FreeSurface); + NODE_SET_METHOD(target, "setColorKey", sdl::SetColorKey); + NODE_SET_METHOD(target, "displayFormat", sdl::DisplayFormat); + NODE_SET_METHOD(target, "displayFormatAlpha", sdl::DisplayFormatAlpha); + NODE_SET_METHOD(target, "setAlpha", sdl::SetAlpha); + NODE_SET_METHOD(target, "mapRGB", sdl::MapRGB); + NODE_SET_METHOD(target, "mapRGBA", sdl::MapRGBA); + NODE_SET_METHOD(target, "getRGB", sdl::GetRGB); + NODE_SET_METHOD(target, "getRGBA", sdl::GetRGBA); + NODE_SET_METHOD(target, "setClipRect",sdl::SetClipRect); + + Local INIT = Object::New(); + target->Set(String::New("INIT"), INIT); + INIT->Set(String::New("TIMER"), Number::New(SDL_INIT_TIMER)); + INIT->Set(String::New("AUDIO"), Number::New(SDL_INIT_AUDIO)); + INIT->Set(String::New("VIDEO"), Number::New(SDL_INIT_VIDEO)); + INIT->Set(String::New("JOYSTICK"), Number::New(SDL_INIT_JOYSTICK)); + INIT->Set(String::New("EVERYTHING"), Number::New(SDL_INIT_EVERYTHING)); + INIT->Set(String::New("NOPARACHUTE"), Number::New(SDL_INIT_NOPARACHUTE)); + + Local SURFACE = Object::New(); + target->Set(String::New("SURFACE"), SURFACE); + SURFACE->Set(String::New("ANYFORMAT"), Number::New(SDL_ANYFORMAT)); + SURFACE->Set(String::New("ASYNCBLIT"), Number::New(SDL_ASYNCBLIT)); + SURFACE->Set(String::New("DOUBLEBUF"), Number::New(SDL_DOUBLEBUF)); + SURFACE->Set(String::New("HWACCEL"), Number::New(SDL_HWACCEL)); + SURFACE->Set(String::New("HWPALETTE"), Number::New(SDL_HWPALETTE)); + SURFACE->Set(String::New("HWSURFACE"), Number::New(SDL_HWSURFACE)); + SURFACE->Set(String::New("FULLSCREEN"), Number::New(SDL_FULLSCREEN)); + SURFACE->Set(String::New("OPENGL"), Number::New(SDL_OPENGL)); + SURFACE->Set(String::New("RESIZABLE"), Number::New(SDL_RESIZABLE)); + SURFACE->Set(String::New("RLEACCEL"), Number::New(SDL_RLEACCEL)); + SURFACE->Set(String::New("SRCALPHA"), Number::New(SDL_SRCALPHA)); + SURFACE->Set(String::New("SRCCOLORKEY"), Number::New(SDL_SRCCOLORKEY)); + SURFACE->Set(String::New("SWSURFACE"), Number::New(SDL_SWSURFACE)); + SURFACE->Set(String::New("PREALLOC"), Number::New(SDL_PREALLOC)); + + Local TTF = Object::New(); + target->Set(String::New("TTF"), TTF); + NODE_SET_METHOD(TTF, "init", sdl::TTF::Init); + NODE_SET_METHOD(TTF, "openFont", sdl::TTF::OpenFont); + NODE_SET_METHOD(TTF, "renderTextBlended", sdl::TTF::RenderTextBlended); + NODE_SET_METHOD(TTF, "renderTextShaded", sdl::TTF::RenderTextShaded); + + Local IMG = Object::New(); + target->Set(String::New("IMG"), IMG); + + NODE_SET_METHOD(IMG, "load", sdl::IMG::Load); + + Local WM = Object::New(); + target->Set(String::New("WM"), WM); + + NODE_SET_METHOD(WM, "setCaption", sdl::WM::SetCaption); + NODE_SET_METHOD(WM, "setIcon", sdl::WM::SetIcon); + + Local GL = Object::New(); + target->Set(String::New("GL"), GL); + + + NODE_SET_METHOD(GL, "setAttribute", sdl::GL::SetAttribute); + NODE_SET_METHOD(GL, "getAttribute", sdl::GL::GetAttribute); + NODE_SET_METHOD(GL, "swapBuffers", sdl::GL::SwapBuffers); + + GL->Set(String::New("RED_SIZE"), Number::New(SDL_GL_RED_SIZE)); + GL->Set(String::New("GREEN_SIZE"), Number::New(SDL_GL_GREEN_SIZE)); + GL->Set(String::New("BLUE_SIZE"), Number::New(SDL_GL_BLUE_SIZE)); + GL->Set(String::New("ALPHA_SIZE"), Number::New(SDL_GL_ALPHA_SIZE)); + GL->Set(String::New("DOUBLEBUFFER"), Number::New(SDL_GL_DOUBLEBUFFER)); + GL->Set(String::New("BUFFER_SIZE"), Number::New(SDL_GL_BUFFER_SIZE)); + GL->Set(String::New("DEPTH_SIZE"), Number::New(SDL_GL_DEPTH_SIZE)); + GL->Set(String::New("STENCIL_SIZE"), Number::New(SDL_GL_STENCIL_SIZE)); + GL->Set(String::New("ACCUM_RED_SIZE"), Number::New(SDL_GL_ACCUM_RED_SIZE)); + GL->Set(String::New("ACCUM_GREEN_SIZE"), Number::New(SDL_GL_ACCUM_GREEN_SIZE)); + GL->Set(String::New("ACCUM_BLUE_SIZE"), Number::New(SDL_GL_ACCUM_BLUE_SIZE)); + GL->Set(String::New("ACCUM_ALPHA_SIZE"), Number::New(SDL_GL_ACCUM_ALPHA_SIZE)); +} + +//////////////////////////////////////////////////////////////////////////////// + +Handle sdl::GL::SetAttribute(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 2 && args[0]->IsNumber() && args[1]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected SetAttribute(Number, Number)"))); + } + + int attr = args[0]->Int32Value(); + int value = args[1]->Int32Value(); + + if (SDL_GL_SetAttribute((SDL_GLattr)attr, value)) return ThrowSDLException(__func__); + return Undefined(); +} + +Handle sdl::GL::GetAttribute(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected GetAttribute(Number)"))); + } + + int attr = args[0]->Int32Value(); + int value; + + if (SDL_GL_GetAttribute((SDL_GLattr)attr, &value)) return ThrowSDLException(__func__); + + return Number::New(value); +} + +Handle sdl::GL::SwapBuffers(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected SwapBuffers()"))); + } + + SDL_GL_SwapBuffers(); + return Undefined(); +} + +Handle sdl::Init(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected Init(Number)"))); + } + + if (SDL_Init(args[0]->Int32Value()) < 0) return ThrowSDLException(__func__); + + return Undefined(); +} + +Handle sdl::InitSubSystem(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected InitSubSystem(Number)"))); + } + + if (SDL_InitSubSystem(args[0]->Int32Value()) < 0) return ThrowSDLException(__func__); + + return Undefined(); +} + +Handle sdl::Quit(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected Quit()"))); + } + + SDL_Quit(); + + return Undefined(); +} + +Handle sdl::QuitSubSystem(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected QuitSubSystem(Number)"))); + } + + SDL_QuitSubSystem(args[0]->Int32Value()); + + return Undefined(); +} + +Handle sdl::WasInit(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected WasInit(Number)"))); + } + + return Number::New(SDL_WasInit(args[0]->Int32Value())); +} + +Handle sdl::ClearError(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected ClearError()"))); + } + + SDL_ClearError(); + + return Undefined(); +} + +Handle sdl::GetError(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected GetError()"))); + } + + return String::New(SDL_GetError()); +} + +Handle sdl::SetError(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsString())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected SetError(String)"))); + } + + String::Utf8Value message(args[1]); + + SDL_SetError(*message); + + return Undefined(); +} + +/* +static void sdl::EIO_WaitEvent(eio_req *req) { + sdl::closure_t *closure = (sdl::closure_t *) req->data; + closure->status = SDL_WaitEvent(NULL); +} + +static int sdl::EIO_OnEvent(eio_req *req) { + HandleScope scope; + + sdl::closure_t *closure = (sdl::closure_t *) req->data; + ev_unref(EV_DEFAULT_UC); + + Handle argv[1]; + if (closure->status == 0) { + argv[0] = MakeSDLException("WaitEvent"); + } else { + argv[0] = Undefined(); + } + + closure->fn->Call(Context::GetCurrent()->Global(), 1, argv); + + closure->fn.Dispose(); + free(closure); + return 0; +}*/ + +static Handle sdl::WaitEvent(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsFunction())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected WaitEvent(Function)"))); + } + + closure_t *closure = (closure_t*) malloc(sizeof(closure_t)); + closure->fn = Persistent::New(Handle::Cast(args[0])); + //eio_custom(EIO_WaitEvent, EIO_PRI_DEFAULT, EIO_OnEvent, closure); + //ev_ref(EV_DEFAULT_UC); + return Undefined(); +} + + + +Handle sdl::PollEvent(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected PollEvent()"))); + } + + SDL_Event event; + if (!SDL_PollEvent(&event)) { + return Undefined(); + } + + Local evt = Object::New(); + + switch (event.type) { + case SDL_ACTIVEEVENT: + evt->Set(String::New("type"), String::New("ACTIVEEVENT")); + evt->Set(String::New("gain"), Boolean::New(event.active.gain)); + evt->Set(String::New("state"), Number::New(event.active.state)); + break; + case SDL_KEYDOWN: + case SDL_KEYUP: + evt->Set(String::New("type"), String::New(event.type == SDL_KEYDOWN ? "KEYDOWN" : "KEYUP")); + evt->Set(String::New("scancode"), Number::New(event.key.keysym.scancode)); + evt->Set(String::New("sym"), Number::New(event.key.keysym.sym)); + evt->Set(String::New("mod"), Number::New(event.key.keysym.mod)); + break; + case SDL_MOUSEMOTION: + evt->Set(String::New("type"), String::New("MOUSEMOTION")); + evt->Set(String::New("state"), Number::New(event.motion.state)); + evt->Set(String::New("which"), Number::New(event.motion.which)); + evt->Set(String::New("x"), Number::New(event.motion.x)); + evt->Set(String::New("y"), Number::New(event.motion.y)); + evt->Set(String::New("xrel"), Number::New(event.motion.xrel)); + evt->Set(String::New("yrel"), Number::New(event.motion.yrel)); + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + evt->Set(String::New("type"), String::New(event.type == SDL_MOUSEBUTTONDOWN ? "MOUSEBUTTONDOWN" : "MOUSEBUTTONUP")); + evt->Set(String::New("button"), Number::New(event.button.button)); + evt->Set(String::New("which"), Number::New(event.button.which)); + evt->Set(String::New("x"), Number::New(event.button.x)); + evt->Set(String::New("y"), Number::New(event.button.y)); + break; + case SDL_JOYAXISMOTION: + evt->Set(String::New("type"), String::New("JOYAXISMOTION")); + evt->Set(String::New("which"), Number::New(event.jaxis.which)); + evt->Set(String::New("axis"), Number::New(event.jaxis.axis)); + evt->Set(String::New("value"), Number::New(event.jaxis.value)); + break; + case SDL_JOYBALLMOTION: + evt->Set(String::New("type"), String::New("JOYBALLMOTION")); + evt->Set(String::New("which"), Number::New(event.jball.which)); + evt->Set(String::New("ball"), Number::New(event.jball.ball)); + evt->Set(String::New("xrel"), Number::New(event.jball.xrel)); + evt->Set(String::New("yrel"), Number::New(event.jball.yrel)); + break; + case SDL_JOYHATMOTION: + evt->Set(String::New("type"), String::New("JOYHATMOTION")); + evt->Set(String::New("which"), Number::New(event.jhat.which)); + evt->Set(String::New("hat"), Number::New(event.jhat.hat)); + evt->Set(String::New("value"), Number::New(event.jhat.value)); + break; + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + evt->Set(String::New("type"), String::New(event.type == SDL_JOYBUTTONDOWN ? "JOYBUTTONDOWN" : "JOYBUTTONUP")); + evt->Set(String::New("which"), Number::New(event.jbutton.which)); + evt->Set(String::New("button"), Number::New(event.jbutton.button)); + break; + case SDL_QUIT: + evt->Set(String::New("type"), String::New("QUIT")); + break; + default: + evt->Set(String::New("type"), String::New("UNKNOWN")); + evt->Set(String::New("typeCode"), Number::New(event.type)); + break; + } + + return scope.Close(evt); +} + +static Handle sdl::SetVideoMode(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 4 && args[0]->IsNumber() && args[1]->IsNumber() && args[2]->IsNumber() && args[3]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected SetVideoMode(Number, Number, Number, Number)"))); + } + + int width = (args[0]->Int32Value()); + int height = (args[1]->Int32Value()); + int bpp = (args[2]->Int32Value()); + int flags = (args[3]->Int32Value()); + + SDL_Surface* screen = SDL_SetVideoMode(width, height, bpp, flags); + if (screen == NULL) return ThrowSDLException(__func__); + return scope.Close(WrapSurface(screen)); +} + +static Handle sdl::PutImageData(const Arguments& args) { + + HandleScope scope; + + if (!(args.Length() == 2 && args[0]->IsObject() && args[1]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected PutImageData(Surface, Object)"))); + } + + // I'm a bad C++ coder. + // Don't judge me :( + + Local obj = args[1]->ToObject(); + //if (obj->GetIndexedPropertiesExternalArrayDataType() != kExternalFloatArray) return; + int len = obj->GetIndexedPropertiesExternalArrayDataLength(); + int* data = static_cast(obj->GetIndexedPropertiesExternalArrayData()); + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + + if( SDL_MUSTLOCK(surface) ) + SDL_LockSurface(surface); + + if(len > surface->w * surface->h) + { + len = surface->w * surface->h; + } + + uint32_t * pixel = (uint32_t*)surface->pixels; + //pixel += (y * surface->pitch) + (x * sizeof(Uint32)); + + for(int i = 0; i < len; i++) + { + *pixel = *data; + pixel++; + data++; + } + + if( SDL_MUSTLOCK(surface) ) + SDL_UnlockSurface(surface); + + return Undefined(); +} + +static Handle sdl::VideoModeOK(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 4 && args[0]->IsNumber() && args[1]->IsNumber() && args[2]->IsNumber() && args[3]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected VideoModeOK(Number, Number, Number, Number)"))); + } + + int width = (args[0]->Int32Value()); + int height = (args[1]->Int32Value()); + int bpp = (args[2]->Int32Value()); + int flags = (args[3]->Int32Value()); + + return Number::New(SDL_VideoModeOK(width, height, bpp, flags)); +} + +static Handle sdl::NumJoysticks(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected NumJoysticks()"))); + } + + return Number::New(SDL_NumJoysticks()); +} + +static Handle sdl::JoystickOpen(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickOpen(Number)"))); + } + + SDL_Joystick* joystick = SDL_JoystickOpen(args[0]->Int32Value()); + if (!joystick) return ThrowSDLException(__func__); + return scope.Close(WrapJoystick(joystick)); +} + +static Handle sdl::JoystickOpened(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickOpened(Number)"))); + } + + return Number::New(SDL_JoystickOpened(args[0]->Int32Value())); +} + + +static Handle sdl::JoystickName(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickName(Number)"))); + } + + return String::New(SDL_JoystickName(args[0]->Int32Value())); +} + +static Handle sdl::JoystickNumAxes(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickNumAxes(Joystick)"))); + } + + return Number::New(SDL_JoystickNumAxes(UnwrapJoystick(args[0]->ToObject()))); +} + +static Handle sdl::JoystickNumButtons(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickNumButtons(Joystick)"))); + } + + return Number::New(SDL_JoystickNumButtons(UnwrapJoystick(args[0]->ToObject()))); +} + +static Handle sdl::JoystickNumBalls(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickNumBalls(Joystick)"))); + } + + return Number::New(SDL_JoystickNumBalls(UnwrapJoystick(args[0]->ToObject()))); +} + +static Handle sdl::JoystickNumHats(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickNumHats(Joystick)"))); + } + + return Number::New(SDL_JoystickNumHats(UnwrapJoystick(args[0]->ToObject()))); +} + +static Handle sdl::JoystickClose(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickClose(Joystick)"))); + } + + SDL_JoystickClose(UnwrapJoystick(args[0]->ToObject())); + + return Undefined(); +} + +static Handle sdl::JoystickUpdate(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickUpdate()"))); + } + + SDL_JoystickUpdate(); + return Undefined(); +} + +static Handle sdl::JoystickEventState(const Arguments& args) { + HandleScope scope; + + int state; + if (args.Length() == 0) { + state = SDL_QUERY; + } else { + if (!(args.Length() == 1 && args[0]->IsBoolean())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected JoystickEventState([Boolean])"))); + } + state = args[0]->BooleanValue() ? SDL_ENABLE : SDL_IGNORE; + } + return Boolean::New(SDL_JoystickEventState(state)); +} + + +static Handle sdl::Flip(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected Flip(Surface)"))); + } + + SDL_Flip(UnwrapSurface(args[0]->ToObject())); + + return Undefined(); +} + +static Handle sdl::FillRect(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 3 + && args[0]->IsObject() + && (args[1]->IsObject() || args[1]->IsNull()) + && args[2]->IsNumber() + )) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected FillRect(Surface, Rect, Number)"))); + } + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + SDL_Rect* rect; + if (args[1]->IsNull()) { + rect = NULL; + } else if (args[1]->IsArray()) { + SDL_Rect r; + Handle arr = args[1]->ToObject(); + r.x = arr->Get(String::New("0"))->Int32Value(); + r.y = arr->Get(String::New("1"))->Int32Value(); + r.w = arr->Get(String::New("2"))->Int32Value(); + r.h = arr->Get(String::New("3"))->Int32Value(); + rect = &r; + } else { + rect = UnwrapRect(args[1]->ToObject()); + } + int color = args[2]->Int32Value(); + + if (SDL_FillRect (surface, rect, color) < 0) return ThrowSDLException(__func__); + + return Undefined(); +} + +static Handle sdl::UpdateRect(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 2 + && args[0]->IsObject() + && (args[1]->IsObject() || args[1]->IsNull()) + )) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected UpdateRect(Surface, Rect)"))); + } + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + SDL_Rect* rect; + if (args[1]->IsNull()) { + rect = NULL; + } else if (args[1]->IsArray()) { + SDL_Rect r; + Handle arr = args[1]->ToObject(); + r.x = arr->Get(String::New("0"))->Int32Value(); + r.y = arr->Get(String::New("1"))->Int32Value(); + r.w = arr->Get(String::New("2"))->Int32Value(); + r.h = arr->Get(String::New("3"))->Int32Value(); + rect = &r; + } else { + rect = UnwrapRect(args[1]->ToObject()); + } + + SDL_UpdateRect(surface, rect->x, rect->y, rect->w, rect->h); + + return Undefined(); +} + + +static Handle sdl::CreateRGBSurface(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 3 && args[0]->IsNumber() && args[1]->IsNumber() && args[2]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected CreateRGBSurface(Number, Number, Number)"))); + } + + int flags = args[0]->Int32Value(); + int width = args[1]->Int32Value(); + int height = args[2]->Int32Value(); + + SDL_Surface *surface; + int rmask, gmask, bmask, amask; + + /* SDL interprets each pixel as a 32-bit number, so our masks must depend + on the endianness (byte order) of the machine */ +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; +#else + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + amask = 0xff000000; +#endif + + surface = SDL_CreateRGBSurface(flags, width, height, 32, rmask, gmask, bmask, amask); + if (surface == NULL) return ThrowSDLException(__func__); + return scope.Close(WrapSurface(surface)); +} + +static Handle sdl::BlitSurface(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 4 + && args[0]->IsObject() + && (args[1]->IsObject() || args[1]->IsNull()) + && args[2]->IsObject() + && (args[3]->IsObject() || args[3]->IsNull()) + )) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected BlitSurface(Surface, Rect, Surface, Rect)"))); + } + + SDL_Surface* src = UnwrapSurface(args[0]->ToObject()); + SDL_Surface* dst = UnwrapSurface(args[2]->ToObject()); + + SDL_Rect* srcrect; + if (args[1]->IsNull()) { + srcrect = NULL; + } else if (args[1]->IsArray()) { + Handle arr1 = args[1]->ToObject(); + srcrect = new SDL_Rect(); + srcrect->x = arr1->Get(String::New("0"))->Int32Value(); + srcrect->y = arr1->Get(String::New("1"))->Int32Value(); + srcrect->w = arr1->Get(String::New("2"))->Int32Value(); + srcrect->h = arr1->Get(String::New("3"))->Int32Value(); + } else { + srcrect = UnwrapRect(args[1]->ToObject()); + } + + SDL_Rect* dstrect; + if (args[3]->IsNull()) { + dstrect = NULL; + } else if (args[3]->IsArray()) { + Handle arr2 = args[3]->ToObject(); + dstrect = new SDL_Rect(); + dstrect->x = arr2->Get(String::New("0"))->Int32Value(); + dstrect->y = arr2->Get(String::New("1"))->Int32Value(); + dstrect->w = arr2->Get(String::New("2"))->Int32Value(); + dstrect->h = arr2->Get(String::New("3"))->Int32Value(); + } else { + dstrect = UnwrapRect(args[3]->ToObject()); + } + +// if (srcrect) printf("srcrect = {x: %d, y: %d, w: %d, h: %d}\n", srcrect->x, srcrect->y, srcrect->w, srcrect->h); +// else printf("srcrect = null\n"); +// if (dstrect) printf("dstrect = {x: %d, y: %d, w: %d, h: %d}\n", dstrect->x, dstrect->y, dstrect->w, dstrect->h); +// else printf("dstrect = null\n"); + + + if (SDL_BlitSurface(src, srcrect, dst, dstrect) < 0) return ThrowSDLException(__func__); + return Undefined(); +} + +static Handle sdl::FreeSurface(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected FreeSurface(Surface)"))); + } + + // TODO: find a way to do this automatically by using GC hooks. This is dangerous in JS land + SDL_FreeSurface(UnwrapSurface(args[0]->ToObject())); + args[0]->ToObject()->Set(String::New("DEAD"), Boolean::New(true)); + + return Undefined(); +} + +static Handle sdl::SetColorKey(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 3 && args[0]->IsObject() && args[1]->IsNumber() && args[2]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected SetColorKey(Surface, Number, Number)"))); + } + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + int flag = args[1]->Int32Value(); + int key = args[2]->Int32Value(); + + if (SDL_SetColorKey(surface, flag, key) < 0) return ThrowSDLException(__func__); + + return Undefined(); + +} + +static Handle sdl::DisplayFormat(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected DisplayFormat(Surface)"))); + } + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + + return scope.Close(WrapSurface(SDL_DisplayFormat(surface))); +} + +static Handle sdl::DisplayFormatAlpha(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected DisplayFormatAlpha(Surface)"))); + } + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + + return scope.Close(WrapSurface(SDL_DisplayFormatAlpha(surface))); +} + +static Handle sdl::SetAlpha(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 3 && args[0]->IsObject() && args[1]->IsNumber() && args[2]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected SetAlpha(Surface, Number, Number)"))); + } + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + int flags = args[1]->Int32Value(); + int alpha = args[2]->Int32Value(); + + if (SDL_SetAlpha(surface, flags, alpha) < 0) return ThrowSDLException(__func__); + + return Undefined(); +} + +static Handle sdl::MapRGB(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 4 && args[0]->IsObject() && args[1]->IsNumber() && args[2]->IsNumber() && args[3]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected MapRGB(PixelFormat, Number, Number, Number)"))); + } + + SDL_PixelFormat* fmt = UnwrapPixelFormat(args[0]->ToObject()); + int r = args[1]->Int32Value(); + int g = args[2]->Int32Value(); + int b = args[3]->Int32Value(); + + return Number::New(SDL_MapRGB(fmt, r, g, b)); +} + +static Handle sdl::MapRGBA(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 5 && args[0]->IsObject() && args[1]->IsNumber() && args[2]->IsNumber() && args[3]->IsNumber() && args[4]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected MapRGBA(PixelFormat, Number, Number, Number, Number)"))); + } + + SDL_PixelFormat* fmt = UnwrapPixelFormat(args[0]->ToObject()); + int r = args[1]->Int32Value(); + int g = args[2]->Int32Value(); + int b = args[3]->Int32Value(); + int a = args[4]->Int32Value(); + + return Number::New(SDL_MapRGBA(fmt, r, g, b, a)); +} + +static Handle sdl::GetRGB(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 2 && args[0]->IsNumber() && args[1]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected GetRGB(Number, PixelFormat)"))); + } + + int pixel = args[0]->Int32Value(); + SDL_PixelFormat* fmt = UnwrapPixelFormat(args[1]->ToObject()); + ::Uint8 r, g, b; + + SDL_GetRGB(pixel, fmt, &r, &g, &b); + + Local rgb = Object::New(); + rgb->Set(String::New("r"), Number::New(r)); + rgb->Set(String::New("g"), Number::New(g)); + rgb->Set(String::New("b"), Number::New(b)); + + return scope.Close(rgb); +} + +static Handle sdl::GetRGBA(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 2 && args[0]->IsNumber() && args[1]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected GetRGBA(Number, PixelFormat)"))); + } + + int pixel = args[0]->Int32Value(); + SDL_PixelFormat* fmt = UnwrapPixelFormat(args[1]->ToObject()); + ::Uint8 r, g, b, a; + + SDL_GetRGBA(pixel, fmt, &r, &g, &b, &a); + + Local rgba = Object::New(); + rgba->Set(String::New("r"), Number::New(r)); + rgba->Set(String::New("g"), Number::New(g)); + rgba->Set(String::New("b"), Number::New(b)); + rgba->Set(String::New("a"), Number::New(a)); + + return scope.Close(rgba); +} + + +static Handle sdl::SetClipRect(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 2 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected SetClipRect(SDL_Surface, SDL_Rect)"))); + } + + SDL_Surface* surface = UnwrapSurface(args[0]->ToObject()); + SDL_Rect* rect; + if (args[1]->IsNull()) { + rect = NULL; + } else if (args[1]->IsArray()) { + SDL_Rect r; + Handle arr = args[1]->ToObject(); + r.x = arr->Get(String::New("0"))->Int32Value(); + r.y = arr->Get(String::New("1"))->Int32Value(); + r.w = arr->Get(String::New("2"))->Int32Value(); + r.h = arr->Get(String::New("3"))->Int32Value(); + rect = &r; + } else { + rect = UnwrapRect(args[1]->ToObject()); + } + if (SDL_SetClipRect (surface, rect ) < 0) return ThrowSDLException(__func__); + + return Undefined(); +} + +static Handle sdl::TTF::Init(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 0)) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected TTF::Init()"))); + } + + if (TTF_Init() < 0) { + return ThrowException(Exception::Error(String::Concat( + String::New("TTF::Init: "), + String::New(TTF_GetError()) + ))); + } + + return Undefined(); +} + +static Handle sdl::TTF::OpenFont(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 2 && args[0]->IsString() && args[1]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected TTF::OpenFont(String, Number)"))); + } + + String::Utf8Value file(args[0]); + int ptsize = (args[1]->Int32Value()); + + TTF_Font* font = TTF_OpenFont(*file, ptsize); + if (font == NULL) { + return ThrowException(Exception::Error(String::Concat( + String::New("TTF::OpenFont: "), + String::New(TTF_GetError()) + ))); + } + return scope.Close(WrapFont(font)); +} + +static Handle sdl::TTF::RenderTextBlended(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 3 && args[0]->IsObject() && args[1]->IsString() && args[2]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected TTF::RenderTextBlended(Font, String, Number)"))); + } + + SDL_PixelFormat* vfmt = SDL_GetVideoInfo()->vfmt; + TTF_Font* font = UnwrapFont(args[0]->ToObject()); + String::Utf8Value text(args[1]); + int colorCode = args[2]->Int32Value(); + + Uint8 r, g, b; + SDL_GetRGB(colorCode, vfmt, &r, &g, &b); + + SDL_Color color; + color.r = r; + color.g = g; + color.b = b; + + SDL_Surface *resulting_text; + resulting_text = TTF_RenderText_Blended(font, *text, color); + if (!resulting_text) { + return ThrowException(Exception::Error(String::Concat( + String::New("TTF::RenderTextBlended: "), + String::New(TTF_GetError()) + ))); + } + return scope.Close(WrapSurface(resulting_text)); +} + +static Handle sdl::TTF::RenderTextShaded(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 4 && args[0]->IsObject() && args[1]->IsString() && args[2]->IsNumber() && args[3]->IsNumber())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected TTF::RenderTextShaded(Font, String, Number, Number)"))); + } + + SDL_PixelFormat* vfmt = SDL_GetVideoInfo()->vfmt; + TTF_Font* font = UnwrapFont(args[0]->ToObject()); + String::Utf8Value text(args[1]); + int colorCodeFg = args[2]->Int32Value(); + int colorCodeBg = args[3]->Int32Value(); + + Uint8 r, g, b; + SDL_GetRGB(colorCodeFg, vfmt, &r, &g, &b); + + SDL_Color colorFg; + colorFg.r = r; + colorFg.g = g; + colorFg.b = b; + + + SDL_GetRGB(colorCodeBg, vfmt, &r, &g, &b); + + SDL_Color colorBg; + colorBg.r = r; + colorBg.g = g; + colorBg.b = b; + + SDL_Surface *resulting_text; + resulting_text = TTF_RenderText_Shaded(font, *text, colorFg, colorBg); + if (!resulting_text) { + return ThrowException(Exception::Error(String::Concat( + String::New("TTF::RenderTextShaded: "), + String::New(TTF_GetError()) + ))); + } + return scope.Close(WrapSurface(resulting_text)); +} + +// TODO: make an async version so this can be used in loops or parallel load images +static Handle sdl::IMG::Load(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsString())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected IMG::Load(String)"))); + } + + String::Utf8Value file(args[0]); + + SDL_Surface *image; + image=IMG_Load(*file); + if(!image) { + return ThrowException(Exception::Error(String::Concat( + String::New("IMG::Load: "), + String::New(IMG_GetError()) + ))); + } + + return scope.Close(WrapSurface(image)); +} + +static Handle sdl::WM::SetCaption(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 2 && args[0]->IsString() && args[1]->IsString())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected WM::SetCaption(String, String)"))); + } + + String::Utf8Value title(args[0]); + String::Utf8Value icon(args[0]); + + SDL_WM_SetCaption(*title, *icon); + + return Undefined(); +} + +static Handle sdl::WM::SetIcon(const Arguments& args) { + HandleScope scope; + + if (!(args.Length() == 1 && args[0]->IsObject())) { + return ThrowException(Exception::TypeError(String::New("Invalid arguments: Expected WM::SetIcon(Surface)"))); + } + + SDL_Surface* icon = UnwrapSurface(args[0]->ToObject()); + int colorkey = SDL_MapRGB(icon->format, 255, 0, 255); + SDL_SetColorKey(icon, SDL_SRCCOLORKEY, colorkey); + SDL_WM_SetIcon(icon, NULL); + + return Undefined(); +} + +NODE_MODULE(nodesdl, init) diff --git a/src/node/node_modules/node-sdl/src/nodesdl.h b/src/node/node_modules/node-sdl/src/nodesdl.h new file mode 100644 index 00000000..e2d5fb7d --- /dev/null +++ b/src/node/node_modules/node-sdl/src/nodesdl.h @@ -0,0 +1,93 @@ +#ifndef NODE_SDL_H_ +#define NODE_SDL_H_ + +#include +#include +#include +#include +#include + + +#include "helpers.h" + +using namespace v8; + +namespace sdl { + + static Handle Init(const Arguments& args); + static Handle InitSubSystem(const Arguments& args); + static Handle Quit(const Arguments& args); + static Handle QuitSubSystem(const Arguments& args); + static Handle WasInit(const Arguments& args); + static Handle ClearError(const Arguments& args); + static Handle GetError(const Arguments& args); + static Handle SetError(const Arguments& args); + static Handle WaitEvent(const Arguments& args); + static Handle PollEvent(const Arguments& args); + static Handle SetVideoMode(const Arguments& args); + static Handle VideoModeOK(const Arguments& args); + static Handle NumJoysticks(const Arguments& args); + static Handle JoystickOpen(const Arguments& args); + static Handle JoystickOpened(const Arguments& args); + static Handle JoystickName(const Arguments& args); + static Handle JoystickNumAxes(const Arguments& args); + static Handle JoystickNumButtons(const Arguments& args); + static Handle JoystickNumBalls(const Arguments& args); + static Handle JoystickNumHats(const Arguments& args); + static Handle JoystickClose(const Arguments& args); + static Handle JoystickUpdate(const Arguments& args); + static Handle JoystickEventState(const Arguments& args); + static Handle Flip(const Arguments& args); + static Handle PutImageData(const Arguments& args); + static Handle FillRect(const Arguments& args); + static Handle UpdateRect(const Arguments& args); + static Handle CreateRGBSurface(const Arguments& args); + static Handle BlitSurface(const Arguments& args); + static Handle FreeSurface(const Arguments& args); + static Handle SetColorKey(const Arguments& args); + static Handle DisplayFormat(const Arguments& args); + static Handle DisplayFormatAlpha(const Arguments& args); + static Handle SetAlpha(const Arguments& args); + static Handle MapRGB(const Arguments& args); + static Handle MapRGBA(const Arguments& args); + static Handle GetRGB(const Arguments& args); + static Handle GetRGBA(const Arguments& args); + static Handle SetClipRect(const Arguments& args); + + namespace TTF { + static Handle Init(const Arguments& args); + static Handle OpenFont(const Arguments& args); + static Handle RenderTextBlended(const Arguments& args); + static Handle RenderTextShaded(const Arguments& args); + } + + namespace IMG { + static Handle Load(const Arguments& args); + } + + namespace WM { + static Handle SetCaption(const Arguments& args); + static Handle SetIcon(const Arguments& args); + } + + namespace GL { + static Handle SetAttribute (const Arguments& args); + static Handle GetAttribute (const Arguments& args); + static Handle SwapBuffers (const Arguments& args); + } + + + + + + + typedef struct { + Persistent fn; + int status; + } closure_t; + //static void EIO_WaitEvent(eio_req *req); + //static int EIO_OnEvent(eio_req *req); + +} + +#endif diff --git a/src/node/screen_sdl.js b/src/node/screen_sdl.js new file mode 100644 index 00000000..8886fb9e --- /dev/null +++ b/src/node/screen_sdl.js @@ -0,0 +1,124 @@ +"use strict"; + +function NodeScreenSDL(sdl, font_file) +{ + var ROW_HEIGHT = 16, + + // about right for ascii.ttf + CHAR_WIDTH = 10, + + /** @type {number} */ + cursor_scanline_start, + + /** @type {number} */ + cursor_scanline_end, + + current_cursor_address, + + graphic_buffer, + graphic_buffer8, + graphic_buffer32; + + + sdl.init(sdl.INIT.VIDEO); + + var ttf = sdl.TTF, + screen; + + ttf.init(); + + var font = ttf.openFont(font_file, 16); + + sdl.events.on("QUIT", function() + { + process.exit(); + }); + + this.put_char = function(row, col, chr, bg_color, fg_color) + { + if((chr & 0xff) === 0) + { + // required, otherwise sdl throws up + return; + } + + var str = String.fromCharCode(chr & 0xff), + s = ttf.renderTextShaded(font, str, fg_color, bg_color); + + sdl.blitSurface(s, null, screen, [col * CHAR_WIDTH, row * ROW_HEIGHT]); + sdl.freeSurface(s); + }; + + this.put_pixel_linear = function(offset, color_part) + { + graphic_buffer8[offset] = color_part; + }; + + this.put_pixel = function(x, y, color) + { + throw "TODO"; + }; + + this.timer_text = function() + { + sdl.flip(screen); + }; + + this.timer_graphical = function() + { + sdl.putImageData(screen, graphic_buffer32); + sdl.flip(screen); + }; + + this.destroy = function() + { + + }; + + this.set_mode = function(graphical) + { + // switch between graphical and text mode + }; + + this.clear_screen = function() + { + + }; + + this.set_size_text = function(cols, rows) + { + screen = sdl.setVideoMode(CHAR_WIDTH * cols, ROW_HEIGHT * rows, 32, 0); + + //dbg_log(screen, LOG_VGA); + //dbg_log(screen.pixels, LOG_VGA); + }; + + this.set_size_graphical = function(width, height) + { + screen = sdl.setVideoMode(width, height, 32, 0); + + graphic_buffer = new ArrayBuffer(width * height * 4); + graphic_buffer8 = new Uint8Array(graphic_buffer); + graphic_buffer32 = new Int32Array(graphic_buffer); + }; + + this.update_cursor = function(cursor_row, cursor_col) + { + refresh_cursor(); + }; + + this.update_cursor_scanline = function(start, end) + { + cursor_scanline_start = start; + cursor_scanline_end = end; + + refresh_cursor(); + }; + + function refresh_cursor() + { + // TODO + } + +} + diff --git a/src/node/screen_tty.js b/src/node/screen_tty.js new file mode 100644 index 00000000..8b5bfa10 --- /dev/null +++ b/src/node/screen_tty.js @@ -0,0 +1,90 @@ +"use strict"; + +/* + * Very simple prototype, mostly incomplete + */ +function NodeScreenTTY() +{ + var stdout = process.stdout, + cursor_row = 0, + cursor_col = 0; + + clear(); + + function clear() + { + stdout.write("\x1b[2J"); + } + + function set_cursor_pos(row, col) + { + stdout.write("\x1b[" + row + ";" + col + "H"); + } + + function hide_cursor() + { + stdout.write("\x1b[?25l"); + } + + function show_cursor() + { + stdout.write("\x1b[?25h"); + } + + this.timer_text = function() + { + + }; + + this.destroy = function() + { + + }; + + this.set_mode = function(is_graphical) + { + if(is_graphical) + { + console.log("Graphical Mode is not supported for NodeScreenTTY"); + } + }; + + this.clear_screen = function() + { + + }; + + this.set_size_text = function(cols, rows) + { + + }; + + this.set_size_graphical = function(width, height) + { + + }; + + this.update_cursor = function(row, col) + { + cursor_row = row; + cursor_col = col; + }; + + this.update_cursor_scanline = function(start, end) + { + + }; + + this.put_char = function(row, col, chr, bg_color, fg_color) + { + var str = String.fromCharCode(chr); + + hide_cursor(); + set_cursor_pos(row, col + 1); + + stdout.write(str); + + set_cursor_pos(cursor_row, cursor_col + 2); + show_cursor(); + }; +} diff --git a/src/pci.js b/src/pci.js new file mode 100644 index 00000000..c9c96c76 --- /dev/null +++ b/src/pci.js @@ -0,0 +1,173 @@ +"use strict"; + +var +/** @const */ PCI_VENDOR_ID = 0x00 /* 16 bits */ +/** @const */ ,PCI_DEVICE_ID = 0x02 /* 16 bits */ +/** @const */ ,PCI_COMMAND = 0x04 /* 16 bits */ +/** @const */ ,PCI_BASE_ADDRESS_0 = 0x10 /* 32 bits */ +/** @const */ ,PCI_BASE_ADDRESS_1 = 0x14 /* 32 bits [htype 0,1 only] */ +/** @const */ ,PCI_BASE_ADDRESS_2 = 0x18 /* 32 bits [htype 0 only] */ +/** @const */ ,PCI_BASE_ADDRESS_3 = 0x1c /* 32 bits */ +/** @const */ ,PCI_BASE_ADDRESS_4 = 0x20 /* 32 bits */ +/** @const */ ,PCI_BASE_ADDRESS_5 = 0x24 /* 32 bits */ +/** @const */ ,PCI_INTERRUPT_LINE = 0x3c /* 8 bits */ +/** @const */ ,PCI_CLASS_REVISION = 0x08; /* High 24 bits are class, low 8 revision */ + +/** @constructor */ +function PCI(dev) +{ + var + io = dev.io, + pci_data = 0, + pci_counter = 0, + pci_response = -1, + pci_status = -1, + self = this; + + // TODO: Change the format of this + this.devices = {}; + + /* + io.register_write(0xCF9, function(value) + { + dbg_log("PCI reboot: " + h(value, 2), LOG_PCI); + + // PCI reboot + if(value & 6) + { + cpu_restart(); + } + });*/ + + io.register_read(0xCFC, function() + { + return pci_response & 0xFF; + }); + + io.register_read(0xCFD, function() + { + return pci_response >> 8 & 0xFF; + }); + io.register_read(0xCFE, function() + { + return pci_response >> 16 & 0xFF; + }); + io.register_read(0xCFF, function() + { + return pci_response >> 24 & 0xFF; + }); + + io.register_read(0xCF8, function() + { + return pci_status & 0xFF; + }); + io.register_read(0xCF9, function() + { + return pci_status >> 8 & 0xFF; + }); + io.register_read(0xCFA, function() + { + return pci_status >> 16 & 0xFF; + }); + io.register_read(0xCFB, function() + { + return pci_status >> 24 & 0xFF; + }); + + io.register_write(0xCF8, function(out_byte) + { + pci_data = pci_data & ~0xFF | out_byte; + }); + io.register_write(0xCF9, function(out_byte) + { + pci_data = pci_data & ~0xFF00 | out_byte << 8; + }); + io.register_write(0xCFA, function(out_byte) + { + pci_data = pci_data & ~0xFF0000 | out_byte << 16; + }); + io.register_write(0xCFB, function(out_byte) + { + pci_data = pci_data & 0xFFFFFF | out_byte << 24; + pci_query(pci_data); + }); + + function pci_query(dword) + { + var dbg_line = "PCI: "; + + // Bit | .31 .0 + // Fmt | EBBBBBBBBDDDDDFFFRRRRRR00 + + var bdf = (dword & 0x7FFFFFFF) >> 8, + addr = dword & 0xFC, + devfn = bdf & 0xFF, + bus = bdf >> 8, + dev = bdf >> 3 & 0x1F, + fn = bdf & 7, + enabled = dword >> 31 & 1; + + dbg_line += " enabled=" + (enabled); + dbg_line += " bdf=" + h(bdf); + dbg_line += " addr=" + h(addr); + + dbg_log(dbg_line + " " + h(dword >>> 0, 8), LOG_PCI); + + if(dword === (0x80000000 | 0)) + { + pci_status = 0x80000000; + } + else if(self.devices[bdf]) + { + var device = self.devices[bdf]; + + pci_status = 0x80000000; + + if(addr === PCI_VENDOR_ID) + { + pci_response = device.vendor_id; + } + else if(addr === PCI_CLASS_REVISION) + { + pci_response = device.class_revision; + } + else if(addr === PCI_BASE_ADDRESS_5) + { + pci_response = device.iobase; + } + else if(addr === PCI_INTERRUPT_LINE) + { + pci_response = device.irq; + } + else + { + dbg_log("unimplemented addr " + h(addr) + " for device " + h(bdf), LOG_PCI); + pci_response = 0; + } + } + else + { + pci_response = 0; + pci_status = 0; + } + } + + this.register_device = function(device, device_id) + { + dbg_assert(!this.devices[device_id]); + this.devices[device_id] = device; + }; + + // ~% lspci -x + // 00:00.0 Host bridge: Intel Corporation 4 Series Chipset DRAM Controller (rev 02) + // 00: 86 80 20 2e 06 00 90 20 02 00 00 06 00 00 00 00 + // 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 20: 00 00 00 00 00 00 00 00 00 00 00 00 43 10 d3 82 + // 30: 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00 + this.register_device({ + irq: 0, + iobase: 0, + vendor_id: 0x8680202e, + class_revision: 0x06009020, + }, 0); +} diff --git a/src/pic.js b/src/pic.js new file mode 100644 index 00000000..568b060d --- /dev/null +++ b/src/pic.js @@ -0,0 +1,280 @@ +"use strict"; + +/** + * Programmable Interrupt Controller + * http://stanislavs.org/helppc/8259.html + * + * @constructor + * @param {PIC=} master + */ +function PIC(dev, call_interrupt_vector, handle_irqs, master) +{ + var + io = dev.io, + + /** + * all irqs off + * @type {number} + */ + irq_mask = 0, + + /** + * @type {number} + * + * Bogus default value (both master and slave mapped to 0). + * Will be initialized by the BIOS + */ + irq_map = 0, + + /** + * in-service register + * Holds interrupts that are currently being serviced + * @type {number} + */ + isr = 0, + + /** + * interrupt request register + * Holds interrupts that have been requested + * @type {number} + */ + irr = 0, + + is_master = master === undefined, + + slave, + + me = this; + + if(is_master) + { + slave = new PIC(dev, call_interrupt_vector, handle_irqs, this); + + this.handle_irqs = function() + { + var enabled_irr = irr & irq_mask; + + if(!enabled_irr) + { + return false + } + + var irq = enabled_irr & -enabled_irr; + + if(isr && (isr & -isr) <= irq) + { + // wait for eoi of higher or same priority interrupt + return false; + } + + irr &= ~irq; + isr |= irq; + + if(irq === 4) + { + // this should always return true + return slave.handle_irqs(); + } + + call_interrupt_vector(irq_map + log2_table[irq], false, false); + + return true; + }; + } + else + { + // is slave + this.handle_irqs = function() + { + var enabled_irr = irr & irq_mask; + + if(!enabled_irr) + { + return false; + } + + var irq = enabled_irr & -enabled_irr; + + if(isr && (isr & -isr) <= irq) + { + // wait for eoi of higher or same priority interrupt + return false; + } + + irr &= ~irq; + isr |= irq; + + call_interrupt_vector(irq_map + log2_table[irq], false, false); + + if(irr) + { + // tell the master we have one more + master.push_irq(2); + } + + return true; + }; + } + + this.dump = function() + { + dbg_log("mask: " + h(irq_mask & 0xFF), LOG_PIC); + dbg_log("base: " + h(irq_map), LOG_PIC); + dbg_log("requested: " + h(irr), LOG_PIC); + dbg_log("serviced: " + h(isr), LOG_PIC); + + if(is_master) + { + slave.dump(); + } + }; + + + var expect_icw4, + state = 0, + read_irr = 1, + io_base, + auto_eoi; + + + if(is_master) + { + io_base = 0x20; + } + else + { + io_base = 0xA0; + } + + io.register_write(io_base, port20_write); + io.register_read(io_base, port20_read); + + io.register_write(io_base | 1, port21_write); + io.register_read(io_base | 1, port21_read); + + function port20_write(data_byte) + { + //dbg_log("20 write: " + h(data_byte), LOG_PIC); + if(data_byte & 0x10) // xxxx1xxx + { + // icw1 + dbg_log("icw1 = " + h(data_byte), LOG_PIC); + expect_icw4 = data_byte & 1; + state = 1; + } + else if(data_byte & 8) // xxx01xxx + { + // ocw3 + dbg_log("ocw3: " + h(data_byte), LOG_PIC); + read_irr = data_byte & 1; + } + else // xxx00xxx + { + // ocw2 + // end of interrupt + //dbg_log("ocw2: " + h(data_byte), LOG_PIC); + + var eoi_type = data_byte >> 5; + + if(eoi_type === 1) + { + // non-specific eoi + isr = 0; + } + else if(eoi_type === 3) + { + // specific eoi + isr &= ~(1 << (data_byte & 7)); + } + else + { + dbg_log("Unknown eoi: " + h(data_byte), LOG_PIC); + } + } + }; + + function port20_read() + { + if(read_irr) + { + return irr; + } + else + { + return isr; + } + } + + function port21_write(data_byte) + { + //dbg_log("21 write: " + h(data_byte), LOG_PIC); + if(state === 0) + { + if(expect_icw4) + { + // icw4 + expect_icw4 = false; + auto_eoi = data_byte & 2; + dbg_log("icw4: " + h(data_byte), LOG_PIC); + } + else + { + // ocw1 + irq_mask = ~data_byte; + //dbg_log("interrupt mask: " + (irq_mask & 0xFFFF).toString(2) + " / map " + h(irq_map), LOG_PIC); + } + } + else if(state === 1) + { + // icw2 + irq_map = data_byte; + dbg_log("interrupts are mapped to " + h(irq_map) + + " (" + (is_master ? "master" : "slave") + ")", LOG_PIC); + state++; + } + else if(state === 2) + { + // icw3 + state = 0; + dbg_log("icw3: " + h(data_byte), LOG_PIC); + } + }; + + function port21_read() + { + //dbg_log("21h read (" + h(irq_map) + ")", LOG_PIC); + return ~irq_mask; + }; + + if(is_master) + { + this.push_irq = function(irq_number) + { + dbg_assert(irq_number >= 0 && irq_number < 16); + + if(irq_number >= 8) + { + slave.push_irq(irq_number - 8); + irq_number = 2; + } + + irr |= 1 << irq_number; + + handle_irqs(); + }; + } + else + { + this.push_irq = function(irq_number) + { + dbg_assert(irq_number >= 0 && irq_number < 8); + + irr |= 1 << irq_number; + }; + } + + this.get_isr = function() + { + return isr; + }; +} diff --git a/src/pit.js b/src/pit.js new file mode 100644 index 00000000..4dc2d6d6 --- /dev/null +++ b/src/pit.js @@ -0,0 +1,303 @@ +"use strict"; + + +/** + * @constructor + * + * Programmable Interval Timer + */ +function PIT(dev) +{ + var + io = dev.io, + pic = dev.pic, + + next_tick = Date.now(), + + me = this, + + /** + * @const + * In kHz + */ + OSCILLATOR_FREQ = 1193.1816666, // 1.193182 MHz + + + counter_next_low = new Uint8Array(3), + counter_enabled = new Uint8Array(3), + counter_mode = new Uint8Array(3), + counter_read_mode = new Uint8Array(3), + + // 2 = latch low, 1 = latch high, 0 = no latch + counter_latch = new Uint8Array(3), + counter_latch_value = new Uint16Array(3), + + counter_reload = new Uint16Array(3), + counter_current = new Uint16Array(3), + + // only counter2 output can be read + counter2_out = 0; + + + // TODO: + // - counter2 can be controlled by an input + + + this.get_timer2 = function() + { + //dbg_log("timer2 read", LOG_PIT); + return counter2_out; + }; + + var parity = 0; + + io.register_read(0x61, function() + { + // > xxx1 xxxx 0=RAM parity error enable + // > PS/2: Read: This bit tiggles for each refresh request. + // + // tiggles?? + + parity ^= 0x10; + return parity | counter2_out << 5; + }); + + + this.timer = function(time) + { + var current, + mode, + steps = (time - next_tick) * OSCILLATOR_FREQ >>> 0; + + if(!steps) + { + return; + } + dbg_assert(steps >= 0); + + next_tick += steps / OSCILLATOR_FREQ; + + // counter 0 produces interrupts + if(counter_enabled[0]) + { + current = counter_current[0] -= steps; + + if(current <= 0) + { + pic.push_irq(0); + mode = counter_mode[0]; + + if(mode === 0) + { + counter_enabled[0] = 0; + counter_current[0] = 0; + } + else if(mode === 3 || mode === 2) + { + counter_current[0] = counter_reload[0] + current % counter_reload[0]; + } + } + } + + // counter 2 has an output bit + if(counter_enabled[2]) + { + current = counter_current[2] -= steps; + + if(current <= 0) + { + mode = counter_mode[2]; + + if(mode === 0) + { + counter2_out = 1; + counter_enabled[2] = 0; + counter_current[2] = 0; + } + else if(mode === 2) + { + counter2_out = 1; + counter_current[2] = counter_reload[2] + current % counter_reload[2]; + } + else if(mode === 3) + { + counter2_out ^= 1; + counter_current[2] = counter_reload[2] + current % counter_reload[2]; + } + } + // cannot really happen, because the counter gets changed by big numbers + //else if(current === 1) + //{ + // if(counter_mode[2] === 2) + // { + // counter2_out = 0; + // } + //} + } + } + + io.register_read(0x40, function() { return counter_read(0); }); + io.register_read(0x41, function() { return counter_read(1); }); + io.register_read(0x42, function() { return counter_read(2); }); + + function counter_read(i) + { + var latch = counter_latch[i]; + + if(latch) + { + counter_latch[i]--; + + if(latch === 2) + { + return counter_latch_value[i] & 0xFF; + } + else + { + return counter_latch_value[i] >> 8; + } + } + else + { + var next_low = counter_next_low[i]; + + if(counter_mode[i] === 3) + { + counter_next_low[i] ^= 1; + } + + if(next_low) + { + return counter_current[i] & 0xFF; + } + else + { + return counter_current[i] >> 8; + } + } + } + + io.register_write(0x40, function(value) { counter_write(0, value); }); + io.register_write(0x41, function(value) { counter_write(1, value); }); + io.register_write(0x42, function(value) { counter_write(2, value); }); + + function counter_write(i, value) + { + if(counter_next_low[i]) + { + counter_reload[i] = counter_reload[i] & ~0xFF | value; + } + else + { + counter_reload[i] = counter_reload[i] & 0xFF | value << 8; + } + + if(counter_read_mode[i] !== 3 || !counter_next_low[i]) + { + if(!counter_reload[i]) + { + counter_reload[i] = 0xFFFF; + } + + // depends on the mode, should actually + // happen on the first tick + counter_current[i] = counter_reload[i]; + + counter_enabled[i] = true; + + dbg_log("counter" + i + " reload=" + h(counter_reload[i]) + + " tick=" + (counter_reload[i] || 0x10000) / OSCILLATOR_FREQ + "ms", LOG_PIT); + } + + if(counter_read_mode[i] === 3) + { + counter_next_low[i] ^= 1; + } + } + + io.register_write(0x43, port43_write); + + function port43_write(reg_byte) + { + var mode = reg_byte >> 1 & 7, + binary_mode = reg_byte & 1, + i = reg_byte >> 6 & 3, + read_mode = reg_byte >> 4 & 3, + next_low; + + if(i === 1) + { + dbg_log("Unimplemented timer1", LOG_PIT); + } + + if(i === 3) + { + dbg_log("Unimplemented read back", LOG_PIT); + return; + } + + if(read_mode === 0) + { + // latch + counter_latch[i] = 2; + counter_latch_value[i] = counter_current[i]; + + return; + } + + if(mode >= 6) + { + // 6 and 7 are aliased to 2 and 3 + mode &= ~4; + } + + dbg_log("Control: mode=" + mode + " ctr=" + i + + " read_mode=" + read_mode + " bcd=" + binary_mode, LOG_PIT); + + if(read_mode === 1) + { + // lsb + counter_next_low[i] = 1; + } + else if(read_mode === 2) + { + // msb + counter_next_low[i] = 0; + } + else + { + // first lsb then msb + counter_next_low[i] = 1; + } + + + if(mode === 0) + { + } + else if(mode === 3 || mode === 2) + { + // what is the difference + } + else + { + dbg_log("Unimplemented counter mode: " + h(mode), LOG_PIT); + } + + counter_mode[i] = mode; + counter_read_mode[i] = read_mode; + + if(i === 2) + { + if(mode === 0) + { + counter2_out = 0; + } + else + { + // correct for mode 2 and 3 + counter2_out = 1; + } + } + }; +} + diff --git a/src/ps2.js b/src/ps2.js new file mode 100644 index 00000000..da1a8250 --- /dev/null +++ b/src/ps2.js @@ -0,0 +1,432 @@ +"use strict"; + +/** + * @constructor + */ +function PS2(dev, keyboard, mouse) +{ + var + io = dev.io, + pic = dev.pic, + + me = this, + + /** @type {boolean} */ + enable_mouse_stream = false, + /** @type {boolean} */ + enable_mouse = false, + + /** @type {boolean} */ + have_mouse = false, + + /** @type {number} */ + mouse_delta_x = 0, + /** @type {number} */ + mouse_delta_y = 0, + /** @type {number} */ + mouse_clicks = 0, + + /** @type {boolean} */ + have_keyboard = false, + + /** @type {boolean} */ + next_is_mouse_command = false, + + /** @type {boolean} */ + next_read_sample = false, + + /** @type {boolean} */ + next_read_led = false, + + /** + * @type {Array.} + */ + kbd_buffer = [], + + /** @type {number} */ + sample_rate = 100, + + /** @type {number} */ + last_mouse_packet = -1, + + /** + * @type {Array.} + */ + mouse_buffer = []; + + + if(keyboard) + { + have_keyboard = true; + keyboard.init(kbd_send_code); + } + + if(mouse) + { + have_mouse = true; + mouse.init(mouse_send_click, mouse_send_delta); + + // TODO: Mouse Wheel + // http://www.computer-engineering.org/ps2mouse/ + } + + + function mouse_irq() + { + pic.push_irq(12); + } + + function kbd_irq() + { + pic.push_irq(1); + } + + + function kbd_send_code(code) + { + //console.log(h(code)); + kbd_buffer.push(code); + kbd_irq(); + } + this.kbd_send_code = kbd_send_code; + + function mouse_send_delta(delta_x, delta_y) + { + if(have_mouse && enable_mouse) + { + mouse_delta_x += delta_x; + mouse_delta_y += delta_y; + + if(enable_mouse_stream) + { + var now = Date.now(); + + if(now - last_mouse_packet < 1000 / sample_rate) + { + // TODO: set timeout + return; + } + + last_mouse_packet = now; + + send_mouse_packet(); + } + } + } + + function mouse_send_click(left, middle, right) + { + if(have_mouse && enable_mouse) + { + mouse_clicks = left | right << 1 | middle << 2; + + if(enable_mouse_stream) + { + send_mouse_packet(); + } + } + } + + function send_mouse_packet() + { + var info_byte = + (mouse_delta_y < 0) << 5 | + (mouse_delta_x < 0) << 4 | + 1 << 3 | + mouse_clicks; + + mouse_buffer.push( + info_byte, + mouse_delta_x & 0xFF, + mouse_delta_y & 0xFF + ); + + if(mouse_buffer.length > 15) + { + var off = mouse_buffer.length % 3; + mouse_buffer = mouse_buffer.slice(0, off).concat(mouse_buffer.slice(off + 3)); + } + + mouse_delta_x = 0; + mouse_delta_y = 0; + + mouse_irq(); + } + + this.destroy = function() + { + if(have_keyboard) + { + keyboard.destroy(); + } + + if(have_mouse) + { + mouse.destroy(); + } + }; + + + var command_register = 0, + read_output_register = false, + read_command_register = false; + + + io.register_read(0x60, port60_read); + io.register_read(0x64, port64_read); + + io.register_write(0x60, port60_write); + io.register_write(0x64, port64_write); + + function port60_read() + { + //log("port 60 read: " + (buffer[0] || "(none)")); + + if(!kbd_buffer.length && !mouse_buffer.length) + { + // should not happen + dbg_log("Port 60 read: Empty", LOG_PS2); + return 0xFF; + } + + var do_mouse_buffer; + + if(kbd_buffer.length && mouse_buffer.length) + { + // tough decision, let's ask the PIC + do_mouse_buffer = (pic.get_isr() & 2) === 0; + } + else if(kbd_buffer.length) + { + do_mouse_buffer = false; + } + else + { + do_mouse_buffer = true; + } + + + if(do_mouse_buffer) + { + dbg_log("Port 60 read (mouse): " + h(mouse_buffer[0]), LOG_PS2); + + if(mouse_buffer.length > 1) + { + mouse_irq(); + } + + return mouse_buffer.shift(); + } + else + { + dbg_log("Port 60 read (kbd) : " + h(kbd_buffer[0]), LOG_PS2); + + if(kbd_buffer.length > 1) + { + kbd_irq(); + } + + return kbd_buffer.shift(); + } + }; + + function port64_read() + { + // status port + //dbg_log("port 64 read", LOG_PS2); + + var status_byte = 0x10; + + if(mouse_buffer.length || kbd_buffer.length) + { + status_byte |= 1; + } + if(mouse_buffer.length) + { + status_byte |= 0x20; + } + + return status_byte; + }; + + function port60_write(write_byte) + { + if(read_command_register) + { + command_register = write_byte; + read_command_register = false; + + dbg_log("Keyboard command register = " + h(command_register), LOG_PS2); + } + else if(read_output_register) + { + read_output_register = false; + mouse_buffer = [write_byte]; + mouse_irq(); + } + else if(next_read_sample) + { + next_read_sample = false; + mouse_buffer = [0xFA]; + + sample_rate = write_byte; + mouse_irq(); + } + else if(next_read_led) + { + // nope + next_read_led = false; + } + else if(next_is_mouse_command) + { + dbg_log("Port 60 data register write: " + h(write_byte), LOG_PS2); + + if(!have_mouse) + { + return; + } + + // send ack + mouse_buffer = [0xFA]; + + if(write_byte === 0xFF) + { + // reset, send completion code + mouse_buffer.push(0xAA, 0x00); + + enable_mouse = true; + mouse.enabled = true; + } + else if(write_byte === 0xF2) + { + // MouseID Byte + mouse_buffer.push(0, 0); + } + else if(write_byte === 0xF3) + { + // sample rate + next_read_sample = true; + } + else if(write_byte === 0xF4) + { + // enable streaming + + enable_mouse_stream = true; + enable_mouse = true; + + mouse.enabled = true; + } + else if(write_byte === 0xF5) + { + // disable streaming + enable_mouse_stream = true; + } + else if(write_byte === 0xF6) + { + // reset defaults + enable_mouse_stream = false; + sample_rate = 100; + + // ... resolution, scaling + } + else if(write_byte === 0xEB) + { + // request single packet + dbg_log("unimplemented request single packet"); + } + else + { + dbg_log("new mouse command: " + h(write_byte), LOG_PS2); + } + + mouse_irq(); + } + else + { + dbg_log("Port 60 data register write: " + h(write_byte), LOG_PS2); + + // send ack + kbd_buffer.push(0xFA); + + if(write_byte === 0xFF) + { + kbd_buffer.push(0xAA, 0x00); + } + else if(write_byte === 0xF2) + { + // identify + kbd_buffer.push(0xAB, 83); + } + else if(write_byte === 0xF4) + { + // enable scanning + } + else if(write_byte === 0xF5) + { + // disable scanning + } + else if(write_byte === 0xED) + { + next_read_led = true; + } + + kbd_irq(); + } + }; + + function port64_write(write_byte) + { + dbg_log("port 64 write: " + h(write_byte), LOG_PS2); + + if(write_byte === 0xFE) + { + dbg_log("CPU reboot via PS2"); + dev.reboot(); + } + else if(write_byte === 0x20) + { + kbd_buffer.push(command_register); + kbd_irq(); + } + else if(write_byte === 0x60) + { + read_command_register = true; + } + else if(write_byte === 0xD3) + { + read_output_register = true; + } + else if(write_byte === 0xD4) + { + next_is_mouse_command = true; + } + else if(write_byte === 0xA9) + { + // test second ps/2 port + kbd_buffer = [0]; + kbd_irq(); + } + else if(write_byte === 0xAA) + { + kbd_buffer = [0x55]; + kbd_irq(); + } + else if(write_byte === 0xAB) + { + kbd_buffer = [0]; + kbd_irq(); + } + /*else if(write_byte === 0xAE) + { + // not sure if right ... + kbd_buffer =[]; + }*/ + else + { + dbg_log("port 64: New command byte: " + h(write_byte), LOG_PS2); + } + }; +} + + + diff --git a/src/rtc.js b/src/rtc.js new file mode 100644 index 00000000..0d1a7683 --- /dev/null +++ b/src/rtc.js @@ -0,0 +1,188 @@ +/** + * RTC (real time clock) and CMOS + * @constructor + */ +function RTC(dev, diskette_type) +{ + var + io = dev.io, + pic = dev.pic, + + cmos_index = 0, + me = this, + + // used for cmos entries + rtc_time = Date.now(), + last_update = rtc_time, + + // used for periodic interrupt + next_interrupt, + + periodic_interrupt = false, + + // corresponds to default value for cmos_a + periodic_interrupt_time = 1000 / 1024; + + + var cmos_a = 0x26, + cmos_b = 2; + + this.nmi_disabled = 0; + + this.timer = function(time) + { + if(periodic_interrupt) + { + while(next_interrupt < time) + { + next_interrupt += periodic_interrupt_time; + + pic.push_irq(8); + } + } + + rtc_time += time - last_update; + last_update = time; + }; + + io.register_write(0x70, function(out_byte) + { + cmos_index = out_byte & 0x7F; + me.nmi_disabled = out_byte >> 7; + }); + + io.register_write(0x71, cmos_write); + io.register_read(0x71, cmos_read); + + function encode_time(t) + { + if(cmos_b & 4) + { + // binary mode + return t; + } + else + { + return Math.bcd_pack(t); + } + } + + + // TODO + // - interrupt on update + // - countdown + // - letting bios/os set values + // (none of these are used by seabios or the OSes we're + // currently testing) + function cmos_read() + { + var index = cmos_index; + + cmos_index = 0xD; + + switch(index) + { + case 0: + return encode_time(new Date(rtc_time).getUTCSeconds()); + case 2: + return encode_time(new Date(rtc_time).getUTCMinutes()); + case 4: + // TODO: 12 hour mode + return encode_time(new Date(rtc_time).getUTCHours()); + case 7: + return encode_time(new Date(rtc_time).getUTCDate()); + case 8: + return encode_time(new Date(rtc_time).getUTCMonth() + 1); + case 9: + return encode_time(new Date(rtc_time).getUTCFullYear() % 100); + + case 0xA: + return cmos_a; + case 0xB: + //dbg_log("cmos read from index " + h(index)); + return cmos_b; + + case 0xE: + // post info + return 0; + case 0xC: + //dbg_log("cmos read from index " + h(index)); + // TODO: + // It is important to know that upon a IRQ 8, Status Register C + // will contain a bitmask telling which interrupt happened. + // What is important is that if register C is not read after an + // IRQ 8, then the interrupt will not happen again. + + //dbg_log("cmos Ch read"); + return 0; + // Missing IRQF flag + //return cmos_b & 0x70; + + case 0xF: + return 0; + + case 0x10: + // floppy type + return diskette_type; + + case 0x14: + // equipment + return 0x2D; + + case 0x32: + return encode_time(new Date(rtc_time).getUTCFullYear() / 100 | 0); + + case 0x34: + return (memory_size - 16 * 1024 * 1024) >> 16 & 0xff; + case 0x35: + return (memory_size - 16 * 1024 * 1024) >> 24 & 0xff; + + case 0x38: + // used by seabios to determine the boot order + // bootflag 1, high nibble, lowest priority + return 0x30; // hd + case 0x3D: + // bootflag 2, both nibbles, high and middle priority + return 0x21; // floppy first, cd second + + case 0x5B: + case 0x5C: + case 0x5D: + // memory above 4GB + return 0; + } + + dbg_log("cmos read from index " + h(index), LOG_RTC); + + return 0xFF; + } + + function cmos_write(data_byte) + { + switch(cmos_index) + { + case 0xA: + cmos_a = data_byte & 0x7F; + periodic_interrupt_time = 1000 / (32768 >> (cmos_a & 0xF) - 1); + + dbg_log("Periodic interrupt, a=" + h(cmos_a, 2) + " t=" + periodic_interrupt_time , LOG_RTC); + break; + case 0xB: + cmos_b = data_byte; + if(cmos_b & 0x40) + { + next_interrupt = Date.now(); + } + + if(cmos_b & 0x20) dbg_log("Unimplemented: alarm interrupt"); + if(cmos_b & 0x10) dbg_log("Unimplemented: updated interrupt"); + + dbg_log("cmos b=" + h(cmos_b, 2), LOG_RTC); + break; + default: + dbg_log("cmos write index " + h(cmos_index) + ": " + h(data_byte), LOG_RTC); + } + + periodic_interrupt = (cmos_b & 0x40) === 0x40 && (cmos_a & 0xF) > 0; + } +} diff --git a/src/string.macro.js b/src/string.macro.js new file mode 100644 index 00000000..aecdb92a --- /dev/null +++ b/src/string.macro.js @@ -0,0 +1,281 @@ +"use strict"; + +/* + * string operations + * + * cmp si di + * movs 0 1 1 A4 + * cmps 1 1 1 A6 + * stos 0 0 1 AA + * lods 0 1 0 AC + * scas 1 0 1 AE + * ins 0 0 1 + * outs 0 1 0 + */ + +#define string_instruction(s, use_cmp, use_di, use_si, fn, aligned_fn)\ + var src, dest, data_src, data_dest;\ + var size = flags & flag_direction ? -(s >> 3) : s >> 3;\ + var ds, es;\ + if(use_cmp && !use_si) data_src = reg ## s[reg_eax];\ + if(use_di) es = get_seg(reg_es), dest = es + regv[reg_vdi];\ + if(use_si) ds = get_seg_prefix(reg_ds), src = ds + regv[reg_vsi];\ + if(repeat_string_prefix) {\ + if(regv[reg_vcx] === 0) return;\ + var aligned = s > 8 && (!use_di || (dest & (s >> 3) - 1) === 0) && (!use_si || (src & (s >> 3) - 1) === 0);\ + do {\ + if(aligned) {\ + aligned_fn;\ + } else {\ + fn;\ + }\ + if(use_di) dest += size, regv[reg_vdi] += size;\ + if(use_si) src += size, regv[reg_vsi] += size;\ + } while(--regv[reg_vcx] && (!use_cmp || (data_src === data_dest) === repeat_string_type));\ + } else {\ + fn;\ + if(use_di) regv[reg_vdi] += size;\ + if(use_si) regv[reg_vsi] += size;\ + }\ + if(use_cmp) cmp ## s(data_src, data_dest);\ + + +function movsb() +{ + string_instruction(8, false, true, true, + { + safe_write8(dest, safe_read8(src)); + }, {}); +} + +function movsw() +{ + string_instruction(16, false, true, true, + { + safe_write16(dest, safe_read16(src)); + }, { + var phys_src = translate_address_read(src); + var phys_dest = translate_address_write(dest); + + memory.write_aligned16(phys_dest, memory.read_aligned16(phys_src)); + }); +} + +function movsd() +{ + string_instruction(32, false, true, true, + { + safe_write32(dest, safe_read32s(src)); + }, { + var phys_src = translate_address_read(src); + var phys_dest = translate_address_write(dest); + + memory.write_aligned32(phys_dest, memory.read_aligned32(phys_src)); + }); +} + +function cmpsb() +{ + string_instruction(8, true, true, true, + { + data_dest = safe_read8(dest); + data_src = safe_read8(src); + }, {}); +} + + +function cmpsw() +{ + string_instruction(16, true, true, true, + { + data_dest = safe_read16(dest); + data_src = safe_read16(src); + }, { + data_dest = memory.read_aligned16(translate_address_read(dest)); + data_src = memory.read_aligned16(translate_address_read(src)); + }); +} + +function cmpsd() +{ + string_instruction(32, true, true, true, + { + data_dest = safe_read32(dest); + data_src = safe_read32(src); + }, { + data_dest = memory.read_aligned32(translate_address_read(dest)) >>> 0; + data_src = memory.read_aligned32(translate_address_read(src)) >>> 0; + }); +} + + +function stosb() +{ + var data = reg8[reg_al]; + + string_instruction(8, false, true, false, + { + safe_write8(dest, data); + }, {}); +} + + +function stosw() +{ + var data = reg16[reg_ax]; + + string_instruction(16, false, true, false, + { + safe_write16(dest, data); + }, { + memory.write_aligned16(translate_address_write(dest), data); + }); +} + + +function stosd() +{ + //dbg_log("stosd " + ((reg32[reg_edi] & 3) ? "mis" : "") + "aligned", LOG_CPU); + var data = reg32[reg_eax]; + + string_instruction(32, false, true, false, + { + safe_write32(dest, data); + }, { + memory.write_aligned32(translate_address_write(dest), data); + }); +} + + +function lodsb() +{ + string_instruction(8, false, false, true, + { + reg8[reg_al] = safe_read8(src); + }, {}); +} + + +function lodsw() +{ + string_instruction(16, false, false, true, + { + reg16[reg_ax] = safe_read16(src); + }, { + reg16[reg_ax] = safe_read16(src); + }); +} + + +function lodsd() +{ + string_instruction(32, false, false, true, + { + reg32[reg_eax] = safe_read32s(src); + }, { + reg32[reg_eax] = safe_read32s(src); + }); +} + + +function scasb() +{ + string_instruction(8, true, true, false, + { + data_dest = safe_read8(dest); + }, {}); +} + + +function scasw() +{ + string_instruction(16, true, true, false, + { + data_dest = safe_read16(dest); + }, { + data_dest = memory.read_aligned16(translate_address_read(dest)); + }); +} + +function scasd() +{ + string_instruction(32, true, true, false, + { + data_dest = safe_read32(dest); + }, { + data_dest = memory.read_aligned32(translate_address_read(dest)) >>> 0; + }); +} + +function insb() +{ + var port = reg16[reg_dx]; + + string_instruction(8, false, true, false, + { + safe_write8(dest, in8(port)); + }, { + }); +} + +function insw() +{ + var port = reg16[reg_dx]; + + string_instruction(8, false, true, false, + { + safe_write16(dest, in16(port)); + }, { + var phys_dest = translate_address_write(dest); + memory.write_aligned16(phys_dest, in16(port)); + }); +} + +function insd() +{ + var port = reg16[reg_dx]; + + string_instruction(32, false, true, false, + { + safe_write32(dest, in32(port)); + }, { + var phys_dest = translate_address_write(dest); + memory.write_aligned32(phys_dest, in32(port)); + }); +} + +function outsb() +{ + var port = reg16[reg_dx]; + + string_instruction(8, false, false, true, + { + out8(port, safe_read8(src)); + }, { + out8(port, safe_read8(src)); + }); +} + +function outsw() +{ + var port = reg16[reg_dx]; + + string_instruction(16, false, false, true, + { + out16(port, safe_read16(src)); + }, { + out16(port, safe_read16(src)); + }); +} + +function outsd() +{ + var port = reg16[reg_dx]; + + string_instruction(32, false, false, true, + { + out32(port, safe_read32s(src)); + }, { + out32(port, safe_read32s(src)); + }); +} diff --git a/src/uart.js b/src/uart.js new file mode 100644 index 00000000..8464f959 --- /dev/null +++ b/src/uart.js @@ -0,0 +1,26 @@ +/** + * No full implementation, just dumping serial output + * to console + * + * @constructor + */ +function UART(dev) +{ + var + io = dev.io, + line = ""; + + io.register_write(0x3F8, function(out_byte) + { + if(out_byte === 0x0A) + { + log(line); + dbg_log(line, LOG_SERIAL); + line = ""; + } + else + { + line += String.fromCharCode(out_byte); + } + }); +} diff --git a/src/v86_all.js.map b/src/v86_all.js.map new file mode 100644 index 00000000..6b069c2f --- /dev/null +++ b/src/v86_all.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"../v86_all.js", +"lineCount":246, +"mappings":"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", +"sources":["browser/main.js","io.js","cpu.js","const.js","main.js","disk.js","pci.js","floppy.js","memory.js","dma.js","pit.js","vga.js","ps2.js","pic.js","rtc.js","uart.js","browser/screen.js","browser/keyboard.js","browser/mouse.js"], +"names":["next_tick","set_tick","tick_handler","e","origin","host","fn","location","protocol","hostname","f","window","removeEventListener","addEventListener","postMessage","log","data","log_element","document","getElementById","textContent","scrollTop","load_file","filename","done","progress","http","XMLHttpRequest","open","responseType","onload","http.onload","response","onprogress","http.onprogress","send","lock_mouse","elem","call","show_progress","el","$","style","display","lengthComputable","per50","loaded","total","String","chr_repeat","id","init","settings","cpu","v86","screen_adapter","ScreenAdapter","parentNode","removeChild","getElementsByClassName","running","onclick","running_time","Date","now","last_tick","value","stop","run","blur","time","ips","last_instr_counter","setInterval","update_info","instr_counter","restart","buffer","dev","fdc","get_buffer","b","blob","Blob","a","createElement","name","href","URL","createObjectURL","a.onclick","dataset","join","body","appendChild","ps2","kbd_send_code","onchange","n","parseFloat","set_scale","focus","keyboard_adapter","KeyboardAdapter","mouse_adapter","MouseAdapter","window.onload","load_local","me","type","files","length","reader","FileReader","reader.onload","SyncBuffer","target","result","floppy_disk","hda_disk","cdrom_disk","readAsArrayBuffer","img","bios","vga_bios","readyState","IO","empty_port_read","empty_port_write","a20_byte","read_callbacks","write_callbacks","i","register_read","this.register_read","port_addr","callback","register_write","this.register_write","out_byte","port_write","this.port_write","port_read","this.port_read","cpu_run","stopped","do_run","repeat_string_prefix","page_fault","segment_prefix","address_size_32","is_32","update_address_size","operand_size_32","update_operand_size","cpu_reboot_internal","destroy","vga","cpu_init","current_settings","memory","Memory","segment_is_null","Uint8Array","segment_limits","Uint32Array","segment_infos","segment_offsets","Int32Array","tlb_user_read","tlb_user_write","tlb_system_read","tlb_system_write","tlb_info","tlb_info_global","reg32","reg32s","reg16","Uint16Array","reg16s","Int16Array","reg8","reg8s","Int8Array","sreg","protected_mode","tsr_offset","tsr_size","ldtr_offset","ldtr_size","gdtr_offset","gdtr_size","idtr_offset","idtr_size","cpl","cr4","cr3","cr2","cr0","paging","page_size_extensions","stack_size_32","paging_changed","stack_reg","reg_vsp","reg_sp","reg_vbp","reg_bp","previous_ip","cpu_timestamp_counter","in_hlt","loop_counter","translate_address_write","translate_address_read","translate_address_disabled","last_result","flags","flags_default","last_op_size","last_op2","last_op1","flags_changed","start","byteLength","mem8","instruction_pointer","switch_seg","reg_ss","linux","write_blob","vmlinux","linuxstart","root","reg_ebx","write_string","cmdline","reg_eax","memory_size","reg_ecx","reg_cs","reg_ds","reg_es","reg_gs","reg_fs","regv","reg_esp","reg_ebp","load_devices","devapi","io","pic","PIC","call_interrupt_vector","handle_irqs","pci","PCI","dma","DMA","VGAScreen","PS2","fpu","FPU","UART","FloppyController","cdrom","CDRom","hda","HDD","hdb_disk","hdb","timer","PIT","rtc","RTC","j","k","LOOP_COUNTER","opcode","read_imm8","table","TIME_PER_FRAME","cr0_changed","new_paging","is_fpu","pe_functions","npe_functions","read_imm8s","read_imm16","read_imm32s","safe_read8","safe_read8s","safe_read16","safe_read32s","get_esp_read","get_esp_write","cpl_changed","last_virt_eip","translate_address_user_write","translate_address_user_read","translate_address_system_write","translate_address_system_read","virt_boundary_read16","low","high","read8","virt_boundary_read32s","virt_boundary_write16","write8","virt_boundary_write32","safe_write8","addr","safe_write16","phys_low","write16","safe_write32","write32","read_moffs","get_seg_prefix","load_flags","getcf","getpf","getaf","getzf","getsf","getof","get_esp_npe","mod","get_real_ip","interrupt_nr","is_software_int","error_code","unimpl","base","read16","selector","dpl","trigger_gp","is_trap","info","lookup_segment_selector","is_null","is_executable","is_present","flag_vm","dc_bit","tss_stack_addr","new_esp","read32s","new_ss","ss_info","rpl","rw_bit","old_esp","old_ss","push32","push16","raise_exception","trigger_de","trigger_ud","code","seg_prefix","seg","default_segment","arpl","r16","flag_zero","flag_interrupt","out8","privileges_for_io","out16","out_word","out32","out_dword","in8","in16","in32","update_flags","new_flags","flag_iopl","table32","table0F","table0F_32","table16","table0F_16","modrm_resolve","modrm_resolve32","reg_vcx","reg_vsi","reg_esi","reg_vdi","reg_edi","modrm_resolve16","reg_cx","reg_si","reg_di","is_gdt","selector_offset","table_limit","table_offset","is_valid","access","limit","is_system","size","granularity","real_limit","gr_bit","is_writable","is_readable","reg","clear_tlb","set","TLB_USER_WRITE","do_page_translation","TLB_USER_READ","TLB_SYSTEM_WRITE","TLB_SYSTEM_READ","for_writing","user","page","page_dir_addr","page_dir_entry","mem32s","can_write","cachable","allow_user","trigger_pagefault","global","page_table_addr","page_table_entry","cache_entry","write","present","multiply_low","n1","n2","low1","low2","add8","dest_operand","source_operand","OPSIZE_8","flags_all","add16","OPSIZE_16","add32","OPSIZE_32","adc8","adc16","adc32","cmp8","cmp16","cmp32","sub8","sub16","sub32","sbb8","sbb16","sbb32","inc8","inc16","inc32","dec8","dec16","dec32","neg8","neg16","neg32","imul_reg16","operand1","operand2","imul_reg32","xadd8","tmp","xadd16","xadd32","and8","and16","and32","test8","test16","test32","or8","or16","or32","xor8","xor16","xor32","rol8","count","flag_overflow","rol16","rol32","rcl8","rcl16","rcl32","ror8","ror16","ror32","rcr8","rcr16","rcr32","shl8","shl16","shl32","shr8","shr16","shr32","sar8","sar16","sar32","shrd16","shrd32","shld16","shld32","bt_reg","bit_base","bit_offset","btc_reg","bts_reg","btr_reg","bt_mem","virt_addr","btc_mem","phys_addr","btr_mem","bts_mem","jmp_rel16","rel16","current_cs","jmpcc16","condition","jmpcc32","imm32s","test_be","test_l","test_le","flag_parity","flag_adjust","flag_sign","imm16","sp","imm32","pop16","pop32s","xchg8","memory_data","modrm_byte","xchg16","xchg16r","operand","temp","reg_ax","xchg32","xchg32r","lss16","new_reg","new_seg","lss32","bswap","fcom","y","x","get_st0","status_word","C0","C3","fcomi","st","stack_ptr","finit","control_word","fpu_opcode","fpu_dp","fpu_ip","stack_empty","fstenv","tag_word","isNaN","Infinity","fpu_ip_selector","fpu_dp_selector","fldenv","sw","integer_round","rc","rounded","Math","round","floor","ceil","truncate","push","C1","EX_SF","EX_I","NaN","pop","get_sti","load_m80","exponent","sign","float64_byte","float64_int","float64","mantissa","pow","store_m80","load_m64","store_m64","load_m32","float32_int","float32","Float64Array","st8","Float32Array","constants","LN2","LOG2E","PI","LN10","op_D8_reg","this.op_D8_reg","imm8","sti","st0","op_D8_mem","this.op_D8_mem","m32","op_D9_reg","this.op_D9_reg","abs","C2","tan","atan2","sqrt","sin","cos","op_D9_mem","this.op_D9_mem","word","op_DA_reg","this.op_DA_reg","test_b","test_z","test_p","op_DA_mem","this.op_DA_mem","op_DB_reg","this.op_DB_reg","op_DB_mem","this.op_DB_mem","int32","op_DC_reg","this.op_DC_reg","low_ptr","op_DC_mem","this.op_DC_mem","m64","op_DD_reg","this.op_DD_reg","op_DD_mem","this.op_DD_mem","op_DE_reg","this.op_DE_reg","op_DE_mem","this.op_DE_mem","m16","op_DF_reg","this.op_DF_reg","op_DF_mem","this.op_DF_mem","this.run","cpu_stop","cpu_restart","was_running","setTimeout","eip_phys","repeat_string_type","__no_inline","cycle","cpu.cycle","mem8s","data16","data32","read8s","get_esp_pe_read","get_esp_pe_write","do_safe_read8","do_safe_read8s","do_safe_read16","do_safe_read32s","modrm_table16","Array","modrm_table32","sib_table","reg_bx","reg_edx","mod37_bit_position","test_o","test_s","phys_addr_high","reg_al","old_al","old_cf","old_af","reg_ah","reg_dx","port","dest","flag_direction","es","aligned","phys_dest","write_aligned32","src","ds","reg_noseg","new_ip","new_cs","flags_mask","phys_src","write_aligned16","read_aligned16","read_aligned32","data_src","data_dest","reg_cl","reg_dl","reg_bl","reg_ch","reg_dh","reg_bh","nesting_level","frame_temp","ip","temp_esp","temp_ss","shift","imm8s","imm16s","target_operand","high_result","low_result","dest_operand_low","dest_operand_high","flag_carry","from_gdt","offset","PSE_ENABLED","old","t","log2_table","tt","m64_low","m64_high","Object","fromList","Object.fromList","xs","extend","Object.extend","keys","pads","String.pads","str","len","pad0","String.pad0","range","Array.range","h","toString","toUpperCase","Number","bits","Number.bits","bit","String.chr_repeat","chr","bcd_pack","Math.bcd_pack","digit","msg","s","get","this.get","this.set","slice","this.get_buffer","to_be32","Math.to_be32","dword","to_be16","Math.to_be16","roundInfinity","Math.roundInfinity","cd_buffer","vendor_id","class_revision","irq","iobase","sector_size","CDROM_SECTOR_SIZE","atapi","pci_id","prototype","AHCIDevice","disk_buffer","nr","read_status","status","data_pointer","pio_data","push_irq","HD_SECTOR_SIZE","sector_count","cylinder_count","head_count","last_drive","cmd","sectors_per_track","ata_command_rw","cmd_fis","is_read","lba","bytecount","mmio_read","host_caps","host_ctl","host_ports_impl","host_intbits","mmio_write","port_lst_addr","port_fis_addr","ctba_addr","first_prdt_start","prdt_addr","atapi_command","fis_command","command_fis_start","this.init","register_device","mmap_register","pci_data","pci_response","pci_status","self","devices","bdf","device","PCI_VENDOR_ID","PCI_CLASS_REVISION","PCI_BASE_ADDRESS_5","PCI_INTERRUPT_LINE","this.register_device","device_id","floppy_image","port3F0_read","port3F4_read","return_byte","response_index","response_length","dor","port3F7_read","port3F5_read","response_data","port3F5_write","reg_byte","bytes_expecting","receiving_command","receiving_index","next_command","fix_drive_data","check_drive_status","args","do_sector","calibrate","last_cylinder","read_sector_id","seek","port3F2_read","port3F2_write","is_write","sector","head","cylinder","read_count","read_offset","number_of_heads","do_write","do_read","ArrayBuffer","mmap_read8","aligned_addr","MMAP_BLOCK_SIZE","registered","memory_map_read","MMAP_BYTEWISE","memory_map_registered","mmap_read32","mmap_write8","memory_map_write","MMAP_DWORDWISE","mmap_write32","int8array","int16array","int8sarray","int32sarray","undefined","this.mmap_register","is_dword","read_func","write_func","unit_size","read_addr","write_addr","this.read8s","this.read8","this.read16","this.read_aligned16","this.read32s","this.read_aligned32","this.write8","this.write16","this.write_aligned16","this.write32","this.write_aligned32","this.write_blob","this.write_string","charCodeAt","data_byte","channel","channels","flipflop_get","address","old_dword","new_byte","lsb_msb_flipflop","bind","portA_write","portB_write","portC_write","port81_write","this.do_read","this.do_write","counter_read","latch","counter_latch","counter_latch_value","next_low","counter_next_low","counter_mode","counter_current","counter_write","counter_reload","counter_read_mode","counter_enabled","counter2_out","parity","this.timer","mode","steps","OSCILLATOR_FREQ","current","port43_write","read_mode","adapter","update_cursor","row","cursor_address","start_address","max_cols","col","min","max_rows","cursor_scanline_start","cursor_scanline_end","screen","screen_width","screen_height","graphical_mode_is_linear","graphical_mode","do_complete_redraw","vga256_palette","vga_memory","plane0","plane1","plane2","plane3","latch0","latch1","latch2","latch3","svga_memory","SVGA_MEMORY_SIZE","svga_enabled","svga_width","svga_height","svga_bpp","color","put_pixel","dac_map","put_char","timer_graphical","timer_text","set_size_text","this.set_size_text","cols_count","rows_count","set_size_graphical","this.set_size_graphical","width","height","update_cursor_scanline","this.update_cursor_scanline","clear_screen","this.clear_screen","set_video_mode","this.set_video_mode","is_graphical","set_mode","this.destroy","index_crtc","dac_color_index","port3C7_write","port3C8_write","index","port3C9_write","color_byte","port3D4_write","register","port3D5_write","port3D5_read","miscellaneous_output_register","port3CC_read","port3C2_write","port3DA_read","attribute_controller_index","port3C1_read","port3C0_write","port3C0_read","sequencer_index","port3C4_write","plane_write_bm","port3C5_write","port3C5_read","graphics_index","port3CE_write","plane_read","planar_mode","planar_rotate_reg","planar_bitmap","port3CF_write","dispi_index","dispi_value","read_index","port1CE_write","port1CF_write","port1D0_write","port1CF_read","MAX_XRES","MAX_YRES","MAX_BPP","port1D0_read","vga_memory_read","vga_memory_write","put_pixel_linear","plane2_byte","plane3_byte","plane0_byte","plane1_byte","memory_start","svga_memory_read","svga_memory_write","green","prev","blue","red","keyboard","mouse","kbd_irq","kbd_buffer","mouse_send_delta","delta_x","delta_y","have_mouse","enable_mouse","mouse_delta_x","enable_mouse_stream","mouse_delta_y","last_mouse_packet","sample_rate","send_mouse_packet","mouse_send_click","left","middle","right","mouse_clicks","mouse_buffer","off","concat","have_keyboard","next_is_mouse_command","next_read_sample","next_read_led","command_register","read_output_register","read_command_register","port60_read","do_mouse_buffer","get_isr","port64_read","status_byte","port60_write","write_byte","enabled","port64_write","reboot","master","irq_mask","irq_map","isr","irr","is_master","slave","this.handle_irqs","enabled_irr","dump","this.dump","expect_icw4","state","read_irr","io_base","port20_write","eoi_type","port20_read","port21_write","port21_read","this.push_irq","irq_number","this.get_isr","diskette_type","encode_time","cmos_b","cmos_index","rtc_time","last_update","next_interrupt","periodic_interrupt","periodic_interrupt_time","cmos_a","nmi_disabled","cmos_write","cmos_read","getUTCSeconds","getUTCMinutes","getUTCHours","getUTCDate","getUTCMonth","getUTCFullYear","line","fromCharCode","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","update_text","did_redraw","text_mode_height","changed_rows","text_update_row","elem_set_scale","scale_x","scale_y","scale_str","webkitTransform","MozTransform","text_screen","graphic_screen","graphic_context","getContext","cursor_element","graphic_image_data","graphic_buffer","cursor_row","cursor_col","graphical_mode_width","text_mode_data","text_mode_width","charmap_high","charmap_low","this.put_char","bg_color","fg_color","p","this.timer_text","this.put_pixel","this.put_pixel_linear","this.timer_graphical","putImageData","this.set_mode","graphical","fillStyle","fillRect","cols","rows","firstChild","getImageData","this.set_scale","s_x","s_y","end","marginTop","this.update_cursor","this.text_update_row","row_element","color_element","text","backgroundColor","ascii","replaceChild","childNodes","may_handle","shiftKey","ctrlKey","keyCode","className","nodeName","keyup_handler","keys_pressed","handler","preventDefault","keydown_handler","blur_handler","key","keydown","charmap","send_code","code_fn","mousemove_handler","SPEED_FACTOR","send_delta","contextmenu_handler","mousedown_handler","click_event","mouseup_handler","down","which","left_down","middle_down","right_down","send_click","click_fn","delta_fn"] +} diff --git a/src/vga.js b/src/vga.js new file mode 100644 index 00000000..617d099a --- /dev/null +++ b/src/vga.js @@ -0,0 +1,1023 @@ +"use strict"; + + +/** + * @constructor + */ +function VGAScreen(dev, adapter) +{ + var + io = dev.io, + memory = dev.memory, + + /** + * TODO: Make this configurable + * @const + */ + SVGA_MEMORY_SIZE = 128 * 64 * 1024, + + /** @const */ + MAX_XRES = 1280, + + /** @const */ + MAX_YRES = 1024, + + /** @const */ + MAX_BPP = 32, + + /** @type {number} */ + cursor_address = 0, + + /** @type {number} */ + cursor_scanline_start = 0xE, + + /** @type {number} */ + cursor_scanline_end = 0xF, + + /** @type {VGAScreen} */ + screen = this, + + /** + * Number of columns in text mode + * @type {number} + */ + max_cols, + + /** + * Number of rows in text mode + * @type {number} + */ + max_rows, + + /** + * Width in pixels in graphical mode + * @type {number} + */ + screen_width, + + /** + * Height in pixels in graphical mode + * @type {number} + */ + screen_height, + + /** + * video memory start address + * @type {number} + */ + start_address = 0, + + /** @type {boolean} */ + graphical_mode_is_linear = true, + + /** @type {boolean} */ + graphical_mode = false, + + /** @type {boolean} */ + do_complete_redraw = false, + + /* + * VGA palette containing 256 colors for video mode 13 etc. + * Needs to be initialised by the BIOS + */ + vga256_palette = new Int32Array(256), + + // 4 times 64k + // Could be shared with SVGA memory + vga_memory = new Uint8Array(4 * 64 * 1024), + + plane0 = new Uint8Array(vga_memory.buffer, 0 * 64 * 1024, 64 * 1024), + plane1 = new Uint8Array(vga_memory.buffer, 1 * 64 * 1024, 64 * 1024), + plane2 = new Uint8Array(vga_memory.buffer, 2 * 64 * 1024, 64 * 1024), + plane3 = new Uint8Array(vga_memory.buffer, 3 * 64 * 1024, 64 * 1024), + + // VGA latches + latch0 = 0, + latch1 = 0, + latch2 = 0, + latch3 = 0, + + + svga_memory = new Uint8Array(SVGA_MEMORY_SIZE), + svga_enabled = false, + + /** @type {number} */ + svga_width = 0, + + /** @type {number} */ + svga_height = 0, + + /** @type {number} */ + svga_bpp = 0; + + + function init() + { + screen.set_size_text(80, 25); + screen.update_cursor_scanline(); + + memory.mmap_register(0xA0000, 0x20000, false, vga_memory_read, vga_memory_write); + + memory.mmap_register(0xE0000000, SVGA_MEMORY_SIZE, false, svga_memory_read, svga_memory_write); + } + + function vga_memory_read(addr) + { + if(!graphical_mode || graphical_mode_is_linear) + { + return vga_memory[addr]; + } + + + // planar mode + addr &= 0xFFFF; + + latch0 = plane0[addr]; + latch1 = plane1[addr]; + latch2 = plane2[addr]; + latch3 = plane3[addr]; + + return vga_memory[plane_read << 16 | addr]; + } + + function vga_memory_write(addr, value) + { + if(graphical_mode) + { + if(graphical_mode_is_linear) + { + vga_memory_write_graphical_linear(addr, value); + } + else + { + vga_memory_write_graphical_planar(addr, value); + } + } + else + { + vga_memory_write_text_mode(addr, value); + } + } + + function vga_memory_write_graphical_linear(addr, value) + { + var offset = addr << 2, + color = vga256_palette[value]; + + adapter.put_pixel_linear(offset | 2, color >> 16 & 0xFF); + adapter.put_pixel_linear(offset | 1, color >> 8 & 0xFF); + adapter.put_pixel_linear(offset, color & 0xFF); + + vga_memory[addr] = value; + } + + function vga_memory_write_graphical_planar(addr, value) + { + if(addr > 0xFFFF) + { + return; + } + + // TODO: + // Replace 4 byte operations with single double word operations + + var write, + plane0_byte, + plane1_byte, + plane2_byte, + plane3_byte; + + // not implemented + dbg_assert((planar_rotate_reg & 7) === 0); + dbg_assert(planar_mode < 3); + + if(planar_mode === 0) + { + plane0_byte = plane1_byte = plane2_byte = plane3_byte = value; + } + else if(planar_mode === 2) + { + if(plane_write_bm & 1) + { + write = value & 1 ? 0xFF : 0; + plane0_byte = latch0 & ~planar_bitmap | write & planar_bitmap; + } + if(plane_write_bm & 2) + { + write = value & 2 ? 0xFF : 0; + plane1_byte = latch1 & ~planar_bitmap | write & planar_bitmap; + } + if(plane_write_bm & 4) + { + write = value & 4 ? 0xFF : 0; + plane2_byte = latch2 & ~planar_bitmap | write & planar_bitmap; + } + if(plane_write_bm & 8) + { + write = value & 8 ? 0xFF : 0; + plane3_byte = latch3 & ~planar_bitmap | write & planar_bitmap; + } + } + + if(planar_mode === 0 || planar_mode === 2) + { + switch(planar_rotate_reg & 0x18) + { + case 0x08: + plane0_byte &= latch0; + plane1_byte &= latch1; + plane2_byte &= latch2; + plane3_byte &= latch3; + break; + case 0x10: + plane0_byte |= latch0; + plane1_byte |= latch1; + plane2_byte |= latch2; + plane3_byte |= latch3; + break; + case 0x18: + plane0_byte ^= latch0; + plane1_byte ^= latch1; + plane2_byte ^= latch2; + plane3_byte ^= latch3; + break; + } + + if(plane_write_bm & 1) + { + plane0_byte = latch0 & ~planar_bitmap | plane0_byte & planar_bitmap; + } + if(plane_write_bm & 2) + { + plane1_byte = latch1 & ~planar_bitmap | plane1_byte & planar_bitmap; + } + if(plane_write_bm & 4) + { + plane2_byte = latch2 & ~planar_bitmap | plane2_byte & planar_bitmap; + } + if(plane_write_bm & 8) + { + plane3_byte = latch3 & ~planar_bitmap | plane3_byte & planar_bitmap; + } + } + else if(planar_mode === 1) + { + plane0_byte = latch0; + plane1_byte = latch1; + plane2_byte = latch2; + plane3_byte = latch3; + } + + if(plane_write_bm & 1) + { + plane0[addr] = plane0_byte; + } + else + { + plane0_byte = plane0[addr]; + } + if(plane_write_bm & 2) + { + plane1[addr] = plane1_byte; + } + else + { + plane1_byte = plane1[addr]; + } + if(plane_write_bm & 4) + { + plane2[addr] = plane2_byte; + } + else + { + plane2_byte = plane2[addr]; + } + if(plane_write_bm & 8) + { + plane3[addr] = plane3_byte; + } + else + { + plane3_byte = plane3[addr]; + } + + if(addr >= (screen_width * screen_height << 3)) + { + return; + } + + // Shift these, so that the bits for the color are in + // the correct position in the while loop + plane1_byte <<= 1; + plane2_byte <<= 2; + plane3_byte <<= 3; + + // 8 pixels per byte, we start at high (addr << 3 | 7) + // << 2 because we're using put_pixel_linear + var offset = (addr << 3 | 7) << 2; + + for(var i = 0; i < 8; i++) + { + var color_index = + plane0_byte >> i & 1 | + plane1_byte >> i & 2 | + plane2_byte >> i & 4 | + plane3_byte >> i & 8, + color = vga256_palette[dac_map[color_index]]; + + adapter.put_pixel_linear(offset | 2, color >> 16); + adapter.put_pixel_linear(offset | 1, color >> 8 & 0xFF); + adapter.put_pixel_linear(offset, color & 0xFF); + + offset -= 4; + } + } + + function text_mode_redraw() + { + var addr = 0x18000 | start_address << 1, + chr, + color; + + for(var row = 0; row < max_rows; row++) + { + for(var col = 0; col < max_cols; col++) + { + chr = vga_memory[addr]; + color = vga_memory[addr | 1]; + + adapter.put_char(row, col, chr, + vga256_palette[color >> 4 & 0xF], vga256_palette[color & 0xF]); + + addr += 2; + } + } + } + + function graphical_linear_redraw() + { + // TODO + } + + function graphical_planar_redraw() + { + var addr = 0, + color; + + for(var y = 0; y < screen_height; y++) + { + for(var x = 0; x < screen_width; x += 8) + { + for(var i = 0; i < 8; i++) + { + color = + plane0[addr] >> i & 1 | + plane1[addr] >> i << 1 & 2 | + plane2[addr] >> i << 2 & 4 | + plane3[addr] >> i << 3 & 8; + + adapter.put_pixel(x + 7 - i, y, vga256_palette[dac_map[color]]); + } + + addr++; + } + } + } + + function vga_memory_write_text_mode(addr, value) + { + if(addr < 0x18000) + { + return; + } + + var memory_start = (addr - 0x18000 >> 1) - start_address, + row = memory_start / max_cols | 0, + col = memory_start % max_cols, + chr, + color; + + if(addr & 1) + { + color = value; + chr = vga_memory[addr & ~1]; + } + else + { + chr = value; + color = vga_memory[addr | 1]; + } + + adapter.put_char(row, col, chr, + vga256_palette[color >> 4 & 0xF], vga256_palette[color & 0xF]); + + vga_memory[addr] = value; + } + + function update_cursor() + { + var row = (cursor_address - start_address) / max_cols | 0, + col = (cursor_address - start_address) % max_cols; + + row = Math.min(max_rows - 1, row); + + adapter.update_cursor(row, col); + } + + + function svga_memory_read(addr) + { + return svga_memory[addr]; + } + + function svga_memory_write(addr, value) + { + svga_memory[addr] = value; + + switch(svga_bpp) + { + case 32: + if((addr & 3) === 3) + { + // 4th byte is meaningless + return; + } + + adapter.put_pixel_linear(addr, value); + break; + + case 24: + addr = addr * (4/3) | 0; + adapter.put_pixel_linear(addr, value); + break; + + case 16: + if(addr & 1) + { + var prev = svga_memory[addr ^ 1], + green = prev >> 5 & 0x07 | value << 3 & 0x38, + blue = value >> 3 & 0x1F; + + blue = blue * 0xFF / 0x1F | 0; + green = green * 0xFF / 0x3F | 0; + + addr <<= 1; + + adapter.put_pixel_linear(addr - 1, green); + adapter.put_pixel_linear(addr - 2, blue); + } + else + { + var red = value & 0x1F; + red = red * 0xFF / 0x1F | 0; + + adapter.put_pixel_linear((addr << 1) + 2, red); + } + break; + + default: + if(DEBUG) + { + throw "SVGA: Unsupported BPP: " + svga_bpp; + } + } + } + + this.timer = function(time) + { + if(do_complete_redraw) + { + do_complete_redraw = false; + + if(graphical_mode) + { + if(graphical_mode_is_linear) + { + graphical_linear_redraw(); + } + else + { + graphical_planar_redraw(); + } + } + else + { + text_mode_redraw(); + } + } + + if(graphical_mode || svga_enabled) + { + adapter.timer_graphical(); + } + else + { + adapter.timer_text(); + } + }; + + /** + * @param {number} cols_count + * @param {number} rows_count + */ + this.set_size_text = function(cols_count, rows_count) + { + max_cols = cols_count; + max_rows = rows_count; + + adapter.set_size_text(cols_count, rows_count); + }; + + this.set_size_graphical = function(width, height) + { + adapter.set_size_graphical(width, height); + } + + this.update_cursor_scanline = function() + { + adapter.update_cursor_scanline(cursor_scanline_start, cursor_scanline_end); + }; + + this.clear_screen = function() + { + adapter.clear_screen(); + }; + + this.set_video_mode = function(mode) + { + var is_graphical = false; + + switch(mode) + { + case 0x03: + this.set_size_text(80, 25); + break; + case 0x10: + this.set_size_graphical(640, 350); + screen_width = 640; + screen_height = 350; + is_graphical = true; + graphical_mode_is_linear = false; + break; + case 0x12: + this.set_size_graphical(640, 480); + screen_width = 640; + screen_height = 480; + is_graphical = true; + graphical_mode_is_linear = false; + break; + case 0x13: + this.set_size_graphical(320, 200); + screen_width = 320; + screen_height = 200; + is_graphical = true; + graphical_mode_is_linear = true; + break; + default: + } + + adapter.set_mode(is_graphical); + + graphical_mode = is_graphical; + + dbg_log("Current video mode: " + h(mode), LOG_VGA); + }; + + this.destroy = function() + { + + }; + + var index_crtc = 0, + index_dac = 0, + index_attribute = 0; + + + // index for setting colors through port 3C9h + var dac_color_index = 0; + + function port3C7_write(index) + { + // index for reading the DAC + dbg_log("3C7 write: " + h(index), LOG_VGA); + }; + io.register_write(0x3C7, port3C7_write); + + function port3C8_write(index) + { + dac_color_index = index * 3; + }; + io.register_write(0x3C8, port3C8_write); + + + function port3C9_write(color_byte) + { + var index = dac_color_index / 3 | 0, + offset = dac_color_index % 3, + color = vga256_palette[index]; + + color_byte = color_byte << 2 & 0xFF | 3; + + if(offset === 0) + { + color = color & ~0xFF0000 | color_byte << 16; + } + else if(offset === 1) + { + color = color & ~0xFF00 | color_byte << 8; + } + else + { + color = color & ~0xFF | color_byte; + dbg_log("dac set color, index=" + h(index) + " value=" + h(color), LOG_VGA); + } + + vga256_palette[index] = color; + + dac_color_index++; + + do_complete_redraw = true; + } + io.register_write(0x3C9, port3C9_write); + + function port3D4_write(register) + { + index_crtc = register; + }; + io.register_write(0x3D4, port3D4_write); + + function port3D5_write(value) + { + switch(index_crtc) + { + case 0x2: + screen.set_size_text(value, 25); + break; + case 0xA: + cursor_scanline_start = value; + screen.update_cursor_scanline(); + break; + case 0xB: + cursor_scanline_end = value; + screen.update_cursor_scanline(); + break; + case 0xC: + start_address = start_address & 0xff | value << 8; + do_complete_redraw = true; + break; + case 0xD: + start_address = start_address & 0xff00 | value; + do_complete_redraw = true; + //dbg_log("start addr: " + h(start_address, 4), LOG_VGA); + break; + case 0xE: + cursor_address = cursor_address & 0xFF | value << 8; + update_cursor(); + break; + case 0xF: + cursor_address = cursor_address & 0xFF00 | value; + update_cursor(); + break; + default: + dbg_log("3D5 / CRTC write " + h(index_crtc) + ": " + h(value), LOG_VGA); + } + + }; + io.register_write(0x3D5, port3D5_write); + + function port3D5_read() + { + if(index_crtc === 0xA) + { + return cursor_scanline_start; + } + else if(index_crtc === 0xB) + { + return cursor_scanline_end; + } + else if(index_crtc === 0xE) + { + return cursor_address >> 8; + } + else if(index_crtc === 0xF) + { + return cursor_address & 0xFF; + } + + dbg_log("3D5 read " + h(index_crtc), LOG_VGA); + return 0; + }; + io.register_read(0x3D5, port3D5_read); + + var miscellaneous_output_register = 0xff; + + function port3CC_read() + { + return miscellaneous_output_register; + } + io.register_read(0x3CC, port3CC_read); + + function port3C2_write(value) + { + dbg_log("3C2 / miscellaneous output register = " + h(value), LOG_VGA); + miscellaneous_output_register = value; + + // cheat way to figure out which video mode is indended to be used + switch_video_mode(value); + } + io.register_write(0x3C2, port3C2_write); + + + function port3DA_read() + { + // status register + attribute_controller_index = -1; + return 0xff; + } + io.register_read(0x3DA, port3DA_read); + + + var attribute_controller_index = -1; + + function port3C1_read() + { + attribute_controller_index = -1; + + dbg_log("3C1 / attribute controller read " + h(attribute_controller_index), LOG_VGA); + return -1; + } + io.register_read(0x3C1, port3C1_read); + + var dac_map = new Uint8Array(0x10); + + function port3C0_write(value) + { + if(attribute_controller_index === -1) + { + attribute_controller_index = value; + } + else + { + if(attribute_controller_index < 0x10) + { + dac_map[attribute_controller_index] = value; + } + else + switch(attribute_controller_index) + { + default: + dbg_log("3C0 / attribute controller write " + h(attribute_controller_index) + ": " + h(value), LOG_VGA); + } + + attribute_controller_index = -1; + + } + } + io.register_write(0x3C0, port3C0_write); + + function port3C0_read() + { + dbg_log("3C0 read", LOG_VGA); + var result = attribute_controller_index; + attribute_controller_index = -1; + return result; + } + io.register_read(0x3C0, port3C0_read); + + + var sequencer_index = -1; + + function port3C4_write(value) + { + sequencer_index = value; + } + io.register_write(0x3C4, port3C4_write); + + + var + // bitmap of planes 0-3 + plane_write_bm = 0xF, + sequencer_memory_mode = 0 + ; + + function port3C5_write(value) + { + switch(sequencer_index) + { + case 0x02: + //dbg_log("plane write mask: " + h(value), LOG_VGA); + plane_write_bm = value; + break; + case 0x04: + dbg_log("sequencer memory mode: " + h(value), LOG_VGA); + sequencer_memory_mode = value; + break; + default: + dbg_log("3C5 / sequencer write " + h(sequencer_index) + ": " + h(value), LOG_VGA); + } + } + io.register_write(0x3C5, port3C5_write); + + + function port3C5_read() + { + switch(sequencer_index) + { + case 0x06: + return 0x12; + break; + default: + dbg_log("3C5 / sequencer read " + h(sequencer_index), LOG_VGA); + } + } + io.register_read(0x3C5, port3C5_read); + + + var graphics_index = -1; + + function port3CE_write(value) + { + graphics_index = value; + } + io.register_write(0x3CE, port3CE_write); + + var plane_read = 0, // value 0-3, which plane to read + planar_mode = 0, + planar_rotate_reg = 0, + planar_bitmap = 0xFF; + + function port3CF_write(value) + { + switch(graphics_index) + { + // TODO: Set/Reset bit + //case 0: + //case 1: + //break; + case 3: + planar_rotate_reg = value; + dbg_log("plane rotate: " + h(value), LOG_VGA); + break; + case 4: + plane_read = value; + dbg_assert(value < 4); + dbg_log("plane read: " + h(value), LOG_VGA); + break; + case 5: + planar_mode = value; + dbg_log("planar mode: " + h(value), LOG_VGA); + break; + case 8: + planar_bitmap = value; + //dbg_log("planar bitmap: " + h(value), LOG_VGA); + break; + default: + dbg_log("3CF / graphics write " + h(graphics_index) + ": " + h(value), LOG_VGA); + } + } + io.register_write(0x3CF, port3CF_write); + + + function switch_video_mode(mar) + { + // Cheap way to figure this out, using the Miscellaneous Output Register + // See: http://wiki.osdev.org/VGA_Hardware#List_of_register_settings + + if(mar === 0x67) + { + screen.set_video_mode(0x3); + } + else if(mar === 0xE3) + { + // also mode X + screen.set_video_mode(0x12); + } + else if(mar === 0x63) + { + screen.set_video_mode(0x13); + } + else if(mar === 0xA3) + { + screen.set_video_mode(0x10); + } + else + { + dbg_log("Unkown MAR value: " + h(mar, 2) + ", going back to text mode", LOG_VGA); + screen.set_video_mode(0x3); + } + } + + + // Bochs VBE Extensions + // http://wiki.osdev.org/Bochs_VBE_Extensions + var dispi_index = -1, + dispi_value = -1, + read_index = true; + + function port1CE_write(value) + { + dispi_index = value; + read_index = true; + } + io.register_write(0x1CE, port1CE_write); + + function port1CF_write(value) + { + if(read_index) + { + dispi_index |= value << 8; + read_index = false + return; + } + + read_index = true; + + dispi_value = value; + switch(dispi_index) + { + default: + dbg_log("1CF / dispi write low " + h(dispi_index) + ": " + h(value), LOG_VGA); + } + } + io.register_write(0x1CF, port1CF_write); + + function port1D0_write(value) + { + dbg_log("1D0 / dispi write high " + h(dispi_index) + ": " + h(value), LOG_VGA); + dispi_value |= value << 8; + + switch(dispi_index) + { + case 1: + svga_width = dispi_value; + break; + case 2: + svga_height = dispi_value; + break; + case 3: + svga_bpp = dispi_value; + break; + case 4: + // enable, options + svga_enabled = (dispi_value & 1) === 1; + break; + default: + } + + dbg_log("SVGA: enabled=" + svga_enabled + ", " + svga_width + "x" + svga_height + "x" + svga_bpp, LOG_VGA); + + if(svga_enabled) + { + screen.set_size_graphical(svga_width, svga_height); + adapter.set_mode(true); + } + } + io.register_write(0x1D0, port1D0_write); + + + function port1CF_read() + { + switch(dispi_index) + { + case 0: + // id + return 0xC0; + case 1: + return MAX_XRES; + case 2: + return MAX_YRES; + case 3: + return MAX_BPP; + case 0x0A: + // memory size in 64 kilobyte banks + return SVGA_MEMORY_SIZE / 64 / 1024; + default: + } + dbg_log("1CF / dispi read low " + h(dispi_index), LOG_VGA); + } + io.register_read(0x1CF, port1CF_read); + + function port1D0_read() + { + switch(dispi_index) + { + case 0: + // id + return 0xB0; + case 1: + return MAX_XRES >> 8; + case 2: + return MAX_YRES >> 8; + case 3: + return MAX_BPP >> 8; + case 0x0A: + return SVGA_MEMORY_SIZE / 64 / 1024 >> 8; + default: + } + dbg_log("1D0 / dispi read high " + h(dispi_index), LOG_VGA); + } + io.register_read(0x1D0, port1D0_read); + + init(); +} + diff --git a/tests/perf/build.sh b/tests/perf/build.sh new file mode 100755 index 00000000..6225313b --- /dev/null +++ b/tests/perf/build.sh @@ -0,0 +1,8 @@ +nasm test.asm -o test.bin + +echo "var file = [" > test-asm.js +cat test.bin|xxd -i >> test-asm.js +echo "]" >> test-asm.js + +echo "done." + diff --git a/tests/perf/runtest.js b/tests/perf/runtest.js new file mode 100644 index 00000000..5f7e3353 --- /dev/null +++ b/tests/perf/runtest.js @@ -0,0 +1,59 @@ +// Run with d8, not node + +var path = "../../src/"; + +load(path + "const.js"); +load(path + "io.js"); +load(path + "cpu.js"); +load(path + "main.js"); +load(path + "disk.js"); +load(path + "pci.js"); +load(path + "test_helpers.js"); +load(path + "memory.js"); +load(path + "dma.js"); +load(path + "pit.js"); +load(path + "pic.js"); + + +if(typeof console === "undefined") +{ + var console = { + log: print, + } +} + +var log = print; + +DEBUG = false; + +var cpu = new v86(); + +cpu.init({}); + +// defines file +load("test-asm.js"); + +for(var i = 0; i < file.length; i++) +{ + cpu.memory.mem8[i] = file[i]; +} + +function run() +{ + for(var i = 0; i < count; i++) + { + cpu.cycle(); + } +} + +var count = 1e7; + +var start = Date.now(); + +run(); + +var end = Date.now(), + duration = (end - start) / 1e3; + +console.log("Finished in " + duration + " seconds, " + (count / duration / 1e6).toFixed(2) + " mips"); + diff --git a/tests/perf/test-asm.js b/tests/perf/test-asm.js new file mode 100644 index 00000000..cb615e18 --- /dev/null +++ b/tests/perf/test-asm.js @@ -0,0 +1,12 @@ +var file = [ + 0x66, 0xbb, 0x00, 0x00, 0x10, 0x00, 0x66, 0xb8, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0xff, 0xff, 0xb0, 0xff, 0x67, 0x8a, 0x03, 0x66, 0x0f, 0xbf, 0xc0, + 0x0f, 0xbe, 0xc0, 0x66, 0x0f, 0xb6, 0xc0, 0x66, 0x91, 0x67, 0x86, 0x03, + 0x67, 0x87, 0x03, 0x67, 0xfe, 0x03, 0x66, 0x67, 0xff, 0x03, 0x40, 0xfe, + 0xc0, 0x67, 0xfe, 0x0b, 0x66, 0x67, 0xff, 0x0b, 0x48, 0xfe, 0xc8, 0x66, + 0xf7, 0xe1, 0xf7, 0xe1, 0xf6, 0xe1, 0x66, 0xf7, 0xe9, 0xf7, 0xe9, 0xf6, + 0xe9, 0x66, 0x6b, 0xc0, 0x10, 0x66, 0x69, 0xc0, 0x00, 0x00, 0x00, 0x01, + 0x6b, 0xc0, 0x10, 0x66, 0x0f, 0xaf, 0xc1, 0x0f, 0xaf, 0xc1, 0x66, 0x50, + 0x50, 0x5f, 0x66, 0x5f, 0xfb, 0xfa, 0xfd, 0xfc, 0x60, 0x61, 0x66, 0x60, + 0x66, 0x61, 0x9c, 0x9d, 0x66, 0x9c, 0x66, 0x9d, 0xeb, 0x8a +] diff --git a/tests/perf/test.asm b/tests/perf/test.asm new file mode 100644 index 00000000..3ac30bd7 --- /dev/null +++ b/tests/perf/test.asm @@ -0,0 +1,199 @@ +;[BITS 32] + +start: +mov ebx, 100000h + +%if 0 + +add al, [4*ebx+100h] +add eax, ecx +add [4*ebx+1000h], cl +add al, 10h +add eax, 1000h +add cl, 10h +add ecx, 1000h + +or al, [4*ebx+100h] +or eax, ecx +or [4*ebx+1000h], cl +or al, 10h +or eax, 1000h +or cl, 10h +or ecx, 1000h + +adc al, [4*ebx+100h] +adc eax, ecx +adc [4*ebx+1000h], cl +adc al, 10h +adc eax, 1000h +adc cl, 10h +adc ecx, 1000h + +sbb al, [4*ebx+100h] +sbb eax, ecx +sbb [4*ebx+1000h], cl +sbb al, 10h +sbb eax, 1000h +sbb cl, 10h +sbb ecx, 1000h + +and al, [4*ebx+100h] +and eax, ecx +and [4*ebx+1000h], cl +and al, 10h +and eax, 1000h +and cl, 10h +and ecx, 1000h + +sub al, [4*ebx+100h] +sub eax, ecx +sub [4*ebx+1000h], cl +sub al, 10h +sub eax, 1000h +sub cl, 10h +sub ecx, 1000h + +xor al, [4*ebx+100h] +xor eax, ecx +xor [4*ebx+1000h], cl +xor al, 10h +xor eax, 1000h +xor cl, 10h +xor ecx, 1000h + +cmp al, [4*ebx+100h] +cmp eax, ecx +cmp [4*ebx+1000h], cl +cmp al, 10h +cmp eax, 1000h +cmp cl, 10h +cmp ecx, 1000h + + +test al, [4*ebx+100h] +test eax, ecx +test [4*ebx+1000h], cl +test al, 10h +test eax, 1000h +%endif + + +%if 0 +add eax, 12345671h + +jo $+2 +jno $+2 +jp $+2 +jnp $+2 +jc $+2 +jnc $+2 +js $+2 +jns $+2 +jz $+2 +jnz $+2 +jl $+2 +jnl $+2 +jbe $+2 +jnbe $+2 +jle $+2 +jnle $+2 +%endif + +%if 0 +sal eax, 12 +sal cx, 7 +sal dl, 1 +sal dh, 0 + +shl eax, 12 +shl cx, 7 +shl dl, 1 +shl dh, 0 + +shr eax, 12 +shr cx, 7 +shr dl, 1 +shr dh, 0 + +ror eax, 12 +ror cx, 7 +ror dl, 1 +ror dh, 0 + +rol eax, 12 +rol cx, 7 +rol dl, 1 +rol dh, 0 + +rcr eax, 12 +rcr cx, 7 +rcr dl, 1 +rcr dh, 0 + +rcl eax, 12 +rcl cx, 7 +rcl dl, 1 +rcl dh, 0 + + +%endif + +mov eax, -1 +mov ax, -1 +mov al, -1 +mov al, [ebx] + +movsx eax, ax +movsx ax, al +movzx eax, al + +xchg eax, ecx +xchg [ebx], al +xchg [ebx], ax + +inc byte [ebx] +inc dword [ebx] +inc ax +inc al +dec byte [ebx] +dec dword [ebx] +dec ax +dec al + +mul ecx +mul cx +mul cl + +imul ecx +imul cx +imul cl + + +imul eax, 10h +imul eax, 1000000h +imul ax, 10h +imul eax, ecx +imul ax, cx + +push eax +push ax +pop di +pop edi + +sti +cli +std +cld + +pusha +popa +pushad +popad + +pushf +popf +pushfd +popfd + + +jmp start diff --git a/tests/perf/test.bin b/tests/perf/test.bin new file mode 100644 index 0000000000000000000000000000000000000000..39b1d1dc2b5639d51fcfc5100bade5d772c35c5b GIT binary patch literal 118 zcmYe>&A=eQkhbGL5CDk{|I@pe)A;uv;NN#3jepyLw2A3$%<1jS>HnD1(*H9%{5z2T zj~mG1_V{-q?fb*;55GN3`~LF#%Wp5!vJVKPWgcK)U|. diff --git a/tests/qemu/Makefile b/tests/qemu/Makefile new file mode 100644 index 00000000..349c3ca9 --- /dev/null +++ b/tests/qemu/Makefile @@ -0,0 +1,17 @@ + +CC=gcc +CC_I386=$(CC) -m32 +QEMU_INCLUDES += -I../.. +CFLAGS=-Wall -O2 -g -fno-strict-aliasing -static +LDFLAGS= + + +# i386/x86_64 emulation test (test various opcodes) */ +test-i386: test-i386.c test-i386-code16.S test-i386-vm86.S \ + test-i386.h test-i386-shift.h test-i386-muldiv.h + $(CC_I386) $(QEMU_INCLUDES) $(CFLAGS) $(LDFLAGS) -o $@ \ + $(= ((maj) << 16) + (min)) +#else +# define QEMU_GNUC_PREREQ(maj, min) 0 +#endif + +#define QEMU_NORETURN __attribute__ ((__noreturn__)) + +#if QEMU_GNUC_PREREQ(3, 4) +#define QEMU_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +#define QEMU_WARN_UNUSED_RESULT +#endif + +#if defined(_WIN32) +# define QEMU_PACKED __attribute__((gcc_struct, packed)) +#else +# define QEMU_PACKED __attribute__((packed)) +#endif + +#define cat(x,y) x ## y +#define cat2(x,y) cat(x,y) +#define QEMU_BUILD_BUG_ON(x) \ + typedef char cat2(qemu_build_bug_on__,__LINE__)[(x)?-1:1]; + +#if defined __GNUC__ +# if !QEMU_GNUC_PREREQ(4, 4) + /* gcc versions before 4.4.x don't support gnu_printf, so use printf. */ +# define GCC_ATTR __attribute__((__unused__, format(printf, 1, 2))) +# define GCC_FMT_ATTR(n, m) __attribute__((format(printf, n, m))) +# else + /* Use gnu_printf when supported (qemu uses standard format strings). */ +# define GCC_ATTR __attribute__((__unused__, format(gnu_printf, 1, 2))) +# define GCC_FMT_ATTR(n, m) __attribute__((format(gnu_printf, n, m))) +# if defined(_WIN32) + /* Map __printf__ to __gnu_printf__ because we want standard format strings + * even when MinGW or GLib include files use __printf__. */ +# define __printf__ __gnu_printf__ +# endif +# endif +#else +#define GCC_ATTR /**/ +#define GCC_FMT_ATTR(n, m) +#endif + +#endif /* COMPILER_H */ diff --git a/tests/qemu/config-host.h b/tests/qemu/config-host.h new file mode 100644 index 00000000..f3ca7c95 --- /dev/null +++ b/tests/qemu/config-host.h @@ -0,0 +1,66 @@ +/* Automatically generated by create_config - do not modify */ +#define CONFIG_QEMU_CONFDIR "/usr/local/etc/qemu" +#define CONFIG_QEMU_DATADIR "/usr/local/share/qemu" +#define CONFIG_QEMU_DOCDIR "/usr/local/share/doc/qemu" +#define CONFIG_QEMU_LOCALSTATEDIR "/usr/local/var" +#define CONFIG_QEMU_HELPERDIR "/usr/local/libexec" +#define HOST_I386 1 +#define CONFIG_POSIX 1 +#define CONFIG_LINUX 1 +#define CONFIG_SLIRP 1 +#define CONFIG_SMBD_COMMAND "/usr/sbin/smbd" +#define CONFIG_AC97 1 +#define CONFIG_ES1370 1 +#define CONFIG_SB16 1 +#define CONFIG_HDA 1 +#define CONFIG_AUDIO_DRIVERS \ + &oss_audio_driver,\ + +#define CONFIG_OSS 1 +#define CONFIG_BDRV_WHITELIST \ + NULL +#define CONFIG_VNC 1 +#define CONFIG_VNC_TLS 1 +#define CONFIG_VNC_PNG 1 +#define CONFIG_FNMATCH 1 +#define QEMU_VERSION "1.3.1" +#define QEMU_PKGVERSION "" +#define CONFIG_SDL 1 +#define CONFIG_CURSES 1 +#define CONFIG_ATFILE 1 +#define CONFIG_UTIMENSAT 1 +#define CONFIG_PIPE2 1 +#define CONFIG_ACCEPT4 1 +#define CONFIG_SPLICE 1 +#define CONFIG_EVENTFD 1 +#define CONFIG_FALLOCATE 1 +#define CONFIG_SYNC_FILE_RANGE 1 +#define CONFIG_FIEMAP 1 +#define CONFIG_DUP3 1 +#define CONFIG_EPOLL 1 +#define CONFIG_EPOLL_CREATE1 1 +#define CONFIG_EPOLL_PWAIT 1 +#define CONFIG_INOTIFY 1 +#define CONFIG_INOTIFY1 1 +#define CONFIG_BYTESWAP_H 1 +#define CONFIG_CURL 1 +#define CONFIG_ATTR 1 +#define CONFIG_IOVEC 1 +#define CONFIG_PREADV 1 +#define CONFIG_SIGNALFD 1 +#define CONFIG_FDATASYNC 1 +#define CONFIG_MADVISE 1 +#define CONFIG_POSIX_MADVISE 1 +#define CONFIG_SIGEV_THREAD_ID 1 +#define CONFIG_SMARTCARD 1 +#define CONFIG_OPENGL 1 +#define CONFIG_UNAME_RELEASE "" +#define CONFIG_ZERO_MALLOC 1 +#define CONFIG_UCONTEXT_COROUTINE 1 +#define CONFIG_OPEN_BY_HANDLE 1 +#define CONFIG_LINUX_MAGIC_H 1 +#define CONFIG_PRAGMA_DISABLE_UNUSED_BUT_SET 1 +#define CONFIG_HAS_ENVIRON 1 +#define CONFIG_TRACE_NOP 1 +#define CONFIG_TRACE_FILE trace +#define CONFIG_TRACE_DEFAULT 1 diff --git a/tests/qemu/test-i386-code16.S b/tests/qemu/test-i386-code16.S new file mode 100644 index 00000000..816c24b9 --- /dev/null +++ b/tests/qemu/test-i386-code16.S @@ -0,0 +1,79 @@ + .code16 + .globl code16_start + .globl code16_end + +CS_SEG = 0xf + +code16_start: + + .globl code16_func1 + + /* basic test */ +code16_func1 = . - code16_start + mov $1, %eax + data32 lret + +/* test push/pop in 16 bit mode */ + .globl code16_func2 +code16_func2 = . - code16_start + xor %eax, %eax + mov $0x12345678, %ebx + movl %esp, %ecx + push %bx + subl %esp, %ecx + pop %ax + data32 lret + +/* test various jmp opcodes */ + .globl code16_func3 +code16_func3 = . - code16_start + jmp 1f + nop +1: + mov $4, %eax + mov $0x12345678, %ebx + xor %bx, %bx + jz 2f + add $2, %ax +2: + + call myfunc + + lcall $CS_SEG, $(myfunc2 - code16_start) + + ljmp $CS_SEG, $(myjmp1 - code16_start) +myjmp1_next: + + cs lcall *myfunc2_addr - code16_start + + cs ljmp *myjmp2_addr - code16_start +myjmp2_next: + + data32 lret + +myfunc2_addr: + .short myfunc2 - code16_start + .short CS_SEG + +myjmp2_addr: + .short myjmp2 - code16_start + .short CS_SEG + +myjmp1: + add $8, %ax + jmp myjmp1_next + +myjmp2: + add $16, %ax + jmp myjmp2_next + +myfunc: + add $1, %ax + ret + +myfunc2: + add $4, %ax + lret + + +code16_end: diff --git a/tests/qemu/test-i386-muldiv.h b/tests/qemu/test-i386-muldiv.h new file mode 100644 index 00000000..015f59e1 --- /dev/null +++ b/tests/qemu/test-i386-muldiv.h @@ -0,0 +1,76 @@ + +void glue(glue(test_, OP), b)(long op0, long op1) +{ + long res, s1, s0, flags; + s0 = op0; + s1 = op1; + res = s0; + flags = 0; + asm ("push %4\n\t" + "popf\n\t" + stringify(OP)"b %b2\n\t" + "pushf\n\t" + "pop %1\n\t" + : "=a" (res), "=g" (flags) + : "q" (s1), "0" (res), "1" (flags)); + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CC=%04lx\n", + stringify(OP) "b", s0, s1, res, flags & CC_MASK); +} + +void glue(glue(test_, OP), w)(long op0h, long op0, long op1) +{ + long res, s1, flags, resh; + s1 = op1; + resh = op0h; + res = op0; + flags = 0; + asm ("push %5\n\t" + "popf\n\t" + stringify(OP) "w %w3\n\t" + "pushf\n\t" + "pop %1\n\t" + : "=a" (res), "=g" (flags), "=d" (resh) + : "q" (s1), "0" (res), "1" (flags), "2" (resh)); + printf("%-10s AH=" FMTLX " AL=" FMTLX " B=" FMTLX " RH=" FMTLX " RL=" FMTLX " CC=%04lx\n", + stringify(OP) "w", op0h, op0, s1, resh, res, flags & CC_MASK); +} + +void glue(glue(test_, OP), l)(long op0h, long op0, long op1) +{ + long res, s1, flags, resh; + s1 = op1; + resh = op0h; + res = op0; + flags = 0; + asm ("push %5\n\t" + "popf\n\t" + stringify(OP) "l %k3\n\t" + "pushf\n\t" + "pop %1\n\t" + : "=a" (res), "=g" (flags), "=d" (resh) + : "q" (s1), "0" (res), "1" (flags), "2" (resh)); + printf("%-10s AH=" FMTLX " AL=" FMTLX " B=" FMTLX " RH=" FMTLX " RL=" FMTLX " CC=%04lx\n", + stringify(OP) "l", op0h, op0, s1, resh, res, flags & CC_MASK); +} + +#if defined(__x86_64__) +void glue(glue(test_, OP), q)(long op0h, long op0, long op1) +{ + long res, s1, flags, resh; + s1 = op1; + resh = op0h; + res = op0; + flags = 0; + asm ("push %5\n\t" + "popf\n\t" + stringify(OP) "q %3\n\t" + "pushf\n\t" + "pop %1\n\t" + : "=a" (res), "=g" (flags), "=d" (resh) + : "q" (s1), "0" (res), "1" (flags), "2" (resh)); + printf("%-10s AH=" FMTLX " AL=" FMTLX " B=" FMTLX " RH=" FMTLX " RL=" FMTLX " CC=%04lx\n", + stringify(OP) "q", op0h, op0, s1, resh, res, flags & CC_MASK); +} +#endif + +#undef OP diff --git a/tests/qemu/test-i386-shift.h b/tests/qemu/test-i386-shift.h new file mode 100644 index 00000000..3d8f84bf --- /dev/null +++ b/tests/qemu/test-i386-shift.h @@ -0,0 +1,185 @@ + +#define exec_op glue(exec_, OP) +#define exec_opq glue(glue(exec_, OP), q) +#define exec_opl glue(glue(exec_, OP), l) +#define exec_opw glue(glue(exec_, OP), w) +#define exec_opb glue(glue(exec_, OP), b) + +#ifndef OP_SHIFTD + +#ifdef OP_NOBYTE +#define EXECSHIFT(size, rsize, res, s1, s2, flags) \ + asm ("push %4\n\t"\ + "popf\n\t"\ + stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \ + "pushf\n\t"\ + "pop %1\n\t"\ + : "=g" (res), "=g" (flags)\ + : "r" (s1), "0" (res), "1" (flags)); +#else +#define EXECSHIFT(size, rsize, res, s1, s2, flags) \ + asm ("push %4\n\t"\ + "popf\n\t"\ + stringify(OP) size " %%cl, %" rsize "0\n\t" \ + "pushf\n\t"\ + "pop %1\n\t"\ + : "=q" (res), "=g" (flags)\ + : "c" (s1), "0" (res), "1" (flags)); +#endif + +#if defined(__x86_64__) +void exec_opq(long s2, long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECSHIFT("q", "", res, s1, s2, flags); + /* overflow is undefined if count != 1 */ + if (s1 != 1) + flags &= ~CC_O; + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", + stringify(OP) "q", s0, s1, res, iflags, flags & CC_MASK); +} +#endif + +void exec_opl(long s2, long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECSHIFT("l", "k", res, s1, s2, flags); + /* overflow is undefined if count != 1 */ + if (s1 != 1) + flags &= ~CC_O; + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", + stringify(OP) "l", s0, s1, res, iflags, flags & CC_MASK); +} + +void exec_opw(long s2, long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECSHIFT("w", "w", res, s1, s2, flags); + /* overflow is undefined if count != 1 */ + if (s1 != 1) + flags &= ~CC_O; + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", + stringify(OP) "w", s0, s1, res, iflags, flags & CC_MASK); +} + +#else +#define EXECSHIFT(size, rsize, res, s1, s2, flags) \ + asm ("push %4\n\t"\ + "popf\n\t"\ + stringify(OP) size " %%cl, %" rsize "5, %" rsize "0\n\t" \ + "pushf\n\t"\ + "pop %1\n\t"\ + : "=g" (res), "=g" (flags)\ + : "c" (s1), "0" (res), "1" (flags), "r" (s2)); + +#if defined(__x86_64__) +void exec_opq(long s2, long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECSHIFT("q", "", res, s1, s2, flags); + /* overflow is undefined if count != 1 */ + if (s1 != 1) + flags &= ~CC_O; + printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", + stringify(OP) "q", s0, s2, s1, res, iflags, flags & CC_MASK); +} +#endif + +void exec_opl(long s2, long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECSHIFT("l", "k", res, s1, s2, flags); + /* overflow is undefined if count != 1 */ + if (s1 != 1) + flags &= ~CC_O; + printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", + stringify(OP) "l", s0, s2, s1, res, iflags, flags & CC_MASK); +} + +void exec_opw(long s2, long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECSHIFT("w", "w", res, s1, s2, flags); + /* overflow is undefined if count != 1 */ + if (s1 != 1) + flags &= ~CC_O; + printf("%-10s A=" FMTLX " B=" FMTLX " C=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", + stringify(OP) "w", s0, s2, s1, res, iflags, flags & CC_MASK); +} + +#endif + +#ifndef OP_NOBYTE +void exec_opb(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECSHIFT("b", "b", res, s1, 0, flags); + /* overflow is undefined if count != 1 */ + if (s1 != 1) + flags &= ~CC_O; + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", + stringify(OP) "b", s0, s1, res, iflags, flags & CC_MASK); +} +#endif + +void exec_op(long s2, long s0, long s1) +{ + s2 = i2l(s2); + s0 = i2l(s0); +#if defined(__x86_64__) + exec_opq(s2, s0, s1, 0); +#endif + exec_opl(s2, s0, s1, 0); +#ifdef OP_SHIFTD + exec_opw(s2, s0, s1, 0); +#else + exec_opw(s2, s0, s1, 0); +#endif +#ifndef OP_NOBYTE + exec_opb(s0, s1, 0); +#endif +#ifdef OP_CC +#if defined(__x86_64__) + exec_opq(s2, s0, s1, CC_C); +#endif + exec_opl(s2, s0, s1, CC_C); + exec_opw(s2, s0, s1, CC_C); + exec_opb(s0, s1, CC_C); +#endif +} + +void glue(test_, OP)(void) +{ + int i, n; +#if defined(__x86_64__) + n = 64; +#else + n = 32; +#endif + for(i = 0; i < n; i++) + exec_op(0x21ad3d34, 0x12345678, i); + for(i = 0; i < n; i++) + exec_op(0x813f3421, 0x82345679, i); +} + +void *glue(_test_, OP) __init_call = glue(test_, OP); + +#undef OP +#undef OP_CC +#undef OP_SHIFTD +#undef OP_NOBYTE +#undef EXECSHIFT diff --git a/tests/qemu/test-i386-vm86.S b/tests/qemu/test-i386-vm86.S new file mode 100644 index 00000000..3bb96c99 --- /dev/null +++ b/tests/qemu/test-i386-vm86.S @@ -0,0 +1,103 @@ + .code16 + .globl vm86_code_start + .globl vm86_code_end + +#define GET_OFFSET(x) ((x) - vm86_code_start + 0x100) + +vm86_code_start: + movw $GET_OFFSET(hello_world), %dx + movb $0x09, %ah + int $0x21 + + /* prepare int 0x90 vector */ + xorw %ax, %ax + movw %ax, %es + es movw $GET_OFFSET(int90_test), 0x90 * 4 + es movw %cs, 0x90 * 4 + 2 + + /* launch int 0x90 */ + + int $0x90 + + /* test IF support */ + movw $GET_OFFSET(IF_msg), %dx + movb $0x09, %ah + int $0x21 + + pushf + popw %dx + movb $0xff, %ah + int $0x21 + + cli + pushf + popw %dx + movb $0xff, %ah + int $0x21 + + sti + pushfl + popl %edx + movb $0xff, %ah + int $0x21 + +#if 0 + movw $GET_OFFSET(IF_msg1), %dx + movb $0x09, %ah + int $0x21 + + pushf + movw %sp, %bx + andw $~0x200, (%bx) + popf +#else + cli +#endif + + pushf + popw %dx + movb $0xff, %ah + int $0x21 + + pushfl + movw %sp, %bx + orw $0x200, (%bx) + popfl + + pushfl + popl %edx + movb $0xff, %ah + int $0x21 + + movb $0x00, %ah + int $0x21 + +int90_test: + pushf + pop %dx + movb $0xff, %ah + int $0x21 + + movw %sp, %bx + movw 4(%bx), %dx + movb $0xff, %ah + int $0x21 + + movw $GET_OFFSET(int90_msg), %dx + movb $0x09, %ah + int $0x21 + iret + +int90_msg: + .string "INT90 started\n$" + +hello_world: + .string "Hello VM86 world\n$" + +IF_msg: + .string "VM86 IF test\n$" + +IF_msg1: + .string "If you see a diff here, your Linux kernel is buggy, please update to 2.4.20 kernel\n$" + +vm86_code_end: diff --git a/tests/qemu/test-i386.c b/tests/qemu/test-i386.c new file mode 100644 index 00000000..ed5557a5 --- /dev/null +++ b/tests/qemu/test-i386.c @@ -0,0 +1,2774 @@ +/* + * x86 CPU test + * + * Copyright (c) 2003 Fabrice Bellard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ +#define _GNU_SOURCE +#include "compiler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(__x86_64__) +//#define TEST_VM86 +#define TEST_SEGS +#endif +//#define LINUX_VM86_IOPL_FIX +//#define TEST_P4_FLAGS +#ifdef __SSE__ +#define TEST_SSE +#define TEST_CMOV 1 +#define TEST_FCOMI 1 +#else +#undef TEST_SSE +#define TEST_CMOV 1 +#define TEST_FCOMI 1 +#endif + +#if defined(__x86_64__) +#define FMT64X "%016lx" +#define FMTLX "%016lx" +#define X86_64_ONLY(x) x +#else +#define FMT64X "%016" PRIx64 +#define FMTLX "%08lx" +#define X86_64_ONLY(x) +#endif + +#ifdef TEST_VM86 +#include +#endif + +#define xglue(x, y) x ## y +#define glue(x, y) xglue(x, y) +#define stringify(s) tostring(s) +#define tostring(s) #s + +#define CC_C 0x0001 +#define CC_P 0x0004 +#define CC_A 0x0010 +#define CC_Z 0x0040 +#define CC_S 0x0080 +#define CC_O 0x0800 + +#define __init_call __attribute__ ((unused,__section__ ("initcall"))) + +#define CC_MASK (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A) + +#if defined(__x86_64__) +static inline long i2l(long v) +{ + return v | ((v ^ 0xabcd) << 32); +} +#else +static inline long i2l(long v) +{ + return v; +} +#endif + +#define OP add +#include "test-i386.h" + +#define OP sub +#include "test-i386.h" + +#define OP xor +#include "test-i386.h" + +#define OP and +#include "test-i386.h" + +#define OP or +#include "test-i386.h" + +#define OP cmp +#include "test-i386.h" + +#define OP adc +#define OP_CC +#include "test-i386.h" + +#define OP sbb +#define OP_CC +#include "test-i386.h" + +#define OP inc +#define OP_CC +#define OP1 +#include "test-i386.h" + +#define OP dec +#define OP_CC +#define OP1 +#include "test-i386.h" + +#define OP neg +#define OP_CC +#define OP1 +#include "test-i386.h" + +#define OP not +#define OP_CC +#define OP1 +#include "test-i386.h" + +#undef CC_MASK +#define CC_MASK (CC_C | CC_P | CC_Z | CC_S | CC_O) + +#define OP shl +#include "test-i386-shift.h" + +#define OP shr +#include "test-i386-shift.h" + +#define OP sar +#include "test-i386-shift.h" + +#define OP rol +#include "test-i386-shift.h" + +#define OP ror +#include "test-i386-shift.h" + +#define OP rcr +#define OP_CC +#include "test-i386-shift.h" + +#define OP rcl +#define OP_CC +#include "test-i386-shift.h" + +#define OP shld +#define OP_SHIFTD +#define OP_NOBYTE +#include "test-i386-shift.h" + +#define OP shrd +#define OP_SHIFTD +#define OP_NOBYTE +#include "test-i386-shift.h" + +/* XXX: should be more precise ? */ +#undef CC_MASK +#define CC_MASK (CC_C) + +#define OP bt +#define OP_NOBYTE +#include "test-i386-shift.h" + +#define OP bts +#define OP_NOBYTE +#include "test-i386-shift.h" + +#define OP btr +#define OP_NOBYTE +#include "test-i386-shift.h" + +#define OP btc +#define OP_NOBYTE +#include "test-i386-shift.h" + +/* lea test (modrm support) */ +#define TEST_LEAQ(STR)\ +{\ + asm("lea " STR ", %0"\ + : "=r" (res)\ + : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));\ + printf("lea %s = " FMTLX "\n", STR, res);\ +} + +#define TEST_LEA(STR)\ +{\ + asm("lea " STR ", %0"\ + : "=r" (res)\ + : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));\ + printf("lea %s = " FMTLX "\n", STR, res);\ +} + +#define TEST_LEA16(STR)\ +{\ + asm(".code16 ; .byte 0x67 ; leal " STR ", %0 ; .code32"\ + : "=wq" (res)\ + : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));\ + printf("lea %s = %08lx\n", STR, res);\ +} + + +void test_lea(void) +{ + long eax, ebx, ecx, edx, esi, edi, res; + eax = i2l(0x0001); + ebx = i2l(0x0002); + ecx = i2l(0x0004); + edx = i2l(0x0008); + esi = i2l(0x0010); + edi = i2l(0x0020); + + TEST_LEA("0x4000"); + + TEST_LEA("(%%eax)"); + TEST_LEA("(%%ebx)"); + TEST_LEA("(%%ecx)"); + TEST_LEA("(%%edx)"); + TEST_LEA("(%%esi)"); + TEST_LEA("(%%edi)"); + + TEST_LEA("0x40(%%eax)"); + TEST_LEA("0x40(%%ebx)"); + TEST_LEA("0x40(%%ecx)"); + TEST_LEA("0x40(%%edx)"); + TEST_LEA("0x40(%%esi)"); + TEST_LEA("0x40(%%edi)"); + + TEST_LEA("0x4000(%%eax)"); + TEST_LEA("0x4000(%%ebx)"); + TEST_LEA("0x4000(%%ecx)"); + TEST_LEA("0x4000(%%edx)"); + TEST_LEA("0x4000(%%esi)"); + TEST_LEA("0x4000(%%edi)"); + + TEST_LEA("(%%eax, %%ecx)"); + TEST_LEA("(%%ebx, %%edx)"); + TEST_LEA("(%%ecx, %%ecx)"); + TEST_LEA("(%%edx, %%ecx)"); + TEST_LEA("(%%esi, %%ecx)"); + TEST_LEA("(%%edi, %%ecx)"); + + TEST_LEA("0x40(%%eax, %%ecx)"); + TEST_LEA("0x4000(%%ebx, %%edx)"); + + TEST_LEA("(%%ecx, %%ecx, 2)"); + TEST_LEA("(%%edx, %%ecx, 4)"); + TEST_LEA("(%%esi, %%ecx, 8)"); + + TEST_LEA("(,%%eax, 2)"); + TEST_LEA("(,%%ebx, 4)"); + TEST_LEA("(,%%ecx, 8)"); + + TEST_LEA("0x40(,%%eax, 2)"); + TEST_LEA("0x40(,%%ebx, 4)"); + TEST_LEA("0x40(,%%ecx, 8)"); + + + TEST_LEA("-10(%%ecx, %%ecx, 2)"); + TEST_LEA("-10(%%edx, %%ecx, 4)"); + TEST_LEA("-10(%%esi, %%ecx, 8)"); + + TEST_LEA("0x4000(%%ecx, %%ecx, 2)"); + TEST_LEA("0x4000(%%edx, %%ecx, 4)"); + TEST_LEA("0x4000(%%esi, %%ecx, 8)"); + +#if defined(__x86_64__) + TEST_LEAQ("0x4000"); + TEST_LEAQ("0x4000(%%rip)"); + + TEST_LEAQ("(%%rax)"); + TEST_LEAQ("(%%rbx)"); + TEST_LEAQ("(%%rcx)"); + TEST_LEAQ("(%%rdx)"); + TEST_LEAQ("(%%rsi)"); + TEST_LEAQ("(%%rdi)"); + + TEST_LEAQ("0x40(%%rax)"); + TEST_LEAQ("0x40(%%rbx)"); + TEST_LEAQ("0x40(%%rcx)"); + TEST_LEAQ("0x40(%%rdx)"); + TEST_LEAQ("0x40(%%rsi)"); + TEST_LEAQ("0x40(%%rdi)"); + + TEST_LEAQ("0x4000(%%rax)"); + TEST_LEAQ("0x4000(%%rbx)"); + TEST_LEAQ("0x4000(%%rcx)"); + TEST_LEAQ("0x4000(%%rdx)"); + TEST_LEAQ("0x4000(%%rsi)"); + TEST_LEAQ("0x4000(%%rdi)"); + + TEST_LEAQ("(%%rax, %%rcx)"); + TEST_LEAQ("(%%rbx, %%rdx)"); + TEST_LEAQ("(%%rcx, %%rcx)"); + TEST_LEAQ("(%%rdx, %%rcx)"); + TEST_LEAQ("(%%rsi, %%rcx)"); + TEST_LEAQ("(%%rdi, %%rcx)"); + + TEST_LEAQ("0x40(%%rax, %%rcx)"); + TEST_LEAQ("0x4000(%%rbx, %%rdx)"); + + TEST_LEAQ("(%%rcx, %%rcx, 2)"); + TEST_LEAQ("(%%rdx, %%rcx, 4)"); + TEST_LEAQ("(%%rsi, %%rcx, 8)"); + + TEST_LEAQ("(,%%rax, 2)"); + TEST_LEAQ("(,%%rbx, 4)"); + TEST_LEAQ("(,%%rcx, 8)"); + + TEST_LEAQ("0x40(,%%rax, 2)"); + TEST_LEAQ("0x40(,%%rbx, 4)"); + TEST_LEAQ("0x40(,%%rcx, 8)"); + + + TEST_LEAQ("-10(%%rcx, %%rcx, 2)"); + TEST_LEAQ("-10(%%rdx, %%rcx, 4)"); + TEST_LEAQ("-10(%%rsi, %%rcx, 8)"); + + TEST_LEAQ("0x4000(%%rcx, %%rcx, 2)"); + TEST_LEAQ("0x4000(%%rdx, %%rcx, 4)"); + TEST_LEAQ("0x4000(%%rsi, %%rcx, 8)"); +#else + /* limited 16 bit addressing test */ + //TEST_LEA16("0x4000"); + //TEST_LEA16("(%%bx)"); + //TEST_LEA16("(%%si)"); + //TEST_LEA16("(%%di)"); + //TEST_LEA16("0x40(%%bx)"); + //TEST_LEA16("0x40(%%si)"); + //TEST_LEA16("0x40(%%di)"); + //TEST_LEA16("0x4000(%%bx)"); + //TEST_LEA16("0x4000(%%si)"); + //TEST_LEA16("(%%bx,%%si)"); + //TEST_LEA16("(%%bx,%%di)"); + //TEST_LEA16("0x40(%%bx,%%si)"); + //TEST_LEA16("0x40(%%bx,%%di)"); + //TEST_LEA16("0x4000(%%bx,%%si)"); + //TEST_LEA16("0x4000(%%bx,%%di)"); +#endif +} + +#define TEST_JCC(JCC, v1, v2)\ +{\ + int res;\ + asm("movl $1, %0\n\t"\ + "cmpl %2, %1\n\t"\ + "j" JCC " 1f\n\t"\ + "movl $0, %0\n\t"\ + "1:\n\t"\ + : "=r" (res)\ + : "r" (v1), "r" (v2));\ + printf("%-10s %d\n", "j" JCC, res);\ +\ + asm("movl $0, %0\n\t"\ + "cmpl %2, %1\n\t"\ + "set" JCC " %b0\n\t"\ + : "=r" (res)\ + : "r" (v1), "r" (v2));\ + printf("%-10s %d\n", "set" JCC, res);\ + if (TEST_CMOV) {\ + long val = i2l(1);\ + long res = i2l(0x12345678);\ +X86_64_ONLY(\ + asm("cmpl %2, %1\n\t"\ + "cmov" JCC "q %3, %0\n\t"\ + : "=r" (res)\ + : "r" (v1), "r" (v2), "m" (val), "0" (res));\ + printf("%-10s R=" FMTLX "\n", "cmov" JCC "q", res);)\ + asm("cmpl %2, %1\n\t"\ + "cmov" JCC "l %k3, %k0\n\t"\ + : "=r" (res)\ + : "r" (v1), "r" (v2), "m" (val), "0" (res));\ + printf("%-10s R=" FMTLX "\n", "cmov" JCC "l", res);\ + asm("cmpl %2, %1\n\t"\ + "cmov" JCC "w %w3, %w0\n\t"\ + : "=r" (res)\ + : "r" (v1), "r" (v2), "r" (1), "0" (res));\ + printf("%-10s R=" FMTLX "\n", "cmov" JCC "w", res);\ + } \ +} + +/* various jump tests */ +void test_jcc(void) +{ + TEST_JCC("ne", 1, 1); + TEST_JCC("ne", 1, 0); + + TEST_JCC("e", 1, 1); + TEST_JCC("e", 1, 0); + + TEST_JCC("l", 1, 1); + TEST_JCC("l", 1, 0); + TEST_JCC("l", 1, -1); + + TEST_JCC("le", 1, 1); + TEST_JCC("le", 1, 0); + TEST_JCC("le", 1, -1); + + TEST_JCC("ge", 1, 1); + TEST_JCC("ge", 1, 0); + TEST_JCC("ge", -1, 1); + + TEST_JCC("g", 1, 1); + TEST_JCC("g", 1, 0); + TEST_JCC("g", 1, -1); + + TEST_JCC("b", 1, 1); + TEST_JCC("b", 1, 0); + TEST_JCC("b", 1, -1); + + TEST_JCC("be", 1, 1); + TEST_JCC("be", 1, 0); + TEST_JCC("be", 1, -1); + + TEST_JCC("ae", 1, 1); + TEST_JCC("ae", 1, 0); + TEST_JCC("ae", 1, -1); + + TEST_JCC("a", 1, 1); + TEST_JCC("a", 1, 0); + TEST_JCC("a", 1, -1); + + + TEST_JCC("p", 1, 1); + TEST_JCC("p", 1, 0); + + TEST_JCC("np", 1, 1); + TEST_JCC("np", 1, 0); + + TEST_JCC("o", 0x7fffffff, 0); + TEST_JCC("o", 0x7fffffff, -1); + + TEST_JCC("no", 0x7fffffff, 0); + TEST_JCC("no", 0x7fffffff, -1); + + TEST_JCC("s", 0, 1); + TEST_JCC("s", 0, -1); + TEST_JCC("s", 0, 0); + + TEST_JCC("ns", 0, 1); + TEST_JCC("ns", 0, -1); + TEST_JCC("ns", 0, 0); +} + +#define TEST_LOOP(insn) \ +{\ + for(i = 0; i < sizeof(ecx_vals) / sizeof(long); i++) {\ + ecx = ecx_vals[i];\ + for(zf = 0; zf < 2; zf++) {\ + asm("test %2, %2\n\t"\ + "movl $1, %0\n\t"\ + insn " 1f\n\t" \ + "movl $0, %0\n\t"\ + "1:\n\t"\ + : "=a" (res)\ + : "c" (ecx), "b" (!zf)); \ + printf("%-10s ECX=" FMTLX " ZF=%ld r=%d\n", insn, ecx, zf, res); \ + }\ + }\ +} + +void test_loop(void) +{ + long ecx, zf; + const long ecx_vals[] = { + 0, + 1, + 0x10000, + 0x10001, +#if defined(__x86_64__) + 0x100000000L, + 0x100000001L, +#endif + }; + int i, res; + +#if !defined(__x86_64__) + TEST_LOOP("jcxz"); + TEST_LOOP("loopw"); + TEST_LOOP("loopzw"); + TEST_LOOP("loopnzw"); +#endif + + TEST_LOOP("jecxz"); + TEST_LOOP("loopl"); + TEST_LOOP("loopzl"); + TEST_LOOP("loopnzl"); +} + +#undef CC_MASK +#ifdef TEST_P4_FLAGS +#define CC_MASK (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A) +#else +#define CC_MASK (CC_O | CC_C) +#endif + +#define OP mul +#include "test-i386-muldiv.h" + +#define OP imul +#include "test-i386-muldiv.h" + +void test_imulw2(long op0, long op1) +{ + long res, s1, s0, flags; + s0 = op0; + s1 = op1; + res = s0; + flags = 0; + asm volatile ("push %4\n\t" + "popf\n\t" + "imulw %w2, %w0\n\t" + "pushf\n\t" + "pop %1\n\t" + : "=q" (res), "=g" (flags) + : "q" (s1), "0" (res), "1" (flags)); + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CC=%04lx\n", + "imulw", s0, s1, res, flags & CC_MASK); +} + +void test_imull2(long op0, long op1) +{ + long res, s1, s0, flags; + s0 = op0; + s1 = op1; + res = s0; + flags = 0; + asm volatile ("push %4\n\t" + "popf\n\t" + "imull %k2, %k0\n\t" + "pushf\n\t" + "pop %1\n\t" + : "=q" (res), "=g" (flags) + : "q" (s1), "0" (res), "1" (flags)); + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CC=%04lx\n", + "imull", s0, s1, res, flags & CC_MASK); +} + +#if defined(__x86_64__) +void test_imulq2(long op0, long op1) +{ + long res, s1, s0, flags; + s0 = op0; + s1 = op1; + res = s0; + flags = 0; + asm volatile ("push %4\n\t" + "popf\n\t" + "imulq %2, %0\n\t" + "pushf\n\t" + "pop %1\n\t" + : "=q" (res), "=g" (flags) + : "q" (s1), "0" (res), "1" (flags)); + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CC=%04lx\n", + "imulq", s0, s1, res, flags & CC_MASK); +} +#endif + +#define TEST_IMUL_IM(size, rsize, op0, op1)\ +{\ + long res, flags, s1;\ + flags = 0;\ + res = 0;\ + s1 = op1;\ + asm volatile ("push %3\n\t"\ + "popf\n\t"\ + "imul" size " $" #op0 ", %" rsize "2, %" rsize "0\n\t" \ + "pushf\n\t"\ + "pop %1\n\t"\ + : "=r" (res), "=g" (flags)\ + : "r" (s1), "1" (flags), "0" (res));\ + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CC=%04lx\n",\ + "imul" size " im", (long)op0, (long)op1, res, flags & CC_MASK);\ +} + + +#undef CC_MASK +#define CC_MASK (0) + +#define OP div +#include "test-i386-muldiv.h" + +#define OP idiv +#include "test-i386-muldiv.h" + +void test_mul(void) +{ + test_imulb(0x1234561d, 4); + test_imulb(3, -4); + test_imulb(0x80, 0x80); + test_imulb(0x10, 0x10); + + test_imulw(0, 0x1234001d, 45); + test_imulw(0, 23, -45); + test_imulw(0, 0x8000, 0x8000); + test_imulw(0, 0x100, 0x100); + + test_imull(0, 0x1234001d, 45); + test_imull(0, 23, -45); + test_imull(0, 0x80000000, 0x80000000); + test_imull(0, 0x10000, 0x10000); + + test_mulb(0x1234561d, 4); + test_mulb(3, -4); + test_mulb(0x80, 0x80); + test_mulb(0x10, 0x10); + + test_mulw(0, 0x1234001d, 45); + test_mulw(0, 23, -45); + test_mulw(0, 0x8000, 0x8000); + test_mulw(0, 0x100, 0x100); + + test_mull(0, 0x1234001d, 45); + test_mull(0, 23, -45); + test_mull(0, 0x80000000, 0x80000000); + test_mull(0, 0x10000, 0x10000); + + test_imulw2(0x1234001d, 45); + test_imulw2(23, -45); + test_imulw2(0x8000, 0x8000); + test_imulw2(0x100, 0x100); + + test_imull2(0x1234001d, 45); + test_imull2(23, -45); + test_imull2(0x80000000, 0x80000000); + test_imull2(0x10000, 0x10000); + + TEST_IMUL_IM("w", "w", 45, 0x1234); + TEST_IMUL_IM("w", "w", -45, 23); + TEST_IMUL_IM("w", "w", 0x8000, 0x80000000); + TEST_IMUL_IM("w", "w", 0x7fff, 0x1000); + + TEST_IMUL_IM("l", "k", 45, 0x1234); + TEST_IMUL_IM("l", "k", -45, 23); + TEST_IMUL_IM("l", "k", 0x8000, 0x80000000); + TEST_IMUL_IM("l", "k", 0x7fff, 0x1000); + + test_idivb(0x12341678, 0x127e); + test_idivb(0x43210123, -5); + test_idivb(0x12340004, -1); + + test_idivw(0, 0x12345678, 12347); + test_idivw(0, -23223, -45); + test_idivw(0, 0x12348000, -1); + test_idivw(0x12343, 0x12345678, 0x81238567); + + test_idivl(0, 0x12345678, 12347); + test_idivl(0, -233223, -45); + test_idivl(0, 0x80000000, -1); + test_idivl(0x12343, 0x12345678, 0x81234567); + + test_divb(0x12341678, 0x127e); + test_divb(0x43210123, -5); + test_divb(0x12340004, -1); + + test_divw(0, 0x12345678, 12347); + test_divw(0, -23223, -45); + test_divw(0, 0x12348000, -1); + test_divw(0x12343, 0x12345678, 0x81238567); + + test_divl(0, 0x12345678, 12347); + test_divl(0, -233223, -45); + test_divl(0, 0x80000000, -1); + test_divl(0x12343, 0x12345678, 0x81234567); + +#if defined(__x86_64__) + test_imulq(0, 0x1234001d1234001d, 45); + test_imulq(0, 23, -45); + test_imulq(0, 0x8000000000000000, 0x8000000000000000); + test_imulq(0, 0x100000000, 0x100000000); + + test_mulq(0, 0x1234001d1234001d, 45); + test_mulq(0, 23, -45); + test_mulq(0, 0x8000000000000000, 0x8000000000000000); + test_mulq(0, 0x100000000, 0x100000000); + + test_imulq2(0x1234001d1234001d, 45); + test_imulq2(23, -45); + test_imulq2(0x8000000000000000, 0x8000000000000000); + test_imulq2(0x100000000, 0x100000000); + + TEST_IMUL_IM("q", "", 45, 0x12341234); + TEST_IMUL_IM("q", "", -45, 23); + TEST_IMUL_IM("q", "", 0x8000, 0x8000000000000000); + TEST_IMUL_IM("q", "", 0x7fff, 0x10000000); + + test_idivq(0, 0x12345678abcdef, 12347); + test_idivq(0, -233223, -45); + test_idivq(0, 0x8000000000000000, -1); + test_idivq(0x12343, 0x12345678, 0x81234567); + + test_divq(0, 0x12345678abcdef, 12347); + test_divq(0, -233223, -45); + test_divq(0, 0x8000000000000000, -1); + test_divq(0x12343, 0x12345678, 0x81234567); +#endif +} + +#define TEST_BSX(op, size, op0)\ +{\ + long res, val, resz;\ + val = op0;\ + asm("xor %1, %1\n"\ + "mov $0x12345678, %0\n"\ + #op " %" size "2, %" size "0 ; setz %b1" \ + : "=&r" (res), "=&q" (resz)\ + : "r" (val));\ + printf("%-10s A=" FMTLX " R=" FMTLX " %ld\n", #op, val, res, resz);\ +} + +void test_bsx(void) +{ + TEST_BSX(bsrw, "w", 0); + TEST_BSX(bsrw, "w", 0x12340128); + TEST_BSX(bsfw, "w", 0); + TEST_BSX(bsfw, "w", 0x12340128); + TEST_BSX(bsrl, "k", 0); + TEST_BSX(bsrl, "k", 0x00340128); + TEST_BSX(bsfl, "k", 0); + TEST_BSX(bsfl, "k", 0x00340128); +#if defined(__x86_64__) + TEST_BSX(bsrq, "", 0); + TEST_BSX(bsrq, "", 0x003401281234); + TEST_BSX(bsfq, "", 0); + TEST_BSX(bsfq, "", 0x003401281234); +#endif +} + +/**********************************************/ + +union float64u { + double d; + uint64_t l; +}; + +union float64u q_nan = { .l = 0xFFF8000000000000LL }; +union float64u s_nan = { .l = 0xFFF0000000000000LL }; + +void test_fops(double a, double b) +{ + printf("a=%f b=%f a+b=%f\n", a, b, a + b); + printf("a=%f b=%f a-b=%f\n", a, b, a - b); + printf("a=%f b=%f a*b=%f\n", a, b, a * b); + printf("a=%f b=%f a/b=%f\n", a, b, a / b); + //printf("a=%f b=%f fmod(a, b)=%f\n", a, b, fmod(a, b)); + printf("a=%f sqrt(a)=%f\n", a, sqrt(a)); + printf("a=%f sin(a)=%f\n", a, sin(a)); + printf("a=%f cos(a)=%f\n", a, cos(a)); + printf("a=%f tan(a)=%f\n", a, tan(a)); + printf("a=%f log(a)=%f\n", a, log(a)); + printf("a=%f exp(a)=%f\n", a, exp(a)); + printf("a=%f b=%f atan2(a, b)=%f\n", a, b, atan2(a, b)); + /* just to test some op combining */ + printf("a=%f asin(sin(a))=%f\n", a, asin(sin(a))); + printf("a=%f acos(cos(a))=%f\n", a, acos(cos(a))); + printf("a=%f atan(tan(a))=%f\n", a, atan(tan(a))); + +} + +void fpu_clear_exceptions(void) +{ + struct QEMU_PACKED { + uint16_t fpuc; + uint16_t dummy1; + uint16_t fpus; + uint16_t dummy2; + uint16_t fptag; + uint16_t dummy3; + uint32_t ignored[4]; + long double fpregs[8]; + } float_env32; + + asm volatile ("fnstenv %0\n" : "=m" (float_env32)); + float_env32.fpus &= ~0x7f; + asm volatile ("fldenv %0\n" : : "m" (float_env32)); +} + +/* XXX: display exception bits when supported */ +#define FPUS_EMASK 0x0000 +//#define FPUS_EMASK 0x007f + +void test_fcmp(double a, double b) +{ + long eflags, fpus; + + fpu_clear_exceptions(); + asm("fcom %2\n" + "fstsw %%ax\n" + : "=a" (fpus) + : "t" (a), "u" (b)); + printf("fcom(%f %f)=%04lx\n", + a, b, fpus & (0x4500 | FPUS_EMASK)); + fpu_clear_exceptions(); + asm("fucom %2\n" + "fstsw %%ax\n" + : "=a" (fpus) + : "t" (a), "u" (b)); + printf("fucom(%f %f)=%04lx\n", + a, b, fpus & (0x4500 | FPUS_EMASK)); + if (TEST_FCOMI) { + /* test f(u)comi instruction */ + fpu_clear_exceptions(); + asm("fcomi %3, %2\n" + "fstsw %%ax\n" + "pushf\n" + "pop %0\n" + : "=r" (eflags), "=a" (fpus) + : "t" (a), "u" (b)); + printf("fcomi(%f %f)=%04lx %02lx\n", + a, b, fpus & FPUS_EMASK, eflags & (CC_Z | CC_P | CC_C)); + fpu_clear_exceptions(); + asm("fucomi %3, %2\n" + "fstsw %%ax\n" + "pushf\n" + "pop %0\n" + : "=r" (eflags), "=a" (fpus) + : "t" (a), "u" (b)); + printf("fucomi(%f %f)=%04lx %02lx\n", + a, b, fpus & FPUS_EMASK, eflags & (CC_Z | CC_P | CC_C)); + } + fpu_clear_exceptions(); + asm volatile("fxam\n" + "fstsw %%ax\n" + : "=a" (fpus) + : "t" (a)); + printf("fxam(%f)=%04lx\n", a, fpus & 0x4700); + fpu_clear_exceptions(); +} + +void test_fcvt(double a) +{ + float fa; + long double la; + int16_t fpuc; + int i; + int64_t lla; + int ia; + int16_t wa; + double ra; + + fa = a; + la = a; + printf("(float)%f = %f\n", a, fa); + printf("(long double)%f = %Lf\n", a, la); + printf("a=" FMT64X "\n", *(uint64_t *)&a); + printf("la=" FMT64X " %04x\n", *(uint64_t *)&la, + *(unsigned short *)((char *)(&la) + 8)); + + /* test all roundings */ + asm volatile ("fstcw %0" : "=m" (fpuc)); + for(i=0;i<4;i++) { + uint16_t val16; + val16 = (fpuc & ~0x0c00) | (i << 10); + asm volatile ("fldcw %0" : : "m" (val16)); + asm volatile ("fist %0" : "=m" (wa) : "t" (a)); + asm volatile ("fistl %0" : "=m" (ia) : "t" (a)); + asm volatile ("fistpll %0" : "=m" (lla) : "t" (a) : "st"); + asm volatile ("frndint ; fstl %0" : "=m" (ra) : "t" (a)); + asm volatile ("fldcw %0" : : "m" (fpuc)); + printf("(short)a = %d\n", wa); + printf("(int)a = %d\n", ia); + printf("(int64_t)a = " FMT64X "\n", lla); + printf("rint(a) = %f\n", ra); + } +} + +#define TEST(N) \ + asm("fld" #N : "=t" (a)); \ + printf("fld" #N "= %f\n", a); + +void test_fconst(void) +{ + double a; + TEST(1); + TEST(l2t); + TEST(l2e); + TEST(pi); + TEST(lg2); + TEST(ln2); + TEST(z); +} + +void test_fbcd(double a) +{ + unsigned short bcd[5]; + double b; + + asm("fbstp %0" : "=m" (bcd[0]) : "t" (a) : "st"); + asm("fbld %1" : "=t" (b) : "m" (bcd[0])); + printf("a=%f bcd=%04x%04x%04x%04x%04x b=%f\n", + a, bcd[4], bcd[3], bcd[2], bcd[1], bcd[0], b); +} + +#define TEST_ENV(env, save, restore)\ +{\ + memset((env), 0xaa, sizeof(*(env)));\ + for(i=0;i<5;i++)\ + asm volatile ("fldl %0" : : "m" (dtab[i]));\ + asm volatile (save " %0\n" : : "m" (*(env)));\ + asm volatile (restore " %0\n": : "m" (*(env)));\ + for(i=0;i<5;i++)\ + asm volatile ("fstpl %0" : "=m" (rtab[i]));\ + for(i=0;i<5;i++)\ + printf("res[%d]=%f\n", i, rtab[i]);\ + printf("fpuc=%04x fpus=%04x fptag=%04x\n",\ + (env)->fpuc,\ + (env)->fpus & 0xff00,\ + (env)->fptag);\ +} + +void test_fenv(void) +{ + struct QEMU_PACKED { + uint16_t fpuc; + uint16_t dummy1; + uint16_t fpus; + uint16_t dummy2; + uint16_t fptag; + uint16_t dummy3; + uint32_t ignored[4]; + long double fpregs[8]; + } float_env32; + struct QEMU_PACKED { + uint16_t fpuc; + uint16_t fpus; + uint16_t fptag; + uint16_t ignored[4]; + long double fpregs[8]; + } float_env16; + double dtab[8]; + double rtab[8]; + int i; + + for(i=0;i<8;i++) + dtab[i] = i + 1; + + //TEST_ENV(&float_env16, "data16 fnstenv", "data16 fldenv"); + //TEST_ENV(&float_env16, "data16 fnsave", "data16 frstor"); + TEST_ENV(&float_env32, "fnstenv", "fldenv"); + TEST_ENV(&float_env32, "fnsave", "frstor"); + + /* test for ffree */ + for(i=0;i<5;i++) + asm volatile ("fldl %0" : : "m" (dtab[i])); + asm volatile("ffree %st(2)"); + asm volatile ("fnstenv %0\n" : : "m" (float_env32)); + asm volatile ("fninit"); + printf("fptag=%04x\n", float_env32.fptag); +} + + +#define TEST_FCMOV(a, b, eflags, CC)\ +{\ + double res;\ + asm("push %3\n"\ + "popf\n"\ + "fcmov" CC " %2, %0\n"\ + : "=t" (res)\ + : "0" (a), "u" (b), "g" (eflags));\ + printf("fcmov%s eflags=0x%04lx-> %f\n", \ + CC, (long)eflags, res);\ +} + +void test_fcmov(void) +{ + double a, b; + long eflags, i; + + a = 1.0; + b = 2.0; + for(i = 0; i < 4; i++) { + eflags = 0; + if (i & 1) + eflags |= CC_C; + if (i & 2) + eflags |= CC_Z; + TEST_FCMOV(a, b, eflags, "b"); + TEST_FCMOV(a, b, eflags, "e"); + TEST_FCMOV(a, b, eflags, "be"); + TEST_FCMOV(a, b, eflags, "nb"); + TEST_FCMOV(a, b, eflags, "ne"); + TEST_FCMOV(a, b, eflags, "nbe"); + } + TEST_FCMOV(a, b, 0, "u"); + TEST_FCMOV(a, b, CC_P, "u"); + TEST_FCMOV(a, b, 0, "nu"); + TEST_FCMOV(a, b, CC_P, "nu"); +} + +void test_floats(void) +{ + test_fops(2, 3); + test_fops(1.4, -5); + test_fcmp(2, -1); + test_fcmp(2, 2); + test_fcmp(2, 3); + test_fcmp(2, q_nan.d); + test_fcmp(q_nan.d, -1); + test_fcmp(-1.0/0.0, -1); + test_fcmp(1.0/0.0, -1); + test_fcvt(0.5); + test_fcvt(-0.5); + test_fcvt(1.0/7.0); + test_fcvt(-1.0/9.0); + test_fcvt(32768); + test_fcvt(-1e20); + test_fcvt(-1.0/0.0); + test_fcvt(1.0/0.0); + test_fcvt(q_nan.d); + test_fconst(); + //test_fbcd(1234567890123456.0); + //test_fbcd(-123451234567890.0); + test_fenv(); + if (TEST_CMOV) { + test_fcmov(); + } +} + +/**********************************************/ +#if !defined(__x86_64__) + +#define TEST_BCD(op, op0, cc_in, cc_mask)\ +{\ + int res, flags;\ + res = op0;\ + flags = cc_in;\ + asm ("push %3\n\t"\ + "popf\n\t"\ + #op "\n\t"\ + "pushf\n\t"\ + "pop %1\n\t"\ + : "=a" (res), "=g" (flags)\ + : "0" (res), "1" (flags));\ + printf("%-10s A=%08x R=%08x CCIN=%04x CC=%04x\n",\ + #op, op0, res, cc_in, flags & cc_mask);\ +} + +void test_bcd(void) +{ + TEST_BCD(daa, 0x12340503, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340506, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340507, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340559, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340560, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x1234059f, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x123405a0, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340503, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340506, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340503, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340506, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340503, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(daa, 0x12340506, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + + TEST_BCD(das, 0x12340503, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340506, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340507, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340559, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340560, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x1234059f, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x123405a0, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340503, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340506, 0, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340503, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340506, CC_C, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340503, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + TEST_BCD(das, 0x12340506, CC_C | CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_A)); + + TEST_BCD(aaa, 0x12340205, CC_A, (CC_C | CC_A)); + TEST_BCD(aaa, 0x12340306, CC_A, (CC_C | CC_A)); + TEST_BCD(aaa, 0x1234040a, CC_A, (CC_C | CC_A)); + TEST_BCD(aaa, 0x123405fa, CC_A, (CC_C | CC_A)); + TEST_BCD(aaa, 0x12340205, 0, (CC_C | CC_A)); + TEST_BCD(aaa, 0x12340306, 0, (CC_C | CC_A)); + TEST_BCD(aaa, 0x1234040a, 0, (CC_C | CC_A)); + TEST_BCD(aaa, 0x123405fa, 0, (CC_C | CC_A)); + + TEST_BCD(aas, 0x12340205, CC_A, (CC_C | CC_A)); + TEST_BCD(aas, 0x12340306, CC_A, (CC_C | CC_A)); + TEST_BCD(aas, 0x1234040a, CC_A, (CC_C | CC_A)); + TEST_BCD(aas, 0x123405fa, CC_A, (CC_C | CC_A)); + TEST_BCD(aas, 0x12340205, 0, (CC_C | CC_A)); + TEST_BCD(aas, 0x12340306, 0, (CC_C | CC_A)); + TEST_BCD(aas, 0x1234040a, 0, (CC_C | CC_A)); + TEST_BCD(aas, 0x123405fa, 0, (CC_C | CC_A)); + + TEST_BCD(aam, 0x12340547, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A)); + TEST_BCD(aad, 0x12340407, CC_A, (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A)); +} +#endif + +#define TEST_XCHG(op, size, opconst)\ +{\ + long op0, op1;\ + op0 = i2l(0x12345678);\ + op1 = i2l(0xfbca7654);\ + asm(#op " %" size "0, %" size "1" \ + : "=q" (op0), opconst (op1) \ + : "0" (op0));\ + printf("%-10s A=" FMTLX " B=" FMTLX "\n",\ + #op, op0, op1);\ +} + +#define TEST_CMPXCHG(op, size, opconst, eax)\ +{\ + long op0, op1, op2;\ + op0 = i2l(0x12345678);\ + op1 = i2l(0xfbca7654);\ + op2 = i2l(eax);\ + asm(#op " %" size "0, %" size "1" \ + : "=q" (op0), opconst (op1) \ + : "0" (op0), "a" (op2));\ + printf("%-10s EAX=" FMTLX " A=" FMTLX " C=" FMTLX "\n",\ + #op, op2, op0, op1);\ +} + +void test_xchg(void) +{ +#if defined(__x86_64__) + TEST_XCHG(xchgq, "", "+q"); +#endif + TEST_XCHG(xchgl, "k", "+q"); + TEST_XCHG(xchgw, "w", "+q"); + TEST_XCHG(xchgb, "b", "+q"); + +#if defined(__x86_64__) + TEST_XCHG(xchgq, "", "=m"); +#endif + TEST_XCHG(xchgl, "k", "+m"); + TEST_XCHG(xchgw, "w", "+m"); + TEST_XCHG(xchgb, "b", "+m"); + +#if defined(__x86_64__) + TEST_XCHG(xaddq, "", "+q"); +#endif + TEST_XCHG(xaddl, "k", "+q"); + TEST_XCHG(xaddw, "w", "+q"); + TEST_XCHG(xaddb, "b", "+q"); + + { + int res; + res = 0x12345678; + asm("xaddl %1, %0" : "=r" (res) : "0" (res)); + printf("xaddl same res=%08x\n", res); + } + +#if defined(__x86_64__) + TEST_XCHG(xaddq, "", "+m"); +#endif + TEST_XCHG(xaddl, "k", "+m"); + TEST_XCHG(xaddw, "w", "+m"); + TEST_XCHG(xaddb, "b", "+m"); + +#if defined(__x86_64__) + TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfbca7654); +#endif + TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfbca7654); + TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfbca7654); + TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfbca7654); + +#if defined(__x86_64__) + TEST_CMPXCHG(cmpxchgq, "", "+q", 0xfffefdfc); +#endif + TEST_CMPXCHG(cmpxchgl, "k", "+q", 0xfffefdfc); + TEST_CMPXCHG(cmpxchgw, "w", "+q", 0xfffefdfc); + TEST_CMPXCHG(cmpxchgb, "b", "+q", 0xfffefdfc); + +#if defined(__x86_64__) + TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfbca7654); +#endif + TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfbca7654); + TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfbca7654); + TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfbca7654); + +#if defined(__x86_64__) + TEST_CMPXCHG(cmpxchgq, "", "+m", 0xfffefdfc); +#endif + TEST_CMPXCHG(cmpxchgl, "k", "+m", 0xfffefdfc); + TEST_CMPXCHG(cmpxchgw, "w", "+m", 0xfffefdfc); + TEST_CMPXCHG(cmpxchgb, "b", "+m", 0xfffefdfc); + + { + uint64_t op0, op1, op2; + long eax, edx; + long i, eflags; + + for(i = 0; i < 2; i++) { + op0 = 0x123456789abcdLL; + eax = i2l(op0 & 0xffffffff); + edx = i2l(op0 >> 32); + if (i == 0) + op1 = 0xfbca765423456LL; + else + op1 = op0; + op2 = 0x6532432432434LL; + asm("cmpxchg8b %2\n" + "pushf\n" + "pop %3\n" + : "=a" (eax), "=d" (edx), "=m" (op1), "=g" (eflags) + : "0" (eax), "1" (edx), "m" (op1), "b" ((int)op2), "c" ((int)(op2 >> 32))); + printf("cmpxchg8b: eax=" FMTLX " edx=" FMTLX " op1=" FMT64X " CC=%02lx\n", + eax, edx, op1, eflags & CC_Z); + } + } +} + +#ifdef TEST_SEGS +/**********************************************/ +/* segmentation tests */ + +#include +#include +#include +#include + +static inline int modify_ldt(int func, void * ptr, unsigned long bytecount) +{ + return syscall(__NR_modify_ldt, func, ptr, bytecount); +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 66) +#define modify_ldt_ldt_s user_desc +#endif + +#define MK_SEL(n) (((n) << 3) | 7) + +uint8_t seg_data1[4096]; +uint8_t seg_data2[4096]; + +#define TEST_LR(op, size, seg, mask)\ +{\ + int res, res2;\ + uint16_t mseg = seg;\ + res = 0x12345678;\ + asm (op " %" size "2, %" size "0\n" \ + "movl $0, %1\n"\ + "jnz 1f\n"\ + "movl $1, %1\n"\ + "1:\n"\ + : "=r" (res), "=r" (res2) : "m" (mseg), "0" (res));\ + printf(op ": Z=%d %08x\n", res2, res & ~(mask));\ +} + +#define TEST_ARPL(op, size, op1, op2)\ +{\ + long a, b, c; \ + a = (op1); \ + b = (op2); \ + asm volatile(op " %" size "3, %" size "0\n"\ + "movl $0,%1\n"\ + "jnz 1f\n"\ + "movl $1,%1\n"\ + "1:\n"\ + : "=r" (a), "=r" (c) : "0" (a), "r" (b)); \ + printf(op size " A=" FMTLX " B=" FMTLX " R=" FMTLX " z=%ld\n",\ + (long)(op1), (long)(op2), a, c);\ +} + +/* NOTE: we use Linux modify_ldt syscall */ +void test_segs(void) +{ + struct modify_ldt_ldt_s ldt; + long long ldt_table[3]; + int res, res2; + char tmp; + struct { + uint32_t offset; + uint16_t seg; + } QEMU_PACKED segoff; + + ldt.entry_number = 1; + ldt.base_addr = (unsigned long)&seg_data1; + ldt.limit = (sizeof(seg_data1) + 0xfff) >> 12; + ldt.seg_32bit = 1; + ldt.contents = MODIFY_LDT_CONTENTS_DATA; + ldt.read_exec_only = 0; + ldt.limit_in_pages = 1; + ldt.seg_not_present = 0; + ldt.useable = 1; + modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */ + + ldt.entry_number = 2; + ldt.base_addr = (unsigned long)&seg_data2; + ldt.limit = (sizeof(seg_data2) + 0xfff) >> 12; + ldt.seg_32bit = 1; + ldt.contents = MODIFY_LDT_CONTENTS_DATA; + ldt.read_exec_only = 0; + ldt.limit_in_pages = 1; + ldt.seg_not_present = 0; + ldt.useable = 1; + modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */ + + modify_ldt(0, &ldt_table, sizeof(ldt_table)); /* read ldt entries */ +#if 0 + { + int i; + for(i=0;i<3;i++) + printf("%d: %016Lx\n", i, ldt_table[i]); + } +#endif + /* do some tests with fs or gs */ + asm volatile ("movl %0, %%fs" : : "r" (MK_SEL(1))); + + seg_data1[1] = 0xaa; + seg_data2[1] = 0x55; + + asm volatile ("fs movzbl 0x1, %0" : "=r" (res)); + printf("FS[1] = %02x\n", res); + + asm volatile ("pushl %%gs\n" + "movl %1, %%gs\n" + "gs movzbl 0x1, %0\n" + "popl %%gs\n" + : "=r" (res) + : "r" (MK_SEL(2))); + printf("GS[1] = %02x\n", res); + + /* tests with ds/ss (implicit segment case) */ + tmp = 0xa5; + asm volatile ("pushl %%ebp\n\t" + "pushl %%ds\n\t" + "movl %2, %%ds\n\t" + "movl %3, %%ebp\n\t" + "movzbl 0x1, %0\n\t" + "movzbl (%%ebp), %1\n\t" + "popl %%ds\n\t" + "popl %%ebp\n\t" + : "=r" (res), "=r" (res2) + : "r" (MK_SEL(1)), "r" (&tmp)); + printf("DS[1] = %02x\n", res); + printf("SS[tmp] = %02x\n", res2); + + segoff.seg = MK_SEL(2); + segoff.offset = 0xabcdef12; + asm volatile("lfs %2, %0\n\t" + "movl %%fs, %1\n\t" + : "=r" (res), "=g" (res2) + : "m" (segoff)); + printf("FS:reg = %04x:%08x\n", res2, res); + +#if 0 + TEST_LR("larw", "w", MK_SEL(2), 0x0100); + TEST_LR("larl", "", MK_SEL(2), 0x0100); + TEST_LR("lslw", "w", MK_SEL(2), 0); + TEST_LR("lsll", "", MK_SEL(2), 0); + + TEST_LR("larw", "w", 0xfff8, 0); + TEST_LR("larl", "", 0xfff8, 0); + TEST_LR("lslw", "w", 0xfff8, 0); + TEST_LR("lsll", "", 0xfff8, 0); +#endif + + TEST_ARPL("arpl", "w", 0x12345678 | 3, 0x762123c | 1); + TEST_ARPL("arpl", "w", 0x12345678 | 1, 0x762123c | 3); + TEST_ARPL("arpl", "w", 0x12345678 | 1, 0x762123c | 1); +} + +/* 16 bit code test */ +extern char code16_start, code16_end; +extern char code16_func1; +extern char code16_func2; +extern char code16_func3; + +void test_code16(void) +{ + struct modify_ldt_ldt_s ldt; + int res, res2; + + /* build a code segment */ + ldt.entry_number = 1; + ldt.base_addr = (unsigned long)&code16_start; + ldt.limit = &code16_end - &code16_start; + ldt.seg_32bit = 0; + ldt.contents = MODIFY_LDT_CONTENTS_CODE; + ldt.read_exec_only = 0; + ldt.limit_in_pages = 0; + ldt.seg_not_present = 0; + ldt.useable = 1; + modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */ + + /* call the first function */ + asm volatile ("lcall %1, %2" + : "=a" (res) + : "i" (MK_SEL(1)), "i" (&code16_func1): "memory", "cc"); + printf("func1() = 0x%08x\n", res); + asm volatile ("lcall %2, %3" + : "=a" (res), "=c" (res2) + : "i" (MK_SEL(1)), "i" (&code16_func2): "memory", "cc"); + printf("func2() = 0x%08x spdec=%d\n", res, res2); + asm volatile ("lcall %1, %2" + : "=a" (res) + : "i" (MK_SEL(1)), "i" (&code16_func3): "memory", "cc"); + printf("func3() = 0x%08x\n", res); +} +#endif + +#if defined(__x86_64__) +asm(".globl func_lret\n" + "func_lret:\n" + "movl $0x87654641, %eax\n" + "lretq\n"); +#else +asm(".globl func_lret\n" + "func_lret:\n" + "movl $0x87654321, %eax\n" + "lret\n" + + ".globl func_iret\n" + "func_iret:\n" + "movl $0xabcd4321, %eax\n" + "iret\n"); +#endif + +extern char func_lret; +extern char func_iret; + +void test_misc(void) +{ + char table[256]; + long res, i; + + for(i=0;i<256;i++) table[i] = 256 - i; + res = 0x12345678; + asm ("xlat" : "=a" (res) : "b" (table), "0" (res)); + printf("xlat: EAX=" FMTLX "\n", res); + +#if defined(__x86_64__) +#if 0 + { + /* XXX: see if Intel Core2 and AMD64 behavior really + differ. Here we implemented the Intel way which is not + compatible yet with QEMU. */ + static struct QEMU_PACKED { + uint64_t offset; + uint16_t seg; + } desc; + long cs_sel; + + asm volatile ("mov %%cs, %0" : "=r" (cs_sel)); + + asm volatile ("push %1\n" + "call func_lret\n" + : "=a" (res) + : "r" (cs_sel) : "memory", "cc"); + printf("func_lret=" FMTLX "\n", res); + + desc.offset = (long)&func_lret; + desc.seg = cs_sel; + + asm volatile ("xor %%rax, %%rax\n" + "rex64 lcall *(%%rcx)\n" + : "=a" (res) + : "c" (&desc) + : "memory", "cc"); + printf("func_lret2=" FMTLX "\n", res); + + asm volatile ("push %2\n" + "mov $ 1f, %%rax\n" + "push %%rax\n" + "rex64 ljmp *(%%rcx)\n" + "1:\n" + : "=a" (res) + : "c" (&desc), "b" (cs_sel) + : "memory", "cc"); + printf("func_lret3=" FMTLX "\n", res); + } +#endif +#else + asm volatile ("push %%cs ; call %1" + : "=a" (res) + : "m" (func_lret): "memory", "cc"); + printf("func_lret=" FMTLX "\n", res); + + asm volatile ("pushf ; push %%cs ; call %1" + : "=a" (res) + : "m" (func_iret): "memory", "cc"); + printf("func_iret=" FMTLX "\n", res); +#endif + +#if defined(__x86_64__) + /* specific popl test */ + asm volatile ("push $12345432 ; push $0x9abcdef ; pop (%%rsp) ; pop %0" + : "=g" (res)); + printf("popl esp=" FMTLX "\n", res); +#else + /* specific popl test */ + asm volatile ("pushl $12345432 ; pushl $0x9abcdef ; popl (%%esp) ; popl %0" + : "=g" (res)); + printf("popl esp=" FMTLX "\n", res); + + /* specific popw test */ + asm volatile ("pushl $12345432 ; pushl $0x9abcdef ; popw (%%esp) ; addl $2, %%esp ; popl %0" + : "=g" (res)); + printf("popw esp=" FMTLX "\n", res); +#endif +} + +uint8_t str_buffer[4096]; + +#define TEST_STRING1(OP, size, DF, REP)\ +{\ + long esi, edi, eax, ecx, eflags;\ +\ + esi = (long)(str_buffer + sizeof(str_buffer) / 2);\ + edi = (long)(str_buffer + sizeof(str_buffer) / 2) + 16;\ + eax = i2l(0x12345678);\ + ecx = 17;\ +\ + asm volatile ("push $0\n\t"\ + "popf\n\t"\ + DF "\n\t"\ + REP #OP size "\n\t"\ + "cld\n\t"\ + "pushf\n\t"\ + "pop %4\n\t"\ + : "=S" (esi), "=D" (edi), "=a" (eax), "=c" (ecx), "=g" (eflags)\ + : "0" (esi), "1" (edi), "2" (eax), "3" (ecx));\ + printf("%-10s ESI=" FMTLX " EDI=" FMTLX " EAX=" FMTLX " ECX=" FMTLX " EFL=%04x\n",\ + REP #OP size, esi, edi, eax, ecx,\ + (int)(eflags & (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A)));\ +} + +#define TEST_STRING(OP, REP)\ + TEST_STRING1(OP, "b", "", REP);\ + TEST_STRING1(OP, "w", "", REP);\ + TEST_STRING1(OP, "l", "", REP);\ + X86_64_ONLY(TEST_STRING1(OP, "q", "", REP));\ + TEST_STRING1(OP, "b", "std", REP);\ + TEST_STRING1(OP, "w", "std", REP);\ + TEST_STRING1(OP, "l", "std", REP);\ + X86_64_ONLY(TEST_STRING1(OP, "q", "std", REP)) + +void test_string(void) +{ + int i; + for(i = 0;i < sizeof(str_buffer); i++) + str_buffer[i] = i + 0x56; + TEST_STRING(stos, ""); + TEST_STRING(stos, "rep "); + TEST_STRING(lods, ""); /* to verify stos */ + TEST_STRING(lods, "rep "); + TEST_STRING(movs, ""); + TEST_STRING(movs, "rep "); + TEST_STRING(lods, ""); /* to verify stos */ + + /* XXX: better tests */ + TEST_STRING(scas, ""); + TEST_STRING(scas, "repz "); + TEST_STRING(scas, "repnz "); + TEST_STRING(cmps, ""); + TEST_STRING(cmps, "repz "); + TEST_STRING(cmps, "repnz "); +} + +#ifdef TEST_VM86 +/* VM86 test */ + +static inline void set_bit(uint8_t *a, unsigned int bit) +{ + a[bit / 8] |= (1 << (bit % 8)); +} + +static inline uint8_t *seg_to_linear(unsigned int seg, unsigned int reg) +{ + return (uint8_t *)((seg << 4) + (reg & 0xffff)); +} + +static inline void pushw(struct vm86_regs *r, int val) +{ + r->esp = (r->esp & ~0xffff) | ((r->esp - 2) & 0xffff); + *(uint16_t *)seg_to_linear(r->ss, r->esp) = val; +} + +static inline int vm86(int func, struct vm86plus_struct *v86) +{ + return syscall(__NR_vm86, func, v86); +} + +extern char vm86_code_start; +extern char vm86_code_end; + +#define VM86_CODE_CS 0x100 +#define VM86_CODE_IP 0x100 + +void test_vm86(void) +{ + struct vm86plus_struct ctx; + struct vm86_regs *r; + uint8_t *vm86_mem; + int seg, ret; + + vm86_mem = mmap((void *)0x00000000, 0x110000, + PROT_WRITE | PROT_READ | PROT_EXEC, + MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); + if (vm86_mem == MAP_FAILED) { + printf("ERROR: could not map vm86 memory"); + return; + } + memset(&ctx, 0, sizeof(ctx)); + + /* init basic registers */ + r = &ctx.regs; + r->eip = VM86_CODE_IP; + r->esp = 0xfffe; + seg = VM86_CODE_CS; + r->cs = seg; + r->ss = seg; + r->ds = seg; + r->es = seg; + r->fs = seg; + r->gs = seg; + r->eflags = VIF_MASK; + + /* move code to proper address. We use the same layout as a .com + dos program. */ + memcpy(vm86_mem + (VM86_CODE_CS << 4) + VM86_CODE_IP, + &vm86_code_start, &vm86_code_end - &vm86_code_start); + + /* mark int 0x21 as being emulated */ + set_bit((uint8_t *)&ctx.int_revectored, 0x21); + + for(;;) { + ret = vm86(VM86_ENTER, &ctx); + switch(VM86_TYPE(ret)) { + case VM86_INTx: + { + int int_num, ah, v; + + int_num = VM86_ARG(ret); + if (int_num != 0x21) + goto unknown_int; + ah = (r->eax >> 8) & 0xff; + switch(ah) { + case 0x00: /* exit */ + goto the_end; + case 0x02: /* write char */ + { + uint8_t c = r->edx; + putchar(c); + } + break; + case 0x09: /* write string */ + { + uint8_t c, *ptr; + ptr = seg_to_linear(r->ds, r->edx); + for(;;) { + c = *ptr++; + if (c == '$') + break; + putchar(c); + } + r->eax = (r->eax & ~0xff) | '$'; + } + break; + case 0xff: /* extension: write eflags number in edx */ + v = (int)r->edx; +#ifndef LINUX_VM86_IOPL_FIX + v &= ~0x3000; +#endif + printf("%08x\n", v); + break; + default: + unknown_int: + printf("unsupported int 0x%02x\n", int_num); + goto the_end; + } + } + break; + case VM86_SIGNAL: + /* a signal came, we just ignore that */ + break; + case VM86_STI: + break; + default: + printf("ERROR: unhandled vm86 return code (0x%x)\n", ret); + goto the_end; + } + } + the_end: + printf("VM86 end\n"); + munmap(vm86_mem, 0x110000); +} +#endif + +/* exception tests */ +#if defined(__i386__) && !defined(REG_EAX) +#define REG_EAX EAX +#define REG_EBX EBX +#define REG_ECX ECX +#define REG_EDX EDX +#define REG_ESI ESI +#define REG_EDI EDI +#define REG_EBP EBP +#define REG_ESP ESP +#define REG_EIP EIP +#define REG_EFL EFL +#define REG_TRAPNO TRAPNO +#define REG_ERR ERR +#endif + +#if defined(__x86_64__) +#define REG_EIP REG_RIP +#endif + +jmp_buf jmp_env; +int v1; +int tab[2]; + +void sig_handler(int sig, siginfo_t *info, void *puc) +{ + struct ucontext *uc = puc; + + printf("si_signo=%d si_errno=%d si_code=%d", + info->si_signo, info->si_errno, info->si_code); + printf(" si_addr=0x%08lx", + (unsigned long)info->si_addr); + printf("\n"); + + printf("trapno=" FMTLX " err=" FMTLX, + (long)uc->uc_mcontext.gregs[REG_TRAPNO], + (long)uc->uc_mcontext.gregs[REG_ERR]); + printf(" EIP=" FMTLX, (long)uc->uc_mcontext.gregs[REG_EIP]); + printf("\n"); + longjmp(jmp_env, 1); +} + +void test_exceptions(void) +{ + struct sigaction act; + volatile int val; + + act.sa_sigaction = sig_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO | SA_NODEFER; + sigaction(SIGFPE, &act, NULL); + sigaction(SIGILL, &act, NULL); + sigaction(SIGSEGV, &act, NULL); + sigaction(SIGBUS, &act, NULL); + sigaction(SIGTRAP, &act, NULL); + + /* test division by zero reporting */ + printf("DIVZ exception:\n"); + if (setjmp(jmp_env) == 0) { + /* now divide by zero */ + v1 = 0; + v1 = 2 / v1; + } + +#if 0 +#if !defined(__x86_64__) + printf("BOUND exception:\n"); + if (setjmp(jmp_env) == 0) { + /* bound exception */ + tab[0] = 1; + tab[1] = 10; + asm volatile ("bound %0, %1" : : "r" (11), "m" (tab[0])); + } +#endif +#endif + +#ifdef TEST_SEGS + printf("segment exceptions:\n"); + if (setjmp(jmp_env) == 0) { + /* load an invalid segment */ + asm volatile ("movl %0, %%fs" : : "r" ((0x1234 << 3) | 1)); + } + if (setjmp(jmp_env) == 0) { + /* null data segment is valid */ + asm volatile ("movl %0, %%fs" : : "r" (3)); + /* null stack segment */ + asm volatile ("movl %0, %%ss" : : "r" (3)); + } + + { + struct modify_ldt_ldt_s ldt; + ldt.entry_number = 1; + ldt.base_addr = (unsigned long)&seg_data1; + ldt.limit = (sizeof(seg_data1) + 0xfff) >> 12; + ldt.seg_32bit = 1; + ldt.contents = MODIFY_LDT_CONTENTS_DATA; + ldt.read_exec_only = 0; + ldt.limit_in_pages = 1; + ldt.seg_not_present = 1; + ldt.useable = 1; + modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */ + + if (setjmp(jmp_env) == 0) { + /* segment not present */ + asm volatile ("movl %0, %%fs" : : "r" (MK_SEL(1))); + } + } +#endif + + /* test SEGV reporting */ + printf("PF exception:\n"); + if (setjmp(jmp_env) == 0) { + val = 1; + /* we add a nop to test a weird PC retrieval case */ + asm volatile ("nop"); + /* now store in an invalid address */ + *(char *)0x1234 = 1; + } + + /* test SEGV reporting */ + printf("PF exception:\n"); + if (setjmp(jmp_env) == 0) { + val = 1; + /* read from an invalid address */ + v1 = *(char *)0x1234; + } + + /* test illegal instruction reporting */ + printf("UD2 exception:\n"); + if (setjmp(jmp_env) == 0) { + /* now execute an invalid instruction */ + asm volatile("ud2"); + } +#if 0 + printf("lock nop exception:\n"); + if (setjmp(jmp_env) == 0) { + /* now execute an invalid instruction */ + asm volatile(".byte 0xf0, 0x90"); /* lock nop */ + } +#endif + + printf("INT exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("int $0xfd"); + } + if (setjmp(jmp_env) == 0) { + asm volatile ("int $0x01"); + } + if (setjmp(jmp_env) == 0) { + asm volatile (".byte 0xcd, 0x03"); + } + if (setjmp(jmp_env) == 0) { + asm volatile ("int $0x04"); + } + if (setjmp(jmp_env) == 0) { + asm volatile ("int $0x05"); + } + + printf("INT3 exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("int3"); + } + + printf("CLI exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("cli"); + } + + printf("STI exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("cli"); + } + +#if !defined(__x86_64__) + printf("INTO exception:\n"); + if (setjmp(jmp_env) == 0) { + /* overflow exception */ + asm volatile ("addl $1, %0 ; into" : : "r" (0x7fffffff)); + } +#endif + + printf("OUTB exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("outb %%al, %%dx" : : "d" (0x4321), "a" (0)); + } + + printf("INB exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("inb %%dx, %%al" : "=a" (val) : "d" (0x4321)); + } + + printf("REP OUTSB exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("rep outsb" : : "d" (0x4321), "S" (tab), "c" (1)); + } + + printf("REP INSB exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("rep insb" : : "d" (0x4321), "D" (tab), "c" (1)); + } + + printf("HLT exception:\n"); + if (setjmp(jmp_env) == 0) { + asm volatile ("hlt"); + } + +#if 0 + printf("single step exception:\n"); + val = 0; + if (setjmp(jmp_env) == 0) { + asm volatile ("pushf\n" + "orl $0x00100, (%%esp)\n" + "popf\n" + "movl $0xabcd, %0\n" + "movl $0x0, %0\n" : "=m" (val) : : "cc", "memory"); + } + printf("val=0x%x\n", val); +#endif +} + + +#if !defined(__x86_64__) +/* specific precise single step test */ +void sig_trap_handler(int sig, siginfo_t *info, void *puc) +{ + struct ucontext *uc = puc; + printf("EIP=" FMTLX "\n", (long)uc->uc_mcontext.gregs[REG_EIP]); +} + +const uint8_t sstep_buf1[4] = { 1, 2, 3, 4}; +uint8_t sstep_buf2[4]; + +void test_single_step(void) +{ + struct sigaction act; + volatile int val; + int i; + + val = 0; + act.sa_sigaction = sig_trap_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO; + sigaction(SIGTRAP, &act, NULL); + asm volatile ("pushf\n" + "orl $0x00100, (%%esp)\n" + "popf\n" + "movl $0xabcd, %0\n" + + /* jmp test */ + "movl $3, %%ecx\n" + "1:\n" + "addl $1, %0\n" + "decl %%ecx\n" + "jnz 1b\n" + + /* movsb: the single step should stop at each movsb iteration */ + "movl $sstep_buf1, %%esi\n" + "movl $sstep_buf2, %%edi\n" + "movl $0, %%ecx\n" + "rep movsb\n" + "movl $3, %%ecx\n" + "rep movsb\n" + "movl $1, %%ecx\n" + "rep movsb\n" + + /* cmpsb: the single step should stop at each cmpsb iteration */ + "movl $sstep_buf1, %%esi\n" + "movl $sstep_buf2, %%edi\n" + "movl $0, %%ecx\n" + "rep cmpsb\n" + "movl $4, %%ecx\n" + "rep cmpsb\n" + + /* getpid() syscall: single step should skip one + instruction */ + "movl $20, %%eax\n" + "int $0x80\n" + "movl $0, %%eax\n" + + /* when modifying SS, trace is not done on the next + instruction */ + "movl %%ss, %%ecx\n" + "movl %%ecx, %%ss\n" + "addl $1, %0\n" + "movl $1, %%eax\n" + "movl %%ecx, %%ss\n" + "jmp 1f\n" + "addl $1, %0\n" + "1:\n" + "movl $1, %%eax\n" + "pushl %%ecx\n" + "popl %%ss\n" + "addl $1, %0\n" + "movl $1, %%eax\n" + + "pushf\n" + "andl $~0x00100, (%%esp)\n" + "popf\n" + : "=m" (val) + : + : "cc", "memory", "eax", "ecx", "esi", "edi"); + printf("val=%d\n", val); + for(i = 0; i < 4; i++) + printf("sstep_buf2[%d] = %d\n", i, sstep_buf2[i]); +} + +/* self modifying code test */ +uint8_t code[] = { + 0xb8, 0x1, 0x00, 0x00, 0x00, /* movl $1, %eax */ + 0xc3, /* ret */ +}; + +asm(".section \".data\"\n" + "smc_code2:\n" + "movl 4(%esp), %eax\n" + "movl %eax, smc_patch_addr2 + 1\n" + "nop\n" + "nop\n" + "nop\n" + "nop\n" + "nop\n" + "nop\n" + "nop\n" + "nop\n" + "smc_patch_addr2:\n" + "movl $1, %eax\n" + "ret\n" + ".previous\n" + ); + +typedef int FuncType(void); +extern int smc_code2(int); +void test_self_modifying_code(void) +{ + int i; + printf("self modifying code:\n"); + printf("func1 = 0x%x\n", ((FuncType *)code)()); + for(i = 2; i <= 4; i++) { + code[1] = i; + printf("func%d = 0x%x\n", i, ((FuncType *)code)()); + } + + /* more difficult test : the modified code is just after the + modifying instruction. It is forbidden in Intel specs, but it + is used by old DOS programs */ + for(i = 2; i <= 4; i++) { + printf("smc_code2(%d) = %d\n", i, smc_code2(i)); + } +} +#endif + +long enter_stack[4096]; + +#if defined(__x86_64__) +#define RSP "%%rsp" +#define RBP "%%rbp" +#else +#define RSP "%%esp" +#define RBP "%%ebp" +#endif + +#if !defined(__x86_64__) +/* causes an infinite loop, disable it for now. */ +#define TEST_ENTER(size, stack_type, level) +#else +#define TEST_ENTER(size, stack_type, level)\ +{\ + long esp_save, esp_val, ebp_val, ebp_save, i;\ + stack_type *ptr, *stack_end, *stack_ptr;\ + memset(enter_stack, 0, sizeof(enter_stack));\ + stack_end = stack_ptr = (stack_type *)(enter_stack + 4096);\ + ebp_val = (long)stack_ptr;\ + for(i=1;i<=32;i++)\ + *--stack_ptr = i;\ + esp_val = (long)stack_ptr;\ + asm("mov " RSP ", %[esp_save]\n"\ + "mov " RBP ", %[ebp_save]\n"\ + "mov %[esp_val], " RSP "\n"\ + "mov %[ebp_val], " RBP "\n"\ + "enter" size " $8, $" #level "\n"\ + "mov " RSP ", %[esp_val]\n"\ + "mov " RBP ", %[ebp_val]\n"\ + "mov %[esp_save], " RSP "\n"\ + "mov %[ebp_save], " RBP "\n"\ + : [esp_save] "=r" (esp_save),\ + [ebp_save] "=r" (ebp_save),\ + [esp_val] "=r" (esp_val),\ + [ebp_val] "=r" (ebp_val)\ + : "[esp_val]" (esp_val),\ + "[ebp_val]" (ebp_val));\ + printf("level=%d:\n", level);\ + printf("esp_val=" FMTLX "\n", esp_val - (long)stack_end);\ + printf("ebp_val=" FMTLX "\n", ebp_val - (long)stack_end);\ + for(ptr = (stack_type *)esp_val; ptr < stack_end; ptr++)\ + printf(FMTLX "\n", (long)ptr[0]);\ +} +#endif + +static void test_enter(void) +{ +#if defined(__x86_64__) + TEST_ENTER("q", uint64_t, 0); + TEST_ENTER("q", uint64_t, 1); + TEST_ENTER("q", uint64_t, 2); + TEST_ENTER("q", uint64_t, 31); +#else + TEST_ENTER("l", uint32_t, 0); + TEST_ENTER("l", uint32_t, 1); + TEST_ENTER("l", uint32_t, 2); + TEST_ENTER("l", uint32_t, 31); +#endif + + TEST_ENTER("w", uint16_t, 0); + TEST_ENTER("w", uint16_t, 1); + TEST_ENTER("w", uint16_t, 2); + TEST_ENTER("w", uint16_t, 31); +} + +#ifdef TEST_SSE + +typedef int __m64 __attribute__ ((__mode__ (__V2SI__))); +typedef float __m128 __attribute__ ((__mode__(__V4SF__))); + +typedef union { + double d[2]; + float s[4]; + uint32_t l[4]; + uint64_t q[2]; + __m128 dq; +} XMMReg; + +static uint64_t __attribute__((aligned(16))) test_values[4][2] = { + { 0x456723c698694873, 0xdc515cff944a58ec }, + { 0x1f297ccd58bad7ab, 0x41f21efba9e3e146 }, + { 0x007c62c2085427f8, 0x231be9e8cde7438d }, + { 0x0f76255a085427f8, 0xc233e9e8c4c9439a }, +}; + +#define SSE_OP(op)\ +{\ + asm volatile (#op " %2, %0" : "=x" (r.dq) : "0" (a.dq), "x" (b.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " b=" FMT64X "" FMT64X " r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.q[1], a.q[0],\ + b.q[1], b.q[0],\ + r.q[1], r.q[0]);\ +} + +#define SSE_OP2(op)\ +{\ + int i;\ + for(i=0;i<2;i++) {\ + a.q[0] = test_values[2*i][0];\ + a.q[1] = test_values[2*i][1];\ + b.q[0] = test_values[2*i+1][0];\ + b.q[1] = test_values[2*i+1][1];\ + SSE_OP(op);\ + }\ +} + +#define MMX_OP2(op)\ +{\ + int i;\ + for(i=0;i<2;i++) {\ + a.q[0] = test_values[2*i][0];\ + b.q[0] = test_values[2*i+1][0];\ + asm volatile (#op " %2, %0" : "=y" (r.q[0]) : "0" (a.q[0]), "y" (b.q[0]));\ + printf("%-9s: a=" FMT64X " b=" FMT64X " r=" FMT64X "\n",\ + #op,\ + a.q[0],\ + b.q[0],\ + r.q[0]);\ + }\ + SSE_OP2(op);\ +} + +#define SHUF_OP(op, ib)\ +{\ + a.q[0] = test_values[0][0];\ + a.q[1] = test_values[0][1];\ + b.q[0] = test_values[1][0];\ + b.q[1] = test_values[1][1];\ + asm volatile (#op " $" #ib ", %2, %0" : "=x" (r.dq) : "0" (a.dq), "x" (b.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " b=" FMT64X "" FMT64X " ib=%02x r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.q[1], a.q[0],\ + b.q[1], b.q[0],\ + ib,\ + r.q[1], r.q[0]);\ +} + +#define PSHUF_OP(op, ib)\ +{\ + int i;\ + for(i=0;i<2;i++) {\ + a.q[0] = test_values[2*i][0];\ + a.q[1] = test_values[2*i][1];\ + asm volatile (#op " $" #ib ", %1, %0" : "=x" (r.dq) : "x" (a.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " ib=%02x r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.q[1], a.q[0],\ + ib,\ + r.q[1], r.q[0]);\ + }\ +} + +#define SHIFT_IM(op, ib)\ +{\ + int i;\ + for(i=0;i<2;i++) {\ + a.q[0] = test_values[2*i][0];\ + a.q[1] = test_values[2*i][1];\ + asm volatile (#op " $" #ib ", %0" : "=x" (r.dq) : "0" (a.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " ib=%02x r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.q[1], a.q[0],\ + ib,\ + r.q[1], r.q[0]);\ + }\ +} + +#define SHIFT_OP(op, ib)\ +{\ + int i;\ + SHIFT_IM(op, ib);\ + for(i=0;i<2;i++) {\ + a.q[0] = test_values[2*i][0];\ + a.q[1] = test_values[2*i][1];\ + b.q[0] = ib;\ + b.q[1] = 0;\ + asm volatile (#op " %2, %0" : "=x" (r.dq) : "0" (a.dq), "x" (b.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " b=" FMT64X "" FMT64X " r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.q[1], a.q[0],\ + b.q[1], b.q[0],\ + r.q[1], r.q[0]);\ + }\ +} + +#define MOVMSK(op)\ +{\ + int i, reg;\ + for(i=0;i<2;i++) {\ + a.q[0] = test_values[2*i][0];\ + a.q[1] = test_values[2*i][1];\ + asm volatile (#op " %1, %0" : "=r" (reg) : "x" (a.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " r=%08x\n",\ + #op,\ + a.q[1], a.q[0],\ + reg);\ + }\ +} + +#define SSE_OPS(a) \ +SSE_OP(a ## ps);\ +SSE_OP(a ## ss); + +#define SSE_OPD(a) \ +SSE_OP(a ## pd);\ +SSE_OP(a ## sd); + +#define SSE_COMI(op, field)\ +{\ + unsigned int eflags;\ + XMMReg a, b;\ + a.field[0] = a1;\ + b.field[0] = b1;\ + asm volatile (#op " %2, %1\n"\ + "pushf\n"\ + "pop %0\n"\ + : "=m" (eflags)\ + : "x" (a.dq), "x" (b.dq));\ + printf("%-9s: a=%f b=%f cc=%04x\n",\ + #op, a1, b1,\ + eflags & (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A));\ +} + +void test_sse_comi(double a1, double b1) +{ + SSE_COMI(ucomiss, s); + SSE_COMI(ucomisd, d); + SSE_COMI(comiss, s); + SSE_COMI(comisd, d); +} + +#define CVT_OP_XMM(op)\ +{\ + asm volatile (#op " %1, %0" : "=x" (r.dq) : "x" (a.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.q[1], a.q[0],\ + r.q[1], r.q[0]);\ +} + +/* Force %xmm0 usage to avoid the case where both register index are 0 + to test instruction decoding more extensively */ +#define CVT_OP_XMM2MMX(op)\ +{\ + asm volatile (#op " %1, %0" : "=y" (r.q[0]) : "x" (a.dq) \ + : "%xmm0"); \ + asm volatile("emms\n"); \ + printf("%-9s: a=" FMT64X "" FMT64X " r=" FMT64X "\n",\ + #op,\ + a.q[1], a.q[0],\ + r.q[0]);\ +} + +#define CVT_OP_MMX2XMM(op)\ +{\ + asm volatile (#op " %1, %0" : "=x" (r.dq) : "y" (a.q[0]));\ + asm volatile("emms\n"); \ + printf("%-9s: a=" FMT64X " r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.q[0],\ + r.q[1], r.q[0]);\ +} + +#define CVT_OP_REG2XMM(op)\ +{\ + asm volatile (#op " %1, %0" : "=x" (r.dq) : "r" (a.l[0]));\ + printf("%-9s: a=%08x r=" FMT64X "" FMT64X "\n",\ + #op,\ + a.l[0],\ + r.q[1], r.q[0]);\ +} + +#define CVT_OP_XMM2REG(op)\ +{\ + asm volatile (#op " %1, %0" : "=r" (r.l[0]) : "x" (a.dq));\ + printf("%-9s: a=" FMT64X "" FMT64X " r=%08x\n",\ + #op,\ + a.q[1], a.q[0],\ + r.l[0]);\ +} + +struct fpxstate { + uint16_t fpuc; + uint16_t fpus; + uint16_t fptag; + uint16_t fop; + uint32_t fpuip; + uint16_t cs_sel; + uint16_t dummy0; + uint32_t fpudp; + uint16_t ds_sel; + uint16_t dummy1; + uint32_t mxcsr; + uint32_t mxcsr_mask; + uint8_t fpregs1[8 * 16]; + uint8_t xmm_regs[8 * 16]; + uint8_t dummy2[224]; +}; + +static struct fpxstate fpx_state __attribute__((aligned(16))); +static struct fpxstate fpx_state2 __attribute__((aligned(16))); + +void test_fxsave(void) +{ + struct fpxstate *fp = &fpx_state; + struct fpxstate *fp2 = &fpx_state2; + int i, nb_xmm; + XMMReg a, b; + a.q[0] = test_values[0][0]; + a.q[1] = test_values[0][1]; + b.q[0] = test_values[1][0]; + b.q[1] = test_values[1][1]; + + asm("movdqa %2, %%xmm0\n" + "movdqa %3, %%xmm7\n" +#if defined(__x86_64__) + "movdqa %2, %%xmm15\n" +#endif + " fld1\n" + " fldpi\n" + " fldln2\n" + " fxsave %0\n" + " fxrstor %0\n" + " fxsave %1\n" + " fninit\n" + : "=m" (*(uint32_t *)fp2), "=m" (*(uint32_t *)fp) + : "m" (a), "m" (b)); + printf("fpuc=%04x\n", fp->fpuc); + printf("fpus=%04x\n", fp->fpus); + printf("fptag=%04x\n", fp->fptag); + for(i = 0; i < 3; i++) { + printf("ST%d: " FMT64X " %04x\n", + i, + *(uint64_t *)&fp->fpregs1[i * 16], + *(uint16_t *)&fp->fpregs1[i * 16 + 8]); + } + printf("mxcsr=%08x\n", fp->mxcsr & 0x1f80); +#if defined(__x86_64__) + nb_xmm = 16; +#else + nb_xmm = 8; +#endif + for(i = 0; i < nb_xmm; i++) { + printf("xmm%d: " FMT64X "" FMT64X "\n", + i, + *(uint64_t *)&fp->xmm_regs[i * 16], + *(uint64_t *)&fp->xmm_regs[i * 16 + 8]); + } +} + +void test_sse(void) +{ + XMMReg r, a, b; + int i; + + MMX_OP2(punpcklbw); + MMX_OP2(punpcklwd); + MMX_OP2(punpckldq); + MMX_OP2(packsswb); + MMX_OP2(pcmpgtb); + MMX_OP2(pcmpgtw); + MMX_OP2(pcmpgtd); + MMX_OP2(packuswb); + MMX_OP2(punpckhbw); + MMX_OP2(punpckhwd); + MMX_OP2(punpckhdq); + MMX_OP2(packssdw); + MMX_OP2(pcmpeqb); + MMX_OP2(pcmpeqw); + MMX_OP2(pcmpeqd); + + MMX_OP2(paddq); + MMX_OP2(pmullw); + MMX_OP2(psubusb); + MMX_OP2(psubusw); + MMX_OP2(pminub); + MMX_OP2(pand); + MMX_OP2(paddusb); + MMX_OP2(paddusw); + MMX_OP2(pmaxub); + MMX_OP2(pandn); + + MMX_OP2(pmulhuw); + MMX_OP2(pmulhw); + + MMX_OP2(psubsb); + MMX_OP2(psubsw); + MMX_OP2(pminsw); + MMX_OP2(por); + MMX_OP2(paddsb); + MMX_OP2(paddsw); + MMX_OP2(pmaxsw); + MMX_OP2(pxor); + MMX_OP2(pmuludq); + MMX_OP2(pmaddwd); + MMX_OP2(psadbw); + MMX_OP2(psubb); + MMX_OP2(psubw); + MMX_OP2(psubd); + MMX_OP2(psubq); + MMX_OP2(paddb); + MMX_OP2(paddw); + MMX_OP2(paddd); + + MMX_OP2(pavgb); + MMX_OP2(pavgw); + + asm volatile ("pinsrw $1, %1, %0" : "=y" (r.q[0]) : "r" (0x12345678)); + printf("%-9s: r=" FMT64X "\n", "pinsrw", r.q[0]); + + asm volatile ("pinsrw $5, %1, %0" : "=x" (r.dq) : "r" (0x12345678)); + printf("%-9s: r=" FMT64X "" FMT64X "\n", "pinsrw", r.q[1], r.q[0]); + + a.q[0] = test_values[0][0]; + a.q[1] = test_values[0][1]; + asm volatile ("pextrw $1, %1, %0" : "=r" (r.l[0]) : "y" (a.q[0])); + printf("%-9s: r=%08x\n", "pextrw", r.l[0]); + + asm volatile ("pextrw $5, %1, %0" : "=r" (r.l[0]) : "x" (a.dq)); + printf("%-9s: r=%08x\n", "pextrw", r.l[0]); + + asm volatile ("pmovmskb %1, %0" : "=r" (r.l[0]) : "y" (a.q[0])); + printf("%-9s: r=%08x\n", "pmovmskb", r.l[0]); + + asm volatile ("pmovmskb %1, %0" : "=r" (r.l[0]) : "x" (a.dq)); + printf("%-9s: r=%08x\n", "pmovmskb", r.l[0]); + + { + r.q[0] = -1; + r.q[1] = -1; + + a.q[0] = test_values[0][0]; + a.q[1] = test_values[0][1]; + b.q[0] = test_values[1][0]; + b.q[1] = test_values[1][1]; + asm volatile("maskmovq %1, %0" : + : "y" (a.q[0]), "y" (b.q[0]), "D" (&r) + : "memory"); + printf("%-9s: r=" FMT64X " a=" FMT64X " b=" FMT64X "\n", + "maskmov", + r.q[0], + a.q[0], + b.q[0]); + asm volatile("maskmovdqu %1, %0" : + : "x" (a.dq), "x" (b.dq), "D" (&r) + : "memory"); + printf("%-9s: r=" FMT64X "" FMT64X " a=" FMT64X "" FMT64X " b=" FMT64X "" FMT64X "\n", + "maskmov", + r.q[1], r.q[0], + a.q[1], a.q[0], + b.q[1], b.q[0]); + } + + asm volatile ("emms"); + + SSE_OP2(punpcklqdq); + SSE_OP2(punpckhqdq); + SSE_OP2(andps); + SSE_OP2(andpd); + SSE_OP2(andnps); + SSE_OP2(andnpd); + SSE_OP2(orps); + SSE_OP2(orpd); + SSE_OP2(xorps); + SSE_OP2(xorpd); + + SSE_OP2(unpcklps); + SSE_OP2(unpcklpd); + SSE_OP2(unpckhps); + SSE_OP2(unpckhpd); + + SHUF_OP(shufps, 0x78); + SHUF_OP(shufpd, 0x02); + + PSHUF_OP(pshufd, 0x78); + PSHUF_OP(pshuflw, 0x78); + PSHUF_OP(pshufhw, 0x78); + + SHIFT_OP(psrlw, 7); + SHIFT_OP(psrlw, 16); + SHIFT_OP(psraw, 7); + SHIFT_OP(psraw, 16); + SHIFT_OP(psllw, 7); + SHIFT_OP(psllw, 16); + + SHIFT_OP(psrld, 7); + SHIFT_OP(psrld, 32); + SHIFT_OP(psrad, 7); + SHIFT_OP(psrad, 32); + SHIFT_OP(pslld, 7); + SHIFT_OP(pslld, 32); + + SHIFT_OP(psrlq, 7); + SHIFT_OP(psrlq, 32); + SHIFT_OP(psllq, 7); + SHIFT_OP(psllq, 32); + + SHIFT_IM(psrldq, 16); + SHIFT_IM(psrldq, 7); + SHIFT_IM(pslldq, 16); + SHIFT_IM(pslldq, 7); + + MOVMSK(movmskps); + MOVMSK(movmskpd); + + /* FPU specific ops */ + + { + uint32_t mxcsr; + asm volatile("stmxcsr %0" : "=m" (mxcsr)); + printf("mxcsr=%08x\n", mxcsr & 0x1f80); + asm volatile("ldmxcsr %0" : : "m" (mxcsr)); + } + + test_sse_comi(2, -1); + test_sse_comi(2, 2); + test_sse_comi(2, 3); + test_sse_comi(2, q_nan.d); + test_sse_comi(q_nan.d, -1); + + for(i = 0; i < 2; i++) { + a.s[0] = 2.7; + a.s[1] = 3.4; + a.s[2] = 4; + a.s[3] = -6.3; + b.s[0] = 45.7; + b.s[1] = 353.4; + b.s[2] = 4; + b.s[3] = 56.3; + if (i == 1) { + a.s[0] = q_nan.d; + b.s[3] = q_nan.d; + } + + SSE_OPS(add); + SSE_OPS(mul); + SSE_OPS(sub); + SSE_OPS(min); + SSE_OPS(div); + SSE_OPS(max); + SSE_OPS(sqrt); + SSE_OPS(cmpeq); + SSE_OPS(cmplt); + SSE_OPS(cmple); + SSE_OPS(cmpunord); + SSE_OPS(cmpneq); + SSE_OPS(cmpnlt); + SSE_OPS(cmpnle); + SSE_OPS(cmpord); + + + a.d[0] = 2.7; + a.d[1] = -3.4; + b.d[0] = 45.7; + b.d[1] = -53.4; + if (i == 1) { + a.d[0] = q_nan.d; + b.d[1] = q_nan.d; + } + SSE_OPD(add); + SSE_OPD(mul); + SSE_OPD(sub); + SSE_OPD(min); + SSE_OPD(div); + SSE_OPD(max); + SSE_OPD(sqrt); + SSE_OPD(cmpeq); + SSE_OPD(cmplt); + SSE_OPD(cmple); + SSE_OPD(cmpunord); + SSE_OPD(cmpneq); + SSE_OPD(cmpnlt); + SSE_OPD(cmpnle); + SSE_OPD(cmpord); + } + + /* float to float/int */ + a.s[0] = 2.7; + a.s[1] = 3.4; + a.s[2] = 4; + a.s[3] = -6.3; + CVT_OP_XMM(cvtps2pd); + CVT_OP_XMM(cvtss2sd); + CVT_OP_XMM2MMX(cvtps2pi); + CVT_OP_XMM2MMX(cvttps2pi); + CVT_OP_XMM2REG(cvtss2si); + CVT_OP_XMM2REG(cvttss2si); + CVT_OP_XMM(cvtps2dq); + CVT_OP_XMM(cvttps2dq); + + a.d[0] = 2.6; + a.d[1] = -3.4; + CVT_OP_XMM(cvtpd2ps); + CVT_OP_XMM(cvtsd2ss); + CVT_OP_XMM2MMX(cvtpd2pi); + CVT_OP_XMM2MMX(cvttpd2pi); + CVT_OP_XMM2REG(cvtsd2si); + CVT_OP_XMM2REG(cvttsd2si); + CVT_OP_XMM(cvtpd2dq); + CVT_OP_XMM(cvttpd2dq); + + /* sse/mmx moves */ + CVT_OP_XMM2MMX(movdq2q); + CVT_OP_MMX2XMM(movq2dq); + + /* int to float */ + a.l[0] = -6; + a.l[1] = 2; + a.l[2] = 100; + a.l[3] = -60000; + CVT_OP_MMX2XMM(cvtpi2ps); + CVT_OP_MMX2XMM(cvtpi2pd); + CVT_OP_REG2XMM(cvtsi2ss); + CVT_OP_REG2XMM(cvtsi2sd); + CVT_OP_XMM(cvtdq2ps); + CVT_OP_XMM(cvtdq2pd); + + /* XXX: test PNI insns */ +#if 0 + SSE_OP2(movshdup); +#endif + asm volatile ("emms"); +} + +#endif + +#define TEST_CONV_RAX(op)\ +{\ + unsigned long a, r;\ + a = i2l(0x8234a6f8);\ + r = a;\ + asm volatile(#op : "=a" (r) : "0" (r));\ + printf("%-10s A=" FMTLX " R=" FMTLX "\n", #op, a, r);\ +} + +#define TEST_CONV_RAX_RDX(op)\ +{\ + unsigned long a, d, r, rh; \ + a = i2l(0x8234a6f8);\ + d = i2l(0x8345a1f2);\ + r = a;\ + rh = d;\ + asm volatile(#op : "=a" (r), "=d" (rh) : "0" (r), "1" (rh)); \ + printf("%-10s A=" FMTLX " R=" FMTLX ":" FMTLX "\n", #op, a, r, rh); \ +} + +void test_conv(void) +{ + TEST_CONV_RAX(cbw); + TEST_CONV_RAX(cwde); +#if defined(__x86_64__) + TEST_CONV_RAX(cdqe); +#endif + + TEST_CONV_RAX_RDX(cwd); + TEST_CONV_RAX_RDX(cdq); +#if defined(__x86_64__) + TEST_CONV_RAX_RDX(cqo); +#endif + + { + unsigned long a, r; + a = i2l(0x12345678); + asm volatile("bswapl %k0" : "=r" (r) : "0" (a)); + printf("%-10s: A=" FMTLX " R=" FMTLX "\n", "bswapl", a, r); + } +#if defined(__x86_64__) + { + unsigned long a, r; + a = i2l(0x12345678); + asm volatile("bswapq %0" : "=r" (r) : "0" (a)); + printf("%-10s: A=" FMTLX " R=" FMTLX "\n", "bswapq", a, r); + } +#endif +} + +extern void *__start_initcall; +extern void *__stop_initcall; + + +int main(int argc, char **argv) +{ + void **ptr; + void (*func)(void); + + ptr = &__start_initcall; + while (ptr != &__stop_initcall) { + func = *ptr++; + func(); + } + test_bsx(); + test_mul(); + test_jcc(); + test_loop(); + test_floats(); +#if !defined(__x86_64__) + test_bcd(); +#endif + test_xchg(); + test_string(); + test_misc(); + test_lea(); +#ifdef TEST_SEGS + test_segs(); + //test_code16(); +#endif +#ifdef TEST_VM86 + //test_vm86(); +#endif +#if !defined(__x86_64__) + test_self_modifying_code(); +#endif + test_enter(); + test_conv(); +#ifdef TEST_SSE + test_sse(); + test_fxsave(); +#endif + test_exceptions(); + //test_single_step(); + return 0; +} diff --git a/tests/qemu/test-i386.h b/tests/qemu/test-i386.h new file mode 100644 index 00000000..75106b8c --- /dev/null +++ b/tests/qemu/test-i386.h @@ -0,0 +1,152 @@ + +#define exec_op glue(exec_, OP) +#define exec_opq glue(glue(exec_, OP), q) +#define exec_opl glue(glue(exec_, OP), l) +#define exec_opw glue(glue(exec_, OP), w) +#define exec_opb glue(glue(exec_, OP), b) + +#define EXECOP2(size, rsize, res, s1, flags) \ + asm ("push %4\n\t"\ + "popf\n\t"\ + stringify(OP) size " %" rsize "2, %" rsize "0\n\t" \ + "pushf\n\t"\ + "pop %1\n\t"\ + : "=q" (res), "=g" (flags)\ + : "q" (s1), "0" (res), "1" (flags)); \ + printf("%-10s A=" FMTLX " B=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \ + stringify(OP) size, s0, s1, res, iflags, flags & CC_MASK); + +#define EXECOP1(size, rsize, res, flags) \ + asm ("push %3\n\t"\ + "popf\n\t"\ + stringify(OP) size " %" rsize "0\n\t" \ + "pushf\n\t"\ + "pop %1\n\t"\ + : "=q" (res), "=g" (flags)\ + : "0" (res), "1" (flags)); \ + printf("%-10s A=" FMTLX " R=" FMTLX " CCIN=%04lx CC=%04lx\n", \ + stringify(OP) size, s0, res, iflags, flags & CC_MASK); + +#ifdef OP1 +#if defined(__x86_64__) +void exec_opq(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP1("q", "", res, flags); +} +#endif + +void exec_opl(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP1("l", "k", res, flags); +} + +void exec_opw(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP1("w", "w", res, flags); +} + +void exec_opb(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP1("b", "b", res, flags); +} +#else +#if defined(__x86_64__) +void exec_opq(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP2("q", "", res, s1, flags); +} +#endif + +void exec_opl(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP2("l", "k", res, s1, flags); +} + +void exec_opw(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP2("w", "w", res, s1, flags); +} + +void exec_opb(long s0, long s1, long iflags) +{ + long res, flags; + res = s0; + flags = iflags; + EXECOP2("b", "b", res, s1, flags); +} +#endif + +void exec_op(long s0, long s1) +{ + s0 = i2l(s0); + s1 = i2l(s1); +#if defined(__x86_64__) + exec_opq(s0, s1, 0); +#endif + exec_opl(s0, s1, 0); + exec_opw(s0, s1, 0); + exec_opb(s0, s1, 0); +#ifdef OP_CC +#if defined(__x86_64__) + exec_opq(s0, s1, CC_C); +#endif + exec_opl(s0, s1, CC_C); + exec_opw(s0, s1, CC_C); + exec_opb(s0, s1, CC_C); +#endif +} + +void glue(test_, OP)(void) +{ + exec_op(0x12345678, 0x812FADA); + exec_op(0x12341, 0x12341); + exec_op(0x12341, -0x12341); + exec_op(0xffffffff, 0); + exec_op(0xffffffff, -1); + exec_op(0xffffffff, 1); + exec_op(0xffffffff, 2); + exec_op(0x7fffffff, 0); + exec_op(0x7fffffff, 1); + exec_op(0x7fffffff, -1); + exec_op(0x80000000, -1); + exec_op(0x80000000, 1); + exec_op(0x80000000, -2); + exec_op(0x12347fff, 0); + exec_op(0x12347fff, 1); + exec_op(0x12347fff, -1); + exec_op(0x12348000, -1); + exec_op(0x12348000, 1); + exec_op(0x12348000, -2); + exec_op(0x12347f7f, 0); + exec_op(0x12347f7f, 1); + exec_op(0x12347f7f, -1); + exec_op(0x12348080, -1); + exec_op(0x12348080, 1); + exec_op(0x12348080, -2); +} + +void *glue(_test_, OP) __init_call = glue(test_, OP); + +#undef OP +#undef OP_CC diff --git a/v86.css b/v86.css new file mode 100644 index 00000000..aa7fdbb7 --- /dev/null +++ b/v86.css @@ -0,0 +1,60 @@ +#log { + font-family: DejaVu Sans Mono; + font-size: 13px; + height: 350px; + float: right; + width: 400px; + border: 0 none; + background-color: #111; + color: #fff; +} +#screen { + white-space: pre; + position: relative; + font-family: Liberation Mono, DejaVu Sans Mono, Courier New, monospace; + font-weight: bold; + font-size: 15px; + line-height: 1; + float: left; +} +#screen, #vga { + border: 1px solid #555; + border-width: 2px 1px; + display: none; + -webkit-transform-origin: top left; + -moz-transform-origin: top left; +} +#vga { + image-rendering: -moz-crisp-edges; // FF 6.0+ + image-rendering: -webkit-optimize-contrast; // Webkit + // (Safari now, Chrome soon) + image-rendering: -o-crisp-edges; // OS X & Windows Opera (12.02+) + image-rendering: optimize-contrast; // Possible future browsers. + -ms-interpolation-mode: nearest-neighbor; // IE +} +#screen > div > span { + height: 15px; +} +#cursor { + position: absolute; + background-color: #ccc; + width: 7px; + display: inline-block; +} +body { + background-color: #111; + color: #fff; + line-height: 1.5; +} +#info { + font-size: 80%; +} +a { + color: wheat; +} +.phone_keyboard { + background-color: #111; + border: 1px solid #555; + width: 100px; + height: 100px; +} diff --git a/v86_all.js b/v86_all.js new file mode 100644 index 00000000..53427165 --- /dev/null +++ b/v86_all.js @@ -0,0 +1,247 @@ +'use strict';var ea,oa;function Tb(f){f.origin===dc&&mc()}var mc,dc=location.protocol+"//"+location.hostname;oa=function(f){mc=f;window.removeEventListener("message",Tb,!1);window.addEventListener("message",Tb,!1)};ea=function(){window.postMessage(null,dc)};function nc(f){var t=document.getElementById("log");t.textContent+=f+"\n";t.scrollTop=1E9} +function Lc(f,t,D){var C=new XMLHttpRequest;C.open("get",f,!0);C.responseType="arraybuffer";C.onload=function(){C.response&&t(C.response)};D&&(C.onprogress=function(f){D(f)});C.send(null)}function Mc(f){var t=f.requestPointerLock||f.mozRequestPointerLock||f.webkitRequestPointerLock;t&&t.call(f)} +function Wc(f){var t=vd("loading");t.style.display="block";f.lengthComputable?(f=f.loaded/f.total*50|0,t.textContent="Loading: "+2*f+"% ["+String.a("#",f)+String.a(" ",50-f)+"]"):t.textContent="Loading ..."}function vd(f){return document.getElementById(f)} +function Hd(f){var t=new Vd,D=new Wd;vd("boot_options").parentNode.removeChild(vd("boot_options"));vd("loading").style.display="none";vd("runtime_options").style.display="block";document.getElementsByClassName("phone_keyboard")[0].style.display="block";var C=!0;vd("run").onclick=function(){C?(B+=Date.now()-X,vd("run").value="Run",t.v()):(vd("run").value="Pause",t.m(),X=Date.now());C=!C;vd("run").blur()};var O=document.getElementById("running_time"),L=document.getElementById("speed"),X=Date.now(), +B=0,G=0;setInterval(function(){if(C){var f=Date.now();B+=f-X;X=f;L.textContent=(t.i-G)/1E3|0;O.textContent=B/1E3|0;G=t.i}},1E3);vd("reset").onclick=function(){t.q();vd("reset").blur()};vd("get_floppy").onclick=function(){var f=t.a.Aa.buffer;f&&(f.Ba(function(f){f=new Blob([f]);var t;t=document.createElement("a");t.download="floppy.img";t.href=window.URL.createObjectURL(f);t.textContent="Download floppy.img";t.onclick=function(){t.parentNode.removeChild(t)};t.dataset.downloadurl=["application/octet-stream", +t.download,t.href].join(":");document.body.appendChild(t)}),vd("get_floppy").blur())};vd("ctrlaltdel").onclick=function(){var f=t.a.Pa;f.G(29);f.G(56);f.G(83);f.G(157);f.G(184);f.G(211);vd("ctrlaltdel").blur()};vd("scale").onchange=function(){var f=parseFloat(this.value);f||0L;L++)C[L]=f,O[L]=t;this.h=function(f,t){C[f]=t};this.g=function(f,t){O[f]=t};this.h(146,function(){return D});this.g(146,function(f){D=f});this.g(128,function(){});this.i=function(f,t){O[f](t)};this.a=function(f){return C[f]()}};function Vd(){function f(){if(oc)oc=ec=!1;else{ec=!0;try{C()}catch(b){if(233495534===b)wa=Nc=!1,ab=-1,Cb=Db,zb(),xa=Db,La(),f();else throw b;}}}function t(){wd.n();Xc.n();D(xd);throw 233495534;}function D(b){"undefined"!==typeof oa&&oa(f);xd=b;bb.memory=k=new be;Yc=new Uint8Array(8);yd=new Uint32Array(8);ae=new Uint32Array(8);da=new Int32Array(8);zd=new Int32Array(1048576);Ad=new Int32Array(1048576);Bd=new Int32Array(1048576);Cd=new Int32Array(1048576);Eb=new Uint8Array(1048576);pc=new Uint8Array(1048576); +y=new Uint32Array(8);e=new Int32Array(y.buffer);g=new Uint16Array(y.buffer);Ga=new Int16Array(y.buffer);v=new Uint8Array(y.buffer);fc=new Int8Array(y.buffer);ra=new Uint16Array(8);Ma=!1;Dd=Ed=Zc=$c=qc=ad=rc=bd=0;Nc=!1;ya=Oc=cd=Ub=Na=0;J=!1;Fd=0;Cb=dd=xa=Db=!1;L();La();zb();$=g;aa=8;sc=10;Vb=ed=0;oc=ec=fd=!1;Pc=20;q=Ea=Qc;ab=-1;wa=!1;I=0;u=2;Y=ma=ba=K=0;if(b.P){for(var c=new Uint8Array(b.P),d=1048576-b.P.byteLength,h=0;h>8)}function H(b,c,d){k.e(b,d);k.e(c,d>>24);b&1?b&2?(k.e(c-2,d>>8),k.e(c-1,d>>16)):(k.e(b+1,d>>8),k.e(b+2,d>>16)):(k.e(b+1,d>>8),k.e(c-1,d>>16))}function V(b,c){k.e(q(b),c)}function R(b,c){var d=q(b); +4095===(b&4095)?n(d,q(b+1),c):k.a(d,c)}function N(b,c){var d=q(b);4093<=(b&4095)?H(d,q(b+3),c):k.f(d,c)}function F(){return Cb?h(3)+M():h(3)+U()}function na(){u=u&-2262|Ba()|ge()|Sc()|Gb()|hd()|Tc();K=0}function sa(b){return dd?da[2]+$[aa]+b:da[2]+($[aa]+b&65535)}function pa(){return E-da[1]}function ha(b,c,d){fd&&(E++,fd=!1);if(Ma){if((b<<3|7)>bd)throw ze("#GP handler");var g=rc+(b<<3)|0;J&&(g=hb(g));var h=k.b(g)|k.b(g+6)<<16,l=k.b(g+2),g=k.d(g+5),m=g>>5&3;if(0===(g&128))throw ze("#NP handler"); +c&&mya)throw ze("#GP handler");if(!c.B)throw ze("#NP handler");if(u&131072)throw ze("VM flag");if(!c.C&&c.lEd)throw ze("#TS handler");m+=Dd;J&&(m=hb(m));var g=k.c(m),m=k.b(m+4),q= +Bb(m);if(q.A)throw ze("#TS handler");if(q.t!==c.l)throw ze("#TS handler");if(q.l!==c.l||!q.ca)throw ze("#TS handler");if(!q.B)throw ze("#TS handler");var q=e[4],p=ra[2];y[4]=g;ra[2]=m;ya=c.l;X();ia(p);ia(q)}na();ia(u);ia(ra[1]);ia(pa());!1!==d&&ia(d);ra[1]=l;E=da[1]+h|0;b?Da():u&=-513}else na(),la(u),la(ra[1]),la(pa()),u&=-513,ca(1,k.b((b<<2)+2)),E=da[1]+k.b(b<<2)|0}function za(b){ha(b,!1,!1);throw 233495534;}function qa(){E=Vb;za(0)}function z(){E=Vb;za(6)}function fa(b){E=Vb;ha(13,!1,b);throw 233495534; +}function ja(b){ab=b;Ab[m()]();ab=-1}function h(b){return-1===ab?da[b]:da[ab]}function Ca(b,c){K&=-65;if((b&3)<(g[c]&3))return u|=64,b&-4|g[c]&3;u&=-65;return b}function Da(){Gd&&u&512&&!Nc&&Gd.a()}function Fa(b,c){$a()?Ua.i(b,c):fa(0)}function Xb(b,c){$a()?(Ua.i(b,c&255),Ua.i(b+1,c>>8&255)):fa(0)}function gc(b,c){$a()?(Ua.i(b,c&255),Ua.i(b+1,c>>8&255),Ua.i(b+2,c>>16&255),Ua.i(b+3,c>>24&255)):fa(0)}function hc(b){if($a())return Ua.a(b);fa(0)}function ic(b){if($a())return Ua.a(b)|Ua.a(b+1)<<8;fa(0)} +function cb(b){if($a())return Ua.a(b)|Ua.a(b+1)<<8|Ua.a(b+2)<<16|Ua.a(b+3)<<24;fa(0)}function $a(){return!Ma||ya<=(u>>12&3)}function jc(b){u=0!==ya&&Ma?ya<=(u>>12&3)?b&-12289|u&12288:b&-12801|u&12800:b;K=0}function La(){xa?(Ab=s,Jd=w):(Ab=r,Jd=x)}function zb(){Cb?(l=he,A=y,ga=1,W=6,T=7):(l=ie,A=g,ga=2,W=12,T=14)}function Bb(b){var c=0===(b&4),d=b&-8,e;b={t:b&3,ga:c,A:!1,$:!0};c?(c=qc,e=ad):(c=Zc,e=$c);if(0===d)return b.A=!0,b;if(d>>3>e)return b.$=!1,b;c+=d;J&&(c=hb(c));b.W=k.b(c+2)|k.d(c+4)<<16|k.d(c+ +7)<<24;b.u=k.d(c+5);b.fa=k.d(c+6)>>4;b.V=k.b(c)|(k.d(c+6)&15)<<16;b.type=b.u&15;b.l=b.u>>5&3;b.L=0===(b.u&16);b.B=128===(b.u&128);b.F=8===(b.u&8);b.ca=2===(b.u&2);b.C=4===(b.u&4);b.size=4===(b.fa&4);b.fb=8===(b.fa&8);b.Sa=b.eb?(b.V<<12|4095)>>>0:b.V;b.Fa=b.ca&&!b.F;b.Ea=b.ca||!b.F;return b}function ca(b,c){1===b&&(Ma=1===(Na&1));if(Ma){var d=Bb(c);if(2===b){if(d.A){fa(0);return}if(!d.$||d.L||d.t!==ya||!d.Fa||d.l!==ya){fa(c&-4);return}if(!d.B)throw E=Vb,ha(12,!1,c&-4),233495534;(dd=d.size)?($=e,aa= +4,sc=5):($=g,aa=8,sc=10)}else if(1===b){if(!d.F)throw ze("#GP handler");if(d.L)throw ze("load system segment descriptor, type = "+(d.u&15));if(d.C&&d.l!==d.t)throw ze("#GP handler");if(d.t!==ya)throw ze("privilege change");if(!d.C&&d.ld.l&&ya>d.l){fa(c&-4);return}if(!d.B)throw E=Vb,ha(11,!1,c&-4),233495534;}Yc[b]=0; +yd[b]=d.Sa;ae[b]=0;da[b]=d.W;ra[b]=c}else ra[b]=c,Yc[b]=0,yd[b]=1048575,da[b]=c<<4}function tc(){Fb=-1;Eb.set(pc)}function Qc(b){return b}function Wb(b){var c=b>>>12;return Eb[c]&8?Ad[c]^b:db(b,1,1)|b&4095}function gd(b){var c=b>>>12;return Eb[c]&4?zd[c]^b:db(b,0,1)|b&4095}function Ia(b){var c=b>>>12;return Eb[c]&2?Cd[c]^b:db(b,1,0)|b&4095}function hb(b){var c=b>>>12;return Eb[c]&1?Bd[c]^b:db(b,0,0)|b&4095}function db(b,c,d){var e=b>>>12,g=(cd>>>2)+(e>>10),h=k.i[g],l=!0,m=!0,q=!0;h&1||(Ub=b,ib(c, +d,0));0===(h&2)&&(l=!1,c&&(Ub=b,ib(c,d,1)));0===(h&4)&&(q=!1,d&&(Ub=b,ib(c,d,1)));0===(h&16)&&(m=!1);if(h&Fd)k.i[g]=h|32|c<<6,b=h&4290772992|e<<12&4190208,h=h&256;else{var u=((h&4294963200)>>>2)+(e&1023),p=k.i[u];p&1||(Ub=b,ib(c,d,0));0===(p&2)&&(l=!1,c&&(Ub=b,ib(c,d,1)));0===(p&4)&&(q=!1,d&&(Ub=b,ib(c,d,1)));0===(p&16)&&(m=!1);k.i[g]=h|32;k.i[u]=p|32|c<<6;b=p&4294963200;h=p&256}m&&(m=b^e<<12,p=0,q&&(zd[e]=m,p|=4,l&&(Ad[e]=m,p|=8)),Bd[e]=m,p|=1,l&&(Cd[e]=m,p|=2),Eb[e]|=p,h&&(pc[e]=p));return b}function ib(b, +c,d){if(Nc)throw ze("Double fault");E=Vb;Nc=!0;ha(14,!1,c<<2|b<<1|d);throw 233495534;}function Z(b,c){var d=b&65535,e=c&65535;return d*e+d*(c&-65536)+(b&-65536)*e}function kc(b,c){ba=b;ma=c;I=ba+c|0;Y=8;K=2261;return I}function eb(b,c){ba=b;ma=c;I=ba+c|0;Y=16;K=2261;return I}function fb(b,c){ba=b;ma=c;I=ba+c;Y=32;K=2261;return I}function uc(b,c){ba=b;ma=c;I=ba+ma+Ba()|0;Y=8;K=2261;return I}function jb(b,c){ba=b;ma=c;I=ba+ma+Ba()|0;Y=16;K=2261;return I}function kb(b,c){ba=b;ma=c;I=ba+ma+Ba();Y=32; +K=2261;return I}function lc(b,c){ba=b;ma=~c;I=ba-c;Y=8;K=2261}function Yb(b,c){ba=b;ma=~c;I=ba-c;Y=16;K=2261}function Zb(b,c){ba=b;ma=-c-1;I=ba-c;Y=32;K=2261}function vc(b,c){ba=b;ma=~c;I=ba-c|0;Y=8;K=2261;return I}function lb(b,c){ba=b;ma=~c;I=ba-c|0;Y=16;K=2261;return I}function mb(b,c){ba=b;ma=-c-1;I=ba-c;Y=32;K=2261;return I}function wc(b,c){ba=b;ma=~c;I=ba-c-Ba()|0;Y=8;K=2261;return I}function nb(b,c){ba=b;ma=~c;I=ba-c-Ba()|0;Y=16;K=2261;return I}function ob(b,c){ba=b;ma=-c-1;I=ba-c-Ba();Y=32; +K=2261;return I}function je(b){u=u&-2|Ba();ba=b;ma=1;I=ba+1|0;Y=8;K=2260;return I}function pb(b){u=u&-2|Ba();ba=b;ma=1;I=ba+1|0;Y=16;K=2260;return I}function qb(b){u=u&-2|Ba();ba=b;ma=1;I=ba+1;Y=32;K=2260;return I}function ke(b){u=u&-2|Ba();ba=b;ma=-1;I=ba-1|0;Y=8;K=2260;return I}function rb(b){u=u&-2|Ba();ba=b;ma=-1;I=ba-1|0;Y=16;K=2260;return I}function sb(b){u=u&-2|Ba();ba=b;ma=-1;I=ba-1;Y=32;K=2260;return I}function le(b){I=-b;K=2261;Y=8;ba=0;ma=I-1;return I}function Kd(b){I=-b;K=2261;Y=16;ba= +0;ma=I-1;return I}function Ld(b){I=-b;K=2261;Y=32;ba=0;ma=I-1;return I}function Md(b,c){var d=b*c;u=32767d?u|2049:u&-2050;K=0;return d}function Nd(b,c){var d=Z(b,c);u=0===(b*c/4294967296|0)?u&-2050:u|2049;K=0;return d}function me(b,c){var d=v[c];v[c]=b;return kc(b,d)}function Od(b,c){var d=g[c];g[c]=b;return eb(b,d)}function Pd(b,c){var d=y[c];y[c]=b;return fb(b,d)}function xc(b,c){I=b&c;Y=8;u&=-2066;K=196;return I}function tb(b,c){I=b&c;Y=16;u&=-2066;K=196;return I}function ub(b,c){I= +b&c;Y=32;u&=-2066;K=196;return I}function id(b,c){I=b&c;Y=8;u&=-2066;K=196}function jd(b,c){I=b&c;Y=16;u&=-2050;K=196}function kd(b,c){I=b&c;Y=32;u&=-2066;K=196}function yc(b,c){I=b|c;Y=8;u&=-2066;K=196;return I}function vb(b,c){I=b|c;Y=16;u&=-2066;K=196;return I}function wb(b,c){I=b|c;Y=32;u&=-2066;K=196;return I}function zc(b,c){I=b^c;Y=8;u&=-2066;K=196;return I}function xb(b,c){I=b^c;Y=16;u&=-2066;K=196;return I}function yb(b,c){I=b^c;Y=32;u&=-2066;K=196;return I}function Ac(b,c){if(!c)return b; +c&=7;var d=b<>8-c;K&=-2050;u=u&-2050|d&1|(d<<11^d<<4)&2048;return d}function Hb(b,c){if(!c)return b;c&=15;var d=b<>16-c;K&=-2050;u=u&-2050|d&1|(d<<11^d>>4)&2048;return d}function Ib(b,c){if(!c)return b;var d=b<>>32-c;K&=-2050;u=u&-2050|d&1|(d<<11^d>>20)&2048;return d}function Bc(b,c){c%=9;if(!c)return b;var d=b<>9-c;K&=-2050;u=u&-2050|d>>8&1|(d<<3^d<<4)&2048;return d}function Jb(b,c){c%=17;if(!c)return b;var d=b<>17-c;K&=-2050;u=u&-2050|d>>16&1|(d>>5^d>> +4)&2048;return d}function Kb(b,c){if(!c)return b;var d=b<>>33-c);K&=-2050;u=u&-2050|b>>>32-c&1;u|=(u<<11^d>>20)&2048;return d}function Cc(b,c){c&=7;if(!c)return b;var d=b>>c|b<<8-c;K&=-2050;u=u&-2050|d>>7&1|(d<<4^d<<5)&2048;return d}function Lb(b,c){c&=15;if(!c)return b;var d=b>>c|b<<16-c;K&=-2050;u=u&-2050|d>>15&1|(d>>4^d>>3)&2048;return d}function Mb(b,c){if(!c)return b;var d=b>>>c|b<<32-c;K&=-2050;u=u&-2050|d>>31&1|(d>>20^d>>19)&2048;return d}function Dc(b,c){c%=9;if(!c)return b; +var d=b>>c|Ba()<<8-c|b<<9-c;K&=-2050;u=u&-2050|d>>8&1|(d<<4^d<<5)&2048;return d}function Nb(b,c){c%=17;if(!c)return b;var d=b>>c|Ba()<<16-c|b<<17-c;K&=-2050;u=u&-2050|d>>16&1|(d>>4^d>>3)&2048;return d}function Ob(b,c){if(!c)return b;var d=b>>>c|Ba()<<32-c;1>c-1&1|(d>>20^d>>19)&2048;return d}function gb(b,c){if(0===c)return b;I=b<>8&1|(I<<3^I<<4)&2048;return I}function Ja(b,c){if(0===c)return b;I=b<>16&1|(I>>5^ +I>>4)&2048;return I}function Ka(b,c){if(0===c)return b;I=b<>>32-c&1;u|=(u&1^I>>31&1)<<11&2048;return I}function Ec(b,c){if(0===c)return b;I=b>>c;Y=8;K=212;u=u&-2050|b>>c-1&1|(b>>7&1)<<11&2048;return I}function Pb(b,c){if(0===c)return b;I=b>>c;Y=16;K=212;u=u&-2050|b>>c-1&1|b>>4&2048;return I}function Qb(b,c){if(0===c)return b;I=b>>>c;Y=32;K=212;u=u&-2050|b>>>c-1&1|b>>20&2048;return I}function Fc(b,c){if(0===c)return b;I=b>>c;Y=8;K=212;u=u&-2050|b>>c-1&1;return I}function Rb(b, +c){if(0===c)return b;I=b>>c;Y=16;K=212;u=u&-2050|b>>c-1&1;return I}function Sb(b,c){if(0===c)return b;I=b>>c;Y=32;K=212;u=u&-2050|b>>>c-1&1;return I}function Gc(b,c,d){if(0===d)return b;16>=d?(I=b>>d|c<<16-d,u=u&-2|b>>d-1&1):(I=b<<32-d|c>>d-16,u=u&-2|c>>d-17&1);Y=16;K=212;u=u&-2049|(I^b)>>4&2048;return I}function Hc(b,c,d){if(0===d)return b;I=b>>>d|c<<32-d;Y=32;K=212;u=u&-2|b>>>d-1&1;u=u&-2049|(I^b)>>20&2048;return I}function Ic(b,c,d){if(0===d)return b;16>=d?(I=b<>>16-d,u=u&-2|b>>>16-d&1):(I= +b>>32-d|c<>>32-d&1);Y=16;K=212;u=u&-2049|(u&1^I>>15&1)<<11;return I}function Jc(b,c,d){if(0===d)return b;I=b<>>32-d;Y=32;K=212;u=u&-2|b>>>32-d&1;u=u&-2049|(u&1^I>>31&1)<<11;return I}function ld(b,c){u=u&-2|b>>c&1;K=0}function md(b,c){u=u&-2|b>>c&1;K=0;return b^1<>c&1;K=0;return b|1<>c&1;K=0;return b&~(1<>3));u=u&-2|d>>(c&7)&1;K=0}function qd(b,c){var d=q(b+(c>>3)),e=k.d(d);c&=7;u=u&-2| +e>>c&1;K=0;k.e(d,e^1<>3)),e=k.d(d);c&=7;u=u&-2|e>>c&1;K=0;k.e(d,e&~(1<>3)),e=k.d(d);c&=7;u=u&-2|e>>c&1;K=0;k.e(d,e|1<I:I>>Y&1:u&1}function ge(){return K& +4?154020>>((I^I>>4)&15)&4:u&4}function Sc(){return K&16?(ba^ma^I^(0>ma)<<4)&16:u&16}function Gb(){return K&64?(~I&I-1)>>Y-7&64:u&64}function hd(){return K&128?I>>Y-8&128:u&128}function Tc(){return K&2048?((ba^I)&(ma^I))>>Y-1<<11&2048:u&2048}function la(b){var c=Id(-2);$[aa]-=2;k.a(c,b)}function ia(b){var c=Id(-4);$[aa]-=4;k.f(c,b)}function Aa(){var b=Va(0);$[aa]+=2;return k.b(b)}function ua(){var b=Va(0);$[aa]+=4;return k.c(b)}function ne(b,c){var d=c>>1&12|c>>5&1,e=v[d];v[d]=b;return e}function Rd(b, +c){var d=c>>2&14,e=g[d];g[d]=b;return e}function $b(b){var c=g[0];g[0]=g[b];g[b]=c}function Sd(b,c){var d=c>>3&7,g=e[d];y[d]=b;return g}function ac(b){var c=e[0];y[0]=e[b];y[b]=c}function Uc(b,c,d){var e=Q(c);c=Q(c+2);ca(b,c);g[d]=e}function Vc(b,c,d){var e=S(c);c=Q(c+4);ca(b,c);y[d]=e}function bc(b){var c=e[b];y[b]=c>>>24|c<<24|c>>8&65280|c<<8&16711680}function Ce(){function b(b){var c=r();Z&=-18177;c>b||(Z=b>c?Z|256:c===b?Z|16384:Z|17664)}function c(b){var c=n[F];K&=-70;u&=-70;c>b||(u=b>c?u|1:c=== +b?u|64:u|69)}function d(){J=895;M=sa=L=Z=0;E=255;F=0}function e(b){if(xa){R(b,J);R(b+4,Z&-14337|F<<11);for(var c=0,d,g=0;8>g;g++)if(d=n[g],E>>g&1)c|=3<<(g<<1);else if(0===d)c|=1<<(g<<1);else if(isNaN(d)||Infinity===d||-Infinity===d)c|=2<<(g<<1);R(b+8,c);N(b+12,L);R(b+16,V);R(b+18,M);N(b+20,sa);R(b+24,P)}else z()}function k(b){if(xa){J=Q(b);var c=Q(b+4);Z=c&-14337;F=c>>11&7;for(var c=Q(b+8),d=E=0;8>d;d++)E|=c>>d&c>>d+1&1<>>0;V=Q(b+16);M=Q(b+18);sa=S(b+20)>>>0;P=Q(b+24)}else z()}function h(b){var c= +J>>10&3;return 0===c?(c=Math.round(b),0.5===c-b&&c&1&&c--,c):1===c||3===c&&0>F&1?(Z&=-513,E&=~(1<>b&1?(Z&=-513,Z=Z|t|A,NaN):n[b]}function r(){return E>>F&1?(Z&=-513,Z=Z|t|A,NaN):n[F]}function v(b){var c=Q(b+8),d=S(b)>>>0,e=S(b+4)>>>0;b=c>>15;c&=-32769;if(0===c)return 0;if(!(32767>c))return I[7]=127| +b<<7,I[6]=240|e>>30<<3&8,I[5]=0,I[4]=0,D[0]=0,G[0];d+=4294967296*e;b&&(d=-d);return d*Math.pow(2,c-16383-63)}function w(b,c){G[0]=n[F+c&7];var d=I[7]&128,e=(I[7]&127)<<4|I[6]>>4,g,k;2047===e?(e=32767,g=0,k=2147483648|(D[1]&524288)<<11):0===e?k=g=0:(e+=15360,g=D[0]<<11,k=2147483648|(D[1]&1048575)<<11|D[0]>>>21);N(b,g);N(b+4,k);R(b+8,d<<8|e)}function x(b){D[0]=S(b);D[1]=S(b+4);return G[0]}function y(b){q(b+7);G[0]=s(0);N(b,D[0]);N(b+4,D[1])}function f(b){H[0]=S(b);return C[0]}this.a=1;var t=64,A=1, +n=new Float64Array(8),B=new Uint8Array(n.buffer);new Uint32Array(n.buffer);var E=255,F=0,C=new Float32Array(1);new Uint8Array(C.buffer);var H=new Uint32Array(C.buffer),G=new Float64Array(1),I=new Uint8Array(G.buffer),D=new Uint32Array(G.buffer);new Uint8Array(10);var J=895,Z=0,L=0,V=0,M=0,sa=0,P=0,O=new Float64Array([1,Math.log(10)/Math.LN2,Math.LOG2E,Math.PI,Math.log(2)/Math.LN10,Math.LN2,0]);this.m=function(c){var d=c>>3&7;c=s(c&7);var e=r();switch(d){case 0:n[F]=e+c;break;case 1:n[F]=e*c;break; +case 2:b(c);break;case 3:b(c);p();break;case 4:n[F]=e-c;break;case 5:n[F]=c-e;break;case 6:n[F]=e/c;break;case 7:n[F]=c/e;break;default:z()}};this.i=function(c,d){var e=c>>3&7,g=f(d),k=r();switch(e){case 0:n[F]=k+g;break;case 1:n[F]=k*g;break;case 2:b(g);break;case 3:b(g);p();break;case 4:n[F]=k-g;break;case 5:n[F]=g-k;break;case 6:n[F]=k/g;break;case 7:n[F]=g/k;break;default:z()}};this.v=function(b){var c=b&7;switch(b>>3&7){case 0:b=s(c);m(b);break;case 1:b=s(c);n[F+c&7]=r();n[F]=b;break;case 4:switch(c){case 0:n[F]= +-r();break;case 1:n[F]=Math.abs(r());break;case 4:c=r();Z&=-18177;isNaN(c)?Z|=17664:0===c?Z|=16384:0>c&&(Z|=256);break;case 5:c=r();Z&=-18177;Z|=B[(F+0&7)<<3|7]>>7<<9;Z=E>>F&1?Z|16640:isNaN(c)?Z|256:0===c?Z|16384:Infinity===c||-Infinity===c?Z|1280:Z|1024;break;default:z()}break;case 5:m(O[c]);break;case 6:switch(c){case 0:n[F]=Math.pow(2,r())-1;break;case 1:n[F+1&7]=s(1)*Math.log(r())/Math.LN2;p();break;case 2:n[F]=Math.tan(r());m(1);break;case 3:n[F+1&7]=Math.atan2(s(1),r());p();break;case 5:n[F]= +r()%s(1);break;default:z()}break;case 7:switch(c){case 0:n[F]=r()%s(1);break;case 2:n[F]=Math.sqrt(r());break;case 3:c=r();n[F]=Math.sin(c);m(Math.cos(c));break;case 4:n[F]=h(r());break;case 5:n[F]=r()*Math.pow(2,l(s(1)));break;case 6:n[F]=Math.sin(r());break;case 7:n[F]=Math.cos(r());break;default:z()}break;default:z()}};this.q=function(b,c){switch(b>>3&7){case 0:var d=f(c);m(d);break;case 2:C[0]=s(0);N(c,H[0]);break;case 3:C[0]=s(0);N(c,H[0]);p();break;case 4:k(c);break;case 5:J=Q(c);break;case 6:e(c); +break;case 7:R(c,J);break;default:z()}};this.Q=function(c){var d=c&7;switch(c>>3&7){case 0:Ra()&&(n[F]=s(d),E&=~(1<>3&7,g=S(d),k=r();switch(e){case 0:n[F]=k+g;break;case 1:n[F]=k*g;break;case 2:b(g);break;case 3:b(g);p();break;case 4:n[F]=k-g;break;case 5:n[F]=g-k;break;case 6:n[F]= +k/g;break;case 7:n[F]=g/k;break;default:z()}};this.S=function(b){var e=b&7;switch(b>>3&7){case 0:Ra()||(n[F]=s(e),E&=~(1<>3&7){case 0:var d=S(c);m(d);break;case 2:d=r();isNaN(d)||2147483647d?(Z|=A,N(c,2147483648)):N(c,h(d)); +break;case 3:d=r();isNaN(d)||2147483647d?(Z|=A,N(c,2147483648)):N(c,h(d));p();break;case 5:m(v(c));break;case 7:w(c,0);p();break;default:z()}};this.Ga=function(c){var d=c>>3&7,e=c&7;c=F+e&7;var e=s(e),g=r();switch(d){case 0:n[c]=e+g;break;case 1:n[c]=e*g;break;case 2:b(e);break;case 3:b(e);p();break;case 4:n[c]=g-e;break;case 5:n[c]=e-g;break;case 6:n[c]=g/e;break;case 7:n[c]=e/g;break;default:z()}};this.aa=function(c,d){var e=c>>3&7,g=x(d),k=r();switch(e){case 0:n[F]=k+g;break;case 1:n[F]= +k*g;break;case 2:b(g);break;case 3:b(g);p();break;case 4:n[F]=k-g;break;case 5:n[F]=g-k;break;case 6:n[F]=k/g;break;case 7:n[F]=g/k;break;default:z()}};this.Ka=function(c){var d=c&7;switch(c>>3&7){case 0:E|=1<<(F+d&7);break;case 2:n[F+d&7]=r();break;case 3:0!==d&&(n[F+d&7]=r());p();break;case 4:c=s(d);b(c);break;case 5:c=s(d);b(c);p();break;default:z()}};this.Ia=function(b,c){switch(b>>3&7){case 0:var g=x(c);m(g);break;case 2:y(c);break;case 3:y(c);p();break;case 4:g=c;k(g);for(var g=g+28,h=0;8>h;h++)n[h]= +v(g),g+=10;break;case 6:g=c;e(g);g+=28;for(h=0;8>h;h++)w(g,h-F&7),g+=10;d();break;case 7:R(c,Z&-14337|F<<11);break;default:z()}};this.Na=function(c){var d=c>>3&7;c=c&7;var e=F+c&7,g=s(c),k=r();switch(d){case 0:n[e]=g+k;break;case 1:n[e]=g*k;break;case 2:b(g);break;case 3:1===c?(b(n[e]),p()):z();break;case 4:n[e]=k-g;break;case 5:n[e]=g-k;break;case 6:n[e]=k/g;break;case 7:n[e]=g/k;break;default:z()}p()};this.Ma=function(c,d){var e=c>>3&7,g=Q(d)<<16>>16,k=r();switch(e){case 0:n[F]=k+g;break;case 1:n[F]= +k*g;break;case 2:b(g);break;case 3:b(g);p();break;case 4:n[F]=k-g;break;case 5:n[F]=g-k;break;case 6:n[F]=k/g;break;case 7:n[F]=g/k;break;default:z()}};this.Ra=function(b){var d=b&7;switch(b>>3&7){case 4:224===b?g[0]=Z&-14337|F<<11:z();break;case 5:b=s(d);c(b);p();break;default:z()}};this.Oa=function(b,c){switch(b>>3&7){case 0:var d=Q(c)<<16>>16;m(d);break;case 2:d=r();isNaN(d)||32767d?(Z|=A,R(c,32768)):R(c,h(d));break;case 3:d=r();isNaN(d)||32767d?(Z|=A,R(c,32768)):R(c,h(d)); +p();break;case 5:var e=S(c)>>>0,d=S(c+4)>>>0,e=e+4294967296*d;d>>31&&(e-=1.8446744073709552E19);m(e);break;case 7:d=h(r());if(isNaN(d)||9223372036854775E3d)d=9223372036854775E3,Z|=A;p();N(c,d);d/=4294967296;0>d&&-1Td;Td++)for(var Ud=0;3>Ud;Ud++)for(var td=1;8>td;td++){var ud=Td|Ud<<6;ta[ud|td<<3]=ta[ud];va[ud|td<<3]=va[ud]}p[0]=function(){return e[0]+h(3)+e[0]|0};p[1]=function(){return e[0]+h(3)+e[1]|0};p[2]=function(){return e[0]+h(3)+e[2]|0};p[3]=function(){return e[0]+h(3)+e[3]|0};p[4]=function(){return e[0]+h(2)+e[4]|0};p[5]=function(b){return e[0]+(b?h(2)+e[5]:h(3)+M())|0};p[6]=function(){return e[0]+ +h(3)+e[6]|0};p[7]=function(){return e[0]+h(3)+e[7]|0};p[64]=function(){return(e[0]<<1)+h(3)+e[0]|0};p[65]=function(){return(e[0]<<1)+h(3)+e[1]|0};p[66]=function(){return(e[0]<<1)+h(3)+e[2]|0};p[67]=function(){return(e[0]<<1)+h(3)+e[3]|0};p[68]=function(){return(e[0]<<1)+h(2)+e[4]|0};p[69]=function(b){return(e[0]<<1)+(b?h(2)+e[5]:h(3)+M())|0};p[70]=function(){return(e[0]<<1)+h(3)+e[6]|0};p[71]=function(){return(e[0]<<1)+h(3)+e[7]|0};p[128]=function(){return(e[0]<<2)+h(3)+e[0]|0};p[129]=function(){return(e[0]<< +2)+h(3)+e[1]|0};p[130]=function(){return(e[0]<<2)+h(3)+e[2]|0};p[131]=function(){return(e[0]<<2)+h(3)+e[3]|0};p[132]=function(){return(e[0]<<2)+h(2)+e[4]|0};p[133]=function(b){return(e[0]<<2)+(b?h(2)+e[5]:h(3)+M())|0};p[134]=function(){return(e[0]<<2)+h(3)+e[6]|0};p[135]=function(){return(e[0]<<2)+h(3)+e[7]|0};p[192]=function(){return(e[0]<<3)+h(3)+e[0]|0};p[193]=function(){return(e[0]<<3)+h(3)+e[1]|0};p[194]=function(){return(e[0]<<3)+h(3)+e[2]|0};p[195]=function(){return(e[0]<<3)+h(3)+e[3]|0};p[196]= +function(){return(e[0]<<3)+h(2)+e[4]|0};p[197]=function(b){return(e[0]<<3)+(b?h(2)+e[5]:h(3)+M())|0};p[198]=function(){return(e[0]<<3)+h(3)+e[6]|0};p[199]=function(){return(e[0]<<3)+h(3)+e[7]|0};p[8]=function(){return e[1]+h(3)+e[0]|0};p[9]=function(){return e[1]+h(3)+e[1]|0};p[10]=function(){return e[1]+h(3)+e[2]|0};p[11]=function(){return e[1]+h(3)+e[3]|0};p[12]=function(){return e[1]+h(2)+e[4]|0};p[13]=function(b){return e[1]+(b?h(2)+e[5]:h(3)+M())|0};p[14]=function(){return e[1]+h(3)+e[6]|0}; +p[15]=function(){return e[1]+h(3)+e[7]|0};p[72]=function(){return(e[1]<<1)+h(3)+e[0]|0};p[73]=function(){return(e[1]<<1)+h(3)+e[1]|0};p[74]=function(){return(e[1]<<1)+h(3)+e[2]|0};p[75]=function(){return(e[1]<<1)+h(3)+e[3]|0};p[76]=function(){return(e[1]<<1)+h(2)+e[4]|0};p[77]=function(b){return(e[1]<<1)+(b?h(2)+e[5]:h(3)+M())|0};p[78]=function(){return(e[1]<<1)+h(3)+e[6]|0};p[79]=function(){return(e[1]<<1)+h(3)+e[7]|0};p[136]=function(){return(e[1]<<2)+h(3)+e[0]|0};p[137]=function(){return(e[1]<< +2)+h(3)+e[1]|0};p[138]=function(){return(e[1]<<2)+h(3)+e[2]|0};p[139]=function(){return(e[1]<<2)+h(3)+e[3]|0};p[140]=function(){return(e[1]<<2)+h(2)+e[4]|0};p[141]=function(b){return(e[1]<<2)+(b?h(2)+e[5]:h(3)+M())|0};p[142]=function(){return(e[1]<<2)+h(3)+e[6]|0};p[143]=function(){return(e[1]<<2)+h(3)+e[7]|0};p[200]=function(){return(e[1]<<3)+h(3)+e[0]|0};p[201]=function(){return(e[1]<<3)+h(3)+e[1]|0};p[202]=function(){return(e[1]<<3)+h(3)+e[2]|0};p[203]=function(){return(e[1]<<3)+h(3)+e[3]|0};p[204]= +function(){return(e[1]<<3)+h(2)+e[4]|0};p[205]=function(b){return(e[1]<<3)+(b?h(2)+e[5]:h(3)+M())|0};p[206]=function(){return(e[1]<<3)+h(3)+e[6]|0};p[207]=function(){return(e[1]<<3)+h(3)+e[7]|0};p[16]=function(){return e[2]+h(3)+e[0]|0};p[17]=function(){return e[2]+h(3)+e[1]|0};p[18]=function(){return e[2]+h(3)+e[2]|0};p[19]=function(){return e[2]+h(3)+e[3]|0};p[20]=function(){return e[2]+h(2)+e[4]|0};p[21]=function(b){return e[2]+(b?h(2)+e[5]:h(3)+M())|0};p[22]=function(){return e[2]+h(3)+e[6]|0}; +p[23]=function(){return e[2]+h(3)+e[7]|0};p[80]=function(){return(e[2]<<1)+h(3)+e[0]|0};p[81]=function(){return(e[2]<<1)+h(3)+e[1]|0};p[82]=function(){return(e[2]<<1)+h(3)+e[2]|0};p[83]=function(){return(e[2]<<1)+h(3)+e[3]|0};p[84]=function(){return(e[2]<<1)+h(2)+e[4]|0};p[85]=function(b){return(e[2]<<1)+(b?h(2)+e[5]:h(3)+M())|0};p[86]=function(){return(e[2]<<1)+h(3)+e[6]|0};p[87]=function(){return(e[2]<<1)+h(3)+e[7]|0};p[144]=function(){return(e[2]<<2)+h(3)+e[0]|0};p[145]=function(){return(e[2]<< +2)+h(3)+e[1]|0};p[146]=function(){return(e[2]<<2)+h(3)+e[2]|0};p[147]=function(){return(e[2]<<2)+h(3)+e[3]|0};p[148]=function(){return(e[2]<<2)+h(2)+e[4]|0};p[149]=function(b){return(e[2]<<2)+(b?h(2)+e[5]:h(3)+M())|0};p[150]=function(){return(e[2]<<2)+h(3)+e[6]|0};p[151]=function(){return(e[2]<<2)+h(3)+e[7]|0};p[208]=function(){return(e[2]<<3)+h(3)+e[0]|0};p[209]=function(){return(e[2]<<3)+h(3)+e[1]|0};p[210]=function(){return(e[2]<<3)+h(3)+e[2]|0};p[211]=function(){return(e[2]<<3)+h(3)+e[3]|0};p[212]= +function(){return(e[2]<<3)+h(2)+e[4]|0};p[213]=function(b){return(e[2]<<3)+(b?h(2)+e[5]:h(3)+M())|0};p[214]=function(){return(e[2]<<3)+h(3)+e[6]|0};p[215]=function(){return(e[2]<<3)+h(3)+e[7]|0};p[24]=function(){return e[3]+h(3)+e[0]|0};p[25]=function(){return e[3]+h(3)+e[1]|0};p[26]=function(){return e[3]+h(3)+e[2]|0};p[27]=function(){return e[3]+h(3)+e[3]|0};p[28]=function(){return e[3]+h(2)+e[4]|0};p[29]=function(b){return e[3]+(b?h(2)+e[5]:h(3)+M())|0};p[30]=function(){return e[3]+h(3)+e[6]|0}; +p[31]=function(){return e[3]+h(3)+e[7]|0};p[88]=function(){return(e[3]<<1)+h(3)+e[0]|0};p[89]=function(){return(e[3]<<1)+h(3)+e[1]|0};p[90]=function(){return(e[3]<<1)+h(3)+e[2]|0};p[91]=function(){return(e[3]<<1)+h(3)+e[3]|0};p[92]=function(){return(e[3]<<1)+h(2)+e[4]|0};p[93]=function(b){return(e[3]<<1)+(b?h(2)+e[5]:h(3)+M())|0};p[94]=function(){return(e[3]<<1)+h(3)+e[6]|0};p[95]=function(){return(e[3]<<1)+h(3)+e[7]|0};p[152]=function(){return(e[3]<<2)+h(3)+e[0]|0};p[153]=function(){return(e[3]<< +2)+h(3)+e[1]|0};p[154]=function(){return(e[3]<<2)+h(3)+e[2]|0};p[155]=function(){return(e[3]<<2)+h(3)+e[3]|0};p[156]=function(){return(e[3]<<2)+h(2)+e[4]|0};p[157]=function(b){return(e[3]<<2)+(b?h(2)+e[5]:h(3)+M())|0};p[158]=function(){return(e[3]<<2)+h(3)+e[6]|0};p[159]=function(){return(e[3]<<2)+h(3)+e[7]|0};p[216]=function(){return(e[3]<<3)+h(3)+e[0]|0};p[217]=function(){return(e[3]<<3)+h(3)+e[1]|0};p[218]=function(){return(e[3]<<3)+h(3)+e[2]|0};p[219]=function(){return(e[3]<<3)+h(3)+e[3]|0};p[220]= +function(){return(e[3]<<3)+h(2)+e[4]|0};p[221]=function(b){return(e[3]<<3)+(b?h(2)+e[5]:h(3)+M())|0};p[222]=function(){return(e[3]<<3)+h(3)+e[6]|0};p[223]=function(){return(e[3]<<3)+h(3)+e[7]|0};p[32]=function(){return 0+h(3)+e[0]|0};p[33]=function(){return 0+h(3)+e[1]|0};p[34]=function(){return 0+h(3)+e[2]|0};p[35]=function(){return 0+h(3)+e[3]|0};p[36]=function(){return 0+h(2)+e[4]|0};p[37]=function(b){return 0+(b?h(2)+e[5]:h(3)+M())|0};p[38]=function(){return 0+h(3)+e[6]|0};p[39]=function(){return 0+ +h(3)+e[7]|0};p[96]=function(){return 0+h(3)+e[0]|0};p[97]=function(){return 0+h(3)+e[1]|0};p[98]=function(){return 0+h(3)+e[2]|0};p[99]=function(){return 0+h(3)+e[3]|0};p[100]=function(){return 0+h(2)+e[4]|0};p[101]=function(b){return 0+(b?h(2)+e[5]:h(3)+M())|0};p[102]=function(){return 0+h(3)+e[6]|0};p[103]=function(){return 0+h(3)+e[7]|0};p[160]=function(){return 0+h(3)+e[0]|0};p[161]=function(){return 0+h(3)+e[1]|0};p[162]=function(){return 0+h(3)+e[2]|0};p[163]=function(){return 0+h(3)+e[3]|0}; +p[164]=function(){return 0+h(2)+e[4]|0};p[165]=function(b){return 0+(b?h(2)+e[5]:h(3)+M())|0};p[166]=function(){return 0+h(3)+e[6]|0};p[167]=function(){return 0+h(3)+e[7]|0};p[224]=function(){return 0+h(3)+e[0]|0};p[225]=function(){return 0+h(3)+e[1]|0};p[226]=function(){return 0+h(3)+e[2]|0};p[227]=function(){return 0+h(3)+e[3]|0};p[228]=function(){return 0+h(2)+e[4]|0};p[229]=function(b){return 0+(b?h(2)+e[5]:h(3)+M())|0};p[230]=function(){return 0+h(3)+e[6]|0};p[231]=function(){return 0+h(3)+e[7]| +0};p[40]=function(){return e[5]+h(3)+e[0]|0};p[41]=function(){return e[5]+h(3)+e[1]|0};p[42]=function(){return e[5]+h(3)+e[2]|0};p[43]=function(){return e[5]+h(3)+e[3]|0};p[44]=function(){return e[5]+h(2)+e[4]|0};p[45]=function(b){return e[5]+(b?h(2)+e[5]:h(3)+M())|0};p[46]=function(){return e[5]+h(3)+e[6]|0};p[47]=function(){return e[5]+h(3)+e[7]|0};p[104]=function(){return(e[5]<<1)+h(3)+e[0]|0};p[105]=function(){return(e[5]<<1)+h(3)+e[1]|0};p[106]=function(){return(e[5]<<1)+h(3)+e[2]|0};p[107]= +function(){return(e[5]<<1)+h(3)+e[3]|0};p[108]=function(){return(e[5]<<1)+h(2)+e[4]|0};p[109]=function(b){return(e[5]<<1)+(b?h(2)+e[5]:h(3)+M())|0};p[110]=function(){return(e[5]<<1)+h(3)+e[6]|0};p[111]=function(){return(e[5]<<1)+h(3)+e[7]|0};p[168]=function(){return(e[5]<<2)+h(3)+e[0]|0};p[169]=function(){return(e[5]<<2)+h(3)+e[1]|0};p[170]=function(){return(e[5]<<2)+h(3)+e[2]|0};p[171]=function(){return(e[5]<<2)+h(3)+e[3]|0};p[172]=function(){return(e[5]<<2)+h(2)+e[4]|0};p[173]=function(b){return(e[5]<< +2)+(b?h(2)+e[5]:h(3)+M())|0};p[174]=function(){return(e[5]<<2)+h(3)+e[6]|0};p[175]=function(){return(e[5]<<2)+h(3)+e[7]|0};p[232]=function(){return(e[5]<<3)+h(3)+e[0]|0};p[233]=function(){return(e[5]<<3)+h(3)+e[1]|0};p[234]=function(){return(e[5]<<3)+h(3)+e[2]|0};p[235]=function(){return(e[5]<<3)+h(3)+e[3]|0};p[236]=function(){return(e[5]<<3)+h(2)+e[4]|0};p[237]=function(b){return(e[5]<<3)+(b?h(2)+e[5]:h(3)+M())|0};p[238]=function(){return(e[5]<<3)+h(3)+e[6]|0};p[239]=function(){return(e[5]<<3)+h(3)+ +e[7]|0};p[48]=function(){return e[6]+h(3)+e[0]|0};p[49]=function(){return e[6]+h(3)+e[1]|0};p[50]=function(){return e[6]+h(3)+e[2]|0};p[51]=function(){return e[6]+h(3)+e[3]|0};p[52]=function(){return e[6]+h(2)+e[4]|0};p[53]=function(b){return e[6]+(b?h(2)+e[5]:h(3)+M())|0};p[54]=function(){return e[6]+h(3)+e[6]|0};p[55]=function(){return e[6]+h(3)+e[7]|0};p[112]=function(){return(e[6]<<1)+h(3)+e[0]|0};p[113]=function(){return(e[6]<<1)+h(3)+e[1]|0};p[114]=function(){return(e[6]<<1)+h(3)+e[2]|0};p[115]= +function(){return(e[6]<<1)+h(3)+e[3]|0};p[116]=function(){return(e[6]<<1)+h(2)+e[4]|0};p[117]=function(b){return(e[6]<<1)+(b?h(2)+e[5]:h(3)+M())|0};p[118]=function(){return(e[6]<<1)+h(3)+e[6]|0};p[119]=function(){return(e[6]<<1)+h(3)+e[7]|0};p[176]=function(){return(e[6]<<2)+h(3)+e[0]|0};p[177]=function(){return(e[6]<<2)+h(3)+e[1]|0};p[178]=function(){return(e[6]<<2)+h(3)+e[2]|0};p[179]=function(){return(e[6]<<2)+h(3)+e[3]|0};p[180]=function(){return(e[6]<<2)+h(2)+e[4]|0};p[181]=function(b){return(e[6]<< +2)+(b?h(2)+e[5]:h(3)+M())|0};p[182]=function(){return(e[6]<<2)+h(3)+e[6]|0};p[183]=function(){return(e[6]<<2)+h(3)+e[7]|0};p[240]=function(){return(e[6]<<3)+h(3)+e[0]|0};p[241]=function(){return(e[6]<<3)+h(3)+e[1]|0};p[242]=function(){return(e[6]<<3)+h(3)+e[2]|0};p[243]=function(){return(e[6]<<3)+h(3)+e[3]|0};p[244]=function(){return(e[6]<<3)+h(2)+e[4]|0};p[245]=function(b){return(e[6]<<3)+(b?h(2)+e[5]:h(3)+M())|0};p[246]=function(){return(e[6]<<3)+h(3)+e[6]|0};p[247]=function(){return(e[6]<<3)+h(3)+ +e[7]|0};p[56]=function(){return e[7]+h(3)+e[0]|0};p[57]=function(){return e[7]+h(3)+e[1]|0};p[58]=function(){return e[7]+h(3)+e[2]|0};p[59]=function(){return e[7]+h(3)+e[3]|0};p[60]=function(){return e[7]+h(2)+e[4]|0};p[61]=function(b){return e[7]+(b?h(2)+e[5]:h(3)+M())|0};p[62]=function(){return e[7]+h(3)+e[6]|0};p[63]=function(){return e[7]+h(3)+e[7]|0};p[120]=function(){return(e[7]<<1)+h(3)+e[0]|0};p[121]=function(){return(e[7]<<1)+h(3)+e[1]|0};p[122]=function(){return(e[7]<<1)+h(3)+e[2]|0};p[123]= +function(){return(e[7]<<1)+h(3)+e[3]|0};p[124]=function(){return(e[7]<<1)+h(2)+e[4]|0};p[125]=function(b){return(e[7]<<1)+(b?h(2)+e[5]:h(3)+M())|0};p[126]=function(){return(e[7]<<1)+h(3)+e[6]|0};p[127]=function(){return(e[7]<<1)+h(3)+e[7]|0};p[184]=function(){return(e[7]<<2)+h(3)+e[0]|0};p[185]=function(){return(e[7]<<2)+h(3)+e[1]|0};p[186]=function(){return(e[7]<<2)+h(3)+e[2]|0};p[187]=function(){return(e[7]<<2)+h(3)+e[3]|0};p[188]=function(){return(e[7]<<2)+h(2)+e[4]|0};p[189]=function(b){return(e[7]<< +2)+(b?h(2)+e[5]:h(3)+M())|0};p[190]=function(){return(e[7]<<2)+h(3)+e[6]|0};p[191]=function(){return(e[7]<<2)+h(3)+e[7]|0};p[248]=function(){return(e[7]<<3)+h(3)+e[0]|0};p[249]=function(){return(e[7]<<3)+h(3)+e[1]|0};p[250]=function(){return(e[7]<<3)+h(3)+e[2]|0};p[251]=function(){return(e[7]<<3)+h(3)+e[3]|0};p[252]=function(){return(e[7]<<3)+h(2)+e[4]|0};p[253]=function(b){return(e[7]<<3)+(b?h(2)+e[5]:h(3)+M())|0};p[254]=function(){return(e[7]<<3)+h(3)+e[6]|0};p[255]=function(){return(e[7]<<3)+h(3)+ +e[7]|0};ie=function(b){return va[b]()};he=function(b){return ta[b]()};"use strict";var oe=new Uint8Array([32,0,1,26,2,23,27,0,3,16,24,30,28,11,0,13,4,7,17,0,25,22,31,15,29,10,12,6,0,21,14,9,5,20,8,19,18]);"use strict";var Ya=Tc,Ra=Ba,Sa=Gb,Za=hd,Ta=ge;"use strict";"use strict";"use strict";var r=[],s=[],x=[],w=[];r[0]=s[0]=function(){var b=m(),c,d;192>b?(d=q(l(b)),c=k.d(d),k.e(d,kc(c,v[b>>1&12|b>>5&1]))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=kc(c,v[b>>1&12|b>>5&1]))};r[1]=function(){var b=m(),c, +d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,eb(c,g[b>>2&14]))):(c=k.b(d),k.a(d,eb(c,g[b>>2&14])))):(c=g[b<<1&14],g[b<<1&14]=eb(c,g[b>>2&14]))};s[1]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,fb(c,y[b>>3&7]))):(c=k.c(d)>>>0,k.f(d,fb(c,y[b>>3&7])))):(c=y[b&7],e[b&7]=fb(c,y[b>>3&7]))};r[2]=s[2]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];v[b>>1&12|b>>5&1]=kc(v[b>>1&12|b>>5&1],c)};r[3]=function(){var b=m(),c=192> +b?Q(l(b)):g[b<<1&14];g[b>>2&14]=eb(g[b>>2&14],c)};s[3]=function(){var b=m(),c=192>b?S(l(b))>>>0:y[b&7];e[b>>3&7]=fb(y[b>>3&7],c)};r[4]=s[4]=function(){v[0]=kc(v[0],m())};r[5]=function(){g[0]=eb(g[0],U())};s[5]=function(){y[0]=fb(y[0],M()>>>0)};r[6]=function(){la(ra[0])};s[6]=function(){ia(ra[0])};r[7]=function(){ca(0,k.b(Va(0)));$[aa]+=2};s[7]=function(){ca(0,k.b(Va(0)));$[aa]+=4};r[8]=s[8]=function(){var b=m(),c,d;192>b?(d=q(l(b)),c=k.d(d),k.e(d,yc(c,v[b>>1&12|b>>5&1]))):(c=v[b<<2&12|b>>2&1],v[b<< +2&12|b>>2&1]=yc(c,v[b>>1&12|b>>5&1]))};r[9]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,vb(c,g[b>>2&14]))):(c=k.b(d),k.a(d,vb(c,g[b>>2&14])))):(c=g[b<<1&14],g[b<<1&14]=vb(c,g[b>>2&14]))};s[9]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g),H(d,g,wb(c,e[b>>3&7]))):(c=k.c(d),k.f(d,wb(c,e[b>>3&7])))):(c=e[b&7],e[b&7]=wb(c,e[b>>3&7]))};r[10]=s[10]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];v[b>>1&12|b>>5& +1]=yc(v[b>>1&12|b>>5&1],c)};r[11]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=vb(g[b>>2&14],c)};s[11]=function(){var b=m(),c=192>b?S(l(b)):e[b&7];e[b>>3&7]=wb(e[b>>3&7],c)};r[12]=s[12]=function(){v[0]=yc(v[0],m())};r[13]=function(){g[0]=vb(g[0],U())};s[13]=function(){y[0]=wb(e[0],M())};r[14]=function(){la(ra[1])};s[14]=function(){ia(ra[1])};r[15]=s[15]=function(){Jd[m()]()};r[16]=s[16]=function(){var b=m(),c,d;192>b?(d=q(l(b)),c=k.d(d),k.e(d,uc(c,v[b>>1&12|b>>5&1]))):(c=v[b<<2&12|b>> +2&1],v[b<<2&12|b>>2&1]=uc(c,v[b>>1&12|b>>5&1]))};r[17]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,jb(c,g[b>>2&14]))):(c=k.b(d),k.a(d,jb(c,g[b>>2&14])))):(c=g[b<<1&14],g[b<<1&14]=jb(c,g[b>>2&14]))};s[17]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,kb(c,y[b>>3&7]))):(c=k.c(d)>>>0,k.f(d,kb(c,y[b>>3&7])))):(c=y[b&7],e[b&7]=kb(c,y[b>>3&7]))};r[18]=s[18]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>> +2&1];v[b>>1&12|b>>5&1]=uc(v[b>>1&12|b>>5&1],c)};r[19]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=jb(g[b>>2&14],c)};s[19]=function(){var b=m(),c=192>b?S(l(b))>>>0:y[b&7];e[b>>3&7]=kb(y[b>>3&7],c)};r[20]=s[20]=function(){v[0]=uc(v[0],m())};r[21]=function(){g[0]=jb(g[0],U())};s[21]=function(){y[0]=kb(y[0],M()>>>0)};r[22]=function(){la(ra[2])};s[22]=function(){ia(ra[2])};r[23]=function(){ca(2,k.b(Va(0)));$[aa]+=2};s[23]=function(){ca(2,k.b(Va(0)));$[aa]+=4};r[24]=s[24]=function(){var b= +m(),c,d;192>b?(d=q(l(b)),c=k.d(d),k.e(d,wc(c,v[b>>1&12|b>>5&1]))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=wc(c,v[b>>1&12|b>>5&1]))};r[25]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,nb(c,g[b>>2&14]))):(c=k.b(d),k.a(d,nb(c,g[b>>2&14])))):(c=g[b<<1&14],g[b<<1&14]=nb(c,g[b>>2&14]))};s[25]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,ob(c,y[b>>3&7]))):(c=k.c(d)>>>0,k.f(d,ob(c,y[b>>3&7])))):(c=y[b&7],e[b&7]= +ob(c,y[b>>3&7]))};r[26]=s[26]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];v[b>>1&12|b>>5&1]=wc(v[b>>1&12|b>>5&1],c)};r[27]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=nb(g[b>>2&14],c)};s[27]=function(){var b=m(),c=192>b?S(l(b))>>>0:y[b&7];e[b>>3&7]=ob(y[b>>3&7],c)};r[28]=s[28]=function(){v[0]=wc(v[0],m())};r[29]=function(){g[0]=nb(g[0],U())};s[29]=function(){y[0]=ob(y[0],M()>>>0)};r[30]=function(){la(ra[3])};s[30]=function(){ia(ra[3])};r[31]=function(){ca(3,k.b(Va(0))); +$[aa]+=2};s[31]=function(){ca(3,k.b(Va(0)));$[aa]+=4};r[32]=s[32]=function(){var b=m(),c,d;192>b?(d=q(l(b)),c=k.d(d),k.e(d,xc(c,v[b>>1&12|b>>5&1]))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=xc(c,v[b>>1&12|b>>5&1]))};r[33]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,tb(c,g[b>>2&14]))):(c=k.b(d),k.a(d,tb(c,g[b>>2&14])))):(c=g[b<<1&14],g[b<<1&14]=tb(c,g[b>>2&14]))};s[33]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g), +H(d,g,ub(c,e[b>>3&7]))):(c=k.c(d),k.f(d,ub(c,e[b>>3&7])))):(c=e[b&7],e[b&7]=ub(c,e[b>>3&7]))};r[34]=s[34]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];v[b>>1&12|b>>5&1]=xc(v[b>>1&12|b>>5&1],c)};r[35]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=tb(g[b>>2&14],c)};s[35]=function(){var b=m(),c=192>b?S(l(b)):e[b&7];e[b>>3&7]=ub(e[b>>3&7],c)};r[36]=s[36]=function(){v[0]=xc(v[0],m())};r[37]=function(){g[0]=tb(g[0],U())};s[37]=function(){y[0]=ub(e[0],M())};r[38]=s[38]=function(){ja(0)}; +r[39]=s[39]=function(){var b=v[0],c=Ba(),d=Sc();u&=-18;if(9<(b&15)||d)v[0]+=6,u|=16;if(153b?(d=q(l(b)),c=k.d(d),k.e(d,vc(c,v[b>>1&12|b>>5&1]))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=vc(c,v[b>>1&12|b>>5&1]))};r[41]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,lb(c,g[b>>2&14]))):(c=k.b(d),k.a(d,lb(c,g[b>>2&14])))):(c=g[b<<1&14],g[b<<1&14]=lb(c,g[b>>2&14]))};s[41]=function(){var b= +m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,mb(c,y[b>>3&7]))):(c=k.c(d)>>>0,k.f(d,mb(c,y[b>>3&7])))):(c=y[b&7],e[b&7]=mb(c,y[b>>3&7]))};r[42]=s[42]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];v[b>>1&12|b>>5&1]=vc(v[b>>1&12|b>>5&1],c)};r[43]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=lb(g[b>>2&14],c)};s[43]=function(){var b=m(),c=192>b?S(l(b))>>>0:y[b&7];e[b>>3&7]=mb(y[b>>3&7],c)};r[44]=s[44]=function(){v[0]=vc(v[0],m())};r[45]=function(){g[0]= +lb(g[0],U())};s[45]=function(){y[0]=mb(y[0],M()>>>0)};r[46]=s[46]=function(){ja(1)};r[47]=s[47]=function(){var b=v[0],c=Ba();u&=-2;9<(b&15)||Sc()?(v[0]-=6,u|=16,u=u&-2|c|v[0]>>7):u&=-17;if(153b?(d=q(l(b)),c=k.d(d),k.e(d,zc(c,v[b>>1&12|b>>5&1]))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=zc(c,v[b>>1&12|b>>5&1]))};r[49]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,xb(c, +g[b>>2&14]))):(c=k.b(d),k.a(d,xb(c,g[b>>2&14])))):(c=g[b<<1&14],g[b<<1&14]=xb(c,g[b>>2&14]))};s[49]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g),H(d,g,yb(c,e[b>>3&7]))):(c=k.c(d),k.f(d,yb(c,e[b>>3&7])))):(c=e[b&7],e[b&7]=yb(c,e[b>>3&7]))};r[50]=s[50]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];v[b>>1&12|b>>5&1]=zc(v[b>>1&12|b>>5&1],c)};r[51]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=xb(g[b>>2&14],c)};s[51]=function(){var b=m(),c= +192>b?S(l(b)):e[b&7];e[b>>3&7]=yb(e[b>>3&7],c)};r[52]=s[52]=function(){v[0]=zc(v[0],m())};r[53]=function(){g[0]=xb(g[0],U())};s[53]=function(){y[0]=yb(e[0],M())};r[54]=s[54]=function(){ja(2)};r[55]=s[55]=function(){9<(v[0]&15)||Sc()?(g[0]+=6,v[1]+=1,u|=17):u&=-18;v[0]&=15;K&=-18};r[56]=s[56]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];lc(c,v[b>>1&12|b>>5&1])};r[57]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];Yb(c,g[b>>2&14])};s[57]=function(){var b=m(),c=192>b?S(l(b))>>>0:y[b&7];Zb(c, +y[b>>3&7])};r[58]=s[58]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];lc(v[b>>1&12|b>>5&1],c)};r[59]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];Yb(g[b>>2&14],c)};s[59]=function(){var b=m(),c=192>b?S(l(b))>>>0:y[b&7];Zb(y[b>>3&7],c)};r[60]=s[60]=function(){lc(v[0],m())};r[61]=function(){Yb(g[0],U())};s[61]=function(){Zb(y[0],M()>>>0)};r[62]=s[62]=function(){ja(3)};r[63]=s[63]=function(){9<(v[0]&15)||Sc()?(g[0]-=6,v[1]-=1,u|=17):u&=-18;v[0]&=15;K&=-18};r[64]=function(){g[0]=pb(g[0])}; +s[64]=function(){y[0]=qb(y[0])};r[65]=function(){g[2]=pb(g[2])};s[65]=function(){y[1]=qb(y[1])};r[66]=function(){g[4]=pb(g[4])};s[66]=function(){y[2]=qb(y[2])};r[67]=function(){g[6]=pb(g[6])};s[67]=function(){y[3]=qb(y[3])};r[68]=function(){g[8]=pb(g[8])};s[68]=function(){y[4]=qb(y[4])};r[69]=function(){g[10]=pb(g[10])};s[69]=function(){y[5]=qb(y[5])};r[70]=function(){g[12]=pb(g[12])};s[70]=function(){y[6]=qb(y[6])};r[71]=function(){g[14]=pb(g[14])};s[71]=function(){y[7]=qb(y[7])};r[72]=function(){g[0]= +rb(g[0])};s[72]=function(){y[0]=sb(y[0])};r[73]=function(){g[2]=rb(g[2])};s[73]=function(){y[1]=sb(y[1])};r[74]=function(){g[4]=rb(g[4])};s[74]=function(){y[2]=sb(y[2])};r[75]=function(){g[6]=rb(g[6])};s[75]=function(){y[3]=sb(y[3])};r[76]=function(){g[8]=rb(g[8])};s[76]=function(){y[4]=sb(y[4])};r[77]=function(){g[10]=rb(g[10])};s[77]=function(){y[5]=sb(y[5])};r[78]=function(){g[12]=rb(g[12])};s[78]=function(){y[6]=sb(y[6])};r[79]=function(){g[14]=rb(g[14])};s[79]=function(){y[7]=sb(y[7])};r[80]= +function(){la(g[0])};s[80]=function(){ia(e[0])};r[81]=function(){la(g[2])};s[81]=function(){ia(e[1])};r[82]=function(){la(g[4])};s[82]=function(){ia(e[2])};r[83]=function(){la(g[6])};s[83]=function(){ia(e[3])};r[84]=function(){la(g[8])};s[84]=function(){ia(e[4])};r[85]=function(){la(g[10])};s[85]=function(){ia(e[5])};r[86]=function(){la(g[12])};s[86]=function(){ia(e[6])};r[87]=function(){la(g[14])};s[87]=function(){ia(e[7])};r[88]=function(){g[0]=Aa()};s[88]=function(){y[0]=ua()};r[89]=function(){g[2]= +Aa()};s[89]=function(){y[1]=ua()};r[90]=function(){g[4]=Aa()};s[90]=function(){y[2]=ua()};r[91]=function(){g[6]=Aa()};s[91]=function(){y[3]=ua()};r[92]=function(){g[8]=Aa()};s[92]=function(){y[4]=ua()};r[93]=function(){g[10]=Aa()};s[93]=function(){y[5]=ua()};r[94]=function(){g[12]=Aa()};s[94]=function(){y[6]=ua()};r[95]=function(){g[14]=Aa()};s[95]=function(){y[7]=ua()};r[96]=function(){var b=g[8];q(b-15);la(g[0]);la(g[2]);la(g[4]);la(g[6]);la(b);la(g[10]);la(g[12]);la(g[14])};s[96]=function(){var b= +e[4];q(b-31);ia(e[0]);ia(e[1]);ia(e[2]);ia(e[3]);ia(b);ia(e[5]);ia(e[6]);ia(e[7])};r[97]=function(){Ea($[aa]+15);g[14]=Aa();g[12]=Aa();g[10]=Aa();$[aa]+=2;g[6]=Aa();g[4]=Aa();g[2]=Aa();g[0]=Aa()};s[97]=function(){Ea($[aa]+31);y[7]=ua();y[6]=ua();y[5]=ua();$[aa]+=4;y[3]=ua();y[2]=ua();y[1]=ua();y[0]=ua()};r[98]=s[98]=function(){throw ze("bound instruction");};r[99]=s[99]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,Ca(c,b>>2&14))):(c=k.b(d),k.a(d,Ca(c, +b>>2&14)))):(c=g[b<<1&14],g[b<<1&14]=Ca(c,b>>2&14))};r[100]=s[100]=function(){ja(4)};r[101]=s[101]=function(){ja(5)};r[102]=s[102]=function(){xa=!Db;La();Ab[m()]();xa=Db;La()};r[103]=s[103]=function(){Cb=!Db;zb();Ab[m()]();Cb=Db;zb()};r[104]=function(){la(U())};s[104]=function(){ia(M())};r[105]=function(){var b=m(),c=192>b?Q(l(b))<<16>>16:Ga[b<<1&14];g[b>>2&14]=Md(U()<<16>>16,c)};s[105]=function(){var b=m(),c=192>b?S(l(b)):e[b&7];y[b>>3&7]=Nd(M(),c)};r[106]=function(){la(P())};s[106]=function(){ia(P())}; +r[107]=function(){var b=m(),c=192>b?Q(l(b))<<16>>16:Ga[b<<1&14];g[b>>2&14]=Md(P(),c)};s[107]=function(){var b=m(),c=192>b?S(l(b)):e[b&7];y[b>>3&7]=Nd(P(),c)};r[108]=s[108]=function(){var b=g[4],c,d=u&1024?-1:1;c=da[0]+A[T];if(wa){if(0!==A[ga]){do V(c,hc(b)),c+=d,A[T]+=d;while(--A[ga])}}else V(c,hc(b)),A[T]+=d};r[109]=function(){var b=g[4],c,d=u&1024?-1:1;c=da[0]+A[T];if(wa){if(0!==A[ga]){do R(c,ic(b)),c+=d,A[T]+=d;while(--A[ga])}}else R(c,ic(b)),A[T]+=d};s[109]=function(){var b=g[4],c,d=u&1024?-4: +4;c=da[0]+A[T];if(wa){if(0!==A[ga]){var e=0===(c&3)&&!0;do{if(e){var h=q(c);k.D(h,cb(b))}else N(c,cb(b));c+=d;A[T]+=d}while(--A[ga])}}else N(c,cb(b)),A[T]+=d};r[110]=s[110]=function(){var b=g[4],c,d=u&1024?-1:1;c=h(3)+A[W];if(wa){if(0!==A[ga]){do Fa(b,ka(c)),c+=d,A[W]+=d;while(--A[ga])}}else Fa(b,ka(c)),A[W]+=d};r[111]=function(){var b=g[4],c,d=u&1024?-2:2;c=h(3)+A[W];if(wa){if(0!==A[ga]){do Xb(b,Q(c)),c+=d,A[W]+=d;while(--A[ga])}}else Xb(b,Q(c)),A[W]+=d};s[111]=function(){var b=g[4],c,d=u&1024?-4: +4;c=h(3)+A[W];if(wa){if(0!==A[ga]){do gc(b,S(c)),c+=d,A[W]+=d;while(--A[ga])}}else gc(b,S(c)),A[W]+=d};r[112]=s[112]=function(){Ya()&&(E=E+P()|0);E++};r[113]=s[113]=function(){Ya()||(E=E+P()|0);E++};r[114]=s[114]=function(){Ra()&&(E=E+P()|0);E++};r[115]=s[115]=function(){Ra()||(E=E+P()|0);E++};r[116]=s[116]=function(){Sa()&&(E=E+P()|0);E++};r[117]=s[117]=function(){Sa()||(E=E+P()|0);E++};r[118]=s[118]=function(){Qa()&&(E=E+P()|0);E++};r[119]=s[119]=function(){Qa()||(E=E+P()|0);E++};r[120]=s[120]= +function(){Za()&&(E=E+P()|0);E++};r[121]=s[121]=function(){Za()||(E=E+P()|0);E++};r[122]=s[122]=function(){Ta()&&(E=E+P()|0);E++};r[123]=s[123]=function(){Ta()||(E=E+P()|0);E++};r[124]=s[124]=function(){Wa()&&(E=E+P()|0);E++};r[125]=s[125]=function(){Wa()||(E=E+P()|0);E++};r[126]=s[126]=function(){Xa()&&(E=E+P()|0);E++};r[127]=s[127]=function(){Xa()||(E=E+P()|0);E++};r[128]=s[128]=function(){var b=m();switch(b>>3&7){case 0:var c;192>b?(b=q(l(b)),c=k.d(b),k.e(b,kc(c,m()))):(c=v[b<<2&12|b>>2&1],v[b<< +2&12|b>>2&1]=kc(c,m()));break;case 1:192>b?(b=q(l(b)),c=k.d(b),k.e(b,yc(c,m()))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=yc(c,m()));break;case 2:192>b?(b=q(l(b)),c=k.d(b),k.e(b,uc(c,m()))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=uc(c,m()));break;case 3:192>b?(b=q(l(b)),c=k.d(b),k.e(b,wc(c,m()))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=wc(c,m()));break;case 4:192>b?(b=q(l(b)),c=k.d(b),k.e(b,xc(c,m()))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=xc(c,m()));break;case 5:192>b?(b=q(l(b)),c=k.d(b),k.e(b,vc(c, +m()))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=vc(c,m()));break;case 6:192>b?(b=q(l(b)),c=k.d(b),k.e(b,zc(c,m()))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=zc(c,m()));break;case 7:c=192>b?ka(l(b)):v[b<<2&12|b>>2&1],lc(c,m())}};r[129]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,eb(c,U()))):(c=k.b(b),k.a(b,eb(c,U())))):(c=g[b<<1&14],g[b<<1&14]=eb(c,U()));break;case 1:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d, +vb(c,U()))):(c=k.b(b),k.a(b,vb(c,U())))):(c=g[b<<1&14],g[b<<1&14]=vb(c,U()));break;case 2:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,jb(c,U()))):(c=k.b(b),k.a(b,jb(c,U())))):(c=g[b<<1&14],g[b<<1&14]=jb(c,U()));break;case 3:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,nb(c,U()))):(c=k.b(b),k.a(b,nb(c,U())))):(c=g[b<<1&14],g[b<<1&14]=nb(c,U()));break;case 4:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,tb(c,U()))):(c=k.b(b),k.a(b,tb(c,U())))): +(c=g[b<<1&14],g[b<<1&14]=tb(c,U()));break;case 5:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,lb(c,U()))):(c=k.b(b),k.a(b,lb(c,U())))):(c=g[b<<1&14],g[b<<1&14]=lb(c,U()));break;case 6:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,xb(c,U()))):(c=k.b(b),k.a(b,xb(c,U())))):(c=g[b<<1&14],g[b<<1&14]=xb(c,U()));break;case 7:c=192>b?Q(l(b)):g[b<<1&14],Yb(c,U())}};s[129]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+ +3),c=G(b,d)>>>0,H(b,d,fb(c,M()>>>0))):(c=k.c(b)>>>0,k.f(b,fb(c,M()>>>0)))):(c=y[b&7],e[b&7]=fb(c,M()>>>0));break;case 1:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d),H(b,d,wb(c,M()))):(c=k.c(b),k.f(b,wb(c,M())))):(c=e[b&7],e[b&7]=wb(c,M()));break;case 2:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,kb(c,M()>>>0))):(c=k.c(b)>>>0,k.f(b,kb(c,M()>>>0)))):(c=y[b&7],e[b&7]=kb(c,M()>>>0));break;case 3:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,ob(c, +M()>>>0))):(c=k.c(b)>>>0,k.f(b,ob(c,M()>>>0)))):(c=y[b&7],e[b&7]=ob(c,M()>>>0));break;case 4:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d),H(b,d,ub(c,M()))):(c=k.c(b),k.f(b,ub(c,M())))):(c=e[b&7],e[b&7]=ub(c,M()));break;case 5:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,mb(c,M()>>>0))):(c=k.c(b)>>>0,k.f(b,mb(c,M()>>>0)))):(c=y[b&7],e[b&7]=mb(c,M()>>>0));break;case 6:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d),H(b,d,yb(c,M()))):(c=k.c(b),k.f(b,yb(c, +M())))):(c=e[b&7],e[b&7]=yb(c,M()));break;case 7:192>b?c=S(l(b))>>>0:c=y[b&7],Zb(c,M()>>>0)}};r[130]=s[130]=function(){Ab[128]()};r[131]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,eb(c,P()&65535))):(c=k.b(b),k.a(b,eb(c,P()&65535)))):(c=g[b<<1&14],g[b<<1&14]=eb(c,P()&65535));break;case 1:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,vb(c,P()))):(c=k.b(b),k.a(b,vb(c,P())))):(c=g[b<<1&14],g[b<<1&14]=vb(c,P())); +break;case 2:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,jb(c,P()&65535))):(c=k.b(b),k.a(b,jb(c,P()&65535)))):(c=g[b<<1&14],g[b<<1&14]=jb(c,P()&65535));break;case 3:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,nb(c,P()&65535))):(c=k.b(b),k.a(b,nb(c,P()&65535)))):(c=g[b<<1&14],g[b<<1&14]=nb(c,P()&65535));break;case 4:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,tb(c,P()))):(c=k.b(b),k.a(b,tb(c,P())))):(c=g[b<<1&14],g[b<<1&14]=tb(c,P())); +break;case 5:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,lb(c,P()&65535))):(c=k.b(b),k.a(b,lb(c,P()&65535)))):(c=g[b<<1&14],g[b<<1&14]=lb(c,P()&65535));break;case 6:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,xb(c,P()))):(c=k.b(b),k.a(b,xb(c,P())))):(c=g[b<<1&14],g[b<<1&14]=xb(c,P()));break;case 7:c=192>b?Q(l(b)):g[b<<1&14],Yb(c,P()&65535)}};s[131]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>> +0,H(b,d,fb(c,P()>>>0))):(c=k.c(b)>>>0,k.f(b,fb(c,P()>>>0)))):(c=y[b&7],e[b&7]=fb(c,P()>>>0));break;case 1:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d),H(b,d,wb(c,P()))):(c=k.c(b),k.f(b,wb(c,P())))):(c=e[b&7],e[b&7]=wb(c,P()));break;case 2:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,kb(c,P()>>>0))):(c=k.c(b)>>>0,k.f(b,kb(c,P()>>>0)))):(c=y[b&7],e[b&7]=kb(c,P()>>>0));break;case 3:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,ob(c,P()>>>0))): +(c=k.c(b)>>>0,k.f(b,ob(c,P()>>>0)))):(c=y[b&7],e[b&7]=ob(c,P()>>>0));break;case 4:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d),H(b,d,ub(c,P()))):(c=k.c(b),k.f(b,ub(c,P())))):(c=e[b&7],e[b&7]=ub(c,P()));break;case 5:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,mb(c,P()>>>0))):(c=k.c(b)>>>0,k.f(b,mb(c,P()>>>0)))):(c=y[b&7],e[b&7]=mb(c,P()>>>0));break;case 6:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d),H(b,d,yb(c,P()))):(c=k.c(b),k.f(b,yb(c,P())))):(c= +e[b&7],e[b&7]=yb(c,P()));break;case 7:192>b?c=S(l(b))>>>0:c=y[b&7],Zb(c,P()>>>0)}};r[132]=s[132]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];id(c,v[b>>1&12|b>>5&1])};r[133]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];jd(c,g[b>>2&14])};s[133]=function(){var b=m(),c=192>b?S(l(b)):e[b&7];kd(c,e[b>>3&7])};r[134]=s[134]=function(){var b=m(),c,d;192>b?(d=q(l(b)),c=k.d(d),k.e(d,ne(c,b))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=ne(c,b))};r[135]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c), +J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,Rd(c,b))):(c=k.b(d),k.a(d,Rd(c,b)))):(c=g[b<<1&14],g[b<<1&14]=Rd(c,b))};s[135]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,Sd(c,b))):(c=k.c(d)>>>0,k.f(d,Sd(c,b)))):(c=y[b&7],e[b&7]=Sd(c,b))};r[136]=s[136]=function(){var b=m();192>b?V(l(b),v[b>>1&12|b>>5&1]):v[b<<2&12|b>>2&1]=v[b>>1&12|b>>5&1]};r[137]=function(){var b=m();192>b?R(l(b),g[b>>2&14]):g[b<<1&14]=g[b>>2&14]};s[137]=function(){var b=m();192>b?N(l(b), +e[b>>3&7]):y[b&7]=e[b>>3&7]};r[138]=s[138]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];v[b>>1&12|b>>5&1]=c};r[139]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c};s[139]=function(){var b=m(),c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c};r[140]=function(){var b=m();192>b?R(l(b),ra[b>>3&7]):g[b<<1&14]=ra[b>>3&7]};s[140]=function(){var b=m();192>b?N(l(b),ra[b>>3&7]):y[b&7]=ra[b>>3&7]};r[141]=function(){var b=m();ab=6;g[(b>>3&7)<<1]=l(b);ab=-1};s[141]=function(){var b=m();ab=6;y[b>>3& +7]=l(b);ab=-1};r[142]=s[142]=function(){var b=m(),c=b>>3&7,b=192>b?Q(l(b)):g[b<<1&14];ca(c,b)};r[143]=s[143]=function(){var b=m();if(xa){var c=Va(0);$[aa]+=4;192>b?N(l(b),k.c(c)):y[b&7]=k.c(c)}else c=Va(0),$[aa]+=2,192>b?R(l(b),k.b(c)):g[b<<1&14]=k.b(c)};r[144]=function(){$b(0)};s[144]=function(){ac(0)};r[145]=function(){$b(2)};s[145]=function(){ac(1)};r[146]=function(){$b(4)};s[146]=function(){ac(2)};r[147]=function(){$b(6)};s[147]=function(){ac(3)};r[148]=function(){$b(8)};s[148]=function(){ac(4)}; +r[149]=function(){$b(10)};s[149]=function(){ac(5)};r[150]=function(){$b(12)};s[150]=function(){ac(6)};r[151]=function(){$b(14)};s[151]=function(){ac(7)};r[144]=s[144]=function(){};r[152]=function(){g[0]=fc[0]};s[152]=function(){y[0]=Ga[0]};r[153]=function(){g[4]=Ga[0]>>15};s[153]=function(){y[2]=e[0]>>31};r[154]=function(){if(Ma)throw ze("16 bit callf in protected mode");var b=U(),c=U();la(ra[1]);la(pa());ca(1,c);E=da[1]+b|0};s[154]=function(){if(Ma)throw ze("callf");var b=M(),c=U();ia(ra[1]);ia(pa()); +ca(1,c);E=da[1]+b|0};r[155]=s[155]=function(){};r[156]=function(){na();la(u)};s[156]=function(){na();ia(u)};r[157]=function(){var b;b=Aa();jc(b);Da()};s[157]=function(){jc(ua());Da()};r[158]=s[158]=function(){u=u&-256|v[1];u=u&4161493|2;K=0};r[159]=s[159]=function(){na();v[1]=u};r[160]=s[160]=function(){var b=ka(F());v[0]=b};r[161]=function(){var b=Q(F());g[0]=b};s[161]=function(){var b=S(F());y[0]=b};r[162]=s[162]=function(){V(F(),v[0])};r[163]=function(){R(F(),g[0])};s[163]=function(){N(F(),e[0])}; +r[164]=s[164]=function(){var b,c,d=u&1024?-1:1;c=da[0]+A[T];b=h(3)+A[W];if(wa){if(0!==A[ga]){do V(c,ka(b)),c+=d,A[T]+=d,b+=d,A[W]+=d;while(--A[ga])}}else V(c,ka(b)),A[T]+=d,A[W]+=d};r[165]=function(){var b,c,d=u&1024?-2:2;c=da[0]+A[T];b=h(3)+A[W];if(wa){if(0!==A[ga]){var e=0===(c&1)&&0===(b&1);do{if(e){var g=Ea(b),l=q(c);k.S(l,k.q(g))}else R(c,Q(b));c+=d;A[T]+=d;b+=d;A[W]+=d}while(--A[ga])}}else R(c,Q(b)),A[T]+=d,A[W]+=d};s[165]=function(){var b,c,d=u&1024?-4:4;c=da[0]+A[T];b=h(3)+A[W];if(wa){if(0!== +A[ga]){var e=0===(c&3)&&0===(b&3);do{if(e){var g=Ea(b),l=q(c);k.D(l,k.v(g))}else N(c,S(b));c+=d;A[T]+=d;b+=d;A[W]+=d}while(--A[ga])}}else N(c,S(b)),A[T]+=d,A[W]+=d};r[166]=s[166]=function(){a:{var b,c,d,e,g=u&1024?-1:1;c=da[0]+A[T];b=h(3)+A[W];if(wa){if(0===A[ga])break a;do e=ka(c),d=ka(b),c+=g,A[T]+=g,b+=g,A[W]+=g;while(--A[ga]&&d===e===cc)}else e=ka(c),d=ka(b),A[T]+=g,A[W]+=g;lc(d,e)}};r[167]=function(){a:{var b,c,d,e,g=u&1024?-2:2;c=da[0]+A[T];b=h(3)+A[W];if(wa){if(0===A[ga])break a;var l=0=== +(c&1)&&0===(b&1);do l?(e=k.q(Ea(c)),d=k.q(Ea(b))):(e=Q(c),d=Q(b)),c+=g,A[T]+=g,b+=g,A[W]+=g;while(--A[ga]&&d===e===cc)}else e=Q(c),d=Q(b),A[T]+=g,A[W]+=g;Yb(d,e)}};s[167]=function(){a:{var b,c,d,e,g=u&1024?-4:4;c=da[0]+A[T];b=h(3)+A[W];if(wa){if(0===A[ga])break a;var l=0===(c&3)&&0===(b&3);do l?(e=k.v(Ea(c))>>>0,d=k.v(Ea(b))>>>0):(e=S(c)>>>0,d=S(b)>>>0),c+=g,A[T]+=g,b+=g,A[W]+=g;while(--A[ga]&&d===e===cc)}else e=S(c)>>>0,d=S(b)>>>0,A[T]+=g,A[W]+=g;Zb(d,e)}};r[168]=s[168]=function(){id(v[0],m())}; +r[169]=function(){jd(g[0],U())};s[169]=function(){kd(e[0],M())};r[170]=s[170]=function(){var b=v[0],c,d=u&1024?-1:1;c=da[0]+A[T];if(wa){if(0!==A[ga]){do V(c,b),c+=d,A[T]+=d;while(--A[ga])}}else V(c,b),A[T]+=d};r[171]=function(){var b=g[0],c,d=u&1024?-2:2;c=da[0]+A[T];if(wa){if(0!==A[ga]){var e=0===(c&1)&&!0;do e?k.S(q(c),b):R(c,b),c+=d,A[T]+=d;while(--A[ga])}}else R(c,b),A[T]+=d};s[171]=function(){var b=y[0],c,d=u&1024?-4:4;c=da[0]+A[T];if(wa){if(0!==A[ga]){var e=0===(c&3)&&!0;do e?k.D(q(c),b):N(c, +b),c+=d,A[T]+=d;while(--A[ga])}}else N(c,b),A[T]+=d};r[172]=s[172]=function(){var b,c=u&1024?-1:1;b=h(3)+A[W];if(wa){if(0!==A[ga]){do v[0]=ka(b),b+=c,A[W]+=c;while(--A[ga])}}else v[0]=ka(b),A[W]+=c};r[173]=function(){var b,c=u&1024?-2:2;b=h(3)+A[W];if(wa){if(0!==A[ga]){do g[0]=Q(b),b+=c,A[W]+=c;while(--A[ga])}}else g[0]=Q(b),A[W]+=c};s[173]=function(){var b,c=u&1024?-4:4;b=h(3)+A[W];if(wa){if(0!==A[ga]){do y[0]=S(b),b+=c,A[W]+=c;while(--A[ga])}}else y[0]=S(b),A[W]+=c};r[174]=s[174]=function(){a:{var b, +c,d,e=u&1024?-1:1;c=v[0];b=da[0]+A[T];if(wa){if(0===A[ga])break a;do d=ka(b),b+=e,A[T]+=e;while(--A[ga]&&c===d===cc)}else d=ka(b),A[T]+=e;lc(c,d)}};r[175]=function(){a:{var b,c,d,e=u&1024?-2:2;c=g[0];b=da[0]+A[T];if(wa){if(0===A[ga])break a;var h=0===(b&1)&&!0;do d=h?k.q(Ea(b)):Q(b),b+=e,A[T]+=e;while(--A[ga]&&c===d===cc)}else d=Q(b),A[T]+=e;Yb(c,d)}};s[175]=function(){a:{var b,c,d,e=u&1024?-4:4;c=y[0];b=da[0]+A[T];if(wa){if(0===A[ga])break a;var g=0===(b&3)&&!0;do d=g?k.v(Ea(b))>>>0:S(b)>>>0,b+= +e,A[T]+=e;while(--A[ga]&&c===d===cc)}else d=S(b)>>>0,A[T]+=e;Zb(c,d)}};r[176]=s[176]=function(){v[0]=m()};r[177]=s[177]=function(){v[4]=m()};r[178]=s[178]=function(){v[8]=m()};r[179]=s[179]=function(){v[12]=m()};r[180]=s[180]=function(){v[1]=m()};r[181]=s[181]=function(){v[5]=m()};r[182]=s[182]=function(){v[9]=m()};r[183]=s[183]=function(){v[13]=m()};r[184]=function(){g[0]=U()};s[184]=function(){e[0]=M()};r[185]=function(){g[2]=U()};s[185]=function(){e[1]=M()};r[186]=function(){g[4]=U()};s[186]=function(){e[2]= +M()};r[187]=function(){g[6]=U()};s[187]=function(){e[3]=M()};r[188]=function(){g[8]=U()};s[188]=function(){e[4]=M()};r[189]=function(){g[10]=U()};s[189]=function(){e[5]=M()};r[190]=function(){g[12]=U()};s[190]=function(){e[6]=M()};r[191]=function(){g[14]=U()};s[191]=function(){e[7]=M()};r[192]=s[192]=function(){var b=m();switch(b>>3&7){case 0:var c;192>b?(b=q(l(b)),c=k.d(b),k.e(b,Ac(c,m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Ac(c,m()&31));break;case 1:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Cc(c, +m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Cc(c,m()&31));break;case 2:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Bc(c,m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Bc(c,m()&31));break;case 3:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Dc(c,m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Dc(c,m()&31));break;case 4:192>b?(b=q(l(b)),c=k.d(b),k.e(b,gb(c,m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=gb(c,m()&31));break;case 5:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Ec(c,m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]= +Ec(c,m()&31));break;case 6:192>b?(b=q(l(b)),c=k.d(b),k.e(b,gb(c,m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=gb(c,m()&31));break;case 7:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Fc(c,m()&31))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Fc(c,m()&31))}};r[193]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Hb(c,m()&31))):(c=k.b(b),k.a(b,Hb(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Hb(c,m()&31));break;case 1:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)? +(d=q(c+1),c=B(b,d),n(b,d,Lb(c,m()&31))):(c=k.b(b),k.a(b,Lb(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Lb(c,m()&31));break;case 2:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Jb(c,m()&31))):(c=k.b(b),k.a(b,Jb(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Jb(c,m()&31));break;case 3:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Nb(c,m()&31))):(c=k.b(b),k.a(b,Nb(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Nb(c,m()&31));break;case 4:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1), +c=B(b,d),n(b,d,Ja(c,m()&31))):(c=k.b(b),k.a(b,Ja(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Ja(c,m()&31));break;case 5:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Pb(c,m()&31))):(c=k.b(b),k.a(b,Pb(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Pb(c,m()&31));break;case 6:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Ja(c,m()&31))):(c=k.b(b),k.a(b,Ja(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Ja(c,m()&31));break;case 7:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d), +n(b,d,Rb(c,m()&31))):(c=k.b(b),k.a(b,Rb(c,m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Rb(c,m()&31))}};s[193]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ib(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Ib(c,m()&31)))):(c=y[b&7],e[b&7]=Ib(c,m()&31));break;case 1:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Mb(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Mb(c,m()&31)))):(c=y[b&7],e[b&7]=Mb(c,m()&31));break;case 2:192>b?(c=l(b),b=q(c),J&& +4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Kb(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Kb(c,m()&31)))):(c=y[b&7],e[b&7]=Kb(c,m()&31));break;case 3:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ob(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Ob(c,m()&31)))):(c=y[b&7],e[b&7]=Ob(c,m()&31));break;case 4:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ka(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Ka(c,m()&31)))):(c=y[b&7],e[b&7]=Ka(c,m()&31));break;case 5:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)? +(d=q(c+3),c=G(b,d)>>>0,H(b,d,Qb(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Qb(c,m()&31)))):(c=y[b&7],e[b&7]=Qb(c,m()&31));break;case 6:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ka(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Ka(c,m()&31)))):(c=y[b&7],e[b&7]=Ka(c,m()&31));break;case 7:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Sb(c,m()&31))):(c=k.c(b)>>>0,k.f(b,Sb(c,m()&31)))):(c=y[b&7],e[b&7]=Sb(c,m()&31))}};r[194]=function(){var b=U();E=da[1]+Aa()|0;y[4]+=b};s[194]=function(){var b= +U();E=da[1]+ua()|0;y[4]+=b};r[195]=function(){E=da[1]+Aa()|0};s[195]=function(){E=da[1]+ua()|0};r[196]=s[196]=function(){var b=m();192<=b?za(6):xa?Vc(0,l(b),b>>3&7):Uc(0,l(b),b>>2&14)};r[197]=s[197]=function(){var b=m();192<=b?za(6):xa?Vc(3,l(b),b>>3&7):Uc(3,l(b),b>>2&14)};r[198]=s[198]=function(){var b=m();192>b?V(l(b),m()):v[b<<2&12|b>>2&1]=m()};r[199]=function(){var b=m();192>b?R(l(b),U()):g[b<<1&14]=U()};s[199]=function(){var b=m();192>b?N(l(b),M()):y[b&7]=M()};r[200]=function(){var b=U(),c=m(), +d;la(g[10]);d=g[8];if(0c.t)throw ze("conforming and dpl > rpl");if(c.t>ya){var d=ua(),e=ua();y[4]=d;jc(b);ya=c.t;ca(2,e&65535);X()}else jc(b);Da()};r[208]=s[208]=function(){var b=m();switch(b>>3&7){case 0:var c;192>b?(b=q(l(b)),c=k.d(b),k.e(b,Ac(c,1))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Ac(c,1));break;case 1:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Cc(c,1))):(c=v[b<<2&12|b>>2&1], +v[b<<2&12|b>>2&1]=Cc(c,1));break;case 2:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Bc(c,1))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Bc(c,1));break;case 3:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Dc(c,1))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Dc(c,1));break;case 4:192>b?(b=q(l(b)),c=k.d(b),k.e(b,gb(c,1))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=gb(c,1));break;case 5:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Ec(c,1))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Ec(c,1));break;case 6:192>b?(b=q(l(b)),c=k.d(b),k.e(b,gb(c,1))):(c=v[b<< +2&12|b>>2&1],v[b<<2&12|b>>2&1]=gb(c,1));break;case 7:192>b?(b=q(l(b)),c=k.d(b),k.e(b,Fc(c,1))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Fc(c,1))}};r[209]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Hb(c,1))):(c=k.b(b),k.a(b,Hb(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Hb(c,1));break;case 1:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Lb(c,1))):(c=k.b(b),k.a(b,Lb(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Lb(c,1));break;case 2:192> +b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Jb(c,1))):(c=k.b(b),k.a(b,Jb(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Jb(c,1));break;case 3:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Nb(c,1))):(c=k.b(b),k.a(b,Nb(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Nb(c,1));break;case 4:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Ja(c,1))):(c=k.b(b),k.a(b,Ja(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Ja(c,1));break;case 5:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d), +n(b,d,Pb(c,1))):(c=k.b(b),k.a(b,Pb(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Pb(c,1));break;case 6:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Ja(c,1))):(c=k.b(b),k.a(b,Ja(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Ja(c,1));break;case 7:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Rb(c,1))):(c=k.b(b),k.a(b,Rb(c,1)))):(c=g[b<<1&14],g[b<<1&14]=Rb(c,1))}};s[209]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b, +d,Ib(c,1))):(c=k.c(b)>>>0,k.f(b,Ib(c,1)))):(c=y[b&7],e[b&7]=Ib(c,1));break;case 1:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Mb(c,1))):(c=k.c(b)>>>0,k.f(b,Mb(c,1)))):(c=y[b&7],e[b&7]=Mb(c,1));break;case 2:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Kb(c,1))):(c=k.c(b)>>>0,k.f(b,Kb(c,1)))):(c=y[b&7],e[b&7]=Kb(c,1));break;case 3:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ob(c,1))):(c=k.c(b)>>>0,k.f(b,Ob(c,1)))):(c=y[b&7],e[b& +7]=Ob(c,1));break;case 4:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ka(c,1))):(c=k.c(b)>>>0,k.f(b,Ka(c,1)))):(c=y[b&7],e[b&7]=Ka(c,1));break;case 5:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Qb(c,1))):(c=k.c(b)>>>0,k.f(b,Qb(c,1)))):(c=y[b&7],e[b&7]=Qb(c,1));break;case 6:192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ka(c,1))):(c=k.c(b)>>>0,k.f(b,Ka(c,1)))):(c=y[b&7],e[b&7]=Ka(c,1));break;case 7:192>b?(c=l(b),b=q(c),J&&4093<=(c& +4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Sb(c,1))):(c=k.c(b)>>>0,k.f(b,Sb(c,1)))):(c=y[b&7],e[b&7]=Sb(c,1))}};r[210]=s[210]=function(){var b=m(),c=v[4]&31;switch(b>>3&7){case 0:var d;192>b?(b=q(l(b)),d=k.d(b),k.e(b,Ac(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Ac(d,c));break;case 1:192>b?(b=q(l(b)),d=k.d(b),k.e(b,Cc(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Cc(d,c));break;case 2:192>b?(b=q(l(b)),d=k.d(b),k.e(b,Bc(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Bc(d,c));break;case 3:192>b?(b=q(l(b)), +d=k.d(b),k.e(b,Dc(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Dc(d,c));break;case 4:192>b?(b=q(l(b)),d=k.d(b),k.e(b,gb(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=gb(d,c));break;case 5:192>b?(b=q(l(b)),d=k.d(b),k.e(b,Ec(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Ec(d,c));break;case 6:192>b?(b=q(l(b)),d=k.d(b),k.e(b,gb(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=gb(d,c));break;case 7:192>b?(b=q(l(b)),d=k.d(b),k.e(b,Fc(d,c))):(d=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=Fc(d,c))}};r[211]=function(){var b= +m(),c=v[4]&31;switch(b>>3&7){case 0:var d,e;192>b?(d=l(b),b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Hb(d,c))):(d=k.b(b),k.a(b,Hb(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Hb(d,c));break;case 1:192>b?(d=l(b),b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Lb(d,c))):(d=k.b(b),k.a(b,Lb(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Lb(d,c));break;case 2:192>b?(d=l(b),b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Jb(d,c))):(d=k.b(b),k.a(b,Jb(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Jb(d,c));break;case 3:192>b?(d=l(b), +b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Nb(d,c))):(d=k.b(b),k.a(b,Nb(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Nb(d,c));break;case 4:192>b?(d=l(b),b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Ja(d,c))):(d=k.b(b),k.a(b,Ja(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Ja(d,c));break;case 5:192>b?(d=l(b),b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Pb(d,c))):(d=k.b(b),k.a(b,Pb(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Pb(d,c));break;case 6:192>b?(d=l(b),b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Ja(d, +c))):(d=k.b(b),k.a(b,Ja(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Ja(d,c));break;case 7:192>b?(d=l(b),b=q(d),J&&4095===(d&4095)?(e=q(d+1),d=B(b,e),n(b,e,Rb(d,c))):(d=k.b(b),k.a(b,Rb(d,c)))):(d=g[b<<1&14],g[b<<1&14]=Rb(d,c))}};s[211]=function(){var b=m(),c=v[4]&31;switch(b>>3&7){case 0:var d,g;192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g,Ib(d,c))):(d=k.c(b)>>>0,k.f(b,Ib(d,c)))):(d=y[b&7],e[b&7]=Ib(d,c));break;case 1:192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g, +Mb(d,c))):(d=k.c(b)>>>0,k.f(b,Mb(d,c)))):(d=y[b&7],e[b&7]=Mb(d,c));break;case 2:192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g,Kb(d,c))):(d=k.c(b)>>>0,k.f(b,Kb(d,c)))):(d=y[b&7],e[b&7]=Kb(d,c));break;case 3:192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g,Ob(d,c))):(d=k.c(b)>>>0,k.f(b,Ob(d,c)))):(d=y[b&7],e[b&7]=Ob(d,c));break;case 4:192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g,Ka(d,c))):(d=k.c(b)>>>0,k.f(b,Ka(d,c)))):(d=y[b&7],e[b&7]= +Ka(d,c));break;case 5:192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g,Qb(d,c))):(d=k.c(b)>>>0,k.f(b,Qb(d,c)))):(d=y[b&7],e[b&7]=Qb(d,c));break;case 6:192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g,Ka(d,c))):(d=k.c(b)>>>0,k.f(b,Ka(d,c)))):(d=y[b&7],e[b&7]=Ka(d,c));break;case 7:192>b?(d=l(b),b=q(d),J&&4093<=(d&4095)?(g=q(d+3),d=G(b,g)>>>0,H(b,g,Sb(d,c))):(d=k.c(b)>>>0,k.f(b,Sb(d,c)))):(d=y[b&7],e[b&7]=Sb(d,c))}};r[212]=s[212]=function(){var b=m();if(0===b)qa(); +else{var c=v[0];v[1]=c/b;v[0]=c%b;I=v[0];K=2261}};r[213]=s[213]=function(){var b=m();I=v[0]+v[1]*b;g[0]=I&255;Y=8;K=2261};r[214]=s[214]=function(){throw ze("salc instruction");};r[215]=s[215]=function(){v[0]=Cb?ka(h(3)+e[3]+v[0]):ka(h(3)+g[6]+v[0])};r[216]=s[216]=function(){var b=m();192>b?Ha.i(b,l(b)):Ha.m(b)};r[217]=s[217]=function(){var b=m();192>b?Ha.q(b,l(b)):Ha.v(b)};r[218]=s[218]=function(){var b=m();192>b?Ha.D(b,l(b)):Ha.Q(b)};r[219]=s[219]=function(){var b=m();192>b?Ha.R(b,l(b)):Ha.S(b)}; +r[220]=s[220]=function(){var b=m();192>b?Ha.aa(b,l(b)):Ha.Ga(b)};r[221]=s[221]=function(){var b=m();192>b?Ha.Ia(b,l(b)):Ha.Ka(b)};r[222]=s[222]=function(){var b=m();192>b?Ha.Ma(b,l(b)):Ha.Na(b)};r[223]=s[223]=function(){var b=m();192>b?Ha.Oa(b,l(b)):Ha.Ra(b)};r[224]=s[224]=function(){if(--A[ga]&&!Gb()){var b=P();E=E+b|0}else E++};r[225]=s[225]=function(){if(--A[ga]&&Gb()){var b=P();E=E+b|0}else E++};r[226]=s[226]=function(){if(--A[ga]){var b=P();E=E+b|0}else E++};r[227]=s[227]=function(){var b=P(); +0===A[ga]&&(E=E+b|0)};r[228]=s[228]=function(){v[0]=hc(m())};r[229]=function(){g[0]=ic(m())};s[229]=function(){y[0]=cb(m())};r[230]=s[230]=function(){Fa(m(),v[0])};r[231]=function(){Xb(m(),g[0])};s[231]=function(){gc(m(),e[0])};r[232]=function(){var b=U()<<16>>16;la(pa());Qd(b)};s[232]=function(){var b=M();ia(pa());E=E+b|0};r[233]=function(){var b=U()<<16>>16;Qd(b)};s[233]=function(){var b=M();E=E+b|0};r[234]=function(){var b=U();ca(1,U());E=b+da[1]|0};s[234]=function(){var b=M();ca(1,U());E=b+da[1]| +0};r[235]=s[235]=function(){var b=P();E=E+b|0};r[236]=s[236]=function(){v[0]=hc(g[4])};r[237]=function(){g[0]=ic(g[4])};s[237]=function(){y[0]=cb(g[4])};r[238]=s[238]=function(){Fa(g[4],v[0])};r[239]=function(){Xb(g[4],g[0])};s[239]=function(){gc(g[4],e[0])};r[240]=s[240]=function(){};r[241]=s[241]=function(){throw ze("int1 instruction");};r[242]=s[242]=function(){wa=!0;cc=!1;Ab[m()]();wa=!1};r[243]=s[243]=function(){cc=wa=!0;Ab[m()]();wa=!1};r[244]=s[244]=function(){ya&&fa(0);if(0===(u&512))throw nc("cpu halted"), +oc=!0,"HALT";E--;fd=!0};r[245]=s[245]=function(){u=(u|1)^Ba();K&=-2};r[246]=s[246]=function(){var b=m();switch(b>>3&7){case 0:var c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];id(c,m());break;case 1:c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];id(c,m());break;case 2:192>b?(b=q(l(b)),c=k.d(b),k.e(b,~c)):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=~c);break;case 3:192>b?(b=q(l(b)),c=k.d(b),k.e(b,le(c))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=le(c));break;case 4:c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];c=c*v[0];g[0]=c;u=256>c?u&-2050: +u|2049;K=0;break;case 5:c=192>b?Rc(l(b)):fc[b<<2&12|b>>2&1];c=c*fc[0];g[0]=c;u=127c?u|2049:u&-2050;K=0;break;case 6:var c=192>b?ka(l(b)):v[b<<2&12|b>>2&1],b=g[0],d=b/c|0;255b?Rc(l(b)):fc[b<<2&12|b>>2&1],b=Ga[0],d=b/c|0,127d||0===c?qa():(v[0]=d,v[1]=b%c)}};r[247]=function(){var b=m();switch(b>>3&7){case 0:var c=192>b?Q(l(b)):g[b<<1&14];jd(c,U());break;case 1:c=192>b?Q(l(b)):g[b<<1&14];jd(c,U());break;case 2:var d;192>b?(c=l(b),b= +q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,~c)):(c=k.b(b),k.a(b,~c))):(c=g[b<<1&14],g[b<<1&14]=~c);break;case 3:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,Kd(c))):(c=k.b(b),k.a(b,Kd(c)))):(c=g[b<<1&14],g[b<<1&14]=Kd(c));break;case 4:c=192>b?Q(l(b)):g[b<<1&14];c=c*g[0];b=c>>>16;g[0]=c;g[4]=b;u=0===b?u&-2050:u|2049;K=0;break;case 5:192>b?c=Q(l(b))<<16>>16:c=Ga[b<<1&14];c=c*Ga[0];g[0]=c;g[4]=c>>16;u=32767c?u|2049:u&-2050;K=0;break;case 6:c=192>b?Q(l(b)):g[b<<1& +14];b=(g[0]|g[4]<<16)>>>0;d=b/c|0;65535b?c=Q(l(b))<<16>>16:c=Ga[b<<1&14],b=g[0]|g[4]<<16,d=b/c|0,32767d||0===c?qa():(g[0]=d,g[4]=b%c)}};s[247]=function(){var b=m();switch(b>>3&7){case 0:var c=192>b?S(l(b)):e[b&7];kd(c,M());break;case 1:c=192>b?S(l(b)):e[b&7];kd(c,M());break;case 2:var d;192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,~c)):(c=k.c(b)>>>0,k.f(b,~c))):(c=y[b&7],e[b&7]=~c);break;case 3:192>b?(c=l(b),b=q(c), +J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,Ld(c))):(c=k.c(b)>>>0,k.f(b,Ld(c)))):(c=y[b&7],e[b&7]=Ld(c));break;case 4:192>b?c=S(l(b))>>>0:c=y[b&7];b=y[0];d=c*b/4294967296|0;y[0]=Z(c,b);y[2]=d;u=0===d?u&-2050:u|2049;K=0;break;case 5:b=c=192>b?S(l(b)):e[b&7];d=e[0];c=b*d/4294967296|0;b=Z(b,d);0===c&&0>b&&(c=-1);y[0]=b;y[2]=c;u=c===(2147483648>y[0]?0:-1)?u&-2050:u|2049;K=0;break;case 6:192>b?c=S(l(b))>>>0:c=y[b&7];d=y[0];var g=y[2],b=(4294967296*g%c+d%c)%c;d=d/c+4294967296*g/c;4294967295b?S(l(b)):e[b&7],d=y[0],g=e[2],b=(4294967296*g%c+d%c)%c,d=d/c+4294967296*g/c,2147483647d||0===c?qa():(y[0]=d,y[2]=b)}};r[248]=s[248]=function(){u&=-2;K&=-2};r[249]=s[249]=function(){u|=1;K&=-2};r[250]=s[250]=function(){$a()?u&=-513:fa(0)};r[251]=s[251]=function(){$a()?(u|=512,Da()):fa(0)};r[252]=s[252]=function(){u&=-1025};r[253]=s[253]=function(){u|=1024};r[254]=s[254]=function(){var b=m(),c=b&56;0===c?192>b?(b=q(l(b)),c=k.d(b),k.e(b,je(c))): +(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=je(c)):8===c?192>b?(b=q(l(b)),c=k.d(b),k.e(b,ke(c))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=ke(c)):z()};r[255]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,pb(c))):(c=k.b(b),k.a(b,pb(c)))):(c=g[b<<1&14],g[b<<1&14]=pb(c));break;case 1:192>b?(c=l(b),b=q(c),J&&4095===(c&4095)?(d=q(c+1),c=B(b,d),n(b,d,rb(c))):(c=k.b(b),k.a(b,rb(c)))):(c=g[b<<1&14],g[b<<1&14]=rb(c));break;case 2:c=192>b?Q(l(b)): +g[b<<1&14];la(pa());E=da[1]+c|0;break;case 3:192<=b&&za(6);c=l(b);la(ra[1]);la(pa());ca(1,Q(c+2));E=da[1]+Q(c)|0;break;case 4:c=192>b?Q(l(b)):g[b<<1&14];E=da[1]+c|0;break;case 5:192<=b&&za(6);c=l(b);ca(1,Q(c+2));E=da[1]+Q(c)|0;break;case 6:c=192>b?Q(l(b)):g[b<<1&14];la(c);break;case 7:z()}};s[255]=function(){var b=m();switch(b>>3&7){case 0:var c,d;192>b?(c=l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,qb(c))):(c=k.c(b)>>>0,k.f(b,qb(c)))):(c=y[b&7],e[b&7]=qb(c));break;case 1:192>b?(c= +l(b),b=q(c),J&&4093<=(c&4095)?(d=q(c+3),c=G(b,d)>>>0,H(b,d,sb(c))):(c=k.c(b)>>>0,k.f(b,sb(c)))):(c=y[b&7],e[b&7]=sb(c));break;case 2:c=192>b?S(l(b)):e[b&7];ia(pa());E=da[1]+c|0;break;case 3:192<=b&&za(6);c=l(b);b=Q(c+4);c=S(c);ia(ra[1]);ia(pa());ca(1,b);E=da[1]+c|0;break;case 4:c=192>b?S(l(b)):e[b&7];E=da[1]+c|0;break;case 5:192<=b&&za(6);c=l(b);b=Q(c+4);c=S(c);ca(1,b);E=da[1]+c|0;break;case 6:c=192>b?S(l(b)):e[b&7];ia(c);break;case 7:z()}};x[0]=w[0]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14]; +Ma||z();ya&&fa(0);switch(b>>3&7){case 2:b=Bb(c);if(b.A)Zc=$c=0;else{if(!b.ga)throw ze("LDTR can only be loaded from GDT");if(!b.B)throw ze("#GP handler");if(!b.L)throw ze("#GP handler");if(2!==b.type)throw ze("#GP handler");$c=b.V;Zc=b.W}break;case 3:b=Bb(c);if(!b.ga)throw ze("TR can only be loaded from GDT");if(b.A)throw ze("#GP handler");if(!b.B)throw ze("#GP handler");if(!b.L)throw ze("#GP handler");if(9!==b.type)throw ze("#GP handler");Ed=b.V;Dd=b.W;break;default:z()}};x[1]=w[1]=function(){var b= +m();ya&&fa(0);var c=b>>3&7;if(4===c)192>b?R(l(b),Na):g[b<<1&14]=Na;else if(6===c)c=192>b?Q(l(b)):g[b<<1&14],Na=Na&-16|c&15,O();else switch(192<=b&&za(6),2!==c&&3!==c||!Ma||(ab=6),b=l(b),ab=-1,c){case 0:R(b,ad);N(b+2,qc);break;case 1:R(b,bd);N(b+2,rc);break;case 2:c=Q(b);b=S(b+2);ad=c;qc=b;xa||(qc&=16777215);break;case 3:c=Q(b);b=S(b+2);bd=c;rc=b;xa||(rc&=16777215);break;case 7:c=b>>>12;Eb[c]=0;pc[c]=0;Fb=-1;break;default:z()}};x[2]=w[2]=function(){m();z()};x[3]=w[3]=function(){m();z()};x[4]=w[4]= +function(){z()};x[5]=w[5]=function(){z()};x[6]=w[6]=function(){ya?fa(0):Na&=-9};x[7]=w[7]=function(){z()};x[8]=w[8]=function(){z()};x[9]=w[9]=function(){ya&&fa(0)};x[10]=w[10]=function(){z()};x[11]=w[11]=function(){z()};x[12]=w[12]=function(){z()};x[13]=w[13]=function(){z()};x[14]=w[14]=function(){z()};x[15]=w[15]=function(){z()};x[16]=w[16]=function(){z()};x[17]=w[17]=function(){z()};x[18]=w[18]=function(){z()};x[19]=w[19]=function(){z()};x[20]=w[20]=function(){z()};x[21]=w[21]=function(){z()};x[22]= +w[22]=function(){z()};x[23]=w[23]=function(){z()};x[24]=w[24]=function(){var b=m();xa?192>b&&S(l(b)):192>b&&Q(l(b))};x[25]=w[25]=function(){z()};x[26]=w[26]=function(){z()};x[27]=w[27]=function(){z()};x[28]=w[28]=function(){z()};x[29]=w[29]=function(){z()};x[30]=w[30]=function(){z()};x[31]=w[31]=function(){z()};x[32]=w[32]=function(){var b=m();ya&&fa(0);switch(b>>3&7){case 0:y[b&7]=Na;break;case 2:y[b&7]=Ub;break;case 3:y[b&7]=cd;break;case 4:y[b&7]=Oc;break;default:z()}};x[33]=w[33]=function(){m(); +ya&&fa(0)};x[34]=w[34]=function(){var b=m();ya&&fa(0);var c=y[b&7];switch(b>>3&7){case 0:if(-2147483648===(c&2147483649))throw ze("#GP handler");Na&2147483648&&!(c&2147483648)&&(pc=new Uint8Array(1048576),tc());Na=c;O();break;case 3:cd=c;tc();break;case 4:(Oc^c)&128&&(pc=new Uint8Array(1048576),tc());Oc=c;Fd=Oc&16?128:0;break;default:z()}};x[35]=w[35]=function(){m();ya&&fa(0)};x[36]=w[36]=function(){z()};x[37]=w[37]=function(){z()};x[38]=w[38]=function(){z()};x[39]=w[39]=function(){z()};x[40]=w[40]= +function(){z()};x[41]=w[41]=function(){z()};x[42]=w[42]=function(){z()};x[43]=w[43]=function(){z()};x[44]=w[44]=function(){z()};x[45]=w[45]=function(){z()};x[46]=w[46]=function(){z()};x[47]=w[47]=function(){z()};x[48]=w[48]=function(){z()};x[49]=w[49]=function(){y[0]=ed;y[2]=ed/4294967296};x[50]=w[50]=function(){z()};x[51]=w[51]=function(){z()};x[52]=w[52]=function(){z()};x[53]=w[53]=function(){z()};x[54]=w[54]=function(){z()};x[55]=w[55]=function(){z()};x[56]=w[56]=function(){z()};x[57]=w[57]=function(){z()}; +x[58]=w[58]=function(){z()};x[59]=w[59]=function(){z()};x[60]=w[60]=function(){z()};x[61]=w[61]=function(){z()};x[62]=w[62]=function(){z()};x[63]=w[63]=function(){z()};x[64]=function(){var b=m();if(Ya()){var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}else 192>b&&l(b)};w[64]=function(){var b=m();if(Ya()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192>b&&l(b)};x[65]=function(){var b=m();if(Ya())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[65]=function(){var b=m();if(Ya())192>b&&l(b); +else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[66]=function(){var b=m();if(Ra()){var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}else 192>b&&l(b)};w[66]=function(){var b=m();if(Ra()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192>b&&l(b)};x[67]=function(){var b=m();if(Ra())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[67]=function(){var b=m();if(Ra())192>b&&l(b);else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[68]=function(){var b=m();if(Sa()){var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2& +14]=c}else 192>b&&l(b)};w[68]=function(){var b=m();if(Sa()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192>b&&l(b)};x[69]=function(){var b=m();if(Sa())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[69]=function(){var b=m();if(Sa())192>b&&l(b);else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[70]=function(){var b=m();if(Qa()){var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}else 192>b&&l(b)};w[70]=function(){var b=m();if(Qa()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192>b&&l(b)};x[71]= +function(){var b=m();if(Qa())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[71]=function(){var b=m();if(Qa())192>b&&l(b);else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[72]=function(){var b=m();if(Za()){var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}else 192>b&&l(b)};w[72]=function(){var b=m();if(Za()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192>b&&l(b)};x[73]=function(){var b=m();if(Za())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[73]=function(){var b=m(); +if(Za())192>b&&l(b);else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[74]=function(){var b=m();if(Ta()){var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}else 192>b&&l(b)};w[74]=function(){var b=m();if(Ta()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192>b&&l(b)};x[75]=function(){var b=m();if(Ta())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[75]=function(){var b=m();if(Ta())192>b&&l(b);else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[76]=function(){var b=m();if(Wa()){var c=192>b?Q(l(b)): +g[b<<1&14];g[b>>2&14]=c}else 192>b&&l(b)};w[76]=function(){var b=m();if(Wa()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192>b&&l(b)};x[77]=function(){var b=m();if(Wa())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[77]=function(){var b=m();if(Wa())192>b&&l(b);else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[78]=function(){var b=m();if(Xa()){var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}else 192>b&&l(b)};w[78]=function(){var b=m();if(Xa()){var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}else 192> +b&&l(b)};x[79]=function(){var b=m();if(Xa())192>b&&l(b);else{var c=192>b?Q(l(b)):g[b<<1&14];g[b>>2&14]=c}};w[79]=function(){var b=m();if(Xa())192>b&&l(b);else{var c=192>b?S(l(b)):e[b&7];e[b>>3&7]=c}};x[80]=w[80]=function(){z()};x[81]=w[81]=function(){z()};x[82]=w[82]=function(){z()};x[83]=w[83]=function(){z()};x[84]=w[84]=function(){z()};x[85]=w[85]=function(){z()};x[86]=w[86]=function(){z()};x[87]=w[87]=function(){z()};x[88]=w[88]=function(){z()};x[89]=w[89]=function(){z()};x[90]=w[90]=function(){z()}; +x[91]=w[91]=function(){z()};x[92]=w[92]=function(){z()};x[93]=w[93]=function(){z()};x[94]=w[94]=function(){z()};x[95]=w[95]=function(){z()};x[96]=w[96]=function(){z()};x[97]=w[97]=function(){z()};x[98]=w[98]=function(){z()};x[99]=w[99]=function(){z()};x[100]=w[100]=function(){z()};x[101]=w[101]=function(){z()};x[102]=w[102]=function(){z()};x[103]=w[103]=function(){z()};x[104]=w[104]=function(){z()};x[105]=w[105]=function(){z()};x[106]=w[106]=function(){z()};x[107]=w[107]=function(){z()};x[108]=w[108]= +function(){z()};x[109]=w[109]=function(){z()};x[110]=w[110]=function(){z()};x[111]=w[111]=function(){z()};x[112]=w[112]=function(){z()};x[113]=w[113]=function(){z()};x[114]=w[114]=function(){z()};x[115]=w[115]=function(){z()};x[116]=w[116]=function(){z()};x[117]=w[117]=function(){z()};x[118]=w[118]=function(){z()};x[119]=w[119]=function(){z()};x[120]=w[120]=function(){z()};x[121]=w[121]=function(){z()};x[122]=w[122]=function(){z()};x[123]=w[123]=function(){z()};x[124]=w[124]=function(){z()};x[125]= +w[125]=function(){z()};x[126]=w[126]=function(){z()};x[127]=w[127]=function(){z()};x[128]=function(){Oa(Ya())};w[128]=function(){Pa(Ya())};x[129]=function(){Oa(!Ya())};w[129]=function(){Pa(!Ya())};x[130]=function(){Oa(Ra())};w[130]=function(){Pa(Ra())};x[131]=function(){Oa(!Ra())};w[131]=function(){Pa(!Ra())};x[132]=function(){Oa(Sa())};w[132]=function(){Pa(Sa())};x[133]=function(){Oa(!Sa())};w[133]=function(){Pa(!Sa())};x[134]=function(){Oa(Qa())};w[134]=function(){Pa(Qa())};x[135]=function(){Oa(!Qa())}; +w[135]=function(){Pa(!Qa())};x[136]=function(){Oa(Za())};w[136]=function(){Pa(Za())};x[137]=function(){Oa(!Za())};w[137]=function(){Pa(!Za())};x[138]=function(){Oa(Ta())};w[138]=function(){Pa(Ta())};x[139]=function(){Oa(!Ta())};w[139]=function(){Pa(!Ta())};x[140]=function(){Oa(Wa())};w[140]=function(){Pa(Wa())};x[141]=function(){Oa(!Wa())};w[141]=function(){Pa(!Wa())};x[142]=function(){Oa(Xa())};w[142]=function(){Pa(Xa())};x[143]=function(){Oa(!Xa())};w[143]=function(){Pa(!Xa())};x[144]=w[144]=function(){var b= +m();192>b?V(l(b),!Ya()^1):v[b<<2&12|b>>2&1]=!Ya()^1};x[145]=w[145]=function(){var b=m();192>b?V(l(b),!!Ya()^1):v[b<<2&12|b>>2&1]=!!Ya()^1};x[146]=w[146]=function(){var b=m();192>b?V(l(b),!Ra()^1):v[b<<2&12|b>>2&1]=!Ra()^1};x[147]=w[147]=function(){var b=m();192>b?V(l(b),!!Ra()^1):v[b<<2&12|b>>2&1]=!!Ra()^1};x[148]=w[148]=function(){var b=m();192>b?V(l(b),!Sa()^1):v[b<<2&12|b>>2&1]=!Sa()^1};x[149]=w[149]=function(){var b=m();192>b?V(l(b),!!Sa()^1):v[b<<2&12|b>>2&1]=!!Sa()^1};x[150]=w[150]=function(){var b= +m();192>b?V(l(b),!Qa()^1):v[b<<2&12|b>>2&1]=!Qa()^1};x[151]=w[151]=function(){var b=m();192>b?V(l(b),!!Qa()^1):v[b<<2&12|b>>2&1]=!!Qa()^1};x[152]=w[152]=function(){var b=m();192>b?V(l(b),!Za()^1):v[b<<2&12|b>>2&1]=!Za()^1};x[153]=w[153]=function(){var b=m();192>b?V(l(b),!!Za()^1):v[b<<2&12|b>>2&1]=!!Za()^1};x[154]=w[154]=function(){var b=m();192>b?V(l(b),!Ta()^1):v[b<<2&12|b>>2&1]=!Ta()^1};x[155]=w[155]=function(){var b=m();192>b?V(l(b),!!Ta()^1):v[b<<2&12|b>>2&1]=!!Ta()^1};x[156]=w[156]=function(){var b= +m();192>b?V(l(b),!Wa()^1):v[b<<2&12|b>>2&1]=!Wa()^1};x[157]=w[157]=function(){var b=m();192>b?V(l(b),!!Wa()^1):v[b<<2&12|b>>2&1]=!!Wa()^1};x[158]=w[158]=function(){var b=m();192>b?V(l(b),!Xa()^1):v[b<<2&12|b>>2&1]=!Xa()^1};x[159]=w[159]=function(){var b=m();192>b?V(l(b),!!Xa()^1):v[b<<2&12|b>>2&1]=!!Xa()^1};x[160]=function(){la(ra[4])};w[160]=function(){ia(ra[4])};x[161]=function(){ca(4,k.b(Va(0)));$[aa]+=2};w[161]=function(){ca(4,k.b(Va(0)));$[aa]+=4};x[162]=w[162]=function(){var b=e[0];0===(b&2147483647)? +(y[0]=2,0===b&&(y[3]=1970169159,y[2]=1231384169,y[1]=1818588270)):1===b?(y[0]=1299,y[3]=0,y[1]=0,y[2]=Ha.a|41240):2===b?(y[0]=1717260289,y[3]=0,y[1]=0,y[2]=8024064):-2138701824===b&&(y[0]=0,y[3]=0,y[1]=0,y[2]=0)};x[163]=w[163]=function(){var b=m();xa?192>b?pd(l(b),e[b>>3&7]):ld(y[b&7],y[b>>3&7]&31):192>b?pd(l(b),Ga[b>>2&14]):ld(g[b<<1&14],g[b>>2&14]&15)};x[164]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,Ic(c,g[b>>2&14],m()&31))):(c=k.b(d),k.a(d,Ic(c, +g[b>>2&14],m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Ic(c,g[b>>2&14],m()&31))};w[164]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,Jc(c,y[b>>3&7],m()&31))):(c=k.c(d)>>>0,k.f(d,Jc(c,y[b>>3&7],m()&31)))):(c=y[b&7],e[b&7]=Jc(c,y[b>>3&7],m()&31))};x[165]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,Ic(c,g[b>>2&14],v[4]&31))):(c=k.b(d),k.a(d,Ic(c,g[b>>2&14],v[4]&31)))):(c=g[b<<1&14],g[b<<1&14]=Ic(c,g[b>>2&14],v[4]& +31))};w[165]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,Jc(c,y[b>>3&7],v[4]&31))):(c=k.c(d)>>>0,k.f(d,Jc(c,y[b>>3&7],v[4]&31)))):(c=y[b&7],e[b&7]=Jc(c,y[b>>3&7],v[4]&31))};x[166]=w[166]=function(){z()};x[167]=w[167]=function(){z()};x[168]=function(){la(ra[5])};w[168]=function(){ia(ra[5])};x[169]=function(){ca(5,k.b(Va(0)));$[aa]+=2};w[169]=function(){ca(5,k.b(Va(0)));$[aa]+=4};x[170]=w[170]=function(){z()};x[171]=w[171]=function(){var b=m();xa?192> +b?sd(l(b),e[b>>3&7]):y[b&7]=nd(e[b&7],e[b>>3&7]&31):192>b?sd(l(b),Ga[b>>2&14]):g[b<<1&14]=nd(g[b<<1&14],Ga[b>>2&14]&15)};x[172]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,Gc(c,g[b>>2&14],m()&31))):(c=k.b(d),k.a(d,Gc(c,g[b>>2&14],m()&31)))):(c=g[b<<1&14],g[b<<1&14]=Gc(c,g[b>>2&14],m()&31))};w[172]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,Hc(c,y[b>>3&7],m()&31))):(c=k.c(d)>>>0,k.f(d,Hc(c,y[b>>3&7], +m()&31)))):(c=y[b&7],e[b&7]=Hc(c,y[b>>3&7],m()&31))};x[173]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,Gc(c,g[b>>2&14],v[4]&31))):(c=k.b(d),k.a(d,Gc(c,g[b>>2&14],v[4]&31)))):(c=g[b<<1&14],g[b<<1&14]=Gc(c,g[b>>2&14],v[4]&31))};w[173]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,Hc(c,y[b>>3&7],v[4]&31))):(c=k.c(d)>>>0,k.f(d,Hc(c,y[b>>3&7],v[4]&31)))):(c=y[b&7],e[b&7]=Hc(c,y[b>>3&7],v[4]&31))};x[174]=w[174]= +function(){z()};x[175]=function(){var b=m(),c=192>b?Q(l(b))<<16>>16:Ga[b<<1&14];g[b>>2&14]=Md(Ga[b>>2&14],c)};w[175]=function(){var b=m(),c=192>b?S(l(b)):e[b&7];y[b>>3&7]=Nd(e[b>>3&7],c)};x[176]=w[176]=function(){var b=m();if(192>b)var c=l(b),d=ka(c);else d=v[b<<2&12|b>>2&1];lc(d,v[0]);Gb()?192>b?V(c,v[b>>1&12|b>>5&1]):v[b<<2&12|b>>2&1]=v[b>>1&12|b>>5&1]:v[0]=d};x[177]=w[177]=function(){var b=m();if(xa){if(192>b)var c=l(b),d=S(c)>>>0;else d=y[b&7];Zb(d,y[0]);Gb()?192>b?N(c,y[b>>3&7]):y[b&7]=y[b>> +3&7]:y[0]=d}else 192>b?(c=l(b),d=Q(c)):d=g[b<<1&14],Yb(d,g[0]),Gb()?192>b?R(c,g[b>>2&14]):g[b<<1&14]=g[b>>2&14]:g[0]=d};x[178]=w[178]=function(){var b=m();192<=b?za(6):xa?Vc(2,l(b),b>>3&7):Uc(2,l(b),b>>2&14)};x[179]=w[179]=function(){var b=m();xa?192>b?rd(l(b),e[b>>3&7]):y[b&7]=od(e[b&7],e[b>>3&7]&31):192>b?rd(l(b),Ga[b>>2&14]):g[b<<1&14]=od(g[b<<1&14],Ga[b>>2&14]&15)};x[180]=w[180]=function(){var b=m();192<=b?za(6):xa?Vc(4,l(b),b>>3&7):Uc(4,l(b),b>>2&14)};x[181]=w[181]=function(){var b=m();192<= +b?za(6):xa?Vc(5,l(b),b>>3&7):Uc(5,l(b),b>>2&14)};x[182]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];g[b>>2&14]=c};w[182]=function(){var b=m(),c=192>b?ka(l(b)):v[b<<2&12|b>>2&1];y[b>>3&7]=c};x[183]=w[183]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14];y[b>>3&7]=c};x[184]=w[184]=function(){z()};x[185]=w[185]=function(){z()};x[186]=w[186]=function(){var b=m();switch(b>>3&7){case 4:xa?192>b?pd(l(b),m()&31):ld(y[b&7],m()&31):192>b?pd(l(b),m()&31):ld(g[b<<1&14],m()&15);break;case 5:xa?192> +b?sd(l(b),m()&31):y[b&7]=nd(e[b&7],m()&31):192>b?sd(l(b),m()&31):g[b<<1&14]=nd(g[b<<1&14],m()&15);break;case 6:xa?192>b?rd(l(b),m()&31):y[b&7]=od(e[b&7],m()&31):192>b?rd(l(b),m()&31):g[b<<1&14]=od(g[b<<1&14],m()&15);break;case 7:xa?192>b?qd(l(b),m()&31):y[b&7]=md(e[b&7],m()&31):192>b?qd(l(b),m()&31):g[b<<1&14]=md(g[b<<1&14],m()&15);break;default:z()}};x[187]=w[187]=function(){var b=m();xa?192>b?qd(l(b),e[b>>3&7]):y[b&7]=md(e[b&7],e[b>>3&7]&31):192>b?qd(l(b),Ga[b>>2&14]):g[b<<1&14]=md(g[b<<1&14],Ga[b>> +2&14]&15)};x[188]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14],d=g;var e=g[b>>2&14];K=0;0===c?(u|=64,c=e):(u&=-65,c=oe[((-c&c)>>>0)%37]);d[b>>2&14]=c};w[188]=function(){var b=m(),c=192>b?S(l(b)):e[b&7],d=y;var g=y[b>>3&7];K=0;0===c?(u|=64,c=g):(u&=-65,c=oe[((-c&c)>>>0)%37]);d[b>>3&7]=c};x[189]=function(){var b=m(),c=192>b?Q(l(b)):g[b<<1&14],d=g;var e=g[b>>2&14];K=0;0===c?(u|=64,c=e):(u&=-65,c=(e=c>>>8)?8+Ae[e]:Ae[c]);d[b>>2&14]=c};w[189]=function(){var b=m(),c=192>b?S(l(b)):e[b&7],d=y;var g=y[b>> +3&7];K=0;if(0===c)u|=64,c=g;else{u&=-65;var g=c>>>16,k;c=g?(k=g>>>8)?24+Ae[k]:16+Ae[g]:(k=c>>>8)?8+Ae[k]:Ae[c]}d[b>>3&7]=c};x[190]=function(){var b=m(),c=192>b?Rc(l(b)):fc[b<<2&12|b>>2&1];g[b>>2&14]=c};w[190]=function(){var b=m(),c=192>b?Rc(l(b)):fc[b<<2&12|b>>2&1];e[b>>3&7]=c};x[191]=w[191]=function(){var b=m(),c=192>b?Q(l(b))<<16>>16:Ga[b<<1&14];e[b>>3&7]=c};x[192]=w[192]=function(){var b=m(),c,d;192>b?(d=q(l(b)),c=k.d(d),k.e(d,me(c,b>>1&12|b>>5&1))):(c=v[b<<2&12|b>>2&1],v[b<<2&12|b>>2&1]=me(c, +b>>1&12|b>>5&1))};x[193]=function(){var b=m(),c,d,e;192>b?(c=l(b),d=q(c),J&&4095===(c&4095)?(e=q(c+1),c=B(d,e),n(d,e,Od(c,b>>2&14))):(c=k.b(d),k.a(d,Od(c,b>>2&14)))):(c=g[b<<1&14],g[b<<1&14]=Od(c,b>>2&14))};w[193]=function(){var b=m(),c,d,g;192>b?(c=l(b),d=q(c),J&&4093<=(c&4095)?(g=q(c+3),c=G(d,g)>>>0,H(d,g,Pd(c,b>>3&7))):(c=k.c(d)>>>0,k.f(d,Pd(c,b>>3&7)))):(c=y[b&7],e[b&7]=Pd(c,b>>3&7))};x[194]=w[194]=function(){z()};x[195]=w[195]=function(){z()};x[196]=w[196]=function(){z()};x[197]=w[197]=function(){z()}; +x[198]=w[198]=function(){z()};x[199]=w[199]=function(){var b=m(),b=l(b),c=S(b)>>>0,d=S(b+4)>>>0;y[0]===c&&y[2]===d?(u|=64,N(b,y[3]),N(b+4,y[1])):(u&=-65,y[0]=c,y[2]=d);K&=-65};x[200]=w[200]=function(){bc(0)};x[201]=w[201]=function(){bc(1)};x[202]=w[202]=function(){bc(2)};x[203]=w[203]=function(){bc(3)};x[204]=w[204]=function(){bc(4)};x[205]=w[205]=function(){bc(5)};x[206]=w[206]=function(){bc(6)};x[207]=w[207]=function(){bc(7)};x[208]=w[208]=function(){z()};x[209]=w[209]=function(){z()};x[210]=w[210]= +function(){z()};x[211]=w[211]=function(){z()};x[212]=w[212]=function(){z()};x[213]=w[213]=function(){z()};x[214]=w[214]=function(){z()};x[215]=w[215]=function(){z()};x[216]=w[216]=function(){z()};x[217]=w[217]=function(){z()};x[218]=w[218]=function(){z()};x[219]=w[219]=function(){z()};x[220]=w[220]=function(){z()};x[221]=w[221]=function(){z()};x[222]=w[222]=function(){z()};x[223]=w[223]=function(){z()};x[224]=w[224]=function(){z()};x[225]=w[225]=function(){z()};x[226]=w[226]=function(){z()};x[227]= +w[227]=function(){z()};x[228]=w[228]=function(){z()};x[229]=w[229]=function(){z()};x[230]=w[230]=function(){z()};x[231]=w[231]=function(){z()};x[232]=w[232]=function(){z()};x[233]=w[233]=function(){z()};x[234]=w[234]=function(){z()};x[235]=w[235]=function(){z()};x[236]=w[236]=function(){z()};x[237]=w[237]=function(){z()};x[238]=w[238]=function(){z()};x[239]=w[239]=function(){z()};x[240]=w[240]=function(){z()};x[241]=w[241]=function(){z()};x[242]=w[242]=function(){z()};x[243]=w[243]=function(){z()}; +x[244]=w[244]=function(){z()};x[245]=w[245]=function(){z()};x[246]=w[246]=function(){z()};x[247]=w[247]=function(){z()};x[248]=w[248]=function(){z()};x[249]=w[249]=function(){z()};x[250]=w[250]=function(){z()};x[251]=w[251]=function(){z()};x[252]=w[252]=function(){z()};x[253]=w[253]=function(){z()};x[254]=w[254]=function(){z()};x[255]=w[255]=function(){z()}};Object.bb=function(f){for(var t={},D=0;Df.length;)f=f+" ";return f};String.i=function(f,t){for(f=f?f+"":"";f.length>>24|f>>8&65280|f<<8&16711680|f<<24};Math.Xa=function(f){return f>>>8&255|f<<8&65280};for(var Ae,De=new Int8Array(256),Ee=0,Fe=-2;256>Ee;Ee++)Ee&Ee-1||Fe++,De[Ee]=Fe;Ae=De;Math.qa=function(f){return 0>8,0,0,16,0,0,0,0,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,4,0,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,1,0,0,3,0,0,0,2,0,2,7,0,B.i,B.i>>8,16,0,63,0,this.o&255,this.o>>8&255,this.o>>16&255,this.o>>24&255,0,0,this.o&255,this.o>>8&255,this.o>>16&255,this.o>>24&255,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,this.o&255,this.o>>8&255,this.o>>16&255,this.o>>24&255]),O()):145===f?O():16===f?O():(O(),H=[0,0,0,0,t.byteLength&255,t.byteLength>>8&255,t.byteLength>>16&255,t.byteLength>>24&255,0,0,0,0])});this.j.h(L|0,function(){return n>8&255});f.h(3326,function(){return D>>16&255});f.h(3327,function(){return D>>24&255});f.h(3320,function(){return C&255});f.h(3321,function(){return C>>8&255});f.h(3322,function(){return C>>16&255});f.h(3323,function(){return C>>24&255});f.g(3320,function(f){t=t&-256|f});f.g(3321,function(f){t=t&-65281|f<<8});f.g(3322,function(f){t=t&-16711681|f<<16});f.g(3323,function(f){var X= +t=t&16777215|f<<24,B=(X&2147483647)>>8;f=X&252;-2147483648===X?C=2147483648:O.a[B]?(X=O.a[B],C=2147483648,0===f?D=X.da:8===f?D=X.Y:36===f?D=X.T:60===f?D=X.U:D=0):C=D=0});this.pa=function(f,t){this.a[t]=f};this.pa({U:0,T:0,da:2256543790,Y:100700192},0)};function ue(f,t){function D(){return 0}function C(){var f=128;jaCa&&(B=1,F++,1>>14,n=V[F];return 1===H[F]?n(f):C(f&-4)>>8*(f&3)&255}function D(f,F){var n=R[f>>>14];1===H[f>>>14]&&n(f,F)}function C(f){var F=V[f>>>14];return 0===(f&3)&&H[f>>>14]===n?F(f):t(f)|t(f+1)<<8|t(f+2)<<16|t(f+3)<<24}function O(f,F){var t=R[f>>>14];0===(f&3)&&H[f>>>14]===n?t(f,F):(D(f,F&255),D(f+1,F>>8&255),D(f+2,F>>16&255),D(f+3,F>>24&255))}var L=new Uint8Array(f),X=new Uint16Array(f),B=new Int8Array(f),G=new Int32Array(f);this.m=L;this.Q= +B;this.i=G;this.buffer=f;for(var n=4,H=new Int8Array(262144),V=[],R=[],f=0;262144>f;f++)V[f]=R[f]=void 0;this.ba=function(f,F,t,B,G){var D=f>>>14;for(t=t?n:1;0>>14]?t(f)<<24>>24:B[f]};this.d=function(f){return H[f>>>14]?t(f):L[f]};this.b=function(f){return H[f>>>14]?t(f)|t(f+1)<<8:L[f]|L[f+1]<<8};this.q=function(f){return H[f>>>14]?t(f)|t(f+1)<<8:X[f>>1]};this.c=function(f){return H[f>>> +14]?C(f)|0:L[f]|L[f+1]<<8|L[f+2]<<16|L[f+3]<<24};this.v=function(f){return H[f>>>14]?C(f)|0:G[f>>2]};this.e=function(f,n){H[f>>>14]?D(f,n):L[f]=n};this.a=function(f,n){H[f>>>14]?(D(f,n&255),D(f+1,n>>8&255)):(L[f]=n,L[f+1]=n>>8)};this.S=function(f,n){H[f>>>14]?(D(f,n&255),D(f+1,n>>8&255)):X[f>>1]=n};this.f=function(f,n){H[f>>>14]?O(f,n):(L[f]=n,L[f+1]=n>>8,L[f+2]=n>>16,L[f+3]=n>>24)};this.D=function(f,n){H[f>>>14]?O(f,n):G[f>>2]=n};this.J=function(f,n){L.set(f,n)};this.aa=function(f){for(var n=0;n< +f.length;n++)this.e(63488+n,f.charCodeAt(n))}};function qe(f){function t(f,t){if(8>f){var n=f>>1;f&1?L[n].count=D(L[n].count,t):L[n].p=D(L[n].p,t)}}function D(f,t){return(X^=1)?f&-256|t:f&-65281|t<<8}var C=f.j,O=f.memory,L=[{p:0,count:0},{p:0,count:0},{p:0,count:0},{p:0,count:0}],X=0;C.g(4,t.bind(0,4));C.g(5,t.bind(0,5));C.g(10,function(){});C.g(11,function(){});C.g(12,function(){X=0});C.g(129,function(f){L[2].p=L[2].p&65535|f<<16});this.ya=function(f,t,n,D){var C=L[2].p;L[2].p+=n;f.get(t,n,function(f){O.J(f,C);D()})};this.za=function(f,t,n){f.set(t, +new Uint8Array(O.buffer,L[2].p,L[2].count+1),function(){n()})}};function xe(f){function t(f){var n=H[f];if(n)return H[f]--,2===n?V[f]&255:V[f]>>8;n=X[f];3===G[f]&&(X[f]^=1);return n?N[f]&255:N[f]>>8}function D(f,t){R[f]=X[f]?R[f]&-256|t:R[f]&255|t<<8;3===n[f]&&X[f]||(R[f]||(R[f]=65535),N[f]=R[f],B[f]=!0);3===n[f]&&(X[f]^=1)}var C=f.j,O=f.s,L=Date.now(),X=new Uint8Array(3),B=new Uint8Array(3),G=new Uint8Array(3),n=new Uint8Array(3),H=new Uint8Array(3),V=new Uint16Array(3),R=new Uint16Array(3),N=new Uint16Array(3),F=0,na=0;C.h(97,function(){na^=16;return na|F<< +5});this.a=function(f){var n,t=1193.1816666*(f-L)>>>0;if(t){L+=t/1193.1816666;if(B[0]&&(f=N[0]-=t,0>=f))if(O.k(0),n=G[0],0===n)B[0]=0,N[0]=0;else if(3===n||2===n)N[0]=R[0]+f%R[0];B[2]&&(f=N[2]-=t,0>=f&&(n=G[2],0===n?(F=1,B[2]=0,N[2]=0):2===n?(F=1,N[2]=R[2]+f%R[2]):3===n&&(F^=1,N[2]=R[2]+f%R[2])))}};C.h(64,function(){return t(0)});C.h(65,function(){return t(1)});C.h(66,function(){return t(2)});C.g(64,function(f){D(0,f)});C.g(65,function(f){D(1,f)});C.g(66,function(f){D(2,f)});C.g(67,function(f){var t= +f>>1&7,D=f>>6&3;f=f>>4&3;3!==D&&(0===f?(H[D]=2,V[D]=N[D]):(6<=t&&(t&=-5),X[D]=1===f?1:2===f?0:1,G[D]=t,n[D]=f,2===D&&(F=0===t?0:1)))})};function re(f,t){function D(){var f=(L-N)/n|0,h=(L-N)%n,f=Math.min(H-1,f);t.Za(f,h)}var C=f.j,O=f.memory,L=0,X=14,B=15,G=this,n,H,V,R,N=0,F=!0,na=!1,sa=!1,pa=new Int32Array(256),ha=new Uint8Array(262144),za=new Uint8Array(ha.buffer,0,65536),qa=new Uint8Array(ha.buffer,65536,65536),z=new Uint8Array(ha.buffer,131072,65536),fa=new Uint8Array(ha.buffer,196608,65536),ja=0,h=0,Ca=0,Da=0,Fa=new Uint8Array(8388608),Xb=!1,gc=0,hc=0,ic=0;this.i=function(){if(sa)if(sa=!1,na){if(!F)for(var f=0,h,D=0;DC;C++)h=za[f]>>C&1|qa[f]>>C<<1&2|z[f]>>C<<2&4|fa[f]>>C<<3&8,t.Qa(B+7-C,D,pa[zb[h]]);f++}}else for(f=98304|N<<1,B=0;B>4&15],pa[D&15]),f+=2;na||Xb?t.Va():t.Wa()};this.N=function(f,h){n=f;H=h;t.N(f,h)};this.I=function(f,h){t.I(f,h)};this.O=function(){t.O(X,B)};this.Z=function(){t.Z()};this.a=function(f){var h=!1;switch(f){case 3:this.N(80,25);break;case 16:this.I(640,350);V=640;R=350;h=!0;F=!1;break;case 18:this.I(640, +480);V=640;R=480;h=!0;F=!1;break;case 19:this.I(320,200),V=320,R=200,F=h=!0}t.va(h);na=h};this.n=function(){};var cb=0,$a=0;C.g(967,function(){});C.g(968,function(f){$a=3*f});C.g(969,function(f){var h=$a/3|0,n=$a%3,z=pa[h];f=f<<2&255|3;pa[h]=0===n?z&-16711681|f<<16:1===n?z&-65281|f<<8:z&-256|f;$a++;sa=!0});C.g(980,function(f){cb=f});C.g(981,function(f){switch(cb){case 2:G.N(f,25);break;case 10:X=f;G.O();break;case 11:B=f;G.O();break;case 12:N=N&255|f<<8;sa=!0;break;case 13:N=N&65280|f;sa=!0;break; +case 14:L=L&255|f<<8;D();break;case 15:L=L&65280|f,D()}});C.h(981,function(){return 10===cb?X:11===cb?B:14===cb?L>>8:15===cb?L&255:0});var jc=255;C.h(972,function(){return jc});C.g(962,function(f){jc=f;103===f?G.a(3):227===f?G.a(18):99===f?G.a(19):163===f?G.a(16):G.a(3)});C.h(986,function(){La=-1;return 255});var La=-1;C.h(961,function(){return La=-1});var zb=new Uint8Array(16);C.g(960,function(f){-1===La?La=f:(16>La&&(zb[La]=f),La=-1)});C.h(960,function(){var f=La;La=-1;return f});var Bb=-1;C.g(964, +function(f){Bb=f});var ca=15;C.g(965,function(f){switch(Bb){case 2:ca=f}});C.h(965,function(){switch(Bb){case 6:return 18}});var tc=-1;C.g(974,function(f){tc=f});var Qc=0,Wb=0,gd=0,Ia=255;C.g(975,function(f){switch(tc){case 3:gd=f;break;case 4:Qc=f;break;case 5:Wb=f;break;case 8:Ia=f}});var hb=-1,db=-1,ib=!0;C.g(462,function(f){hb=f;ib=!0});C.g(463,function(f){ib?(hb|=f<<8,ib=!1):(ib=!0,db=f)});C.g(464,function(f){db|=f<<8;switch(hb){case 1:gc=db;break;case 2:hc=db;break;case 3:ic=db;break;case 4:Xb= +1===(db&1)}Xb&&(G.I(gc,hc),t.va(!0))});C.h(463,function(){switch(hb){case 0:return 192;case 1:return 1280;case 2:return 1024;case 3:return 32;case 10:return 128}});C.h(464,function(){switch(hb){case 0:return 176;case 1:return 5;case 2:return 4;case 3:return 0;case 10:return 0}});G.N(80,25);G.O();O.ba(655360,131072,!1,function(f){if(!na||F)return ha[f];f&=65535;ja=za[f];h=qa[f];Ca=z[f];Da=fa[f];return ha[Qc<<16|f]},function(f,D){if(na)if(F){var C=f<<2,B=pa[D];t.r(C|2,B>>16&255);t.r(C|1,B>>8&255);t.r(C, +B&255);ha[f]=D}else{if(!(65535=V*R<<3)){B<<=1;G<<=2;H<<=3;for(var L=(f<<3|7)<<2,O=0;8>O;O++){var Fa=pa[zb[C>>O&1|B>>O&2|G>>O&4|H>>O&8]];t.r(L|2,Fa>>16);t.r(L|1,Fa>>8&255);t.r(L,Fa&255);L-=4}}}}else 98304>f||(B=(f-98304>>1)-N,C=B/n|0,B%=n,f&1?(H=D,G=ha[f&-2]):(G=D,H=ha[f|1]),t.ka(C,B,G,pa[H>>4&15],pa[H&15]),ha[f]=D)});O.ba(3758096384,8388608,!1,function(f){return Fa[f]},function(f,h){Fa[f]=h;switch(ic){case 32:if(3===(f&3))break;t.r(f,h);break;case 24:t.r(4/3*f|0,h);break;case 16:if(f& +1){var n=Fa[f^1]>>5&7|h<<3&56,z;z=255*(h>>3&31)/31|0;f<<=1;t.r(f-1,255*n/63|0);t.r(f-2,z)}else n=255*(h&31)/31|0,t.r((f<<1)+2,n)}})};function se(f,t,D){function C(){n.k(1)}function O(f){qa.push(f);C()}function L(f,h){if(R&&V&&(N+=f,F+=h,H)){var n=Date.now();n-fa<1E3/z||(fa=n,B())}}function X(f,h,n){R&&V&&(na=f|n<<1|h<<2,H&&B())}function B(){ja.push((0>F)<<5|(0>N)<<4|8|na,N&255,F&255);if(15>5;1===n?B=0:3===n&&(B&=~(1<<(f&7)))}}); +O.h(f,function(){return N?G:B});O.g(f|1,function(f){0===R?V?V=!1:L=~f:1===R?(X=f,R++):2===R&&(R=0)});O.h(f|1,function(){return~L});this.k=n?function(f){8<=f&&(H.k(f-8),f=2);G|=1<>7});C.g(113,function(f){switch(L){case 10:R=f&127;V=1E3/(32768>>(R&15)-1);break;case 11:N=f,N&64&&(n=Date.now())}H=64===(N&64)&&0<(R&15)});C.h(113,function(){var f=L;L=13;switch(f){case 0:return D((new Date(B)).getUTCSeconds());case 2:return D((new Date(B)).getUTCMinutes()); +case 4:return D((new Date(B)).getUTCHours());case 7:return D((new Date(B)).getUTCDate());case 8:return D((new Date(B)).getUTCMonth()+1);case 9:return D((new Date(B)).getUTCFullYear()%100);case 10:return R;case 11:return N;case 14:return 0;case 12:return 0;case 15:return 0;case 16:return t;case 20:return 45;case 50:return D((new Date(B)).getUTCFullYear()/100|0);case 52:return 0;case 53:return 3;case 56:return 48;case 61:return 33;case 91:case 92:case 93:return 0}return 255})};function te(f){var t="";f.j.g(1016,function(f){10===f?(nc(t),t=""):t+=String.fromCharCode(f)})};window.requestAnimationFrame||(window.requestAnimationFrame=window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame); +function Wd(){function f(){na=!0;for(var f=0;f>16&255;B[f+1]=t>>8&255;B[f+2]=t&255}; +this.r=function(f,n){B[(f^3)-1]=n};this.Va=function(){na&&(na=!1,requestAnimationFrame(function(){na=!0;O.putImageData(X,0,0)}))};this.n=function(){};this.va=function(f){f?(D.style.display="none",C.style.display="block"):(D.style.display="block",C.style.display="none")};this.Z=function(){O.fillStyle="#000";O.fillRect(0,0,C.width,C.height)};this.N=function(f,n){F=new Int8Array(n);sa=new Int32Array(f*n*3);pa=f;for(ha=n;D.firstChild;)D.removeChild(D.firstChild);for(var t=0;tN?String.fromCharCode(qa[N]):String.fromCharCode(N);R++;t+=3;if(f===G)if(R===n)break;else if(R===n+1){B.appendChild(L);break}}h.textContent=H;B.appendChild(h)}D.replaceChild(B,D.childNodes[f])}};function Xd(){function f(f){return f.shiftKey&&f.ctrlKey&&74===f.keyCode||116===f.keyCode||!X.enabled?!1:f.target?"phone_keyboard"===f.target.className||"INPUT"!==f.target.nodeName&&"TEXTAREA"!==f.target.nodeName:!0}function t(n){if(f(n)){var t=n.keyCode;if(!L[t])return!1;L[t]=!1;O(t,!1)||n.preventDefault()}}function D(n){if(f(n)){var t=n.keyCode;L[t]&&O(t,!1);L[t]=!0;O(t,!0)||n.preventDefault()}}function C(){for(var f=Object.keys(L),t,B=0;B= +G.length||0===G[f])return!0;var C=G[f];t||(C|=128);255>8),B(C&255)):B(C);return!1}var L={},X=this,B;this.enabled=!0;var G=new Uint16Array([0,0,0,0,0,0,0,0,14,15,0,0,0,28,0,0,42,29,56,0,58,0,0,0,0,0,0,1,0,0,0,0,57,57417,57425,79,71,75,72,77,80,0,0,0,0,82,83,0,11,2,3,4,5,6,7,8,9,10,0,39,0,13,0,0,0,30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,0,0,0,0,0,82,79,80,81,75,76,77,71,72,73,0,0,0,0,0,0,59,60,61,62,63,64,65,66,67,68,87,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,39,13,51,12,52,53,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,43,27,40,0]);this.w=function(f){this.n();B=f;window.addEventListener("keyup",t,!1);window.addEventListener("keydown",D,!1);window.addEventListener("blur",C,!1)};this.n=function(){window.removeEventListener("keyup",t,!1);window.removeEventListener("keydown",D,!1);window.removeEventListener("blur",C,!1)}};function Yd(){function f(f){return V.enabled&&(!f.target||"mousemove"===f.type||"INPUT"!==f.target.nodeName&&"TEXTAREA"!==f.target.nodeName)}function t(n){if(f(n)){var t;t=n.webkitMovementX||n.mozMovementX||0;n=n.webkitMovementY||n.mozMovementY||0;t=Math.qa(0.5*t);n=Math.qa(0.5*n);H(t,-n)}}function D(n){f(n)&&n.preventDefault()}function C(n){f(n)&&L(n,!0)}function O(n){f(n)&&L(n,!1)}function L(f,t){1===f.which?X=t:2===f.which?G=t:3===f.which&&(B=t);n(X,G,B);f.preventDefault()}var X=!1,B=!1,G=!1,n, +H,V=this;this.enabled=!1;this.n=function(){window.removeEventListener("mousemove",t,!1);document.removeEventListener("contextmenu",D,!1);window.removeEventListener("mousedown",C,!1);window.removeEventListener("mouseup",O,!1)};this.w=function(f,B){this.n();n=f;H=B;window.addEventListener("mousemove",t,!1);document.addEventListener("contextmenu",D,!1);window.addEventListener("mousedown",C,!1);window.addEventListener("mouseup",O,!1)}}; +//# sourceMappingURL=src/v86_all.js.map
+ + To fast version + +
+ CD image:
+ (Bootable El Torito)

+ Floppy disk image:
+ (1.44 or 2.88)

+ Hard drive disk image:
+

+
+ or +
+
+ + + + + +
+ + + + + readme +
+
+