/*** m6805: Portable 6805 emulator ****************************************** m6805.c (Also supports hd68705 and hd63705 variants) References: 6809 Simulator V09, By L.C. Benschop, Eidnhoven The Netherlands. m6809: Portable 6809 emulator, DS (6809 code in MAME, derived from the 6809 Simulator V09) 6809 Microcomputer Programming & Interfacing with Experiments" by Andrew C. Staugaard, Jr.; Howard W. Sams & Co., Inc. System dependencies: UINT16 must be 16 bit unsigned int UINT8 must be 8 bit unsigned int UINT32 must be more than 16 bits arrays up to 65536 bytes must be supported machine must be twos complement Additional Notes: K.Wilkins 18/03/99 - Added 63705 functonality and modified all CPU functions necessary to support: Variable width address bus Different stack pointer Alternate boot vectors Alternate interrups vectors *****************************************************************************/ #include "debugger.h" #include "deprecat.h" #include "m6805.h" #define IRQ_LEVEL_DETECT 0 enum { SUBTYPE_M6805, SUBTYPE_M68705, SUBTYPE_HD63705 }; /* 6805 Registers */ typedef struct { int subtype; /* Which sub-type is being emulated */ UINT32 sp_mask; /* Stack pointer address mask */ UINT32 sp_low; /* Stack pointer low water mark (or floor) */ PAIR pc; /* Program counter */ PAIR s; /* Stack pointer */ UINT8 a; /* Accumulator */ UINT8 x; /* Index register */ UINT8 cc; /* Condition codes */ UINT16 pending_interrupts; /* MB */ int (*irq_callback)(int irqline); int irq_state[9]; /* KW Additional lines for HD63705 */ int nmi_state; } m6805_Regs; /* 6805 registers */ static m6805_Regs m6805; #define SUBTYPE m6805.subtype /* CPU Type */ #define SP_MASK m6805.sp_mask /* stack pointer mask */ #define SP_LOW m6805.sp_low /* stack pointer low water mark */ #define pPC m6805.pc /* program counter PAIR */ #define PC m6805.pc.w.l /* program counter lower word */ #define S m6805.s.w.l /* stack pointer lower word */ #define A m6805.a /* accumulator */ #define X m6805.x /* index register */ #define CC m6805.cc /* condition codes */ static PAIR ea; /* effective address */ #define EAD ea.d #define EA ea.w.l /* public globals */ static int m6805_ICount=50000; /* DS -- THESE ARE RE-DEFINED IN m6805.h TO RAM, ROM or FUNCTIONS IN cpuintrf.c */ #define RM(Addr) M6805_RDMEM(Addr) #define WM(Addr,Value) M6805_WRMEM(Addr,Value) #define M_RDOP(Addr) M6805_RDOP(Addr) #define M_RDOP_ARG(Addr) M6805_RDOP_ARG(Addr) /* macros to tweak the PC and SP */ #define SP_INC if( ++S > SP_MASK) S = SP_LOW #define SP_DEC if( --S < SP_LOW) S = SP_MASK #define SP_ADJUST(s) ( ( (s) & SP_MASK ) | SP_LOW ) /* macros to access memory */ #define IMMBYTE(b) {b = M_RDOP_ARG(PC++);} #define IMMWORD(w) {w.d = 0; w.b.h = M_RDOP_ARG(PC); w.b.l = M_RDOP_ARG(PC+1); PC+=2;} #define PUSHBYTE(b) wr_s_handler_b(&b) #define PUSHWORD(w) wr_s_handler_w(&w) #define PULLBYTE(b) rd_s_handler_b(&b) #define PULLWORD(w) rd_s_handler_w(&w) /* CC masks H INZC 7654 3210 */ #define CFLAG 0x01 #define ZFLAG 0x02 #define NFLAG 0x04 #define IFLAG 0x08 #define HFLAG 0x10 #define CLR_NZ CC&=~(NFLAG|ZFLAG) #define CLR_HNZC CC&=~(HFLAG|NFLAG|ZFLAG|CFLAG) #define CLR_Z CC&=~(ZFLAG) #define CLR_NZC CC&=~(NFLAG|ZFLAG|CFLAG) #define CLR_ZC CC&=~(ZFLAG|CFLAG) /* macros for CC -- CC bits affected should be reset before calling */ #define SET_Z(a) if(!a)SEZ #define SET_Z8(a) SET_Z((UINT8)a) #define SET_N8(a) CC|=((a&0x80)>>5) #define SET_H(a,b,r) CC|=((a^b^r)&0x10) #define SET_C8(a) CC|=((a&0x100)>>8) static const UINT8 flags8i[256]= /* increment */ { 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04 }; static const UINT8 flags8d[256]= /* decrement */ { 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04 }; #define SET_FLAGS8I(a) {CC|=flags8i[(a)&0xff];} #define SET_FLAGS8D(a) {CC|=flags8d[(a)&0xff];} /* combos */ #define SET_NZ8(a) {SET_N8(a);SET_Z(a);} #define SET_FLAGS8(a,b,r) {SET_N8(r);SET_Z8(r);SET_C8(r);} /* for treating an unsigned UINT8 as a signed INT16 */ #define SIGNED(b) ((INT16)(b&0x80?b|0xff00:b)) /* Macros for addressing modes */ #define DIRECT EAD=0;IMMBYTE(ea.b.l) #define IMM8 EA=PC++ #define EXTENDED IMMWORD(ea) #define INDEXED EA=X #define INDEXED1 {EAD=0; IMMBYTE(ea.b.l); EA+=X;} #define INDEXED2 {IMMWORD(ea); EA+=X;} /* macros to set status flags */ #if defined(SEC) #undef SEC #endif #define SEC CC|=CFLAG #define CLC CC&=~CFLAG #define SEZ CC|=ZFLAG #define CLZ CC&=~ZFLAG #define SEN CC|=NFLAG #define CLN CC&=~NFLAG #define SEH CC|=HFLAG #define CLH CC&=~HFLAG #define SEI CC|=IFLAG #define CLI CC&=~IFLAG /* macros for convenience */ #define DIRBYTE(b) {DIRECT;b=RM(EAD);} #define EXTBYTE(b) {EXTENDED;b=RM(EAD);} #define IDXBYTE(b) {INDEXED;b=RM(EAD);} #define IDX1BYTE(b) {INDEXED1;b=RM(EAD);} #define IDX2BYTE(b) {INDEXED2;b=RM(EAD);} /* Macros for branch instructions */ #define BRANCH(f) { UINT8 t; IMMBYTE(t); if(f) { PC+=SIGNED(t); change_pc(PC); if (t==0xfe) { /* speed up busy loops */ if(m6805_ICount > 0) m6805_ICount = 0; } } } /* what they say it is ... */ static const unsigned char cycles1[] = { /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /*0*/ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /*1*/ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, /*2*/ 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /*3*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 6, 0, 6, 6, 0, /*4*/ 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4, /*5*/ 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4, /*6*/ 7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 0, 7, /*7*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 6, 0, 6, /*8*/ 9, 6, 0,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*9*/ 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, /*A*/ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 8, 2, 0, /*B*/ 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 7, 4, 5, /*C*/ 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 4, 8, 5, 6, /*D*/ 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 5, 9, 6, 7, /*E*/ 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 4, 8, 5, 6, /*F*/ 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 7, 4, 5 }; /* pre-clear a PAIR union; clearing h2 and h3 only might be faster? */ #define CLEAR_PAIR(p) p->d = 0 INLINE void rd_s_handler_b( UINT8 *b ) { SP_INC; *b = RM( S ); } INLINE void rd_s_handler_w( PAIR *p ) { CLEAR_PAIR(p); SP_INC; p->b.h = RM( S ); SP_INC; p->b.l = RM( S ); } INLINE void wr_s_handler_b( UINT8 *b ) { WM( S, *b ); SP_DEC; } INLINE void wr_s_handler_w( PAIR *p ) { WM( S, p->b.l ); SP_DEC; WM( S, p->b.h ); SP_DEC; } INLINE void RM16( UINT32 Addr, PAIR *p ) { CLEAR_PAIR(p); p->b.h = RM(Addr); ++Addr; // if( ++Addr > AMASK ) Addr = 0; p->b.l = RM(Addr); } #ifdef UNUSED_FUNCTION INLINE void WM16( UINT32 Addr, PAIR *p ) { WM( Addr, p->b.h ); ++Addr; // if( ++Addr > AMASK ) Addr = 0; WM( Addr, p->b.l ); } #endif #if (HAS_M68705) /* Generate interrupt - m68705 version */ static void m68705_Interrupt(void) { if( (m6805.pending_interrupts & ((1< 0 ); return cycles - m6805_ICount; } /**************************************************************************** * M68705 section ****************************************************************************/ #if (HAS_M68705) static void m68705_init(int index, int clock, const void *config, int (*irqcallback)(int)) { state_register("m68705", index); m6805.irq_callback = irqcallback; } static void m68705_reset(void) { m6805_reset(); /* Overide default 6805 type */ m6805.subtype = SUBTYPE_M68705; RM16( 0xfffe, &m6805.pc ); } static void m68705_set_irq_line(int irqline, int state) { if (m6805.irq_state[irqline] == state ) return; m6805.irq_state[irqline] = state; if (state != CLEAR_LINE) m6805.pending_interrupts |= 1<i); break; case CPUINFO_INT_REGISTER + M6805_A: A = info->i; break; case CPUINFO_INT_PC: case CPUINFO_INT_REGISTER + M6805_PC: PC = info->i; change_pc(PC); break; case CPUINFO_INT_SP: case CPUINFO_INT_REGISTER + M6805_S: S = SP_ADJUST(info->i); break; case CPUINFO_INT_REGISTER + M6805_X: X = info->i; break; case CPUINFO_INT_REGISTER + M6805_CC: CC = info->i; break; } } /************************************************************************** * Generic get_info **************************************************************************/ void m6805_get_info(UINT32 state, cpuinfo *info) { switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(m6805); break; case CPUINFO_INT_INPUT_LINES: info->i = 1; break; case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break; case CPUINFO_INT_ENDIANNESS: info->i = CPU_IS_BE; break; case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; case CPUINFO_INT_CLOCK_DIVIDER: info->i = 4; break; case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break; case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 3; break; case CPUINFO_INT_MIN_CYCLES: info->i = 2; break; case CPUINFO_INT_MAX_CYCLES: info->i = 10; break; case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 8; break; case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 12; break; case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break; case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break; case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break; case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA: info->i = 0; break; case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break; case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break; case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break; case CPUINFO_INT_INPUT_STATE + M6805_IRQ_LINE: info->i = m6805.irq_state[M6805_IRQ_LINE]; break; case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break; case CPUINFO_INT_REGISTER + M6805_A: info->i = A; break; case CPUINFO_INT_PC: info->i = PC; break; case CPUINFO_INT_REGISTER + M6805_PC: info->i = PC; break; case CPUINFO_INT_SP: case CPUINFO_INT_REGISTER + M6805_S: info->i = SP_ADJUST(S); break; case CPUINFO_INT_REGISTER + M6805_X: info->i = X; break; case CPUINFO_INT_REGISTER + M6805_CC: info->i = CC; break; /* --- the following bits of info are returned as pointers to data or functions --- */ case CPUINFO_PTR_SET_INFO: info->setinfo = m6805_set_info; break; case CPUINFO_PTR_GET_CONTEXT: info->getcontext = m6805_get_context; break; case CPUINFO_PTR_SET_CONTEXT: info->setcontext = m6805_set_context; break; case CPUINFO_PTR_INIT: info->init = m6805_init; break; case CPUINFO_PTR_RESET: info->reset = m6805_reset; break; case CPUINFO_PTR_EXIT: info->exit = m6805_exit; break; case CPUINFO_PTR_EXECUTE: info->execute = m6805_execute; break; case CPUINFO_PTR_BURN: info->burn = NULL; break; case CPUINFO_PTR_DISASSEMBLE: info->disassemble = m6805_dasm; break; case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &m6805_ICount; break; /* --- the following bits of info are returned as NULL-terminated strings --- */ case CPUINFO_STR_NAME: strcpy(info->s, "M6805"); break; case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Motorola 6805"); break; case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "1.0"); break; case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break; case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "The MAME team."); break; case CPUINFO_STR_FLAGS: sprintf(info->s, "%c%c%c%c%c%c%c%c", m6805.cc & 0x80 ? '?':'.', m6805.cc & 0x40 ? '?':'.', m6805.cc & 0x20 ? '?':'.', m6805.cc & 0x10 ? 'H':'.', m6805.cc & 0x08 ? 'I':'.', m6805.cc & 0x04 ? 'N':'.', m6805.cc & 0x02 ? 'Z':'.', m6805.cc & 0x01 ? 'C':'.'); break; case CPUINFO_STR_REGISTER + M6805_A: sprintf(info->s, "A:%02X", m6805.a); break; case CPUINFO_STR_REGISTER + M6805_PC: sprintf(info->s, "PC:%04X", m6805.pc.w.l); break; case CPUINFO_STR_REGISTER + M6805_S: sprintf(info->s, "S:%02X", m6805.s.w.l); break; case CPUINFO_STR_REGISTER + M6805_X: sprintf(info->s, "X:%02X", m6805.x); break; case CPUINFO_STR_REGISTER + M6805_CC: sprintf(info->s, "CC:%02X", m6805.cc); break; } } #if (HAS_M68705) /************************************************************************** * CPU-specific set_info **************************************************************************/ static void m68705_set_info(UINT32 state, cpuinfo *info) { switch(state) { /* --- the following bits of info are set as 64-bit signed integers --- */ case CPUINFO_INT_INPUT_STATE + M68705_INT_TIMER: m68705_set_irq_line(M68705_INT_TIMER, info->i); break; default: m6805_set_info(state,info); break; } } void m68705_get_info(UINT32 state, cpuinfo *info) { switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ case CPUINFO_INT_INPUT_STATE + M68705_INT_TIMER: info->i = m6805.irq_state[M68705_INT_TIMER]; break; /* --- the following bits of info are returned as pointers to data or functions --- */ case CPUINFO_PTR_SET_INFO: info->setinfo = m68705_set_info; break; case CPUINFO_PTR_INIT: info->init = m68705_init; break; case CPUINFO_PTR_RESET: info->reset = m68705_reset; break; /* --- the following bits of info are returned as NULL-terminated strings --- */ case CPUINFO_STR_NAME: strcpy(info->s, "M68705"); break; default: m6805_get_info(state, info); break; } } #endif #if (HAS_HD63705) /************************************************************************** * CPU-specific set_info **************************************************************************/ static void hd63705_set_info(UINT32 state, cpuinfo *info) { switch (state) { /* --- the following bits of info are set as 64-bit signed integers --- */ case CPUINFO_INT_INPUT_STATE + HD63705_INT_IRQ1: hd63705_set_irq_line(HD63705_INT_IRQ1, info->i); break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_IRQ2: hd63705_set_irq_line(HD63705_INT_IRQ2, info->i); break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_TIMER1: hd63705_set_irq_line(HD63705_INT_TIMER1, info->i); break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_TIMER2: hd63705_set_irq_line(HD63705_INT_TIMER2, info->i); break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_TIMER3: hd63705_set_irq_line(HD63705_INT_TIMER3, info->i); break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_PCI: hd63705_set_irq_line(HD63705_INT_PCI, info->i); break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_SCI: hd63705_set_irq_line(HD63705_INT_SCI, info->i); break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_ADCONV: hd63705_set_irq_line(HD63705_INT_ADCONV, info->i); break; case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: hd63705_set_irq_line(INPUT_LINE_NMI, info->i); break; default: m6805_set_info(state, info); break; } } void hd63705_get_info(UINT32 state, cpuinfo *info) { switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ case CPUINFO_INT_INPUT_STATE + HD63705_INT_IRQ1: info->i = m6805.irq_state[HD63705_INT_IRQ1]; break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_IRQ2: info->i = m6805.irq_state[HD63705_INT_IRQ2]; break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_TIMER1: info->i = m6805.irq_state[HD63705_INT_TIMER1]; break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_TIMER2: info->i = m6805.irq_state[HD63705_INT_TIMER2]; break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_TIMER3: info->i = m6805.irq_state[HD63705_INT_TIMER3]; break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_PCI: info->i = m6805.irq_state[HD63705_INT_PCI]; break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_SCI: info->i = m6805.irq_state[HD63705_INT_SCI]; break; case CPUINFO_INT_INPUT_STATE + HD63705_INT_ADCONV: info->i = m6805.irq_state[HD63705_INT_ADCONV]; break; case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: info->i = m6805.irq_state[HD63705_INT_NMI]; break; case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 16; break; /* --- the following bits of info are returned as pointers to data or functions --- */ case CPUINFO_PTR_SET_INFO: info->setinfo = hd63705_set_info; break; case CPUINFO_PTR_INIT: info->init = hd63705_init; break; case CPUINFO_PTR_RESET: info->reset = hd63705_reset; break; /* --- the following bits of info are returned as NULL-terminated strings --- */ case CPUINFO_STR_NAME: strcpy(info->s, "HD63705"); break; case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "1.0"); break; case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Keith Wilkins, Juergen Buchmueller"); break; default: m6805_get_info(state, info); break; } } #endif