From 7fdaeb844bac9d9232b3768520ab2b17d7ba2c1b Mon Sep 17 00:00:00 2001 From: Will Scullin Date: Sun, 1 Oct 2017 11:17:30 -0700 Subject: [PATCH] Improved keyboard behavior, including iOS fixes. --- js/apple2io.js | 4 +-- js/main2.js | 2 +- js/main2e.js | 2 +- js/ui/keyboard.js | 73 +++++++++++++++++++++++++++++++---------------- 4 files changed, 52 insertions(+), 29 deletions(-) diff --git a/js/apple2io.js b/js/apple2io.js index 3794d6b..7638332 100644 --- a/js/apple2io.js +++ b/js/apple2io.js @@ -246,7 +246,7 @@ function Apple2IO(cpu, callbacks) } _key = val.charCodeAt(0) | 0x80; } - result = _keyDown ? 0x80 : 0x00; + result = (_keyDown ? 0x80 : 0x00) | _key; break; case LOC.KEYBOARD: result = _key; @@ -436,7 +436,6 @@ function Apple2IO(cpu, callbacks) keyUp: function apple2io_keyUp() { _keyDown = false; - _key = 0; }, buttonDown: function apple2io_buttonDown(b) { @@ -456,6 +455,7 @@ function Apple2IO(cpu, callbacks) _cycles_per_sample = _hz / _rate; }, + setKeyBuffer: function apple2io_setKeyBuffer(buffer) { _buffer = buffer.split(''); if (_buffer.length > 0) { diff --git a/js/main2.js b/js/main2.js index 4e25217..0292525 100644 --- a/js/main2.js +++ b/js/main2.js @@ -822,7 +822,7 @@ function _keydown(evt) { var key = keyboard.mapKeyEvent(evt); if (key != 0xff) { - io.keyDown(key, evt.shiftKey); + io.keyDown(key); } } if (evt.keyCode === 112) { // F1 - Reset diff --git a/js/main2e.js b/js/main2e.js index 18a9fa5..c8481f9 100644 --- a/js/main2e.js +++ b/js/main2e.js @@ -786,7 +786,7 @@ function _keydown(evt) { var key = keyboard.mapKeyEvent(evt); if (key != 0xff) { - io.keyDown(key, evt.shiftKey); + io.keyDown(key); } } if (evt.keyCode === 112) { // F1 - Reset diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index f7c19fe..0369a28 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -147,37 +147,53 @@ function KeyBoard(io, e) { 0xBE: [0x2E, 0x2E, 0x3E], // . - > 0xBF: [0x2F, 0x2F, 0x3F], // / - ? 0xC0: [0x60, 0x60, 0x7E], // ` - ~ - 0xDB: [0x5B, 0x5B, 0x7B], // [ - 0xDC: [0x5C, 0x5C, 0x7C], // \ - 0xDD: [0x5D, 0x5D, 0x7D], // ] + 0xDB: [0x5B, 0x1B, 0x7B], // [ - { + 0xDC: [0x5C, 0x1C, 0x7C], // \ - | + 0xDD: [0x5D, 0x1D, 0x7D], // ] - } 0xDE: [0x27, 0x22, 0x22], // ' - ' 0xFF: [0xFF, 0xFF, 0xFF] // No comma line }; - var keys2 = - [[['1','2','3','4','5','6','7','8','9','0',':','-','RESET'], - ['ESC','Q','W','E','R','T','Y','U','I','O','P','REPT','RETURN'], - ['CTRL','A','S','D','F','G','H','J','K','L',';','←','→'], - ['SHIFT','Z','X','C','V','B','N','M',',','.','/','SHIFT'], - ['POWER', ' ']], - [['!','"','#','$','%','&','\'','(',')','0','*','=','RESET'], - ['ESC','Q','W','E','R','T','Y','U','I','O','@','REPT','RETURN'], - ['CTRL','A','S','D','F','BELL','H','J','K','L','+','←','→'], - ['SHIFT','Z','X','C','V','B','^',']','<','>','?','SHIFT'], - ['POWER', ' ']]]; + var uiKitMap = { + 'Dead': 0xFF, + 'UIKeyInputLeftArrow': 0x08, + 'UIKeyInputRightArrow': 0x15, + 'UIKeyInputUpArrow': 0x0B, + 'UIKeyInputDownArrow': 0x0A, + 'UIKeyInputEscape': 0x1B + }; + + var keys2 = [ + [ + ['1','2','3','4','5','6','7','8','9','0',':','-','RESET'], + ['ESC','Q','W','E','R','T','Y','U','I','O','P','REPT','RETURN'], + ['CTRL','A','S','D','F','G','H','J','K','L',';','←','→'], + ['SHIFT','Z','X','C','V','B','N','M',',','.','/','SHIFT'], + ['POWER', ' '] + ], [ + ['!','"','#','$','%','&','\'','(',')','0','*','=','RESET'], + ['ESC','Q','W','E','R','T','Y','U','I','O','@','REPT','RETURN'], + ['CTRL','A','S','D','F','BELL','H','J','K','L','+','←','→'], + ['SHIFT','Z','X','C','V','B','^',']','<','>','?','SHIFT'], + ['POWER', ' '] + ] + ]; var keys2e = [ - [['ESC','1','2','3','4','5','6','7','8','9','0','-','=','DELETE'], - ['TAB','Q','W','E','R','T','Y','U','I','O','P','[',']','\\'], - ['CTRL','A','S','D','F','G','H','J','K','L',';','"','RETURN'], - ['SHIFT','Z','X','C','V','B','N','M',',','.','/','SHIFT'], - ['LOCK','`','POW','OPEN_APPLE',' ','CLOSED_APPLE','←','→','↓','↑']], - [['ESC','!','@','#','$','%','^','&','*','(',')','_','+','DELETE'], - ['TAB','Q','W','E','R','T','Y','U','I','O','P','{','}','|'], - ['CTRL','A','S','D','F','G','H','J','K','L',':','\'','RETURN'], - ['SHIFT','Z','X','C','V','B','N','M','<','>','?','SHIFT'], - ['CAPS','~','POW','OPEN_APPLE',' ','CLOSED_APPLE','←','→','↓','↑']] + [ + ['ESC','1','2','3','4','5','6','7','8','9','0','-','=','DELETE'], + ['TAB','Q','W','E','R','T','Y','U','I','O','P','[',']','\\'], + ['CTRL','A','S','D','F','G','H','J','K','L',';','"','RETURN'], + ['SHIFT','Z','X','C','V','B','N','M',',','.','/','SHIFT'], + ['LOCK','`','POW','OPEN_APPLE',' ','CLOSED_APPLE','←','→','↓','↑'] + ], [ + ['ESC','!','@','#','$','%','^','&','*','(',')','_','+','DELETE'], + ['TAB','Q','W','E','R','T','Y','U','I','O','P','{','}','|'], + ['CTRL','A','S','D','F','G','H','J','K','L',':','\'','RETURN'], + ['SHIFT','Z','X','C','V','B','N','M','<','>','?','SHIFT'], + ['CAPS','~','POW','OPEN_APPLE',' ','CLOSED_APPLE','←','→','↓','↑'] + ] ]; var keys = e ? keys2e : keys2; @@ -192,7 +208,9 @@ function KeyBoard(io, e) { mapKeyEvent: function keyboard_mapKeyEvent(evt) { var code = evt.keyCode, key = 0xff; - if (code in keymap) { + if (evt.key in uiKitMap) { + key = uiKitMap[evt.key]; + } else if (code in keymap) { key = keymap[code][evt.shiftKey ? 2 : (evt.ctrlKey ? 1 : 0)]; if (capslocked && key >= 0x61 && key <= 0x7A) key -= 0x20; @@ -200,6 +218,11 @@ function KeyBoard(io, e) { debug('Unhandled key = ' + toHex(code)); } + if (key == 0x7F && evt.shiftKey && evt.ctrlKey) { + reset(); + key = 0xff; + } + return key; },