183
209
case 0x01: /* DDRA */
184
210
//mame_printf_debug("HC11: ddra = %02X\n", value);
212
case 0x03: /* PORTC */
213
memory_write_byte(cpustate->io, MC68HC11_IO_PORTC, value);
215
case 0x04: /* PORTC */
216
memory_write_byte(cpustate->io, MC68HC11_IO_PORTB, value);
186
218
case 0x08: /* PORTD */
187
memory_write_byte(cpustate->io, MC68HC11_IO_PORTD, value);
219
memory_write_byte(cpustate->io, MC68HC11_IO_PORTD, value); //mask & 0x3f?
189
221
case 0x09: /* DDRD */
190
222
//mame_printf_debug("HC11: ddrd = %02X\n", value);
224
case 0x0a: /* PORTE */
225
memory_write_byte(cpustate->io, MC68HC11_IO_PORTE, value);
192
227
case 0x22: /* TMSK1 */
230
cpustate->tflg1 = value;
194
232
case 0x24: /* TMSK2 */
196
234
case 0x28: /* SPCR1 */
358
cpustate->internal_ram_size = 1280; /* FIXME: this is for MC68HC11M0 */
403
cpustate->has_extended_io = conf->has_extended_io;
404
cpustate->internal_ram_size = conf->internal_ram_size;
408
/* defaults it to the HC11M0 version for now (I might strip this down on a later date) */
409
cpustate->has_extended_io = 1;
410
cpustate->internal_ram_size = 1280;
359
413
cpustate->internal_ram = auto_alloc_array(device->machine, UINT8, cpustate->internal_ram_size);
361
415
cpustate->reg_position = 0;
443
0xffda: Pulse Accumulator Input Edge
444
0xffdc: Pulse Accumulator Overflow
445
0xffde: Timer Overflow
446
0xffe0: Timer Output Capture 5
447
0xffe2: Timer Output Capture 4
448
0xffe4: Timer Output Capture 3
449
0xffe6: Timer Output Capture 2
450
0xffe8: Timer Output Capture 1
451
0xffea: Timer Input Capture 3
452
0xffec: Timer Input Capture 2
453
0xffee: Timer Input Capture 1
454
0xfff0: Real Time Int
457
0xfff6: SWI (Trap IRQ)
458
0xfff8: Illegal Opcode (NMI)
459
0xfffa: CO-Processor Fail
460
0xfffc: Clock Monitor
464
static void check_irq_lines(hc11_state *cpustate)
466
if( cpustate->irq_state[MC68HC11_IRQ_LINE]!=CLEAR_LINE && (!(cpustate->ccr & CC_I)) )
470
if(cpustate->wait_state == 0)
472
PUSH16(cpustate, cpustate->pc);
473
PUSH16(cpustate, cpustate->iy);
474
PUSH16(cpustate, cpustate->ix);
475
PUSH8(cpustate, REG_A);
476
PUSH8(cpustate, REG_B);
477
PUSH8(cpustate, cpustate->ccr);
479
pc_vector = READ16(cpustate, 0xfff2);
480
SET_PC(cpustate, pc_vector);
481
cpustate->ccr |= CC_I; //irq taken, mask the flag
482
if(cpustate->wait_state == 1) { cpustate->wait_state = 2; }
483
if(cpustate->stop_state == 1) { cpustate->stop_state = 2; }
484
(void)(*cpustate->irq_callback)(cpustate->device, MC68HC11_IRQ_LINE);
488
static void set_irq_line(hc11_state *cpustate, int irqline, int state)
490
cpustate->irq_state[irqline] = state;
491
if (state == CLEAR_LINE) return;
492
check_irq_lines(cpustate);
380
495
static CPU_EXECUTE( hc11 )
382
497
hc11_state *cpustate = get_safe_token(device);
525
case CPUINFO_INT_INPUT_STATE + MC68HC11_IRQ_LINE: set_irq_line(cpustate, MC68HC11_IRQ_LINE, info->i); break;
408
527
/* --- the following bits of info are set as 64-bit signed integers --- */
409
528
case CPUINFO_INT_PC: cpustate->pc = info->i; break;
410
case CPUINFO_INT_REGISTER + HC11_PC: cpustate->pc = info->i; break;
529
case CPUINFO_INT_REGISTER + HC11_PC: cpustate->pc = info->i; break;
411
530
case CPUINFO_INT_REGISTER + HC11_SP: cpustate->sp = info->i; break;
412
531
case CPUINFO_INT_REGISTER + HC11_A: cpustate->d.d8.a = info->i; break;
413
532
case CPUINFO_INT_REGISTER + HC11_B: cpustate->d.d8.b = info->i; break;
425
544
/* --- the following bits of info are returned as 64-bit signed integers --- */
426
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(hc11_state); break;
427
case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
428
case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break;
429
case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_BIG; break;
430
case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break;
431
case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
432
case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break;
433
case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 5; break;
434
case CPUINFO_INT_MIN_CYCLES: info->i = 1; break;
435
case CPUINFO_INT_MAX_CYCLES: info->i = 41; break;
437
case CPUINFO_INT_DATABUS_WIDTH_PROGRAM: info->i = 8; break;
438
case CPUINFO_INT_ADDRBUS_WIDTH_PROGRAM: info->i = 16; break;
439
case CPUINFO_INT_ADDRBUS_SHIFT_PROGRAM: info->i = 0; break;
440
case CPUINFO_INT_DATABUS_WIDTH_DATA: info->i = 0; break;
441
case CPUINFO_INT_ADDRBUS_WIDTH_DATA: info->i = 0; break;
442
case CPUINFO_INT_ADDRBUS_SHIFT_DATA: info->i = 0; break;
443
case CPUINFO_INT_DATABUS_WIDTH_IO: info->i = 8; break;
444
case CPUINFO_INT_ADDRBUS_WIDTH_IO: info->i = 8; break;
445
case CPUINFO_INT_ADDRBUS_SHIFT_IO: info->i = 0; break;
447
case CPUINFO_INT_INPUT_STATE: info->i = CLEAR_LINE; break;
449
case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break;
545
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(hc11_state); break;
546
case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
547
case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break;
548
case DEVINFO_INT_ENDIANNESS: info->i = ENDIANNESS_BIG; break;
549
case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break;
550
case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
551
case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break;
552
case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 5; break;
553
case CPUINFO_INT_MIN_CYCLES: info->i = 1; break;
554
case CPUINFO_INT_MAX_CYCLES: info->i = 41; break;
556
case CPUINFO_INT_DATABUS_WIDTH_PROGRAM: info->i = 8; break;
557
case CPUINFO_INT_ADDRBUS_WIDTH_PROGRAM: info->i = 16; break;
558
case CPUINFO_INT_ADDRBUS_SHIFT_PROGRAM: info->i = 0; break;
559
case CPUINFO_INT_DATABUS_WIDTH_DATA: info->i = 0; break;
560
case CPUINFO_INT_ADDRBUS_WIDTH_DATA: info->i = 0; break;
561
case CPUINFO_INT_ADDRBUS_SHIFT_DATA: info->i = 0; break;
562
case CPUINFO_INT_DATABUS_WIDTH_IO: info->i = 8; break;
563
case CPUINFO_INT_ADDRBUS_WIDTH_IO: info->i = 8; break;
564
case CPUINFO_INT_ADDRBUS_SHIFT_IO: info->i = 0; break;
566
case CPUINFO_INT_INPUT_STATE + MC68HC11_IRQ_LINE: info->i = cpustate->irq_state[MC68HC11_IRQ_LINE]; break;
568
case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break;
451
570
case CPUINFO_INT_PC: /* intentional fallthrough */
452
case CPUINFO_INT_REGISTER + HC11_PC: info->i = cpustate->pc; break;
453
case CPUINFO_INT_REGISTER + HC11_SP: info->i = cpustate->sp; break;
454
case CPUINFO_INT_REGISTER + HC11_A: info->i = cpustate->d.d8.a; break;
455
case CPUINFO_INT_REGISTER + HC11_B: info->i = cpustate->d.d8.b; break;
456
case CPUINFO_INT_REGISTER + HC11_IX: info->i = cpustate->ix; break;
457
case CPUINFO_INT_REGISTER + HC11_IY: info->i = cpustate->iy; break;
571
case CPUINFO_INT_REGISTER + HC11_PC: info->i = cpustate->pc; break;
572
case CPUINFO_INT_REGISTER + HC11_SP: info->i = cpustate->sp; break;
573
case CPUINFO_INT_REGISTER + HC11_A: info->i = cpustate->d.d8.a; break;
574
case CPUINFO_INT_REGISTER + HC11_B: info->i = cpustate->d.d8.b; break;
575
case CPUINFO_INT_REGISTER + HC11_IX: info->i = cpustate->ix; break;
576
case CPUINFO_INT_REGISTER + HC11_IY: info->i = cpustate->iy; break;
459
578
/* --- the following bits of info are returned as pointers to data or functions --- */
460
579
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(mc68hc11); break;
463
582
case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(hc11); break;
464
583
case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(hc11); break;
465
584
case CPUINFO_FCT_BURN: info->burn = NULL; break;
466
case CPUINFO_FCT_DISASSEMBLE: info->disassemble = hc11_disasm; break;
585
case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(hc11); break;
467
586
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break;
469
588
/* --- the following bits of info are returned as NULL-terminated strings --- */
470
case CPUINFO_STR_NAME: strcpy(info->s, "MC68HC11"); break;
471
case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Motorola MC68HC11"); break;
472
case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "1.0"); break;
473
case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break;
474
case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright Ville Linde"); break;
589
case DEVINFO_STR_NAME: strcpy(info->s, "MC68HC11"); break;
590
case DEVINFO_STR_FAMILY: strcpy(info->s, "Motorola MC68HC11"); break;
591
case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break;
592
case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
593
case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Ville Linde"); break;
476
595
case CPUINFO_STR_FLAGS:
477
596
sprintf(info->s, "%c%c%c%c%c%c%c%c",