--- uae/src/cia.c 2018/04/24 16:38:39 1.1.1.1 +++ uae/src/cia.c 2018/04/24 16:39:05 1.1.1.2 @@ -42,17 +42,17 @@ static UBYTE clock_control_d = RTC_D_ADJ static UBYTE clock_control_e = 0; static UBYTE clock_control_f = RTC_F_24_12; -static UBYTE ciaaicr,ciaaimask,ciabicr,ciabimask; -static UBYTE ciaacra,ciaacrb,ciabcra,ciabcrb; -static ULONG ciaata,ciaatb,ciabta,ciabtb; +UBYTE ciaaicr,ciaaimask,ciabicr,ciabimask; +UBYTE ciaacra,ciaacrb,ciabcra,ciabcrb; +ULONG ciaata,ciaatb,ciabta,ciabtb; static UWORD ciaala,ciaalb,ciabla,ciablb; -static ULONG ciaatod,ciabtod,ciaatol,ciabtol,ciaaalarm,ciabalarm; +ULONG ciaatod,ciabtod,ciaatol,ciabtol,ciaaalarm,ciabalarm; static int ciaatodon, ciabtodon; -static int ciaatlatch,ciabtlatch; +int ciaatlatch,ciabtlatch; static UBYTE ciaapra,ciaaprb,ciaadra,ciaadrb,ciaasdr; static UBYTE ciabpra,ciabprb,ciabdra,ciabdrb,ciabsdr; static int div10; -static int kbstate, kback; +static int kbstate, kback, ciaasdr_unread = 0; static int prtopen; static FILE *prttmp; @@ -231,7 +231,7 @@ void diskindex_handler(void) void CIA_hsync_handler(void) { - static int keytime = 0; + static int keytime = 0, sleepyhead = 0; if (ciabtodon) ciabtod++; @@ -241,20 +241,40 @@ void CIA_hsync_handler(void) ciabicr |= 4; RethinkICRB(); } if (keys_available() && kback && (++keytime & 15) == 0) { - switch(kbstate) { - case 0: - ciaasdr = (BYTE)~0xFB; /* aaarghh... stupid compiler */ - kbstate++; - break; - case 1: - kbstate++; - ciaasdr = (BYTE)~0xFD; - break; - case 2: - ciaasdr = ~get_next_key(); - break; - } - ciaaicr |= 8; RethinkICRA(); + /* + * This hack lets one possible ciaaicr cycle go by without any key + * being read, for every cycle in which a key is pulled out of the + * queue. If no hack is used, a lot of key events just get lost + * when you type fast. With a simple hack that waits for ciaasdr + * to be read before feeding it another, it will keep up until the + * queue gets about 14 characters ahead and then lose events, and + * the mouse pointer will freeze while typing is being taken in. + * With this hack, you can type 30 or 40 characters ahead with little + * or no lossage, and the mouse doesn't get stuck. The tradeoff is + * that the total slowness of typing appearing on screen is worse. + */ + if (ciaasdr_unread == 2) + ciaasdr_unread = 0; + else if (ciaasdr_unread == 0) { + switch (kbstate) { + case 0: + ciaasdr = (BYTE)~0xFB; /* aaarghh... stupid compiler */ + kbstate++; + break; + case 1: + kbstate++; + ciaasdr = (BYTE)~0xFD; + break; + case 2: + ciaasdr = ~get_next_key(); + ciaasdr_unread = 1; /* interlock to prevent lost keystrokes */ + break; + } + ciaaicr |= 8; + RethinkICRA(); + sleepyhead = 0; + } else if (!(++sleepyhead & 15)) + ciaasdr_unread = 0; /* give up on this key event after unread for a long time */ } } @@ -304,6 +324,7 @@ static UBYTE ReadCIAA(UWORD addr) ciaatlatch = 1; ciaatol = ciaatod; /* ??? only if not already latched? */ return (ciaatol >> 16) & 0xff; case 12: + if (ciaasdr == 1) ciaasdr_unread = 2; return ciaasdr; case 13: tmp = ciaaicr; ciaaicr = 0; RethinkICRA(); return tmp; @@ -381,7 +402,7 @@ static void WriteCIAA(UWORD addr,UBYTE v fflush (prttmp); #endif if (val==0x04) { -#if defined(__unix) && !defined(__bebox__) && !defined(__DOS__) +#if defined(__unix) && !defined(__BEOS__) && !defined(__DOS__) pclose (prttmp); #else fclose (prttmp); @@ -389,7 +410,7 @@ static void WriteCIAA(UWORD addr,UBYTE v prtopen = 0; } } else { -#if defined(__unix) && !defined(__bebox__) && !defined(__DOS__) +#if defined(__unix) && !defined(__BEOS__) && !defined(__DOS__) prttmp=(FILE *)popen ((char *)prtname,"w"); #else prttmp=(FILE *)fopen ((char *)prtname,"wb"); @@ -594,6 +615,7 @@ void CIA_reset(void) kbstate = 0; ciaatlatch = ciabtlatch = 0; + ciaapra = 2; ciaatod = ciabtod = 0; ciaatodon = ciabtodon = 0; ciaaicr = ciabicr = ciaaimask = ciabimask = 0; ciaacra = ciaacrb = ciabcra = ciabcrb = 0x4; /* outmode = toggle; */ @@ -601,8 +623,8 @@ void CIA_reset(void) div10 = 0; lastdiv10 = 0; CIA_calctimers(); - - ciabpra = 0xDC; + ciabpra = 0x8C; + /*fprintf (stderr," CIA-Reset\n ");*/ } void dumpcia(void) @@ -618,11 +640,11 @@ void dumpcia(void) /* CIA memory access */ static ULONG cia_lget(CPTR) REGPARAM; -static UWORD cia_wget(CPTR) REGPARAM; -static UBYTE cia_bget(CPTR) REGPARAM; +static ULONG cia_wget(CPTR) REGPARAM; +static ULONG cia_bget(CPTR) REGPARAM; static void cia_lput(CPTR, ULONG) REGPARAM; -static void cia_wput(CPTR, UWORD) REGPARAM; -static void cia_bput(CPTR, UBYTE) REGPARAM; +static void cia_wput(CPTR, ULONG) REGPARAM; +static void cia_bput(CPTR, ULONG) REGPARAM; addrbank cia_bank = { default_alget, default_awget, @@ -631,17 +653,17 @@ addrbank cia_bank = { default_xlate, default_check }; -ULONG cia_lget(CPTR addr) +ULONG REGPARAM2 cia_lget(CPTR addr) { return cia_bget(addr+3); } -UWORD cia_wget(CPTR addr) +ULONG REGPARAM2 cia_wget(CPTR addr) { return cia_bget(addr+1); } -UBYTE cia_bget(CPTR addr) +ULONG REGPARAM2 cia_bget(CPTR addr) { if ((addr & 0x3001) == 0x2001) return ReadCIAA((addr & 0xF00) >> 8); @@ -650,17 +672,17 @@ UBYTE cia_bget(CPTR addr) return 0; } -void cia_lput(CPTR addr, ULONG value) +void REGPARAM2 cia_lput(CPTR addr, ULONG value) { cia_bput(addr+3,value); /* FIXME ? */ } -void cia_wput(CPTR addr, UWORD value) +void REGPARAM2 cia_wput(CPTR addr, ULONG value) { cia_bput(addr+1,value); } -void cia_bput(CPTR addr, UBYTE value) +void REGPARAM2 cia_bput(CPTR addr, ULONG value) { if ((addr & 0x3001) == 0x2001) WriteCIAA((addr & 0xF00) >> 8,value); @@ -671,11 +693,11 @@ void cia_bput(CPTR addr, UBYTE value) /* battclock memory access */ static ULONG clock_lget(CPTR) REGPARAM; -static UWORD clock_wget(CPTR) REGPARAM; -static UBYTE clock_bget(CPTR) REGPARAM; +static ULONG clock_wget(CPTR) REGPARAM; +static ULONG clock_bget(CPTR) REGPARAM; static void clock_lput(CPTR, ULONG) REGPARAM; -static void clock_wput(CPTR, UWORD) REGPARAM; -static void clock_bput(CPTR, UBYTE) REGPARAM; +static void clock_wput(CPTR, ULONG) REGPARAM; +static void clock_bput(CPTR, ULONG) REGPARAM; addrbank clock_bank = { default_alget, default_awget, @@ -684,17 +706,17 @@ addrbank clock_bank = { default_xlate, default_check }; -ULONG clock_lget(CPTR addr) +ULONG REGPARAM2 clock_lget(CPTR addr) { return clock_bget(addr+3); } -UWORD clock_wget(CPTR addr) +ULONG REGPARAM2 clock_wget(CPTR addr) { return clock_bget(addr+1); } -UBYTE clock_bget(CPTR addr) +ULONG REGPARAM2 clock_bget(CPTR addr) { time_t t=time(0); struct tm *ct; @@ -722,17 +744,17 @@ UBYTE clock_bget(CPTR addr) return 0; } -void clock_lput(CPTR addr, ULONG value) +void REGPARAM2 clock_lput(CPTR addr, ULONG value) { /* No way */ } -void clock_wput(CPTR addr, UWORD value) +void REGPARAM2 clock_wput(CPTR addr, ULONG value) { /* No way */ } -void clock_bput(CPTR addr, UBYTE value) +void REGPARAM2 clock_bput(CPTR addr, ULONG value) { switch (addr & 0x3f) {