diff --git a/src/cioxtrn/cioxtrn.c b/src/cioxtrn/cioxtrn.c
index ee060ff9a67948cc021e44ba44d7610c544b6b83..5a6bd049c8226e814f4f972f33a6cc1d6a9b5481 100644
--- a/src/cioxtrn/cioxtrn.c
+++ b/src/cioxtrn/cioxtrn.c
@@ -2,6 +2,7 @@
 #include <stdio.h>
 #include "genwrap.h"
 #include "ciolib.h"
+#include "keys.h"
 
 HANDLE				console_output;
 HANDLE				console_input;
@@ -68,14 +69,82 @@ void input_thread(void *args)
 			ckey.Event.KeyEvent.uChar.AsciiChar=key;
 		}
 		else {
-			ckey.Event.KeyEvent.wVirtualKeyCode=MapVirtualKey(key, 1);
-			ckey.Event.KeyEvent.wVirtualScanCode=key;
+			ckey.Event.KeyEvent.dwControlKeyState=0;
 			ckey.Event.KeyEvent.uChar.AsciiChar=0;
-
-			if(key<' ')
-				ckey.Event.KeyEvent.dwControlKeyState=LEFT_CTRL_PRESSED;
-			else
-				ckey.Event.KeyEvent.dwControlKeyState=0;
+			switch(key) {
+			case CIO_KEY_HOME:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_HOME;
+				break;
+			case CIO_KEY_UP:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_UP;
+				break;
+			case CIO_KEY_END:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_END;
+				break;
+			case CIO_KEY_DOWN:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_DOWN;
+				break;
+			case CIO_KEY_IC:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_INSERT;
+				break;
+			case CIO_KEY_DC:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_DELETE;
+				break;
+			case CIO_KEY_LEFT:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_LEFT;
+				break;
+			case CIO_KEY_RIGHT:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_RIGHT;
+				break;
+			case CIO_KEY_PPAGE:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_PRIOR;
+				break;
+			case CIO_KEY_NPAGE:
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_NEXT;
+				break;
+			case CIO_KEY_F(1):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F1;
+				break;
+			case CIO_KEY_F(2):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F2;
+				break;
+			case CIO_KEY_F(3):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F3;
+				break;
+			case CIO_KEY_F(4):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F4;
+				break;
+			case CIO_KEY_F(5):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F5;
+				break;
+			case CIO_KEY_F(6):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F6;
+				break;
+			case CIO_KEY_F(7):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F7;
+				break;
+			case CIO_KEY_F(8):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F8;
+				break;
+			case CIO_KEY_F(9):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F9;
+				break;
+			case CIO_KEY_F(10):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F10;
+				break;
+			case CIO_KEY_F(11):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F11;
+				break;
+			case CIO_KEY_F(12):
+				ckey.Event.KeyEvent.wVirtualKeyCode=VK_F12;
+				break;
+			default:
+				continue;
+			}
+			ckey.Event.KeyEvent.wRepeatCount=1;
+			ckey.Event.KeyEvent.wVirtualScanCode=MapVirtualKey(ckey.Event.KeyEvent.wVirtualKeyCode, 0);
+			ckey.Event.KeyEvent.uChar.AsciiChar=0;
+			ckey.Event.KeyEvent.dwControlKeyState=0;
 		}
 		if(alt)
 			ckey.Event.KeyEvent.dwControlKeyState |= LEFT_ALT_PRESSED;