src/emu/ioport.c
| r14366 | r14367 | |
| 242 | 242 | const input_field_config * field[NUM_SIMUL_KEYS]; |
| 243 | 243 | }; |
| 244 | 244 | |
| 245 | #define KEY_BUFFER_SIZE 4096 |
| 246 | |
| 245 | 247 | typedef struct _key_buffer key_buffer; |
| 246 | 248 | struct _key_buffer |
| 247 | 249 | { |
| 248 | 250 | int begin_pos; |
| 249 | 251 | int end_pos; |
| 250 | 252 | unsigned int status_keydown : 1; |
| 251 | | unicode_char buffer[4096]; |
| 253 | int size; |
| 254 | unicode_char *buffer; |
| 252 | 255 | }; |
| 253 | 256 | |
| 254 | 257 | typedef struct _char_info char_info; |
| r14366 | r14367 | |
| 285 | 288 | |
| 286 | 289 | /* inputx */ |
| 287 | 290 | inputx_code *codes; |
| 288 | | key_buffer *keybuffer; |
| 291 | key_buffer keybuffer; |
| 289 | 292 | emu_timer *inputx_timer; |
| 290 | 293 | int (*queue_chars)(running_machine &machine, const unicode_char *text, size_t text_len); |
| 291 | 294 | int (*accept_char)(running_machine &machine, unicode_char ch); |
| r14366 | r14367 | |
| 2331 | 2334 | { |
| 2332 | 2335 | input_port_private *portdata = machine.input_port_data; |
| 2333 | 2336 | assert(inputx_can_post(machine)); |
| 2334 | | return (key_buffer *)portdata->keybuffer; |
| 2337 | return (key_buffer *)&portdata->keybuffer; |
| 2335 | 2338 | } |
| 2336 | 2339 | |
| 2337 | 2340 | |
| r14366 | r14367 | |
| 4176 | 4179 | static void clear_keybuffer(running_machine &machine) |
| 4177 | 4180 | { |
| 4178 | 4181 | input_port_private *portdata = machine.input_port_data; |
| 4179 | | portdata->keybuffer = NULL; |
| 4182 | portdata->keybuffer.buffer = NULL; |
| 4180 | 4183 | portdata->queue_chars = NULL; |
| 4181 | 4184 | portdata->codes = NULL; |
| 4182 | 4185 | } |
| r14366 | r14367 | |
| 4187 | 4190 | { |
| 4188 | 4191 | input_port_private *portdata = machine.input_port_data; |
| 4189 | 4192 | 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); |
| 4191 | 4198 | machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(clear_keybuffer), &machine)); |
| 4192 | 4199 | } |
| 4193 | 4200 | |
| r14366 | r14367 | |
| 4196 | 4203 | void inputx_init(running_machine &machine) |
| 4197 | 4204 | { |
| 4198 | 4205 | input_port_private *portdata = machine.input_port_data; |
| 4199 | | portdata->codes = NULL; |
| 4200 | 4206 | portdata->inputx_timer = NULL; |
| 4201 | | portdata->queue_chars = NULL; |
| 4202 | 4207 | portdata->accept_char = NULL; |
| 4203 | 4208 | portdata->charqueue_empty = NULL; |
| 4204 | | portdata->keybuffer = NULL; |
| 4209 | clear_keybuffer(machine); |
| 4205 | 4210 | |
| 4206 | 4211 | if (machine.debug_flags & DEBUG_FLAG_ENABLED) |
| 4207 | 4212 | { |
| r14366 | r14367 | |
| 4326 | 4331 | } |
| 4327 | 4332 | |
| 4328 | 4333 | 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; |
| 4330 | 4347 | } |
| 4331 | 4348 | |
| 4332 | 4349 | |
| r14366 | r14367 | |
| 4335 | 4352 | { |
| 4336 | 4353 | key_buffer *keybuf; |
| 4337 | 4354 | 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; |
| 4339 | 4356 | } |
| 4340 | 4357 | |
| 4341 | 4358 | |
| r14366 | r14367 | |
| 4414 | 4431 | while((keybuf->begin_pos != keybuf->end_pos) && (*portdata->queue_chars)(machine, &keybuf->buffer[keybuf->begin_pos], 1)) |
| 4415 | 4432 | { |
| 4416 | 4433 | keybuf->begin_pos++; |
| 4417 | | keybuf->begin_pos %= ARRAY_LENGTH(keybuf->buffer); |
| 4434 | keybuf->begin_pos %= keybuf->size; |
| 4418 | 4435 | |
| 4419 | 4436 | if (portdata->current_rate != attotime::zero) |
| 4420 | 4437 | break; |
| r14366 | r14367 | |
| 4427 | 4444 | { |
| 4428 | 4445 | keybuf->status_keydown = FALSE; |
| 4429 | 4446 | keybuf->begin_pos++; |
| 4430 | | keybuf->begin_pos %= ARRAY_LENGTH(keybuf->buffer); |
| 4447 | keybuf->begin_pos %= keybuf->size; |
| 4431 | 4448 | } |
| 4432 | 4449 | else |
| 4433 | 4450 | { |