From bc1185dcda842b6854d4d965cef56f13be3e465f Mon Sep 17 00:00:00 2001 From: Chen Cai Date: Mon, 3 Sep 2018 15:39:54 +0800 Subject: [PATCH] 1.add bochs files and default bochs config file 2.Update building script of Windows --- Template/bochsrc.bxrc | 23 +++ Template/bxshare/BIOS-bochs-latest | Bin 0 -> 131072 bytes Template/bxshare/VGABIOS-lgpl-latest | Bin 0 -> 41472 bytes Template/bxshare/keymaps/sdl-pc-us.map | 211 ++++++++++++++++++++++++ Template/bxshare/keymaps/sdl2-pc-us.map | 191 +++++++++++++++++++++ Template/bxshare/keymaps/x11-pc-us.map | 205 +++++++++++++++++++++++ Template/bxshare/readme.txt | 8 + mbr/nmake.bat | 29 +++- 8 files changed, 663 insertions(+), 4 deletions(-) create mode 100644 Template/bochsrc.bxrc create mode 100644 Template/bxshare/BIOS-bochs-latest create mode 100644 Template/bxshare/VGABIOS-lgpl-latest create mode 100644 Template/bxshare/keymaps/sdl-pc-us.map create mode 100644 Template/bxshare/keymaps/sdl2-pc-us.map create mode 100644 Template/bxshare/keymaps/x11-pc-us.map create mode 100644 Template/bxshare/readme.txt diff --git a/Template/bochsrc.bxrc b/Template/bochsrc.bxrc new file mode 100644 index 0000000..6134978 --- /dev/null +++ b/Template/bochsrc.bxrc @@ -0,0 +1,23 @@ + +# how much memory the emulated machine will have +megs: 32 + +# filename of ROM images +romimage: file=bxshare\BIOS-bochs-latest +vgaromimage: file=bxshare\VGABIOS-lgpl-latest + +# hard disk +ata0-master: type=disk, path="system.img", mode=flat + +# choose the boot disk. +boot: disk + +# where do we send log messages? +log: bochsout.txt + +# disable the mouse, since we are in text only mode +mouse: enabled=0 + +# set up IPS value and clock sync +cpu: ips=15000000 +clock: sync=both \ No newline at end of file diff --git a/Template/bxshare/BIOS-bochs-latest b/Template/bxshare/BIOS-bochs-latest new file mode 100644 index 0000000000000000000000000000000000000000..bdfe49819bb4e75e2a800c76f61424d6abf2e7f7 GIT binary patch literal 131072 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 +# modifier). +# +# The ASCII_equivalent must be either apostrophe + one character + apostrophe, +# or one of these keywords: space, return, tab, backslash, apostrophe, none. +# This format is designed to look like a char constant in C, but it's a very +# simple parser. There's no concept of backslash being an escape char. The +# backslash and apostrophe entries are provided for aesthetic purposes only: no +# C++ programmer wants to see '\' or '''. The parser doesn't care, but they are +# ugly. +# +# Host_key_name is the name of the key combination according to the gui library +# (X windows, SDL, etc). Each GUI module must provide a function that converts +# these host key names into numbers. A pointer to the conversion function is +# passed to loadKeymap(), and it is used when parsing the keymap file. As the +# keymap file is parsed, the conversion function is called for each host key +# name, to convert it into a number. Only the number is stored. If the host +# key name is not found, the conversion function returns BX_KEYMAP_UNKNOWN, and +# the keymap code will panic, like this: +# +# [KMAP ] line 51: unknown host key name 'SDLK_PAREN_RIGHT' +# +# If this happens, you must edit the keymap file, and either correct the host +# key name or comment out that line. +# + +BX_KEY_0 '0' SDLK_0 +BX_KEY_0+BX_KEY_SHIFT_L ')' SDLK_RIGHTPAREN +BX_KEY_1 '1' SDLK_1 +BX_KEY_1+BX_KEY_SHIFT_L '!' SDLK_EXCLAIM +BX_KEY_2 '2' SDLK_2 +BX_KEY_2+BX_KEY_SHIFT_L '@' SDLK_AT +BX_KEY_3 '3' SDLK_3 +BX_KEY_3+BX_KEY_SHIFT_L '#' SDLK_HASH +BX_KEY_4 '4' SDLK_4 +BX_KEY_4+BX_KEY_SHIFT_L '$' SDLK_DOLLAR +BX_KEY_5 '5' SDLK_5 +#BX_KEY_5+BX_KEY_SHIFT_L '%' SDLK_PERCENT +BX_KEY_6 '6' SDLK_6 +BX_KEY_6+BX_KEY_SHIFT_L '^' SDLK_CARET +BX_KEY_7 '7' SDLK_7 +BX_KEY_7+BX_KEY_SHIFT_L '&' SDLK_AMPERSAND +BX_KEY_8 '8' SDLK_8 +BX_KEY_8+BX_KEY_SHIFT_L '*' SDLK_ASTERISK +BX_KEY_9 '9' SDLK_9 +BX_KEY_9+BX_KEY_SHIFT_L '(' SDLK_LEFTPAREN +BX_KEY_A+BX_KEY_SHIFT_L 'A' SDLK_a +BX_KEY_A 'a' SDLK_a +BX_KEY_B+BX_KEY_SHIFT_L 'B' SDLK_b +BX_KEY_B 'b' SDLK_b +BX_KEY_C+BX_KEY_SHIFT_L 'C' SDLK_c +BX_KEY_C 'c' SDLK_c +BX_KEY_D+BX_KEY_SHIFT_L 'D' SDLK_d +BX_KEY_D 'd' SDLK_d +BX_KEY_E+BX_KEY_SHIFT_L 'E' SDLK_e +BX_KEY_E 'e' SDLK_e +BX_KEY_F+BX_KEY_SHIFT_L 'F' SDLK_f +BX_KEY_F 'f' SDLK_f +BX_KEY_G+BX_KEY_SHIFT_L 'G' SDLK_g +BX_KEY_G 'g' SDLK_g +BX_KEY_H+BX_KEY_SHIFT_L 'H' SDLK_h +BX_KEY_H 'h' SDLK_h +BX_KEY_I+BX_KEY_SHIFT_L 'I' SDLK_i +BX_KEY_I 'i' SDLK_i +BX_KEY_J+BX_KEY_SHIFT_L 'J' SDLK_j +BX_KEY_J 'j' SDLK_j +BX_KEY_K+BX_KEY_SHIFT_L 'K' SDLK_k +BX_KEY_K 'k' SDLK_k +BX_KEY_L+BX_KEY_SHIFT_L 'L' SDLK_l +BX_KEY_L 'l' SDLK_l +BX_KEY_M+BX_KEY_SHIFT_L 'M' SDLK_m +BX_KEY_M 'm' SDLK_m +BX_KEY_N+BX_KEY_SHIFT_L 'N' SDLK_n +BX_KEY_N 'n' SDLK_n +BX_KEY_O+BX_KEY_SHIFT_L 'O' SDLK_o +BX_KEY_O 'o' SDLK_o +BX_KEY_P+BX_KEY_SHIFT_L 'P' SDLK_p +BX_KEY_P 'p' SDLK_p +BX_KEY_Q+BX_KEY_SHIFT_L 'Q' SDLK_q +BX_KEY_Q 'q' SDLK_q +BX_KEY_R+BX_KEY_SHIFT_L 'R' SDLK_r +BX_KEY_R 'r' SDLK_r +BX_KEY_S+BX_KEY_SHIFT_L 'S' SDLK_s +BX_KEY_S 's' SDLK_s +BX_KEY_T+BX_KEY_SHIFT_L 'T' SDLK_t +BX_KEY_T 't' SDLK_t +BX_KEY_U+BX_KEY_SHIFT_L 'U' SDLK_u +BX_KEY_U 'u' SDLK_u +BX_KEY_V+BX_KEY_SHIFT_L 'V' SDLK_v +BX_KEY_V 'v' SDLK_v +BX_KEY_W+BX_KEY_SHIFT_L 'W' SDLK_w +BX_KEY_W 'w' SDLK_w +BX_KEY_X+BX_KEY_SHIFT_L 'X' SDLK_x +BX_KEY_X 'x' SDLK_x +BX_KEY_Y+BX_KEY_SHIFT_L 'Y' SDLK_y +BX_KEY_Y 'y' SDLK_y +BX_KEY_Z+BX_KEY_SHIFT_L 'Z' SDLK_z +BX_KEY_Z 'z' SDLK_z +BX_KEY_F1 none SDLK_F1 +BX_KEY_F2 none SDLK_F2 +BX_KEY_F3 none SDLK_F3 +BX_KEY_F4 none SDLK_F4 +BX_KEY_F5 none SDLK_F5 +BX_KEY_F6 none SDLK_F6 +BX_KEY_F7 none SDLK_F7 +BX_KEY_F8 none SDLK_F8 +BX_KEY_F9 none SDLK_F9 +BX_KEY_F10 none SDLK_F10 +BX_KEY_F11 none SDLK_F11 +BX_KEY_F12 none SDLK_F12 +BX_KEY_ALT_L none SDLK_LALT +BX_KEY_ALT_L none SDLK_LMETA +BX_KEY_ALT_R none SDLK_MODE +#BX_KEY_ALT_R none SDLK_Multi_key +BX_KEY_BACKSLASH backslash SDLK_BACKSLASH +#BX_KEY_BACKSLASH+BX_KEY_SHIFT_L '|' SDLK_bar +BX_KEY_BACKSPACE none SDLK_BACKSPACE +BX_KEY_CAPS_LOCK none SDLK_CAPSLOCK +BX_KEY_COMMA ',' SDLK_COMMA +BX_KEY_COMMA+BX_KEY_SHIFT_L '<' SDLK_LESS +BX_KEY_CTRL_L none SDLK_LCTRL +BX_KEY_CTRL_R none SDLK_RCTRL +BX_KEY_DELETE none SDLK_DELETE +BX_KEY_DOWN none SDLK_DOWN +BX_KEY_END none SDLK_END +BX_KEY_ENTER return SDLK_RETURN +BX_KEY_EQUALS '=' SDLK_EQUALS +BX_KEY_EQUALS+BX_KEY_SHIFT_L '+' SDLK_PLUS +BX_KEY_ESC none SDLK_ESCAPE +#BX_KEY_GRAVE+BX_KEY_SHIFT_L '~' SDLK_asciitilde +BX_KEY_GRAVE '`' SDLK_BACKQUOTE +BX_KEY_HOME none SDLK_HOME +BX_KEY_INSERT none SDLK_INSERT +BX_KEY_KP_5 none SDLK_KP5 +#BX_KEY_KP_5 none SDLK_KP_BEGIN +BX_KEY_KP_ADD none SDLK_KP_PLUS +BX_KEY_KP_DELETE none SDLK_KP_PERIOD +#BX_KEY_KP_DELETE none SDLK_KP_DELETE +BX_KEY_KP_DIVIDE none SDLK_KP_DIVIDE +BX_KEY_KP_DOWN none SDLK_KP2 +#BX_KEY_KP_DOWN none SDLK_KP_DOWN +BX_KEY_KP_END none SDLK_KP1 +#BX_KEY_KP_END none SDLK_KP_END +BX_KEY_KP_ENTER none SDLK_KP_ENTER +BX_KEY_KP_HOME none SDLK_KP7 +#BX_KEY_KP_HOME none SDLK_KP_HOME +BX_KEY_KP_INSERT none SDLK_KP0 +#BX_KEY_KP_INSERT none SDLK_KP_INSERT +BX_KEY_KP_LEFT none SDLK_KP4 +#BX_KEY_KP_LEFT none SDLK_KP_LEFT +BX_KEY_KP_MULTIPLY none SDLK_KP_MULTIPLY +BX_KEY_KP_PAGE_DOWN none SDLK_KP3 +#BX_KEY_KP_PAGE_DOWN none SDLK_KP_PAGE_DOWN +BX_KEY_KP_PAGE_UP none SDLK_KP9 +#BX_KEY_KP_PAGE_UP none SDLK_KP_PAGE_UP +BX_KEY_KP_RIGHT none SDLK_KP6 +#BX_KEY_KP_RIGHT none SDLK_KP_Right +BX_KEY_KP_SUBTRACT none SDLK_KP_MINUS +BX_KEY_KP_UP none SDLK_KP8 +#BX_KEY_KP_UP none SDLK_KP_Up +BX_KEY_LEFT none SDLK_LEFT +#BX_KEY_LEFT_BRACKET+BX_KEY_SHIFT_L '{' SDLK_BRACELEFT +BX_KEY_LEFT_BRACKET '[' SDLK_LEFTBRACKET +BX_KEY_MENU none SDLK_MENU +BX_KEY_MINUS '-' SDLK_MINUS +BX_KEY_MINUS+BX_KEY_SHIFT_L '_' SDLK_UNDERSCORE +BX_KEY_NUM_LOCK none SDLK_NUMLOCK +BX_KEY_PAGE_DOWN none SDLK_PAGEDOWN +BX_KEY_PAGE_UP none SDLK_PAGEUP +BX_KEY_PAUSE none SDLK_BREAK +BX_KEY_PAUSE none SDLK_PAUSE +BX_KEY_PERIOD+BX_KEY_SHIFT_L '>' SDLK_GREATER +BX_KEY_PERIOD '.' SDLK_PERIOD +BX_KEY_PRINT none SDLK_PRINT +BX_KEY_PRINT none SDLK_SYSREQ +BX_KEY_RIGHT none SDLK_RIGHT +#BX_KEY_RIGHT_BRACKET+BX_KEY_SHIFT_L '}' SDLK_BRACERIGHT +BX_KEY_RIGHT_BRACKET ']' SDLK_RIGHTBRACKET +BX_KEY_SCRL_LOCK none SDLK_SCROLLOCK +BX_KEY_SEMICOLON+BX_KEY_SHIFT_L ':' SDLK_COLON +BX_KEY_SEMICOLON ';' SDLK_SEMICOLON +BX_KEY_SHIFT_L none SDLK_LSHIFT +BX_KEY_SHIFT_R none SDLK_RSHIFT +BX_KEY_SINGLE_QUOTE apostrophe SDLK_QUOTE +BX_KEY_SINGLE_QUOTE+BX_KEY_SHIFT_L '"' SDLK_QUOTEDBL +BX_KEY_SLASH+BX_KEY_SHIFT_L '?' SDLK_QUESTION +BX_KEY_SLASH '/' SDLK_SLASH +BX_KEY_SPACE space SDLK_SPACE +#BX_KEY_TAB none SDLK_ISO_LEFT_TAB +BX_KEY_TAB tab SDLK_TAB +BX_KEY_UP none SDLK_UP +BX_KEY_WIN_L none SDLK_LSUPER +BX_KEY_WIN_R none SDLK_LSUPER diff --git a/Template/bxshare/keymaps/sdl2-pc-us.map b/Template/bxshare/keymaps/sdl2-pc-us.map new file mode 100644 index 0000000..7fb1eaa --- /dev/null +++ b/Template/bxshare/keymaps/sdl2-pc-us.map @@ -0,0 +1,191 @@ +# Bochs Keymap file +# $Id: sdl2-pc-us.map 12400 2014-07-06 18:29:06Z vruppert $ +# Target: PC(x86) keyboard, US keymap, SDL2 gui +# Author: Volker Ruppert (based on SDL keymap by Bryce Denney) +# +# The keymap file describes the layout of a keyboard, and how it translates +# into Bochs key codes. +# +# Format: +# BX_Keysym ASCII_equivalent Host_key_name +# +# Or, for keys that require modifiers: +# BX_Keysym+BX_Modifier ASCII_equivalent Host_key_name +# +# BX_Keysym and BX_Modifier must be present in the bx_key_symbol[] list in +# gui/keymap.cc. The BX_Modifier is usually a shift key press, but it +# could be any key. Presently a maximum of one modifier is supported, but this +# could be changed in keymap.h (structure def has only one slot for modifier), +# keymap.cc (parsing code), and iodev/keyboard.cc (simulate keypresses for >1 +# modifier). +# +# The ASCII_equivalent must be either apostrophe + one character + apostrophe, +# or one of these keywords: space, return, tab, backslash, apostrophe, none. +# This format is designed to look like a char constant in C, but it's a very +# simple parser. There's no concept of backslash being an escape char. The +# backslash and apostrophe entries are provided for aesthetic purposes only: no +# C++ programmer wants to see '\' or '''. The parser doesn't care, but they are +# ugly. +# +# Host_key_name is the name of the key combination according to the gui library +# (X windows, SDL, etc). Each GUI module must provide a function that converts +# these host key names into numbers. A pointer to the conversion function is +# passed to loadKeymap(), and it is used when parsing the keymap file. As the +# keymap file is parsed, the conversion function is called for each host key +# name, to convert it into a number. Only the number is stored. If the host +# key name is not found, the conversion function returns BX_KEYMAP_UNKNOWN, and +# the keymap code will panic, like this: +# +# [KMAP ] line 51: unknown host key name 'SDLK_PAREN_RIGHT' +# +# If this happens, you must edit the keymap file, and either correct the host +# key name or comment out that line. +# + +BX_KEY_0 '0' SDLK_0 +BX_KEY_0+BX_KEY_SHIFT_L ')' SDLK_RIGHTPAREN +BX_KEY_1 '1' SDLK_1 +BX_KEY_1+BX_KEY_SHIFT_L '!' SDLK_EXCLAIM +BX_KEY_2 '2' SDLK_2 +BX_KEY_2+BX_KEY_SHIFT_L '@' SDLK_AT +BX_KEY_3 '3' SDLK_3 +BX_KEY_3+BX_KEY_SHIFT_L '#' SDLK_HASH +BX_KEY_4 '4' SDLK_4 +BX_KEY_4+BX_KEY_SHIFT_L '$' SDLK_DOLLAR +BX_KEY_5 '5' SDLK_5 +BX_KEY_6 '6' SDLK_6 +BX_KEY_6+BX_KEY_SHIFT_L '^' SDLK_CARET +BX_KEY_7 '7' SDLK_7 +BX_KEY_7+BX_KEY_SHIFT_L '&' SDLK_AMPERSAND +BX_KEY_8 '8' SDLK_8 +BX_KEY_8+BX_KEY_SHIFT_L '*' SDLK_ASTERISK +BX_KEY_9 '9' SDLK_9 +BX_KEY_9+BX_KEY_SHIFT_L '(' SDLK_LEFTPAREN +BX_KEY_A+BX_KEY_SHIFT_L 'A' SDLK_a +BX_KEY_A 'a' SDLK_a +BX_KEY_B+BX_KEY_SHIFT_L 'B' SDLK_b +BX_KEY_B 'b' SDLK_b +BX_KEY_C+BX_KEY_SHIFT_L 'C' SDLK_c +BX_KEY_C 'c' SDLK_c +BX_KEY_D+BX_KEY_SHIFT_L 'D' SDLK_d +BX_KEY_D 'd' SDLK_d +BX_KEY_E+BX_KEY_SHIFT_L 'E' SDLK_e +BX_KEY_E 'e' SDLK_e +BX_KEY_F+BX_KEY_SHIFT_L 'F' SDLK_f +BX_KEY_F 'f' SDLK_f +BX_KEY_G+BX_KEY_SHIFT_L 'G' SDLK_g +BX_KEY_G 'g' SDLK_g +BX_KEY_H+BX_KEY_SHIFT_L 'H' SDLK_h +BX_KEY_H 'h' SDLK_h +BX_KEY_I+BX_KEY_SHIFT_L 'I' SDLK_i +BX_KEY_I 'i' SDLK_i +BX_KEY_J+BX_KEY_SHIFT_L 'J' SDLK_j +BX_KEY_J 'j' SDLK_j +BX_KEY_K+BX_KEY_SHIFT_L 'K' SDLK_k +BX_KEY_K 'k' SDLK_k +BX_KEY_L+BX_KEY_SHIFT_L 'L' SDLK_l +BX_KEY_L 'l' SDLK_l +BX_KEY_M+BX_KEY_SHIFT_L 'M' SDLK_m +BX_KEY_M 'm' SDLK_m +BX_KEY_N+BX_KEY_SHIFT_L 'N' SDLK_n +BX_KEY_N 'n' SDLK_n +BX_KEY_O+BX_KEY_SHIFT_L 'O' SDLK_o +BX_KEY_O 'o' SDLK_o +BX_KEY_P+BX_KEY_SHIFT_L 'P' SDLK_p +BX_KEY_P 'p' SDLK_p +BX_KEY_Q+BX_KEY_SHIFT_L 'Q' SDLK_q +BX_KEY_Q 'q' SDLK_q +BX_KEY_R+BX_KEY_SHIFT_L 'R' SDLK_r +BX_KEY_R 'r' SDLK_r +BX_KEY_S+BX_KEY_SHIFT_L 'S' SDLK_s +BX_KEY_S 's' SDLK_s +BX_KEY_T+BX_KEY_SHIFT_L 'T' SDLK_t +BX_KEY_T 't' SDLK_t +BX_KEY_U+BX_KEY_SHIFT_L 'U' SDLK_u +BX_KEY_U 'u' SDLK_u +BX_KEY_V+BX_KEY_SHIFT_L 'V' SDLK_v +BX_KEY_V 'v' SDLK_v +BX_KEY_W+BX_KEY_SHIFT_L 'W' SDLK_w +BX_KEY_W 'w' SDLK_w +BX_KEY_X+BX_KEY_SHIFT_L 'X' SDLK_x +BX_KEY_X 'x' SDLK_x +BX_KEY_Y+BX_KEY_SHIFT_L 'Y' SDLK_y +BX_KEY_Y 'y' SDLK_y +BX_KEY_Z+BX_KEY_SHIFT_L 'Z' SDLK_z +BX_KEY_Z 'z' SDLK_z +BX_KEY_F1 none SDLK_F1 +BX_KEY_F2 none SDLK_F2 +BX_KEY_F3 none SDLK_F3 +BX_KEY_F4 none SDLK_F4 +BX_KEY_F5 none SDLK_F5 +BX_KEY_F6 none SDLK_F6 +BX_KEY_F7 none SDLK_F7 +BX_KEY_F8 none SDLK_F8 +BX_KEY_F9 none SDLK_F9 +BX_KEY_F10 none SDLK_F10 +BX_KEY_F11 none SDLK_F11 +BX_KEY_F12 none SDLK_F12 +BX_KEY_ALT_L none SDLK_LALT +BX_KEY_ALT_R none SDLK_MODE +BX_KEY_BACKSLASH backslash SDLK_BACKSLASH +BX_KEY_BACKSPACE none SDLK_BACKSPACE +BX_KEY_CAPS_LOCK none SDLK_CAPSLOCK +BX_KEY_COMMA ',' SDLK_COMMA +BX_KEY_COMMA+BX_KEY_SHIFT_L '<' SDLK_LESS +BX_KEY_CTRL_L none SDLK_LCTRL +BX_KEY_CTRL_R none SDLK_RCTRL +BX_KEY_DELETE none SDLK_DELETE +BX_KEY_DOWN none SDLK_DOWN +BX_KEY_END none SDLK_END +BX_KEY_ENTER return SDLK_RETURN +BX_KEY_EQUALS '=' SDLK_EQUALS +BX_KEY_EQUALS+BX_KEY_SHIFT_L '+' SDLK_PLUS +BX_KEY_ESC none SDLK_ESCAPE +BX_KEY_GRAVE '`' SDLK_BACKQUOTE +BX_KEY_HOME none SDLK_HOME +BX_KEY_INSERT none SDLK_INSERT +BX_KEY_KP_5 none SDLK_KP_5 +BX_KEY_KP_ADD none SDLK_KP_PLUS +BX_KEY_KP_DELETE none SDLK_KP_PERIOD +BX_KEY_KP_DIVIDE none SDLK_KP_DIVIDE +BX_KEY_KP_DOWN none SDLK_KP_2 +BX_KEY_KP_END none SDLK_KP_1 +BX_KEY_KP_ENTER none SDLK_KP_ENTER +BX_KEY_KP_HOME none SDLK_KP_7 +BX_KEY_KP_INSERT none SDLK_KP_0 +BX_KEY_KP_LEFT none SDLK_KP_4 +BX_KEY_KP_MULTIPLY none SDLK_KP_MULTIPLY +BX_KEY_KP_PAGE_DOWN none SDLK_KP_3 +BX_KEY_KP_PAGE_UP none SDLK_KP_9 +BX_KEY_KP_RIGHT none SDLK_KP_6 +BX_KEY_KP_SUBTRACT none SDLK_KP_MINUS +BX_KEY_KP_UP none SDLK_KP_8 +BX_KEY_LEFT none SDLK_LEFT +BX_KEY_LEFT_BRACKET '[' SDLK_LEFTBRACKET +BX_KEY_MENU none SDLK_MENU +BX_KEY_MINUS '-' SDLK_MINUS +BX_KEY_MINUS+BX_KEY_SHIFT_L '_' SDLK_UNDERSCORE +BX_KEY_NUM_LOCK none SDLK_NUMLOCKCLEAR +BX_KEY_PAGE_DOWN none SDLK_PAGEDOWN +BX_KEY_PAGE_UP none SDLK_PAGEUP +BX_KEY_PAUSE none SDLK_PAUSE +BX_KEY_PERIOD+BX_KEY_SHIFT_L '>' SDLK_GREATER +BX_KEY_PERIOD '.' SDLK_PERIOD +BX_KEY_PRINT none SDLK_PRINTSCREEN +BX_KEY_PRINT none SDLK_SYSREQ +BX_KEY_RIGHT none SDLK_RIGHT +BX_KEY_RIGHT_BRACKET ']' SDLK_RIGHTBRACKET +BX_KEY_SCRL_LOCK none SDLK_SCROLLLOCK +BX_KEY_SEMICOLON+BX_KEY_SHIFT_L ':' SDLK_COLON +BX_KEY_SEMICOLON ';' SDLK_SEMICOLON +BX_KEY_SHIFT_L none SDLK_LSHIFT +BX_KEY_SHIFT_R none SDLK_RSHIFT +BX_KEY_SINGLE_QUOTE apostrophe SDLK_QUOTE +BX_KEY_SINGLE_QUOTE+BX_KEY_SHIFT_L '"' SDLK_QUOTEDBL +BX_KEY_SLASH+BX_KEY_SHIFT_L '?' SDLK_QUESTION +BX_KEY_SLASH '/' SDLK_SLASH +BX_KEY_SPACE space SDLK_SPACE +BX_KEY_TAB tab SDLK_TAB +BX_KEY_UP none SDLK_UP +BX_KEY_WIN_L none SDLK_LGUI +BX_KEY_WIN_R none SDLK_RGUI diff --git a/Template/bxshare/keymaps/x11-pc-us.map b/Template/bxshare/keymaps/x11-pc-us.map new file mode 100644 index 0000000..fc32319 --- /dev/null +++ b/Template/bxshare/keymaps/x11-pc-us.map @@ -0,0 +1,205 @@ +# Bochs Keymap file +# $Id: x11-pc-us.map 12400 2014-07-06 18:29:06Z vruppert $ +# Target: PC(x86) keyboard, US keymap +# Author: Christophe Bothamy, Bryce Denney +# +# The keymap file describes the layout of a keyboard, and how it translates +# into Bochs key codes. +# +# Format: +# BX_Keysym ASCII_equivalent Xwin_Keysym +# +# Or, for keys that require modifiers: +# BX_Keysym+BX_Modifier ASCII_equivalent Xwin_Keysym +# +# BX_Keysym and BX_Modifier must be present in the bx_key_symbol[] list in +# gui/keymap.cc. The BX_Modifier is usually a shift key press, but it +# could be any key. Presently a maximum of one modifier is supported, but this +# could be changed in keymap.h (structure def has only one slot for modifier), +# keymap.cc (parsing code), and iodev/keyboard.cc (simulate keypresses for >1 +# modifier). +# +# The ASCII_equivalent must be either apostrophe + one character + apostrophe, +# or one of these keywords: space, return, tab, backslash, apostrophe, none. +# This format is designed to look like a char constant in C, but it's a very +# simple parser. There's no concept of backslash being an escape char. The +# backslash and apostrophe entries are provided for aesthetic purposes only: no +# C++ programmer wants to see '\' or '''. The parser doesn't care, but they are +# ugly. +# +# Xwin_Keysym is the X windows equivalent of the key combination. These +# codes should match whatever you find in /usr/X11R6/include/X11/keysymdef.h. +# If you're running X windows, Bochs will take each of these Xwin_Keysyms, +# pull off the XK_ in front, and use XStringToKeysym() to change them into +# numerical codes. If this lookup fails, you will get a panic and you need +# to edit the keymap file. +# + +BX_KEY_0 '0' XK_0 +BX_KEY_0+BX_KEY_SHIFT_L ')' XK_parenright +BX_KEY_1 '1' XK_1 +BX_KEY_1+BX_KEY_SHIFT_L '!' XK_exclam +BX_KEY_2 '2' XK_2 +BX_KEY_2+BX_KEY_SHIFT_L '@' XK_at +BX_KEY_3 '3' XK_3 +BX_KEY_3+BX_KEY_SHIFT_L '#' XK_numbersign +BX_KEY_4 '4' XK_4 +BX_KEY_4+BX_KEY_SHIFT_L '$' XK_dollar +BX_KEY_5 '5' XK_5 +BX_KEY_5+BX_KEY_SHIFT_L '%' XK_percent +BX_KEY_6 '6' XK_6 +BX_KEY_6+BX_KEY_SHIFT_L '^' XK_asciicircum +BX_KEY_7 '7' XK_7 +BX_KEY_7+BX_KEY_SHIFT_L '&' XK_ampersand +BX_KEY_8 '8' XK_8 +BX_KEY_8+BX_KEY_SHIFT_L '*' XK_asterisk +BX_KEY_9 '9' XK_9 +BX_KEY_9+BX_KEY_SHIFT_L '(' XK_parenleft +BX_KEY_A+BX_KEY_SHIFT_L 'A' XK_A +BX_KEY_A 'a' XK_a +BX_KEY_B+BX_KEY_SHIFT_L 'B' XK_B +BX_KEY_B 'b' XK_b +BX_KEY_C+BX_KEY_SHIFT_L 'C' XK_C +BX_KEY_C 'c' XK_c +BX_KEY_D+BX_KEY_SHIFT_L 'D' XK_D +BX_KEY_D 'd' XK_d +BX_KEY_E+BX_KEY_SHIFT_L 'E' XK_E +BX_KEY_E 'e' XK_e +BX_KEY_F+BX_KEY_SHIFT_L 'F' XK_F +BX_KEY_F 'f' XK_f +BX_KEY_G+BX_KEY_SHIFT_L 'G' XK_G +BX_KEY_G 'g' XK_g +BX_KEY_H+BX_KEY_SHIFT_L 'H' XK_H +BX_KEY_H 'h' XK_h +BX_KEY_I+BX_KEY_SHIFT_L 'I' XK_I +BX_KEY_I 'i' XK_i +BX_KEY_J+BX_KEY_SHIFT_L 'J' XK_J +BX_KEY_J 'j' XK_j +BX_KEY_K+BX_KEY_SHIFT_L 'K' XK_K +BX_KEY_K 'k' XK_k +BX_KEY_L+BX_KEY_SHIFT_L 'L' XK_L +BX_KEY_L 'l' XK_l +BX_KEY_M+BX_KEY_SHIFT_L 'M' XK_M +BX_KEY_M 'm' XK_m +BX_KEY_N+BX_KEY_SHIFT_L 'N' XK_N +BX_KEY_N 'n' XK_n +BX_KEY_O+BX_KEY_SHIFT_L 'O' XK_O +BX_KEY_O 'o' XK_o +BX_KEY_P+BX_KEY_SHIFT_L 'P' XK_P +BX_KEY_P 'p' XK_p +BX_KEY_Q+BX_KEY_SHIFT_L 'Q' XK_Q +BX_KEY_Q 'q' XK_q +BX_KEY_R+BX_KEY_SHIFT_L 'R' XK_R +BX_KEY_R 'r' XK_r +BX_KEY_S+BX_KEY_SHIFT_L 'S' XK_S +BX_KEY_S 's' XK_s +BX_KEY_T+BX_KEY_SHIFT_L 'T' XK_T +BX_KEY_T 't' XK_t +BX_KEY_U+BX_KEY_SHIFT_L 'U' XK_U +BX_KEY_U 'u' XK_u +BX_KEY_V+BX_KEY_SHIFT_L 'V' XK_V +BX_KEY_V 'v' XK_v +BX_KEY_W+BX_KEY_SHIFT_L 'W' XK_W +BX_KEY_W 'w' XK_w +BX_KEY_X+BX_KEY_SHIFT_L 'X' XK_X +BX_KEY_X 'x' XK_x +BX_KEY_Y+BX_KEY_SHIFT_L 'Y' XK_Y +BX_KEY_Y 'y' XK_y +BX_KEY_Z+BX_KEY_SHIFT_L 'Z' XK_Z +BX_KEY_Z 'z' XK_z +BX_KEY_F1 none XK_F1 +BX_KEY_F2 none XK_F2 +BX_KEY_F3 none XK_F3 +BX_KEY_F4 none XK_F4 +BX_KEY_F5 none XK_F5 +BX_KEY_F6 none XK_F6 +BX_KEY_F7 none XK_F7 +BX_KEY_F8 none XK_F8 +BX_KEY_F9 none XK_F9 +BX_KEY_F10 none XK_F10 +BX_KEY_F11 none XK_F11 +BX_KEY_F12 none XK_F12 +BX_KEY_ALT_L none XK_Alt_L +BX_KEY_ALT_L none XK_Meta_L +BX_KEY_ALT_R none XK_Alt_R +BX_KEY_ALT_R none XK_Mode_switch +BX_KEY_ALT_R none XK_Multi_key +BX_KEY_BACKSLASH backslash XK_backslash +BX_KEY_BACKSLASH+BX_KEY_SHIFT_L '|' XK_bar +BX_KEY_BACKSPACE none XK_BackSpace +BX_KEY_CAPS_LOCK none XK_Caps_Lock +BX_KEY_COMMA ',' XK_comma +BX_KEY_COMMA+BX_KEY_SHIFT_L '<' XK_less +BX_KEY_CTRL_L none XK_Control_L +BX_KEY_CTRL_R none XK_Control_R +BX_KEY_DELETE none XK_Delete +BX_KEY_DOWN none XK_Down +BX_KEY_END none XK_End +BX_KEY_ENTER return XK_Return +BX_KEY_EQUALS '=' XK_equal +BX_KEY_EQUALS+BX_KEY_SHIFT_L '+' XK_plus +BX_KEY_ESC none XK_Escape +BX_KEY_GRAVE+BX_KEY_SHIFT_L '~' XK_asciitilde +BX_KEY_GRAVE '`' XK_grave +BX_KEY_HOME none XK_Home +BX_KEY_INSERT none XK_Insert +BX_KEY_KP_5 none XK_KP_5 +BX_KEY_KP_5 none XK_KP_Begin +BX_KEY_KP_ADD none XK_KP_Add +BX_KEY_KP_DELETE none XK_KP_Decimal +BX_KEY_KP_DELETE none XK_KP_Delete +BX_KEY_KP_DIVIDE none XK_KP_Divide +BX_KEY_KP_DOWN none XK_KP_2 +BX_KEY_KP_DOWN none XK_KP_Down +BX_KEY_KP_END none XK_KP_1 +BX_KEY_KP_END none XK_KP_End +BX_KEY_KP_ENTER none XK_KP_Enter +BX_KEY_KP_HOME none XK_KP_7 +BX_KEY_KP_HOME none XK_KP_Home +BX_KEY_KP_INSERT none XK_KP_0 +BX_KEY_KP_INSERT none XK_KP_Insert +BX_KEY_KP_LEFT none XK_KP_4 +BX_KEY_KP_LEFT none XK_KP_Left +BX_KEY_KP_MULTIPLY none XK_KP_Multiply +BX_KEY_KP_PAGE_DOWN none XK_KP_3 +BX_KEY_KP_PAGE_DOWN none XK_KP_Page_Down +BX_KEY_KP_PAGE_UP none XK_KP_9 +BX_KEY_KP_PAGE_UP none XK_KP_Page_Up +BX_KEY_KP_RIGHT none XK_KP_6 +BX_KEY_KP_RIGHT none XK_KP_Right +BX_KEY_KP_SUBTRACT none XK_KP_Subtract +BX_KEY_KP_UP none XK_KP_8 +BX_KEY_KP_UP none XK_KP_Up +BX_KEY_LEFT none XK_Left +BX_KEY_LEFT_BRACKET+BX_KEY_SHIFT_L '{' XK_braceleft +BX_KEY_LEFT_BRACKET '[' XK_bracketleft +BX_KEY_MENU none XK_Menu +BX_KEY_MINUS '-' XK_minus +BX_KEY_MINUS+BX_KEY_SHIFT_L '_' XK_underscore +BX_KEY_NUM_LOCK none XK_Num_Lock +BX_KEY_PAGE_DOWN none XK_Page_Down +BX_KEY_PAGE_UP none XK_Page_Up +BX_KEY_PAUSE none XK_Break +BX_KEY_PAUSE none XK_Pause +BX_KEY_PERIOD+BX_KEY_SHIFT_L '>' XK_greater +BX_KEY_PERIOD '.' XK_period +BX_KEY_PRINT none XK_Print +BX_KEY_PRINT none XK_Sys_Req +BX_KEY_RIGHT none XK_Right +BX_KEY_RIGHT_BRACKET+BX_KEY_SHIFT_L '}' XK_braceright +BX_KEY_RIGHT_BRACKET ']' XK_bracketright +BX_KEY_SCRL_LOCK none XK_Scroll_Lock +BX_KEY_SEMICOLON+BX_KEY_SHIFT_L ':' XK_colon +BX_KEY_SEMICOLON ';' XK_semicolon +BX_KEY_SHIFT_L none XK_Shift_L +BX_KEY_SHIFT_R none XK_Shift_R +BX_KEY_SINGLE_QUOTE apostrophe XK_apostrophe +BX_KEY_SINGLE_QUOTE+BX_KEY_SHIFT_L '"' XK_quotedbl +BX_KEY_SLASH+BX_KEY_SHIFT_L '?' XK_question +BX_KEY_SLASH '/' XK_slash +BX_KEY_SPACE space XK_space +BX_KEY_TAB none XK_ISO_Left_Tab +BX_KEY_TAB tab XK_Tab +BX_KEY_UP none XK_Up +BX_KEY_WIN_L none XK_Super_L +BX_KEY_WIN_R none XK_Super_R diff --git a/Template/bxshare/readme.txt b/Template/bxshare/readme.txt new file mode 100644 index 0000000..fafd07d --- /dev/null +++ b/Template/bxshare/readme.txt @@ -0,0 +1,8 @@ +These files are copied from where bochs is installed. + +Under GNU/Linux or Mac OS, it's unnecessary. +But for Windows, we cannot use $BXSHARE to locate ROM images nor keymap files. + +So here I want to unify the running script for different platform. + +Finally, run.cmd and run.sh should be nearly same. \ No newline at end of file diff --git a/mbr/nmake.bat b/mbr/nmake.bat index 9361521..bbf8269 100644 --- a/mbr/nmake.bat +++ b/mbr/nmake.bat @@ -1,10 +1,31 @@ @echo off -nasm -f bin -o bin\%1.bin %1.asm +rem Preparing +if not exist bin ( + mkdir bin +) -rem .\bin\mbr bin\%1.bin -bin\dd if=bin\%1.bin of="G:\VirtualBox VMs\dos2\dos2.vhd" bs=512 count=1 conv=notrunc +if not exist bin\bochsrc.bxrc ( + xcopy /Y ..\template\bochsrc.bxrc bin\ + xcopy /E /Y ..\template\bxshare bin\bxshare\ +) +cd bin +if not exist system.img ( + :: Create a 10MB-HD image named "system.img" which will be used by bochsrc.bxrc + bximage -mode=create -hd=10 -q system.img +) -vboxmanage startvm dos2 \ No newline at end of file +:: Remove temp files which may prevent starting a new bochs instance +del /s /q system.img.lock + +:: Build +nasm -f bin -o %1.bin -l %1.lst ..\%1.asm + +dd if=%1.bin of=system.img bs=512 count=1 + +:: Run +bochs -q -f bochsrc.bxrc + +cd .. \ No newline at end of file