[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--