ExShell (New Version: 0.02(018.14282)) (by StaticZ)

- Fixed: FPS limit ignored after minimize\restore application 
- Fixed: SuperEagle filter crashed application. 
- Fixed: Related paths for $StartPEPath: don't work. 
- Change startup initialization for more safety 
- Change using instruction sets: MMX, SSE, SSE2, AVX 
- Added: EPX upscale filter 
- Added: info about selected filters and game mode in OSD 
- Added: saving screenshots by PrntScr hotkey (Ctrl+PrntScr to save original image) 
- Added: separating FPS limit for focused and unfocused application window 
- Added: sending customise keyboard keys scancode at lose and get focus. 
- Added: minor checks and validations

git-svn-id: https://ja2svn.mooo.com/source/ja2_v1.13_data@2166 4f8fa57e-7814-0410-bad4-adc449f26b7c
This commit is contained in:
Wanne
2014-10-11 16:38:33 +00:00
parent 092580a228
commit 0ba2b3eeb3
7 changed files with 253 additions and 32 deletions
Binary file not shown.
Binary file not shown.
+58 -32
View File
@@ -2,30 +2,32 @@
~ Encoding: only UTF-8 without BOM !!! =====
$unknown: OFF ~ !! Don't remove this... =====
~ =====================================================================================
~ Using sections (exshell will look for walues in this sections in left-to right order)
$LoadProfile: { "ShellOptions", "EXSProfile01", "DefaultConf" }
~$LoadProfile: { "ShellOptions", "EXSProfile02", "DefaultConf" }
~ see "ecd-format_eng.pdf"|"ecd-format_rus.pdf" for format and syntax description.
~ WARNING: This version supported only DirectDraw2 with screen mode 16 bpp (555 or 565).
~$LoadProfile: "DefaultConf"
~ Using sections (exshell will look for walues in this sections in left-to right order)
$LoadProfile: { "ShellOptions", "JaggedAlliance2", "DefaultConf" }
~ =====================================================================================
[EXSProfile01] ~ Jagged Alliance 2: 1.13 =====
[JaggedAlliance2] ~ Jagged Alliance 2 and it's mods =====
~ =====================================================================================
$StartPEPath: "C:\Jagged Alliance 2 1.13\ja2.exe"
$StartPEArgs: ""
~ =====================================================================================
[DefaultConf] ~ Default configuration for all profiles =====
~ =====================================================================================
$StartPEPath: "game.exe"
$StartPEArgs: "-nomovie"
$StartPEPath: "game.exe" ~ Full or relative path to lunching application.
$StartPEArgs: "" ~ command line arguments for lunching application.
~ 0 - OFF, value is bit mask for allowed CPU cores, use to solve problems with multi core.
~ (i.e. #0001 - 1st core, #0002 - 2nd core, #0004 - 3rd core, #0008 - 4yh core and so on)
~ (i.e. #0001 - 1st core, #0002 - 2nd core, #0004 - 3rd core, #0008 - 4th core and so on)
$CPUAffinity: #0001
~ Offset to application entry point (WinMain procedure, it's not same for PE entry point)
@@ -59,13 +61,14 @@ $ClipMCursor: YES ~ NOTE: NOT IMPLEMENTED !!
~ Set limit for screen update, use this to reduce CPU usage. Value NO or 0 means that there
~ are no limitation in exshell, but notice that running application can have own FPS limit.
~ Set value to YES to use VSYNC (Only for DirectDraw, for GDI it will be same as NO value)
$FPSMaxLimit: 60
~ Second value is FPS limit for application when focus is lost. If value NO then 1st value
~ will be used. This will help to save your CPU load.
$FPSMaxLimit: { 60, 10 }
~ 1st and 2nd parameters - Original full screen game mode (it's not real window size)
~ 3rd parameter - color mode (for 16 bit commonly used 555 or 565, for 24\32 - 888,
~ for 256 color mode use value 0).
$FScreenMode: { 800, 600, 555 } ~ NOTE: 8\24\32 BIT MODES NOT IMPLEMENTED !!
$FScreenMode: { 640, 480, 555 } ~ NOTE: 8\24\32 BIT MODES NOT IMPLEMENTED !!
~ Real window settings (it can be larger then application resolution):
~ 1st parameter - if TRUE window will have border, if FALSE then it will be created without it.
@@ -73,7 +76,7 @@ $FScreenMode: { 800, 600, 555 } ~ NOTE: 8\24\32 BIT MODES NOT IMPLEMENTED !!
~ real window sizes will be larger. Exactly border sizes depending on OS version and used theme.
~ 4th and 5th parameters - initial position for top-left corner of a window (X, Y)
~ 6th parameter - window background color (in R8G8B8 format)
$WindowFrame: { YES, 1600, 1200, 0, 0, #008080 }
$WindowFrame: { YES, 1920, 1080, 0, 0, #008080 } ~ NOTE: WINDOW BORDER NOT IMPLEMENTED !!
~ 1st parameter - Bliter type (render method):
~ 1 - GDI
@@ -95,7 +98,7 @@ $WindowFrame: { YES, 1600, 1200, 0, 0, #008080 }
~ 1 - stretch with saving aspect ratio.
~ 2 - stretch to window size with saving aspect ratio (cutting sides).
~ 3 - stretch to window size.
$UsingBliter: { 1, 0, 5, 1 }
$UsingBliter: { 1, 0, 5, 0 }
~ Using filters for capture image. You can use any number of filters you want, they will be
~ applied in order they are declared. The output result of filter will become input data for
@@ -105,24 +108,47 @@ $UsingBliter: { 1, 0, 5, 1 }
~ 1st parameter - upscale type (add #2000 for 2x, #3000 for 3x, #4000 for 4x, if supported):
~ #00 - None [ ] - don't use upscale filter (1x)
~ #01 - Simple [2x 3x 4x] - fastest, no smoothing, no filtering
~ #02 - Pixelate [2x 3x 4x] - retro style
~ #03 - Scanlines [2x ] - retro style
~ #04 - ScanlinesTV [2x ] - retro style
~
~ #02 - Pixelate [2x 3x 4x] - retro style (old screen)
~ #03 - Scanlines [2x ] - retro style (old screen)
~ #04 - ScanlinesTV [2x ] - retro style (old screen)
~ #05 - MotionBlur [2x ] - blur effect for screen update
~ #10 - 2xSaI [2x ]
~ #11 - SuperEagle [2x ]
~ #12 - Super2xSaI [2x ]
~ #13 - AdMame [2x ] - RECOMENDED! (best speed for good quality)
~ #20 - lq [2x ]
~ #21 - hq [2x ]
~ #22 - xbra [2x 3x 4x]
~ #23 - xbrb [2x 3x 4x]
~ #24 - xbrc [2x 3x 4x]
~
~ #10 - Eagle [--------] - good for saving graphics details
~ #11 - 2xSaI [2x ] - improved Eagle algorithm
~ #12 - SuperEagle [2x ] - similar to 2xSaI, but does more blending
~ #13 - Super2xSaI [2x ] - similar to 2xSaI, but smooths graphics
~
~ #20 - EPX [2x ] - something average between Eagle family and HQ family
~ #21 - Scale [--------] - improved EPX
~ #22 - AdvMame [2x ] - improved EPX <RECOMENDED! (best speed for good quality)>
~
~ #30 - lq [2x ] - good for making graphics sharper
~ #31 - hq [2x ] - same as LQ, but more heavy interpolation
~ #32 - xbra [2x 3x 4x] - based on HQ
~ #33 - xbrb [2x 3x 4x] - based on HQ
~ #34 - xbrc [2x 3x 4x] - based on HQ
~ #35 - xbrz [--------] - improved XBR
~
~ #01 - GrayScale [- - - ] - Convert colors to gray tons.
~ ??? - Scale2xSaI, Bilinear, BilinearPlus
~ NOTE: keys can contain addition parameters, depending on using filter (see description above).
~ $ImageFilter: #0001
$ImageFilter: #2022
$ImageFilter: #0001
$ImageFilter: #2004
~ This options allow to send pressing event for specified keys to application before focus will be lost
~ and after focus restore. This can be used for setting game on pause, autosaveing or solving some
~ problems with sticking keys while switching windows. Common keys code are defined below, optionally
~ you can add #00E00000 for extended key code (E0). For example ALT+S can be described as events
~ {#38, #1F, #9F, #B8} or in case of right ALT {#E00038, #1F, #9F, #E000B8}.
~ You can add any number of key codes to array or use NO value to disable it, keys will be send from left
~ to right order. List of scan codes can be found in ./toolsadd/scancodes.htm
$GetFocusKey: { #B8,#E000B8 } ~ Break for: Left & Right ALT
$RemFocusKey: OFF ~ NOTE: bad coded, though in most cases its working.
~ Press PrintScreen for saving screenshot or Ctrl+PrintScreen for saving unfiltered screenshot.
~ Allowed formats: "jpeg", "png", "bmp", "tiff", "gif" (note gif allows save only up to 256 colors)
$ScrnGrabImg: "png"
~ =====================================================================================
@@ -137,21 +163,21 @@ $UseDebugMod: YES ~ Disable all debug staff (OSD, console and other)
$ShowOSDMenu: { YES, 30, 60, "Courier", 7, 18, 20, #B4B4B4, TRUE, #000000 }
~ enable, x, y, width, height, buggerW, buggerH, font, family, fontW, fontH, CP
$ShowConsole: { YES, 0, 0, #C0DE, 1006, 87, 4096, "Consolas", #00, 9, 26, 1251 }
$ShowConsole: { YES, 100, 100, #C0DE, 906, 87, 4096, "Consolas", #00, 9, 26, 1251 }
$ConsoleWPal: { ~ 16 color RGB palette
~ #000000, #000080, #008000, #008080, #800000, #800080, #808000, #C0C0C0, ~ Default Windows
~ #808080, #0000FF, #00FF00, #00FFFF, #FF0000, #FF00FF, #FFFF00, #FFFFFF
#000000, #000080, #008000, #008080, #800000, #800080, #808000, #C0C0C0, ~ Essence Theme
#808080, #0000FF, #00FF00, #00FFFF, #FF0000, #FF00FF, #FFFF00, #FFFFFF
#808080, #0000FF, #00FF00, #00FFFF, #FF0000, #FF00FF, #FFFF00, #FFFFFF
}
$ConsoleWait: NO ~ Pause console log at process termination
~ =====================================================================================
[Localisation] ~ List for known locals =====
[Localisation] ~ List for known locals (don't rename or delete) =====
~ =====================================================================================
~ Note: Don't rename this section and never use localised strings here!!!
~ format: LangCode (2 chars only), ANSI_CP, OEM_CP, Charset
Binary file not shown.
+15
View File
@@ -137,5 +137,20 @@ ExShell was tested for compatibility with this games:
* Intial realise
(2014.10.09) ver 0.02 rev 018 build 14282
------------------------------------------
* Fixed: FPS limit ignored after minimize\restore application
* Fixed: SuperEagle filter crashed application.
* Fixed: Related paths for $StartPEPath: don't work.
* Change startup initialization for more safety
* Change using instruction sets: MMX, SSE, SSE2, AVX
* Added: EPX upscale filter
* Added: info about selected filters and game mode in OSD
* Added: saving screenshots by PrntScr hotkey (Ctrl+PrntScr to save original image)
* Added: separating FPS limit for focused and unfocused application window
* Added: sending customise keyboard keys scancode at lose and get focus.
* Added: minor checks and validations
@@ -0,0 +1,64 @@
<NotepadPlus>
<UserLang name="ECD" ext="ecd" udlVersion="2.1">
<Settings>
<Global caseIgnored="yes" allowFoldOfComments="no" foldCompact="no" forcePureLC="0" decimalSeparator="0" />
<Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
</Settings>
<KeywordLists>
<Keywords name="Comments">00~ 01 02 03 04</Keywords>
<Keywords name="Numbers, prefix1">#</Keywords>
<Keywords name="Numbers, prefix2"></Keywords>
<Keywords name="Numbers, extras1"></Keywords>
<Keywords name="Numbers, extras2"></Keywords>
<Keywords name="Numbers, suffix1"></Keywords>
<Keywords name="Numbers, suffix2"></Keywords>
<Keywords name="Numbers, range"></Keywords>
<Keywords name="Operators1">&quot; , : { } @ --&gt; ( ) [ ]</Keywords>
<Keywords name="Operators2"></Keywords>
<Keywords name="Folders in code1, open">&lt;--</Keywords>
<Keywords name="Folders in code1, middle"></Keywords>
<Keywords name="Folders in code1, close">--&gt;</Keywords>
<Keywords name="Folders in code2, open"></Keywords>
<Keywords name="Folders in code2, middle"></Keywords>
<Keywords name="Folders in code2, close"></Keywords>
<Keywords name="Folders in comment, open"></Keywords>
<Keywords name="Folders in comment, middle"></Keywords>
<Keywords name="Folders in comment, close"></Keywords>
<Keywords name="Keywords1">ru. en.</Keywords>
<Keywords name="Keywords2">true false yes no on off</Keywords>
<Keywords name="Keywords3"></Keywords>
<Keywords name="Keywords4"></Keywords>
<Keywords name="Keywords5"></Keywords>
<Keywords name="Keywords6"></Keywords>
<Keywords name="Keywords7"></Keywords>
<Keywords name="Keywords8"></Keywords>
<Keywords name="Delimiters">00&quot; 01 02&quot; 03[ 04 05] 06$ 07 08: 09@ 10 11: 12%% 13 14%% 15 16 17, 17} 17$ 17[ 17@ 18 19 20 21 22 23</Keywords>
</KeywordLists>
<Styles>
<WordsStyle name="DEFAULT" fgColor="000000" bgColor="FFFFFF" fontName="Consolas" fontStyle="0" nesting="0" />
<WordsStyle name="COMMENTS" fgColor="FFFF00" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="LINE COMMENTS" fgColor="808080" bgColor="FFFFFF" fontName="Consolas" fontStyle="2" nesting="0" />
<WordsStyle name="NUMBERS" fgColor="808040" bgColor="FFFFFF" fontName="Consolas" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS1" fgColor="800080" bgColor="FFFFFF" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="KEYWORDS2" fgColor="804000" bgColor="FFFFFF" fontName="Consolas" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS3" fgColor="000080" bgColor="E4E4E4" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="KEYWORDS4" fgColor="800080" bgColor="FFFFFF" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="KEYWORDS5" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS6" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="KEYWORDS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="OPERATORS" fgColor="FD2E02" bgColor="F6F6F6" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="FOLDER IN CODE1" fgColor="C0C0C0" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="FOLDER IN CODE2" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="FOLDER IN COMMENT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS1" fgColor="008000" bgColor="FFFFFF" fontName="Consolas" fontStyle="2" nesting="0" />
<WordsStyle name="DELIMITERS2" fgColor="006697" bgColor="FFFFC4" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="DELIMITERS3" fgColor="000080" bgColor="E4E4E4" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="DELIMITERS4" fgColor="FF8000" bgColor="E4E4E4" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="DELIMITERS5" fgColor="808080" bgColor="FFFFFF" fontName="Consolas" fontStyle="1" nesting="0" />
<WordsStyle name="DELIMITERS6" fgColor="808040" bgColor="FFFFFF" fontName="Consolas" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS7" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="DELIMITERS8" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
</Styles>
</UserLang>
</NotepadPlus>
+116
View File
@@ -0,0 +1,116 @@
<html>
<table border="0" cellspacing="2" cellpadding="5"><tbody><tr><th><b>Key</b></th><th><b>Make (HEX)</b></th><th><b>Break (HEX)</b></th></tr>
<tr><td>Num Lock</td><td>45</td><td>C5</td></tr>
<tr><td>Num Divide</td><td>E0 35</td><td>E0 B5</td></tr>
<tr><td>Num Multiply</td><td>37</td><td>B7</td></tr>
<tr><td>Num Minus</td><td>4A</td><td>CA</td></tr>
<tr><td>Num Plus</td><td>4E</td><td>CE</td></tr>
<tr><td>Num Enter</td><td>E0 1C</td><td>E0 9C</td></tr>
<tr><td>Num Dot</td><td>53</td><td>D3</td></tr>
<tr><td>Num 0</td><td>52</td><td>D2</td></tr>
<tr><td>Num 1</td><td>4F</td><td>CF</td></tr>
<tr><td>Num 2</td><td>50</td><td>D0</td></tr>
<tr><td>Num 3</td><td>51</td><td>D1</td></tr>
<tr><td>Num 4</td><td>4B</td><td>CB</td></tr>
<tr><td>Num 5</td><td>4C</td><td>CC</td></tr>
<tr><td>Num 6</td><td>4D</td><td>CD</td></tr>
<tr><td>Num 7</td><td>47</td><td>C7</td></tr>
<tr><td>Num 8</td><td>48</td><td>C8</td></tr>
<tr><td>Num 9</td><td>49</td><td>C9</td></tr>
<tr><td></td><td></td><td></td></tr>
<tr><td>Print Screen</td><td>E0 2A E0 37</td><td>E0 B7 E0 AA</td></tr>
<tr><td>Scroll Lock</td><td>46</td><td>C6</td></tr>
<tr><td>Pause</td><td>E1 1D 45 E1 9D C5</td><td></td></tr>
<tr><td>Insert</td><td>E0 2A E0 52</td><td>E0 D2 E0 AA</td></tr>
<tr><td>Home</td><td>E0 2A E0 47</td><td>E0 C7 E0 AA</td></tr>
<tr><td>Page Up</td><td>E0 2A E0 49</td><td>E0 C9 E0 AA</td></tr>
<tr><td>Delete</td><td>E0 2A E0 53</td><td>E0 D3 E0 AA</td></tr>
<tr><td>End</td><td>E0 2A E0 4F</td><td>E0 CF E0 AA</td></tr>
<tr><td>Page Down</td><td>E0 2A E0 51</td><td>E0 D1 E0 AA</td></tr>
<tr><td>Arrow Up</td><td>E0 2A E0 48</td><td>E0 C8 E0 AA</td></tr>
<tr><td>Arrow Left</td><td>E0 2A E0 4B</td><td>E0 CB E0 AA</td></tr>
<tr><td>Arrow Down</td><td>E0 2A E0 50</td><td>E0 D0 E0 AA</td></tr>
<tr><td>Arrow Right</td><td>E0 2A E0 4D</td><td>E0 CD E0 AA</td></tr>
<tr><td>Power</td><td>E0 5E</td><td>E0 DE</td></tr>
<tr><td>Sleep</td><td>E0 5F</td><td>E0 DF</td></tr>
<tr><td>Wake Up</td><td>E0 63</td><td>E0 E3</td></tr>
<tr><td></td><td></td><td></td></tr>
<tr><td>Esc</td><td>01</td><td>81</td></tr>
<tr><td>F1</td><td>3B</td><td>BB</td></tr>
<tr><td>F2</td><td>3C</td><td>BC</td></tr>
<tr><td>F3</td><td>3D</td><td>BD</td></tr>
<tr><td>F4</td><td>3E</td><td>BE</td></tr>
<tr><td>F5</td><td>3F</td><td>BF</td></tr>
<tr><td>F6</td><td>40</td><td>C0</td></tr>
<tr><td>F7</td><td>41</td><td>C1</td></tr>
<tr><td>F8</td><td>42</td><td>C2</td></tr>
<tr><td>F9</td><td>43</td><td>C3</td></tr>
<tr><td>F10</td><td>44</td><td>C4</td></tr>
<tr><td>F11</td><td>57</td><td>D7</td></tr>
<tr><td>F12</td><td>58</td><td>D8</td></tr>
<tr><td></td><td></td><td></td></tr>
<tr><td>Tab</td><td>0F</td><td>8F</td></tr>
<tr><td>Caps Lock</td><td>3A</td><td>BA</td></tr>
<tr><td>Shift Left</td><td>2A</td><td>AA</td></tr>
<tr><td>Shift Right</td><td>36</td><td>B6</td></tr>
<tr><td>Ctrl Left</td><td>1D</td><td>9D</td></tr>
<tr><td>Ctrl Right</td><td>E0 1D</td><td>E0 9D</td></tr>
<tr><td>Alt Left</td><td>38</td><td>B8</td></tr>
<tr><td>Alt Right</td><td>E0 38</td><td>E0 B8</td></tr>
<tr><td>Win Left</td><td>E0 5B</td><td>E0 DB</td></tr>
<tr><td>Win Right</td><td>E0 5C</td><td>E0 DC</td></tr>
<tr><td>Applications</td><td>E0 5D</td><td>E0 DD</td></tr>
<tr><td>Space</td><td>39</td><td>B9</td></tr>
<tr><td>Enter</td><td>1C</td><td>9C</td></tr>
<tr><td>Back Space</td><td>0E</td><td>8E</td></tr>
<tr><td></td><td></td><td></td></tr>
<tr><td>1</td><td>02</td><td>82</td></tr>
<tr><td>2</td><td>03</td><td>83</td></tr>
<tr><td>3</td><td>04</td><td>84</td></tr>
<tr><td>4</td><td>05</td><td>85</td></tr>
<tr><td>5</td><td>06</td><td>86</td></tr>
<tr><td>6</td><td>07</td><td>87</td></tr>
<tr><td>7</td><td>08</td><td>88</td></tr>
<tr><td>8</td><td>09</td><td>89</td></tr>
<tr><td>9</td><td>0A</td><td>8A</td></tr>
<tr><td>0</td><td>0B</td><td>8B</td></tr>
<tr><td>Q</td><td>10</td><td>90</td></tr>
<tr><td>W</td><td>11</td><td>91</td></tr>
<tr><td>E</td><td>12</td><td>92</td></tr>
<tr><td>R</td><td>13</td><td>93</td></tr>
<tr><td>T</td><td>14</td><td>94</td></tr>
<tr><td>Y</td><td>15</td><td>95</td></tr>
<tr><td>U</td><td>16</td><td>96</td></tr>
<tr><td>I</td><td>17</td><td>97</td></tr>
<tr><td>O</td><td>18</td><td>98</td></tr>
<tr><td>P</td><td>19</td><td>99</td></tr>
<tr><td>A</td><td>1E</td><td>9E</td></tr>
<tr><td>S</td><td>1F</td><td>9F</td></tr>
<tr><td>D</td><td>20</td><td>A0</td></tr>
<tr><td>F</td><td>21</td><td>A1</td></tr>
<tr><td>G</td><td>22</td><td>A2</td></tr>
<tr><td>H</td><td>23</td><td>A3</td></tr>
<tr><td>J</td><td>24</td><td>A4</td></tr>
<tr><td>K</td><td>25</td><td>A5</td></tr>
<tr><td>L</td><td>26</td><td>A6</td></tr>
<tr><td>Z</td><td>2C</td><td>AC</td></tr>
<tr><td>X</td><td>2D</td><td>AD</td></tr>
<tr><td>C</td><td>2E</td><td>AE</td></tr>
<tr><td>V</td><td>2F</td><td>AF</td></tr>
<tr><td>B</td><td>30</td><td>B0</td></tr>
<tr><td>N</td><td>31</td><td>B1</td></tr>
<tr><td>M</td><td>32</td><td>B2</td></tr>
<tr><td></td><td></td><td></td></tr>
<tr><td>~</td><td>29</td><td>A9</td></tr>
<tr><td>-</td><td>0C</td><td>8C</td></tr>
<tr><td>=</td><td>0D</td><td>8D</td></tr>
<tr><td>\</td><td>2B</td><td>AB</td></tr>
<tr><td>[</td><td>1A</td><td>9A</td></tr>
<tr><td>]</td><td>1B</td><td>9B</td></tr>
<tr><td>;</td><td>27</td><td>A7</td></tr>
<tr><td>"</td><td>28</td><td>A8</td></tr>
<tr><td>&lt;</td><td>33</td><td>B3</td></tr>
<tr><td>&gt;</td><td>34</td><td>B4</td></tr>
<tr><td>?</td><td>35</td><td>B5</td></tr>
</tbody></table>
</html>