Previous 15994 Revisions Next

r14367 Monday 6th February, 2012 at 20:20:29 UTC by Wilbert Pol
ioport.c: Made the key/paste buffer auto-expand when it becomes full. This makes it possible to paste larger BASIC programs for instance. [Wilbert Pol]
[src/emu]ioport.c

src/emu/ioport.c
r14366r14367
242242   const input_field_config * field[NUM_SIMUL_KEYS];
243243};
244244
245#define KEY_BUFFER_SIZE   4096
246
245247typedef struct _key_buffer key_buffer;
246248struct _key_buffer
247249{
248250   int begin_pos;
249251   int end_pos;
250252   unsigned int status_keydown : 1;
251   unicode_char buffer[4096];
253   int size;
254   unicode_char *buffer;
252255};
253256
254257typedef struct _char_info char_info;
r14366r14367
285288
286289   /* inputx */
287290   inputx_code *codes;
288   key_buffer *keybuffer;
291   key_buffer keybuffer;
289292   emu_timer *inputx_timer;
290293   int (*queue_chars)(running_machine &machine, const unicode_char *text, size_t text_len);
291294   int (*accept_char)(running_machine &machine, unicode_char ch);
r14366r14367
23312334{
23322335   input_port_private *portdata = machine.input_port_data;
23332336   assert(inputx_can_post(machine));
2334   return (key_buffer *)portdata->keybuffer;
2337   return (key_buffer *)&portdata->keybuffer;
23352338}
23362339
23372340
r14366r14367
41764179static void clear_keybuffer(running_machine &machine)
41774180{
41784181   input_port_private *portdata = machine.input_port_data;
4179   portdata->keybuffer = NULL;
4182   portdata->keybuffer.buffer = NULL;
41804183   portdata->queue_chars = NULL;
41814184   portdata->codes = NULL;
41824185}
r14366r14367
41874190{
41884191   input_port_private *portdata = machine.input_port_data;
41894192   portdata->inputx_timer = machine.scheduler().timer_alloc(FUNC(inputx_timerproc));
4190   portdata->keybuffer = auto_alloc_clear(machine, key_buffer);
4193   portdata->keybuffer.begin_pos = 0;
4194   portdata->keybuffer.end_pos = 0;
4195   portdata->keybuffer.status_keydown = 0;
4196   portdata->keybuffer.size = KEY_BUFFER_SIZE;
4197   portdata->keybuffer.buffer = auto_alloc_array(machine, unicode_char, portdata->keybuffer.size);
41914198   machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(clear_keybuffer), &machine));
41924199}
41934200
r14366r14367
41964203void inputx_init(running_machine &machine)
41974204{
41984205   input_port_private *portdata = machine.input_port_data;
4199   portdata->codes = NULL;
42004206   portdata->inputx_timer = NULL;
4201   portdata->queue_chars = NULL;
42024207   portdata->accept_char = NULL;
42034208   portdata->charqueue_empty = NULL;
4204   portdata->keybuffer = NULL;
4209   clear_keybuffer(machine);
42054210
42064211   if (machine.debug_flags & DEBUG_FLAG_ENABLED)
42074212   {
r14366r14367
43264331   }
43274332
43284333   keybuf->buffer[keybuf->end_pos++] = ch;
4329   keybuf->end_pos %= ARRAY_LENGTH(keybuf->buffer);
4334   if ((keybuf->end_pos+1) % keybuf->size == keybuf->begin_pos)
4335   {
4336      // Buffer full
4337      unicode_char *old_buffer = keybuf->buffer;
4338      keybuf->size = keybuf->size + KEY_BUFFER_SIZE;
4339      keybuf->buffer = auto_alloc_array(machine, unicode_char, keybuf->size);
4340      for( int i = keybuf->begin_pos; i <= keybuf->end_pos; i++ )
4341      {
4342         keybuf->buffer[i] = old_buffer[i];
4343      }
4344      auto_free(machine, old_buffer);
4345   }
4346   keybuf->end_pos %= keybuf->size;
43304347}
43314348
43324349
r14366r14367
43354352{
43364353   key_buffer *keybuf;
43374354   keybuf = get_buffer(machine);
4338   return ((keybuf->end_pos + 1) % ARRAY_LENGTH(keybuf->buffer)) == keybuf->begin_pos;
4355   return ((keybuf->end_pos + 1) % keybuf->size) == keybuf->begin_pos;
43394356}
43404357
43414358
r14366r14367
44144431      while((keybuf->begin_pos != keybuf->end_pos) && (*portdata->queue_chars)(machine, &keybuf->buffer[keybuf->begin_pos], 1))
44154432      {
44164433         keybuf->begin_pos++;
4417         keybuf->begin_pos %= ARRAY_LENGTH(keybuf->buffer);
4434         keybuf->begin_pos %= keybuf->size;
44184435
44194436         if (portdata->current_rate != attotime::zero)
44204437            break;
r14366r14367
44274444      {
44284445         keybuf->status_keydown = FALSE;
44294446         keybuf->begin_pos++;
4430         keybuf->begin_pos %= ARRAY_LENGTH(keybuf->buffer);
4447         keybuf->begin_pos %= keybuf->size;
44314448      }
44324449      else
44334450      {

Previous 15994 Revisions Next


© 1998-2018 The MESS Team