[LMH] Lisp timing issue solved
Björn Victor
Bjorn@Victor.se
Mon, 05 Dec 2005 18:19:46 +0100
This is a multi-part message in MIME format.
--------------010508050306010704020507
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Daniel Seagraves wrote:
> On Mon, 5 Dec 2005 nyef@lisphacker.com wrote:
>=20
>=20
>>I'd wonder if it has more to do with the frequency at which you check f=
or
>>keyboard events than with any of the lisp-side timing stuff?
>=20
>=20
> It might be. Inserting delays between key down and up events doesn't se=
em
> to help; I'll screw around with the timing and see what I get.
Actually I think it was just the keymap which was screwed up, so Lisp
didn't see keys coming up correctly. I cleaned up the code just a
little, mostly in order to understand it better (attached, including
fixes to initialize the RTC so Lisp gets the right time).
Anyway, it seems to work better for me. YMMV?
-- Bj=F6rn
--------------010508050306010704020507
Content-Type: text/plain;
name="sib.c.patch.2"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="sib.c.patch.2"
*** sib.c.~1~ 2005-12-05 13:06:07.000000000 +0100
--- sib.c 2005-12-05 18:16:55.000000000 +0100
***************
*** 26,31 ****
--- 26,34 ----
#include <linux/vt.h>
#include <linux/kd.h>
#endif
+ #ifdef DISPLAY_SDL
+ #include <SDL/SDL_keysym.h>
+ #endif
// Set host framebuffer resolution here
#ifndef FB_WIDTH
***************
*** 248,253 ****
--- 251,279 ----
// **** NEW RTC / ITIMER CODE ****
+ unsigned char dec_to_bcd(int n) {
+ return (((((n)/10)&0xf)<<4)|(((n)%10)&0xf));
+ }
+ void
+ sib_rtc_initialize()
+ {
+ time_t tnow = time(NULL);
+ struct tm *now = localtime(&tnow);
+
+ sib_rtc_sec = dec_to_bcd(now->tm_sec);
+ sib_rtc_min = dec_to_bcd(now->tm_min);
+ sib_rtc_hour = dec_to_bcd(now->tm_hour);
+ sib_rtc_dow = dec_to_bcd(now->tm_wday);
+ if (now->tm_mon == 1 && now->tm_mday == 29)
+ sib_rtc_date = dec_to_bcd(now->tm_mday-1);
+ else
+ sib_rtc_date = dec_to_bcd(now->tm_mday);
+ sib_rtc_month = sib_ram_month = dec_to_bcd(now->tm_mon+1);
+ /* Hack */
+ sib_ram_10ms = dec_to_bcd((now->tm_year)%100);
+ sib_ram_100ns = (((now->tm_year/100))<<5) | (((now->tm_mon == 1 && now->tm_mday == 29)&1)<<4);
+ }
+
void sib_updateslow(){
// Add a second
sib_rtc_sec++;
***************
*** 374,470 ****
init_sdl_to_keysym_map(void)
{
map[0x12] = 1;
! map['1'] = 0x24a4; // 1
! map['2'] = 0x25a5; // 2
! map['3'] = 0x26a6; // 3
! map['4'] = 0x27a7; // 4
! map['5'] = 0x28a8; // 5
! map['6'] = 0x29a9; // 6
! map['7'] = 0x2aaa; // 7
! map['8'] = 0x2bab; // 8
! map['9'] = 0x2cac; // 9
! map['0'] = 0x2dad; // 0
! map['-'] = 0x2eae; // -
! map['+'] = 0x2faf; // +
!
! map['Q'] = 0x39b9; // Q
! map['W'] = 0x3aba; // W
! map['E'] = 0x3bbb; // E
! map['R'] = 0x3cbc; // R
! map['T'] = 0x3dbd; // T
! map['Y'] = 0x3ebe; // Y
! map['U'] = 0x3fbf; // U
! map['I'] = 0x40c0; // I
! map['O'] = 0x41c1; // O
! map['P'] = 0x42c2; // P
!
! map['A'] = 0x50d0; // A
! map['S'] = 0x51d1; // S
! map['D'] = 0x52d2; // D
! map['F'] = 0x53d3; // F
! map['G'] = 0x54d4; // G
! map['H'] = 0x55d5; // H
! map['J'] = 0x56d6; // J
! map['K'] = 0x57d7; // K
! map['L'] = 0x58d8; // L
!
! map['Z'] = 0x68e8; // Z
! map['X'] = 0x69e9; // X
! map['C'] = 0x6aea; // C
! map['V'] = 0x6beb; // V
! map['B'] = 0x6cec; // B
! map['N'] = 0x6ded; // N
! map['M'] = 0x6eee; // M
!
! map['['] = 0x43c3;
! map[']'] = 0x1b9b;
! map[';'] = 0x27a7;
! map['~'] = 0x29a9; // TILDE - MAPS TO SYMBOL
! map['\\'] = 0x46c6;
! map[' '] = 0x7bfb;
! map[','] = 0x6fef;
! map['.'] = 0x70f0;
map['/'] = 0x71fa;
! map[';'] = 0x59d9;
! map['\''] = 0x5ada;
! map['='] = 0x32b2;
! map['+'] = 0x33b3;
! map[0x0d] = 0x5bdb; // ENTER
! map[0x08] = 0x4fcf; // BACKSPACE (MAPS TO RUBOUT)
! map[0x09] = 0x35b5; // TAB
! map[0x1b] = 0x23a3; // ESC
!
! map[273] = 0x47c7; // up arrow
! map[274] = 0x75f5; // down arrow
! map[275] = 0x5fdf; // right arrow
! map[276] = 0x5ddd; // left arrow
! map[277] = 0x1595; /* HOME - F1 */
! map[278] = 0x1494; /* INSERT - F2 */
!
! map[280] = 0x76f6; /* PAGEUP - ABORT */
!
! map[282] = 0x0888; /* F1 - SYSTEM */
! map[283] = 0x0989; /* F2 - NETWORK */
! map[284] = 0x0a8a; /* F3 - STATUS */
! map[285] = 0x0b8b; /* F4 - TERMINAL */
! map[286] = 0x0181; /* F5 - HELP */
!
! map[301] = 0x0383; // CAPSLOCK
!
! map[303] = 0x67e7; // RIGHT SHIFT
! map[304] = 0x72f2; // LEFT SHIFT
! map[303] = 0xe767; // RIGHT SHIFT
! map[304] = 0xf272; // LEFT SHIFT
! map[305] = 0x1c9c; // RIGHT CTRL
! map[306] = 0x1c9c; // LEFT CTRL
! map[307] = 0x1b9b; // RIGHT ALT (META)
! map[308] = 0x1b9b; // LEFT ALT (META)
- map[311] = 0x1a9a; // RIGHT windows (SUPER)
- map[312] = 0x1a9a; // LEFT windows (SUPER)
}
unsigned char lastchar=0;
--- 400,501 ----
init_sdl_to_keysym_map(void)
{
map[0x12] = 1;
! map['1'] = 0x24; // 1
! map['2'] = 0x25; // 2
! map['3'] = 0x26; // 3
! map['4'] = 0x27; // 4
! map['5'] = 0x28; // 5
! map['6'] = 0x29; // 6
! map['7'] = 0x2a; // 7
! map['8'] = 0x2b; // 8
! map['9'] = 0x2c; // 9
! map['0'] = 0x2d; // 0
! map['-'] = 0x2e; // -
! map['+'] = 0x2f; // +
!
! map['Q'] = 0x39; // Q
! map['W'] = 0x3a; // W
! map['E'] = 0x3b; // E
! map['R'] = 0x3c; // R
! map['T'] = 0x3d; // T
! map['Y'] = 0x3e; // Y
! map['U'] = 0x3f; // U
! map['I'] = 0x40; // I
! map['O'] = 0x41; // O
! map['P'] = 0x42; // P
!
! map['A'] = 0x50; // A
! map['S'] = 0x51; // S
! map['D'] = 0x52; // D
! map['F'] = 0x53; // F
! map['G'] = 0x54; // G
! map['H'] = 0x55; // H
! map['J'] = 0x56; // J
! map['K'] = 0x57; // K
! map['L'] = 0x58; // L
!
! map['Z'] = 0x68; // Z
! map['X'] = 0x69; // X
! map['C'] = 0x6a; // C
! map['V'] = 0x6b; // V
! map['B'] = 0x6c; // B
! map['N'] = 0x6d; // N
! map['M'] = 0x6e; // M
!
! map['['] = 0x43;
! map[']'] = 0x1b;
! map[';'] = 0x27;
! map['~'] = 0x29; // TILDE - MAPS TO SYMBOL
! map['\\'] = 0x46;
! map[' '] = 0x7b;
! map[','] = 0x6f;
! map['.'] = 0x70;
map['/'] = 0x71fa;
! map[';'] = 0x59;
! map['\''] = 0x5a;
!
! map['='] = 0x32;
! map['+'] = 0x33;
! map[SDLK_RETURN] = 0x5b; // ENTER
! map[SDLK_BACKSPACE] = 0x4f; // BACKSPACE (MAPS TO RUBOUT)
! map[SDLK_TAB] = 0x35; // TAB
! map[SDLK_ESCAPE] = 0x23; // ESC
!
! map[SDLK_UP] = 0x47; // up arrow
! map[SDLK_DOWN] = 0x75; // down arrow
! map[SDLK_RIGHT] = 0x5f; // right arrow
! map[SDLK_LEFT] = 0x5d; // left arrow
! map[SDLK_HOME] = 0x15; /* HOME - F1 */
! map[SDLK_INSERT] = 0x14; /* INSERT - F2 */
!
! map[SDLK_PAGEUP] = 0x4c; /* PAGEUP - ABORT */
! map[SDLK_PAGEDOWN] = 0x21; /* PAGEDOWN - RESUME */
!
! map[SDLK_F1] = 0x08; /* F1 - SYSTEM */
! map[SDLK_F2] = 0x09; /* F2 - NETWORK */
! map[SDLK_F3] = 0x0a; /* F3 - STATUS */
! map[SDLK_F4] = 0x0b; /* F4 - TERMINAL */
! map[SDLK_F5] = 0x01; /* F5 - HELP */
! map[SDLK_F6] = 0x0e; /* F6 - Clear Input */
!
! map[SDLK_CAPSLOCK] = 0x03; // CAPSLOCK
!
! map[SDLK_RSHIFT] = 0x67e7; // RIGHT SHIFT
! map[SDLK_LSHIFT] = 0x72f2; // LEFT SHIFT
! #if 1
! map[SDLK_RSHIFT] = 0xe767; // RIGHT SHIFT
! map[SDLK_LSHIFT] = 0xf272; // LEFT SHIFT
! #endif
! map[SDLK_RCTRL] = 0x1c; // RIGHT CTRL
! map[SDLK_LCTRL] = 0x1c; // LEFT CTRL
! map[SDLK_RALT] = 0x1b; // RIGHT ALT (META)
! map[SDLK_LALT] = 0x1b; // LEFT ALT (META)
! map[SDLK_RSUPER] = 0x1a; // RIGHT windows (SUPER)
! map[SDLK_LSUPER] = 0x1a; // LEFT windows (SUPER)
}
unsigned char lastchar=0;
***************
*** 497,503 ****
if (sdlchar >= 'a' && sdlchar <= 'z')
sdlchar -= ' ';
! outchar = down ? (map[sdlchar] >> 8) : (map[sdlchar] & 0xff);
if (outchar == 0) {
logmsgf("Keystroke lost (%x) - unmapped keycode\n", sdlchar);
--- 528,537 ----
if (sdlchar >= 'a' && sdlchar <= 'z')
sdlchar -= ' ';
! if (down && map[sdlchar] > 0xff)
! outchar = map[sdlchar] >> 8;
! else
! outchar = map[sdlchar] | (down ? 0x80 : 0);
if (outchar == 0) {
logmsgf("Keystroke lost (%x) - unmapped keycode\n", sdlchar);
***************
*** 908,913 ****
--- 942,950 ----
keyboard_usart_rx_fifo[0]=0;
keyboard_usart_rx_bot=0;
keyboard_usart_rx_top=0;
+
+ sib_rtc_initialize();
+
/* CONSOLE SETUP */
// Arrange for SIGIO on IO availability
signal(SIGIO,kbdhandler);
***************
*** 1191,1206 ****
printf("Mouse initialization completed.\n");
#endif
- // Clear screen and VRAM
- bzero(framebuffer,screensize);
- bzero(VRAM,0x20000);
-
#ifdef DISPLAY_SDL
{
! extern void sdl_init(unsigned long int *ps, char **pfb);
! sdl_init(&screensize, &framebuffer);
}
#endif
}
void redraw_display(){
--- 1228,1243 ----
printf("Mouse initialization completed.\n");
#endif
#ifdef DISPLAY_SDL
{
! extern void sdl_init(unsigned long int *ps, char **pfb, int width, int height);
! sdl_init(&screensize, &framebuffer, FB_WIDTH, FB_HEIGHT);
}
#endif
+ // Clear screen and VRAM
+ bzero(framebuffer,screensize);
+ bzero(VRAM,0x20000);
+
}
void redraw_display(){
***************
*** 1777,1783 ****
case 0xF20000: // Mouse Y-Position Register
case 0xF20001: // Mouse Y-Position Register, low-halfword mode
NUbus_Data = sib_mouse_y_pos&0xFFFF;
! // logmsgf("READ MOUSE Y POS - 0x%lX\n",NUbus_Data);
NUbus_acknowledge=1;
sib_mouse_moved_sent = 0;
return;
--- 1814,1820 ----
case 0xF20000: // Mouse Y-Position Register
case 0xF20001: // Mouse Y-Position Register, low-halfword mode
NUbus_Data = sib_mouse_y_pos&0xFFFF;
! //logmsgf("READ MOUSE Y POS - 0x%lX\n",NUbus_Data);
NUbus_acknowledge=1;
sib_mouse_moved_sent = 0;
return;
***************
*** 1785,1791 ****
case 0xF20005: // Mouse X-Position Register, low-halfword mode
NUbus_Data = sib_mouse_x_pos&0xFFFF;
NUbus_acknowledge=1;
! // logmsgf("READ MOUSE X POS - 0x%lX\n",NUbus_Data);
sib_mouse_moved_sent = 0;
return;
case 0xF20008: // Mouse Keyswitch/Motion Data Register
--- 1822,1828 ----
case 0xF20005: // Mouse X-Position Register, low-halfword mode
NUbus_Data = sib_mouse_x_pos&0xFFFF;
NUbus_acknowledge=1;
! //logmsgf("READ MOUSE X POS - 0x%lX\n",NUbus_Data);
sib_mouse_moved_sent = 0;
return;
case 0xF20008: // Mouse Keyswitch/Motion Data Register
***************
*** 1812,1818 ****
}else{
// Otherwise, just return the register intact.
NUbus_Data = sib_mouse_motion_reg;
! // logmsgf("READ MOUSE MOTION REG - 0x%lX\n",NUbus_Data);
}
}
NUbus_acknowledge=1;
--- 1849,1855 ----
}else{
// Otherwise, just return the register intact.
NUbus_Data = sib_mouse_motion_reg;
! //logmsgf("READ MOUSE MOTION REG - 0x%lX\n",NUbus_Data);
}
}
NUbus_acknowledge=1;
***************
*** 1873,1878 ****
--- 1910,1923 ----
NUbus_Data = sib_vox_data_reg&0xFFFF;
NUbus_acknowledge=1;
return;
+ case 0xF80000:
+ NUbus_Data = sib_rtc_100ns;
+ NUbus_acknowledge=1;
+ return;
+ case 0xF80004:
+ NUbus_Data = sib_rtc_10ms;
+ NUbus_acknowledge=1;
+ return;
case 0xF80008:
NUbus_Data = sib_rtc_sec;
NUbus_acknowledge=1;
***************
*** 1899,1910 ****
return;
case 0xF80020:
NUbus_Data = sib_ram_100ns;
! logmsgf("SIB: RAM 100NS RD: %X\n",sib_ram_100ns);
NUbus_acknowledge=1;
return;
case 0xF80024:
NUbus_Data = sib_ram_10ms;
! logmsgf("SIB: RAM 10MS RD: %X\n",sib_ram_10ms);
NUbus_acknowledge=1;
return;
case 0xF80050: // RTC Update Status Bit
--- 1944,1979 ----
return;
case 0xF80020:
NUbus_Data = sib_ram_100ns;
! //logmsgf("SIB: RAM 100NS RD: %X\n",sib_ram_100ns);
NUbus_acknowledge=1;
return;
case 0xF80024:
NUbus_Data = sib_ram_10ms;
! //logmsgf("SIB: RAM 10MS RD: %X\n",sib_ram_10ms);
! NUbus_acknowledge=1;
! return;
! case 0xF80028:
! NUbus_Data = sib_ram_sec;
! NUbus_acknowledge=1;
! return;
! case 0xF8002C:
! NUbus_Data = sib_ram_min;
! NUbus_acknowledge=1;
! return;
! case 0xF80030:
! NUbus_Data = sib_ram_hour;
! NUbus_acknowledge=1;
! return;
! case 0xF80034:
! NUbus_Data = sib_ram_dow;
! NUbus_acknowledge=1;
! return;
! case 0xF80038:
! NUbus_Data = sib_ram_date;
! NUbus_acknowledge=1;
! return;
! case 0xF8003C: /* This one is essential */
! NUbus_Data = sib_ram_month;
NUbus_acknowledge=1;
return;
case 0xF80050: // RTC Update Status Bit
***************
*** 2060,2070 ****
--- 2129,2149 ----
NUbus_acknowledge=1;
return;
+ case 0xF80000: // RTC 100ns counter
+ NUbus_Data = sib_rtc_100ns&0xFF;
+ // logmsgf("SIB: RTC 100NS RD: %X\n",sib_rtc_10ms);
+ NUbus_acknowledge=1;
+ return;
case 0xF80004: // RTC 10ms counter
NUbus_Data = sib_rtc_10ms&0xFF;
// logmsgf("SIB: RTC 10MS RD: %X\n",sib_rtc_10ms);
NUbus_acknowledge=1;
return;
+ case 0xF80008: // RTC sec counter
+ NUbus_Data = sib_rtc_sec;
+ // logmsgf("SIB: sec RD: %X\n",sib_rtc_sec);
+ NUbus_acknowledge=1;
+ return;
case 0xF8000C: // RTC 1min counter
NUbus_Data = sib_rtc_min;
NUbus_acknowledge=1;
***************
*** 2087,2098 ****
return;
case 0xF80020:
NUbus_Data = sib_ram_100ns;
! logmsgf("SIB: RAM 100NS RD: %X\n",sib_ram_100ns);
NUbus_acknowledge=1;
return;
case 0xF80024:
NUbus_Data = sib_ram_10ms;
! logmsgf("SIB: RAM 10MS RD: %X\n",sib_ram_10ms);
NUbus_acknowledge=1;
return;
case 0xF80028:
--- 2166,2177 ----
return;
case 0xF80020:
NUbus_Data = sib_ram_100ns;
! //logmsgf("SIB: RAM 100NS RD: %X\n",sib_ram_100ns);
NUbus_acknowledge=1;
return;
case 0xF80024:
NUbus_Data = sib_ram_10ms;
! //logmsgf("SIB: RAM 10MS RD: %X\n",sib_ram_10ms);
NUbus_acknowledge=1;
return;
case 0xF80028:
***************
*** 2524,2530 ****
return;
case 0xF80024:
sib_ram_10ms = NUbus_Data&0xFF;
! logmsgf("SIB: RAM 10MS WT: %X\n",sib_ram_10ms);
NUbus_acknowledge=1;
return;
case 0xF80028:
--- 2603,2609 ----
return;
case 0xF80024:
sib_ram_10ms = NUbus_Data&0xFF;
! //logmsgf("SIB: RAM 10MS WT: %X\n",sib_ram_10ms);
NUbus_acknowledge=1;
return;
case 0xF80028:
***************
*** 3053,3059 ****
return;
case 0xF80024:
sib_ram_10ms = NUbus_Data;
! logmsgf("SIB: RAM 10MS WT: %X\n",sib_ram_10ms);
NUbus_acknowledge=1;
return;
case 0xF80028:
--- 3132,3138 ----
return;
case 0xF80024:
sib_ram_10ms = NUbus_Data;
! //logmsgf("SIB: RAM 10MS WT: %X\n",sib_ram_10ms);
NUbus_acknowledge=1;
return;
case 0xF80028:
--------------010508050306010704020507--