From 212d7aea9815745bd5ea97a746a9a147b26614f7 Mon Sep 17 00:00:00 2001 From: waltje Date: Fri, 26 Apr 2019 22:03:30 -0500 Subject: [PATCH] Updates to fix (and improve) the UI handling of the emulated keyboard state. Updatd mem.c with new readmem386l and writemem386l functions from 86Box. Several cleanups to the keyboard layer to remove some weirdness. Updated the NVR code and nvr_at.c to just use a speed_changed member for the AT devices. --- src/devices/input/keyboard.c | 270 ++++++++++++++------------------ src/devices/input/keyboard.h | 18 +-- src/devices/input/keyboard_at.c | 17 +- src/devices/input/keyboard_xt.c | 62 +------- src/devices/system/nvr_at.c | 23 ++- src/devices/video/vid_tvga.c | 4 +- src/machines/m_amstrad.c | 4 +- src/machines/m_olim24.c | 4 +- src/machines/m_pcjr.c | 4 +- src/machines/m_tandy1000.c | 4 +- src/mem.c | 55 +------ src/nvr.c | 15 +- src/nvr.h | 6 +- src/pc.c | 6 +- src/ui/ui.h | 5 +- src/ui/ui_misc.c | 13 +- 16 files changed, 186 insertions(+), 324 deletions(-) diff --git a/src/devices/input/keyboard.c b/src/devices/input/keyboard.c index 9f2a169..eb473d5 100644 --- a/src/devices/input/keyboard.c +++ b/src/devices/input/keyboard.c @@ -8,7 +8,7 @@ * * General keyboard driver interface. * - * Version: @(#)keyboard.c 1.0.13 2019/04/26 + * Version: @(#)keyboard.c 1.0.14 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -59,7 +59,7 @@ void (*keyboard_send)(uint16_t val); static int recv_key[512]; /* keyboard input buffer */ static int oldkey[512]; -static const scancode *scan_table; /* scancode table for keyboard */ +static const scancode_t *scan_table; /* scancode table for keyboard */ static uint8_t caps_lock = 0; static uint8_t num_lock = 0; @@ -84,41 +84,6 @@ kbd_log(int level, const char *fmt, ...) #endif -/* Reset the keyboard driver. */ -void -keyboard_init(void) -{ - memset(recv_key, 0x00, sizeof(recv_key)); - - keyboard_scan = 1; - keyboard_delay = 0; - scan_table = NULL; - - memset(keyboard_set3_flags, 0x00, sizeof(keyboard_set3_flags)); - keyboard_set3_all_repeat = 0; - keyboard_set3_all_break = 0; -} - - -void -keyboard_reset(void) -{ - uint8_t i; - - /* Initialize the key states from the platform keyboard. */ - i = plat_kbd_state() & 0xff; - - keyboard_set_state(i); -} - - -void -keyboard_set_table(const scancode *ptr) -{ - scan_table = ptr; -} - - static uint8_t fake_shift_needed(uint16_t scan) { @@ -127,6 +92,7 @@ fake_shift_needed(uint16_t scan) case 0x0148: case 0x0149: case 0x014a: + case 0x014b: case 0x014d: case 0x014f: case 0x0150: @@ -141,10 +107,10 @@ fake_shift_needed(uint16_t scan) } -void +static void key_process(uint16_t scan, int down) { - const scancode *codes = scan_table; + const scancode_t *codes = scan_table; int c; if (! keyboard_scan) return; @@ -178,6 +144,61 @@ key_process(uint16_t scan, int down) } +/* Insert keystrokes into the machine's keyboard buffer. */ +static void +keyboard_send_scan(uint8_t val) +{ + if (AT) + keyboard_at_adddata_keyboard_raw(val); + else + keyboard_send(val); +} + + +/* Send the machine a Control-Alt sequence. */ +static void +keyboard_ca(uint8_t sc) +{ + keyboard_send_scan(29); /* Ctrl key pressed */ + keyboard_send_scan(56); /* Alt key pressed */ + + keyboard_send_scan(sc); /* press */ + keyboard_send_scan(sc | 0x80); /* release */ + + keyboard_send_scan(184); /* Alt key released */ + keyboard_send_scan(157); /* Ctrl key released */ +} + + +/* Reset the keyboard driver. */ +void +keyboard_reset(void) +{ + keyboard_scan = 1; + keyboard_delay = 0; + + memset(recv_key, 0x00, sizeof(recv_key)); + + memset(keyboard_set3_flags, 0x00, sizeof(keyboard_set3_flags)); + keyboard_set3_all_repeat = 0; + keyboard_set3_all_break = 0; +} + + +void +keyboard_set_table(const scancode_t *ptr) +{ + scan_table = ptr; +} + + +int +keyboard_recv(uint16_t key) +{ + return(recv_key[key]); +} + + /* Handle a keystroke event from the UI layer. */ void keyboard_input(int down, uint16_t scan) @@ -220,11 +241,11 @@ keyboard_input(int down, uint16_t scan) break; case 0x0038: /* Left Alt */ - shift |= 0x03; + shift |= 0x04; break; case 0x0138: /* Right Alt */ - shift |= 0x30; + shift |= 0x40; break; } } else { @@ -246,11 +267,11 @@ keyboard_input(int down, uint16_t scan) break; case 0x0038: /* Left Alt */ - shift &= ~0x03; + shift &= ~0x04; break; case 0x0138: /* Right Alt */ - shift &= ~0x30; + shift &= ~0x40; break; case 0x003a: /* Caps Lock */ @@ -280,39 +301,67 @@ keyboard_input(int down, uint16_t scan) uiflag |= KBD_FLAG_NUM; if (scroll_lock) uiflag |= KBD_FLAG_SCROLL; - ui_sb_kbstate(uiflag); -//INFO("KBD: input: caps=%d num=%d scrl=%d\n", caps_lock,num_lock,scroll_lock); + + /* Update UI and possibly host. */ + ui_set_kbd_state(uiflag); } - /* - * NOTE: Shouldn't this be some sort of bit shift? - * An array of 8 unsigned 64-bit integers should be enough. - */ -#if 0 - recv_key[scan >> 6] |= ((uint64_t) down << ((uint64_t) scan & 0x3fLL)); -#else - recv_key[scan & 0x01ff] = down; -#endif - DEBUG("Received scan code: %03X (%s)\n",scan & 0x1ff, down ? "down" : "up"); + recv_key[scan & 0x01ff] = down; key_process(scan & 0x01ff, down); } -static uint8_t -keyboard_do_break(uint16_t scan) +void +keyboard_adddata(uint16_t val, void (*add_data)(uint16_t val)) { - const scancode *codes = scan_table; + uint8_t shift_states; - if (AT && ((keyboard_mode & 3) == 3)) { - if (!keyboard_set3_all_break && !recv_key[scan] && - !(keyboard_set3_flags[codes[scan].mk[0]] & 2)) - return(0); + if (add_data == NULL) return; - return(1); + shift_states = shift & STATE_SHIFT_MASK; + + switch(val) { + case FAKE_LSHIFT_ON: + if (num_lock) { + if (! shift_states) { + /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ + add_data(0x2a); + } + } else { + if (shift_states & STATE_LSHIFT) { + /* Num lock off and left shift pressed. */ + add_data(0xaa); + } + if (shift_states & STATE_RSHIFT) { + /* Num lock off and right shift pressed. */ + add_data(0xb6); + } + } + break; + + case FAKE_LSHIFT_OFF: + if (num_lock) { + if (! shift_states) { + /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ + add_data(0xaa); + } + } else { + if (shift_states & STATE_LSHIFT) { + /* Num lock off and left shift pressed. */ + add_data(0x2a); + } + if (shift_states & STATE_RSHIFT) { + /* Num lock off and right shift pressed. */ + add_data(0x36); + } + } + break; + + default: + add_data(val); + break; } - - return(1); } @@ -335,101 +384,10 @@ keyboard_get_state(void) if (scroll_lock) ret |= KBD_FLAG_SCROLL; -//INFO("KBD state: caps=%d num=%d scrl=%d\n", caps_lock,num_lock,scroll_lock); return(ret); } -/* - * Called by the UI to update the states of - * Caps Lock, Num Lock, and Scroll Lock. - */ -void -keyboard_set_state(uint8_t flags) -{ - const scancode *codes = scan_table; - int i, f; - - f = !!(flags & KBD_FLAG_CAPS); - if (caps_lock != f) { -#if 0 - i = 0; - while (codes[0x03a].mk[i] != 0) - keyboard_send(codes[0x03a].mk[i++]); - if (keyboard_do_break(0x03a)) { - i = 0; - while (codes[0x03a].brk[i] != 0) - keyboard_send(codes[0x03a].brk[i++]); - } -#endif - caps_lock = f; - } - - f = !!(flags & KBD_FLAG_NUM); - if (num_lock != f) { -#if 0 - i = 0; - while (codes[0x045].mk[i] != 0) - keyboard_send(codes[0x045].mk[i++]); - if (keyboard_do_break(0x045)) { - i = 0; - while (codes[0x045].brk[i] != 0) - keyboard_send(codes[0x045].brk[i++]); - } -#endif - num_lock = f; - } - - f = !!(flags & KBD_FLAG_SCROLL); - if (scroll_lock != f) { -#if 0 - i = 0; - while (codes[0x046].mk[i] != 0) - keyboard_send(codes[0x046].mk[i++]); - if (keyboard_do_break(0x046)) { - i = 0; - while (codes[0x046].brk[i] != 0) - keyboard_send(codes[0x046].brk[i++]); - } -#endif - scroll_lock = f; - } -} - - -int -keyboard_recv(uint16_t key) -{ - return(recv_key[key]); -} - - -/* Insert keystrokes into the machine's keyboard buffer. */ -static void -keyboard_send_scan(uint8_t val) -{ - if (AT) - keyboard_at_adddata_keyboard_raw(val); - else - keyboard_send(val); -} - - -/* Send the machine a Control-Alt sequence. */ -static void -keyboard_ca(uint8_t sc) -{ - keyboard_send_scan(29); /* Ctrl key pressed */ - keyboard_send_scan(56); /* Alt key pressed */ - - keyboard_send_scan(sc); /* press */ - keyboard_send_scan(sc | 0x80); /* release */ - - keyboard_send_scan(184); /* Alt key released */ - keyboard_send_scan(157); /* Ctrl key released */ -} - - /* Send the machine a Control-Alt-DEL sequence. */ void keyboard_cad(void) diff --git a/src/devices/input/keyboard.h b/src/devices/input/keyboard.h index bcdf334..61008c7 100644 --- a/src/devices/input/keyboard.h +++ b/src/devices/input/keyboard.h @@ -8,7 +8,7 @@ * * Definitions for the keyboard interface. * - * Version: @(#)keyboard.h 1.0.12 2019/04/25 + * Version: @(#)keyboard.h 1.0.13 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -65,7 +65,7 @@ extern "C" { typedef struct { uint8_t mk[4]; uint8_t brk[4]; -} scancode; +} scancode_t; extern uint8_t keyboard_mode; @@ -78,7 +78,7 @@ extern uint8_t keyboard_set3_all_break; extern int mouse_queue_start, mouse_queue_end; extern int mouse_scan; -extern const scancode scancode_xt[512]; +extern const scancode_t scancode_xt[512]; #ifdef EMU_DEVICE_H extern const device_t keyboard_pc_device; @@ -107,21 +107,17 @@ extern const device_t keyboard_ps2_ami_pci_device; extern void (*keyboard_send)(uint16_t val); -extern void kbd_adddata_process(uint16_t val, void (*adddata)(uint16_t val)); +extern void keyboard_adddata(uint16_t val, void (*adddata)(uint16_t val)); +extern void keyboard_poll_host(void); extern void kbd_log(int level, const char *fmt, ...); -extern void keyboard_init(void); extern void keyboard_reset(void); extern void keyboard_close(void); -extern void keyboard_set_table(const scancode *ptr); -extern void keyboard_poll_host(void); -extern void keyboard_process(void); -extern uint16_t keyboard_convert(int ch); +extern void keyboard_set_table(const scancode_t *ptr); extern void keyboard_input(int down, uint16_t scan); +extern int keyboard_recv(uint16_t key); extern uint8_t keyboard_get_shift(void); extern uint8_t keyboard_get_state(void); -extern void keyboard_set_state(uint8_t); -extern int keyboard_recv(uint16_t key); extern void keyboard_cad(void); extern void keyboard_cae(void); extern void keyboard_cab(void); diff --git a/src/devices/input/keyboard_at.c b/src/devices/input/keyboard_at.c index 76d6e5d..80122fa 100644 --- a/src/devices/input/keyboard_at.c +++ b/src/devices/input/keyboard_at.c @@ -8,10 +8,15 @@ * * Intel 8042 (AT keyboard controller) emulation. * - * NOTE: Several changes to disable Mode1 for now, as this breaks + * **NOTE**: Several changes to disable Mode1 for now, as this breaks * the TSX32 operating system. More cleanups needed.. * - * Version: @(#)keyboard_at.c 1.0.24 2019/04/25 + * **NOTE** The input functions for the Acer KBC chip (used by V30) is + * not OK yet. One of the commands sent is confusuing it, and + * it either will not process ctrl-alt-esc, or it will not do + * ANY input. + * + * Version: @(#)keyboard_at.c 1.0.25 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -216,7 +221,7 @@ static const uint8_t nont_to_t[256] = { }; #if USE_SET1 -static const scancode scancode_set1[512] = { +static const scancode_t scancode_set1[512] = { { { 0 }, { 0 } }, /* 000 */ { { 0x01 }, { 0x81 } }, { { 0x02 }, { 0x82 } }, @@ -717,7 +722,7 @@ static const scancode scancode_set1[512] = { }; #endif -static const scancode scancode_set2[512] = { +static const scancode_t scancode_set2[512] = { { { 0 }, { 0 } }, /* 000 */ { { 0x76 }, { 0xf0,0x76 } }, { { 0x16 }, { 0xf0,0x16 } }, @@ -1217,7 +1222,7 @@ static const scancode scancode_set2[512] = { { { 0xe0,0xff }, { 0xe0,0xf0,0xff } } }; -static const scancode scancode_set3[512] = { +static const scancode_t scancode_set3[512] = { { { 0 }, { 0 } }, /* 000 */ { { 0x08 }, { 0xf0,0x08 } }, { { 0x16 }, { 0xf0,0x16 } }, @@ -3252,7 +3257,7 @@ kbd_init(const device_t *info, UNUSED(void *parent)) break; case KBC_VEN_ACER: -// kbd->write60_ven = &kbd_write60_acer; + kbd->write60_ven = &kbd_write60_acer; kbd->write64_ven = &kbd_write64_acer; break; } diff --git a/src/devices/input/keyboard_xt.c b/src/devices/input/keyboard_xt.c index 09dc82f..0890032 100644 --- a/src/devices/input/keyboard_xt.c +++ b/src/devices/input/keyboard_xt.c @@ -8,7 +8,9 @@ * * Implementation of the XT-style keyboard. * - * Version: @(#)keyboard_xt.c 1.0.17 2019/04/25 + * **NOTE** The key_queue stuff should be in the device data. + * + * Version: @(#)keyboard_xt.c 1.0.18 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -98,7 +100,7 @@ typedef struct { /* PC/XT keyboard has no escape scancodes, and no scancodes beyond 53. */ -const scancode scancode_xt[512] = { +const scancode_t scancode_xt[512] = { { { 0 }, { 0 } }, /* 000 */ { { 0x01 }, { 0x81 } }, { { 0x02 }, { 0x82 } }, @@ -652,64 +654,10 @@ kbd_adddata(uint16_t val) } -void -kbd_adddata_process(uint16_t val, void (*adddata)(uint16_t val)) -{ - uint8_t num_lock = 0, shift_states = 0; - - if (adddata == NULL) return; - - num_lock = !!(keyboard_get_state() & KBD_FLAG_NUM); - shift_states = keyboard_get_shift() & STATE_SHIFT_MASK; - - switch(val) { - case FAKE_LSHIFT_ON: - if (num_lock) { - if (! shift_states) { - /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ - adddata(0x2a); - } - } else { - if (shift_states & STATE_LSHIFT) { - /* Num lock off and left shift pressed. */ - adddata(0xaa); - } - if (shift_states & STATE_RSHIFT) { - /* Num lock off and right shift pressed. */ - adddata(0xb6); - } - } - break; - - case FAKE_LSHIFT_OFF: - if (num_lock) { - if (! shift_states) { - /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ - adddata(0xaa); - } - } else { - if (shift_states & STATE_LSHIFT) { - /* Num lock off and left shift pressed. */ - adddata(0x2a); - } - if (shift_states & STATE_RSHIFT) { - /* Num lock off and right shift pressed. */ - adddata(0x36); - } - } - break; - - default: - adddata(val); - break; - } -} - - static void kbd_adddata_ex(uint16_t val) { - kbd_adddata_process(val, kbd_adddata); + keyboard_adddata(val, kbd_adddata); } diff --git a/src/devices/system/nvr_at.c b/src/devices/system/nvr_at.c index 0123392..4aff6be 100644 --- a/src/devices/system/nvr_at.c +++ b/src/devices/system/nvr_at.c @@ -189,7 +189,7 @@ * including the later update (DS12887A) which implemented a * "century" register to be compatible with Y2K. * - * Version: @(#)nvr_at.c 1.0.15 2019/04/25 + * Version: @(#)nvr_at.c 1.0.16 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -645,8 +645,10 @@ nvr_start(nvr_t *nvr) static void -nvr_recalc(nvr_t *nvr) +nvr_recalc(void *priv) { + nvr_t *nvr = (nvr_t *)priv; + timer_recalc(nvr, 0); } @@ -692,7 +694,6 @@ nvr_at_init(const device_t *info, UNUSED(void *parent)) nvr->reset = nvr_reset; nvr->start = nvr_start; nvr->tick = timer_tick; - nvr->recalc = nvr_recalc; /* Initialize the generic NVR. */ nvr_init(nvr); @@ -730,7 +731,9 @@ const device_t at_nvr_old_device = { 0, NULL, nvr_at_init, nvr_at_close, NULL, - NULL, NULL, NULL, NULL, + NULL, + nvr_recalc, + NULL, NULL, NULL }; @@ -740,7 +743,9 @@ const device_t at_nvr_device = { 1, NULL, nvr_at_init, nvr_at_close, NULL, - NULL, NULL, NULL, NULL, + NULL, + nvr_recalc, + NULL, NULL, NULL }; @@ -750,7 +755,9 @@ const device_t ps_nvr_device = { 2, NULL, nvr_at_init, nvr_at_close, NULL, - NULL, NULL, NULL, NULL, + NULL, + nvr_recalc, + NULL, NULL, NULL }; @@ -760,6 +767,8 @@ const device_t amstrad_nvr_device = { 3, NULL, nvr_at_init, nvr_at_close, NULL, - NULL, NULL, NULL, NULL, + NULL, + nvr_recalc, + NULL, NULL, NULL }; diff --git a/src/devices/video/vid_tvga.c b/src/devices/video/vid_tvga.c index 69fedc5..e0a7722 100644 --- a/src/devices/video/vid_tvga.c +++ b/src/devices/video/vid_tvga.c @@ -8,7 +8,7 @@ * * Trident TVGA (8900B/8900C/8900D) emulation. * - * Version: @(#)vid_tvga.c 1.0.13 2019/04/19 + * Version: @(#)vid_tvga.c 1.0.14 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -370,11 +370,9 @@ tvga_init(const device_t *info, UNUSED(void *parent)) tvga->svga.ramdac = device_add(&tkd8001_ramdac_device); break; -#if 0 case 1: /* TVGA 8900D */ tvga->svga.ramdac = device_add(&tkd8001_ramdac_device); break; -#endif } if (info->path) diff --git a/src/machines/m_amstrad.c b/src/machines/m_amstrad.c index 00a5f3f..cf0d9a6 100644 --- a/src/machines/m_amstrad.c +++ b/src/machines/m_amstrad.c @@ -15,7 +15,7 @@ * 80 columns. To be fixed... * Also, the DDM bits stuff needs to be verified. * - * Version: @(#)m_amstrad.c 1.0.26 2019/04/25 + * Version: @(#)m_amstrad.c 1.0.27 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -198,7 +198,7 @@ kbd_adddata(uint16_t val) static void kbd_adddata_ex(uint16_t val) { - kbd_adddata_process(val, kbd_adddata); + keyboard_adddata(val, kbd_adddata); } diff --git a/src/machines/m_olim24.c b/src/machines/m_olim24.c index da7dbff..9aacb8b 100644 --- a/src/machines/m_olim24.c +++ b/src/machines/m_olim24.c @@ -21,7 +21,7 @@ * data at all, so there seems to not be a way to properly do * that.. The chip's interrupt pin is not connected. * - * Version: @(#)m_olim24.c 1.0.18 2019/04/25 + * Version: @(#)m_olim24.c 1.0.19 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -174,7 +174,7 @@ kbd_adddata(uint16_t val) static void kbd_adddata_ex(uint16_t val) { - kbd_adddata_process(val, kbd_adddata); + keyboard_adddata(val, kbd_adddata); } diff --git a/src/machines/m_pcjr.c b/src/machines/m_pcjr.c index 9011137..106b054 100644 --- a/src/machines/m_pcjr.c +++ b/src/machines/m_pcjr.c @@ -8,7 +8,7 @@ * * Emulation of the IBM PCjr. * - * Version: @(#)m_pcjr.c 1.0.18 2019/04/25 + * Version: @(#)m_pcjr.c 1.0.19 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -719,7 +719,7 @@ kbd_adddata(uint16_t val) static void kbd_adddata_ex(uint16_t val) { - kbd_adddata_process(val, kbd_adddata); + keyboard_adddata(val, kbd_adddata); } diff --git a/src/machines/m_tandy1000.c b/src/machines/m_tandy1000.c index 585dc7c..fd11be2 100644 --- a/src/machines/m_tandy1000.c +++ b/src/machines/m_tandy1000.c @@ -8,7 +8,7 @@ * * Emulation of Tandy models 1000, 1000HX and 1000SL2. * - * Version: @(#)m_tandy1000.c 1.0.21 2019/04/26 + * Version: @(#)m_tandy1000.c 1.0.22 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -128,7 +128,7 @@ typedef struct { } tandy_t; -static const scancode scancode_tandy[512] = { +static const scancode_t scancode_tandy[512] = { { { 0 }, { 0 } }, { { 0x01 }, { 0x81 } }, { { 0x02 }, { 0x82 } }, diff --git a/src/mem.c b/src/mem.c index ce3cce5..14b563f 100644 --- a/src/mem.c +++ b/src/mem.c @@ -12,7 +12,7 @@ * The Port92 stuff should be moved to devices/system/memctl.c * as a standard device. * - * Version: @(#)mem.c 1.0.31 2019/04/25 + * Version: @(#)mem.c 1.0.32 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -505,72 +505,25 @@ writemembl(uint32_t addr, uint8_t val) uint8_t readmemb386l(uint32_t seg, uint32_t addr) { - mem_map_t *map; - if (seg == (uint32_t)-1) { x86gpf("NULL segment", 0); - return 0xff; + return -1; } - mem_logical_addr = addr = addr + seg; - if (addr < 0x100000 && ram_mapped_addr[addr >> 14]) { - addr = (ram_mapped_addr[addr >> 14] & MEM_MAP_TO_SHADOW_RAM_MASK) ? addr : (ram_mapped_addr[addr >> 14] & ~0x3fff) + (addr & 0x3fff); - if (addr < (uint32_t)(1024UL * mem_size)) - return ram[addr]; - return 0xff; - } - - if (cr0 >> 31) { - addr = mmutranslate_read(addr); - if (addr == 0xffffffff) - return 0xff; - } - - addr &= rammask; - - map = read_mapping[addr >> 14]; - if (map && map->read_b) - return map->read_b(addr, map->p); - - return 0xff; + return readmembl(addr + seg); } void writememb386l(uint32_t seg, uint32_t addr, uint8_t val) { - mem_map_t *map; - if (seg == (uint32_t)-1) { x86gpf("NULL segment", 0); return; } - mem_logical_addr = addr = addr + seg; - if (addr < 0x100000 && ram_mapped_addr[addr >> 14]) { - addr = (ram_mapped_addr[addr >> 14] & MEM_MAP_TO_SHADOW_RAM_MASK) ? addr : (ram_mapped_addr[addr >> 14] & ~0x3fff) + (addr & 0x3fff); - if (addr < (uint32_t)(1024UL * mem_size)) - ram[addr] = val; - return; - } - - if (page_lookup[addr>>12]) { - page_lookup[addr>>12]->write_b(addr, val, page_lookup[addr>>12]); - - return; - } - - if (cr0 >> 31) { - addr = mmutranslate_write(addr); - if (addr == 0xffffffff) return; - } - - addr &= rammask; - - map = write_mapping[addr >> 14]; - if (map && map->write_b) - map->write_b(addr, val, map->p); + writemembl(addr + seg, val); } diff --git a/src/nvr.c b/src/nvr.c index 0b98704..edeeef7 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -8,7 +8,7 @@ * * Implement a generic NVRAM/CMOS/RTC device. * - * Version: @(#)nvr.c 1.0.16 2019/04/25 + * Version: @(#)nvr.c 1.0.17 2019/04/26 * * Author: Fred N. van Kempen, * @@ -136,6 +136,7 @@ onesec_timer(void *priv) } +/* Get current time from internal clock. */ /* Initialize the generic NVRAM/RTC device. */ void nvr_init(nvr_t *nvr) @@ -328,18 +329,6 @@ nvr_save(void) } -void -nvr_period_recalc(void) -{ - /* Make sure we have been initialized. */ - if (saved_nvr == NULL) return; - - if (saved_nvr->recalc && (saved_nvr->size != 0)) - saved_nvr->recalc(saved_nvr); -} - - -/* Get current time from internal clock. */ void nvr_time_get(struct tm *tm) { diff --git a/src/nvr.h b/src/nvr.h index 308517a..cc674c3 100644 --- a/src/nvr.h +++ b/src/nvr.h @@ -8,11 +8,11 @@ * * Definitions for the generic NVRAM/CMOS driver. * - * Version: @(#)nvr.h 1.0.8 2018/09/09 + * Version: @(#)nvr.h 1.0.9 2019/04/26 * * Author: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2019 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the @@ -79,7 +79,6 @@ typedef struct _nvr_ { void (*reset)(struct _nvr_ *); void (*start)(struct _nvr_ *); void (*tick)(struct _nvr_ *); - void (*recalc)(struct _nvr_ *); uint8_t regs[NVR_MAXSIZE]; /* these are the registers */ } nvr_t; @@ -99,7 +98,6 @@ extern void nvr_init(nvr_t *); extern wchar_t *nvr_path(const wchar_t *fn); extern int nvr_load(void); extern int nvr_save(void); -extern void nvr_period_recalc(void); extern int nvr_is_leap(int year); extern int nvr_get_days(int month, int year); diff --git a/src/pc.c b/src/pc.c index 8581bb2..10deec9 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Main emulator module where most things are controlled. * - * Version: @(#)pc.c 1.0.69 2019/04/23 + * Version: @(#)pc.c 1.0.71 2019/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -798,7 +798,6 @@ INFO("PC: set_speed(%i) -> speed %lu\n", turbo, speed); * timer system is built around the CPU clock as a * base unit. So, if we change that, everything does.. */ - nvr_period_recalc(); } @@ -910,7 +909,6 @@ pc_init(void) timer_reset(); - keyboard_init(); joystick_init(); video_init(); @@ -1037,8 +1035,8 @@ pc_reset_hard_init(void) isartc_reset(); /* Reset some basic devices. */ - mouse_reset(); keyboard_reset(); + mouse_reset(); /* Reset sound system. This MAY add a game port, so before joystick! */ sound_reset(); diff --git a/src/ui/ui.h b/src/ui/ui.h index 127f865..e30d596 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -8,11 +8,11 @@ * * Define the various UI functions. * - * Version: @(#)ui.h 1.0.16 2018/11/20 + * Version: @(#)ui.h 1.0.17 2019/04/26 * * Author: Fred N. van Kempen, * - * Copyright 2017,2018 Fred N. van Kempen. + * Copyright 2017-2019 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the @@ -154,6 +154,7 @@ extern void ui_show_cursor(int on); extern void ui_show_render(int on); extern wchar_t *ui_window_title(const wchar_t *s); extern int ui_fdd_icon(int type); +extern void ui_set_kbd_state(int flags); extern void menu_add_item(int idm, int type, int id, const wchar_t *str); extern void menu_enable_item(int idm, int val); extern void menu_set_item(int idm, int val); diff --git a/src/ui/ui_misc.c b/src/ui/ui_misc.c index 32c3396..2d4ffc5 100644 --- a/src/ui/ui_misc.c +++ b/src/ui/ui_misc.c @@ -8,11 +8,11 @@ * * Misc stuff for UI, doesn't fit anywhere else.. * - * Version: @(#)ui_misc.c 1.0.1 2018/09/29 + * Version: @(#)ui_misc.c 1.0.2 2019/04/26 * * Author: Fred N. van Kempen, * - * Copyright 2018 Fred N. van Kempen. + * Copyright 2018,2019 Fred N. van Kempen. * * Redistribution and use in source and binary forms, with * or without modification, are permitted provided that the @@ -54,6 +54,15 @@ #include "ui.h" +/* Update the UI and/or host for the active keyboard state. */ +void +ui_set_kbd_state(int flags) +{ + /* First of all, update our status bar. */ + ui_sb_kbstate(flags); +} + + /* Return icon number based on drive type. */ int ui_fdd_icon(int type)