about summary refs log tree commit diff stats
path: root/subx/015jump_relative.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2017-10-16 02:48:14 -0700
committerKartik K. Agaram <vc@akkartik.com>2017-10-16 02:48:14 -0700
commit4f6b2aca0dd9f795e19a5dfe8f3b1bdbe2ef9081 (patch)
tree7d724ada880dbd4fa0faeb46efd5866015514f2d /subx/015jump_relative.cc
parentbd61a20af859a07f18aebea0d13c52d9e6b104bd (diff)
downloadmu-4f6b2aca0dd9f795e19a5dfe8f3b1bdbe2ef9081.tar.gz
4071
subx: conditional jump instructions

Lots of boilerplate here. This commit really strains my 'copyista'
ethic. But I think it's still clearer to see each instruction
implemented independently than to try to create a macro or something
like that.
Diffstat (limited to 'subx/015jump_relative.cc')
-rw-r--r--subx/015jump_relative.cc258
1 files changed, 258 insertions, 0 deletions
diff --git a/subx/015jump_relative.cc b/subx/015jump_relative.cc
new file mode 100644
index 00000000..b48b2072
--- /dev/null
+++ b/subx/015jump_relative.cc
@@ -0,0 +1,258 @@
+//: jump to 16-bit offset
+
+//:: jump
+
+:(scenario jump_rel16)
+# op  ModRM   SIB   displacement  immediate
+  e9                05 00                     # skip 1 instruction
+  05                              00 00 00 01
+  05                              00 00 00 02
++run: inst: 0x00000001
++run: jump 5
++run: inst: 0x00000009
+-run: inst: 0x00000003
+
+:(before "End Single-Byte Opcodes")
+case 0xe9: {  // jump rel8
+  int16_t offset = imm16();
+  trace(2, "run") << "jump " << offset << end();
+  EIP += offset;
+  break;
+}
+:(code)
+int16_t imm16() {
+  int16_t result = next();
+  result |= (next()<<8);
+  return result;
+}
+
+//:: jump if equal/zero
+
+:(scenario je_rel16_success)
+% ZF = true;
+# op  ModRM   SIB   displacement  immediate
+  0f 84             05 00                     # skip 1 instruction
+  05                              00 00 00 01
+  05                              00 00 00 02
++run: inst: 0x00000001
++run: jump 5
++run: inst: 0x0000000a
+-run: inst: 0x00000005
+
+:(before "End Two-Byte Opcodes Starting With 0f")
+case 0x84: {  // jump rel16 if ZF
+  int8_t offset = imm16();
+  if (ZF) {
+    trace(2, "run") << "jump " << NUM(offset) << end();
+    EIP += offset;
+  }
+  break;
+}
+
+:(scenario je_rel16_fail)
+% ZF = false;
+# op  ModRM   SIB   displacement  immediate
+  0f 84             05 00                     # skip 1 instruction
+  05                              00 00 00 01
+  05                              00 00 00 02
++run: inst: 0x00000001
++run: inst: 0x00000005
++run: inst: 0x0000000a
+-run: jump 5
+
+//:: jump if not equal/not zero
+
+:(scenario jne_rel16_success)
+% ZF = false;
+# op  ModRM   SIB   displacement  immediate
+  0f 85             05 00                     # skip 1 instruction
+  05                              00 00 00 01
+  05                              00 00 00 02
++run: inst: 0x00000001
++run: jump 5
++run: inst: 0x0000000a
+-run: inst: 0x00000005
+
+:(before "End Two-Byte Opcodes Starting With 0f")
+case 0x85: {  // jump rel16 unless ZF
+  int8_t offset = imm16();
+  if (!ZF) {
+    trace(2, "run") << "jump " << NUM(offset) << end();
+    EIP += offset;
+  }
+  break;
+}
+
+:(scenario jne_rel16_fail)
+% ZF = true;
+# op  ModRM   SIB   displacement  immediate
+  0f 85             05 00                     # skip 1 instruction
+  05                              00 00 00 01
+  05                              00 00 00 02
++run: lass="n">f))]


if __name__ == '__main__':
    distutils.core.setup(  # pylint: disable=no-member
        name='ranger',
        description='Vim-like file manager',
        long_description=ranger.__doc__,
        version=ranger.__version__,
        author=ranger.__author__,
        author_email=ranger.__email__,
        license=ranger.__license__,
        url='http://ranger.nongnu.org',
        scripts=['scripts/ranger', 'scripts/rifle'],
        data_files=[
            ('share/applications',
             ['doc/ranger.desktop']),
            ('share/man/man1',
             ['doc/ranger.1',
              'doc/rifle.1']),
            ('share/doc/ranger',
             ['README.md',
              'CHANGELOG.md',
              'HACKING.md',
              'doc/colorschemes.txt']),
            ('share/doc/ranger/config/colorschemes',
             _findall('doc/config/colorschemes')),
            ('share/doc/ranger/config', _findall('doc/config')),
            ('share/doc/ranger/tools', _findall('doc/tools')),
            ('share/doc/ranger/examples', _findall('examples')),
        ],
        package_data={
            'ranger': [
                'data/*', 'config/rc.conf',
                'config/rifle.conf',
            ],
        },
        packages=('ranger',
                  'ranger.api',
                  'ranger.colorschemes',
                  'ranger.container',
                  'ranger.core',
                  'ranger.config',
                  'ranger.ext',
                  'ranger.gui',
                  'ranger.gui.widgets',
                  'ranger.ext.vcs'))
+ 0f 8c 05 00 # skip 1 instruction + 05 00 00 00 01 + 05 00 00 00 02 ++run: inst: 0x00000001 ++run: inst: 0x00000005 ++run: inst: 0x0000000a +-run: jump 5 + +//:: jump if lesser or equal + +:(scenario jle_rel16_equal) +% ZF = true; +% SF = false; +% OF = false; +# op ModRM SIB displacement immediate + 0f 8e 05 00 # skip 1 instruction + 05 00 00 00 01 + 05 00 00 00 02 ++run: inst: 0x00000001 ++run: jump 5 ++run: inst: 0x0000000a +-run: inst: 0x00000005 + +:(scenario jle_rel16_lesser) +% ZF = false; +% SF = true; +% OF = false; +# op ModRM SIB displacement immediate + 0f 8e 05 00 # skip 1 instruction + 05 00 00 00 01 + 05 00 00 00 02 ++run: inst: 0x00000001 ++run: jump 5 ++run: inst: 0x0000000a +-run: inst: 0x00000005 + +:(before "End Two-Byte Opcodes Starting With 0f") +case 0x8e: { // jump rel16 if SF or ZF + int8_t offset = imm16(); + if (ZF || SF != OF) { + trace(2, "run") << "jump " << NUM(offset) << end(); + EIP += offset; + } + break; +} + +:(scenario jle_rel16_greater) +% ZF = false; +% SF = false; +% OF = false; +# op ModRM SIB displacement immediate + 0f 8e 05 00 # skip 1 instruction + 05 00 00 00 01 + 05 00 00 00 02 ++run: inst: 0x00000001
s://git-scm.com/'>git 2.36.2.497.gbbea4dcf42) at 2024-06-30 08:25:06 +0000