mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-27 08:05:41 +00:00
159 lines
7.5 KiB
C
159 lines
7.5 KiB
C
/*
|
|
* Turbo68K: Motorola 680X0 emulator
|
|
* Copyright 2000-2002 Bart Trzynadlowski, see "README.TXT" for terms of use
|
|
*/
|
|
|
|
#ifndef _TURBO68K_H_
|
|
#define _TURBO68K_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/*****************************************************************************
|
|
* Generic Macros */
|
|
|
|
#define TURBO68K_OKAY 0 /* no error */
|
|
#define TURBO68K_NULL 0 /* null */
|
|
#define TURBO68K_SUPERVISOR 0 /* affects supervisor space */
|
|
#define TURBO68K_USER 1 /* function affects user space */
|
|
#define TURBO68K_UNINITIALIZED 15 /* uninitialized interrupt */
|
|
#define TURBO68K_SPURIOUS 24 /* spurious interrupt */
|
|
#define TURBO68K_AUTOVECTOR 256 /* autovectored interrupt */
|
|
|
|
|
|
/*****************************************************************************
|
|
* Error Codes */
|
|
|
|
#define TURBO68K_ERROR_FETCH 1 /* fetch error (PC bounds) */
|
|
#define TURBO68K_ERROR_INVINST 2 /* invalid instruction */
|
|
#define TURBO68K_ERROR_INTLEVEL 3 /* invalid interrupt level */
|
|
#define TURBO68K_ERROR_INTVECTOR 4 /* invalid interrupt vector */
|
|
#define TURBO68K_ERROR_INTPENDING 5 /* level already pending */
|
|
#define TURBO68K_ERROR_STACKFRAME 6 /* unhandled stack frame */
|
|
|
|
|
|
/*****************************************************************************
|
|
* Data Types */
|
|
|
|
typedef unsigned int TURBO68K_UINT32; /* unsigned 32-bit */
|
|
typedef signed int TURBO68K_INT32; /* signed 32-bit */
|
|
typedef unsigned short TURBO68K_UINT16; /* unsigned 16-bit */
|
|
typedef signed short TURBO68K_INT16; /* signed 16-bit */
|
|
typedef unsigned char TURBO68K_UINT8; /* unsigned 8-bit */
|
|
typedef signed char TURBO68K_INT8; /* signed 8-bit */
|
|
|
|
|
|
/*****************************************************************************
|
|
* Data Structures */
|
|
|
|
struct TURBO68K_FETCHREGION
|
|
{
|
|
TURBO68K_UINT32 base;
|
|
TURBO68K_UINT32 limit;
|
|
TURBO68K_UINT32 ptr;
|
|
};
|
|
|
|
struct TURBO68K_DATAREGION
|
|
{
|
|
TURBO68K_UINT32 base;
|
|
TURBO68K_UINT32 limit;
|
|
TURBO68K_UINT32 ptr;
|
|
void *handler;
|
|
};
|
|
|
|
struct TURBO68K_CONTEXT_68000
|
|
{
|
|
void *fetch, *pcfetch;
|
|
void *read_byte, *read_word, *read_long;
|
|
void *write_byte, *write_word, *write_long;
|
|
void *super_fetch, *super_pcfetch;
|
|
void *super_read_byte, *super_read_word, *super_read_long;
|
|
void *super_write_byte, *super_write_word, *super_write_long;
|
|
void *user_fetch, *user_pcfetch;
|
|
void *user_read_byte, *user_read_word, *user_read_long;
|
|
void *user_write_byte, *user_write_word, *user_write_long;
|
|
TURBO68K_UINT32 intr[8], cycles, remaining;
|
|
TURBO68K_UINT32 d[8], a[8], sp, sr, pc, status;
|
|
void *InterruptAcknowledge;
|
|
void *Reset;
|
|
};
|
|
|
|
struct TURBO68K_CONTEXT_68010
|
|
{
|
|
void *fetch, *pcfetch;
|
|
void *read_byte, *read_word, *read_long;
|
|
void *write_byte, *write_word, *write_long;
|
|
void *super_fetch, *super_pcfetch;
|
|
void *super_read_byte, *super_read_word, *super_read_long;
|
|
void *super_write_byte, *super_write_word, *super_write_long;
|
|
void *user_fetch, *user_pcfetch;
|
|
void *user_read_byte, *user_read_word, *user_read_long;
|
|
void *user_write_byte, *user_write_word, *user_write_long;
|
|
TURBO68K_UINT32 intr[8], cycles, remaining;
|
|
TURBO68K_UINT32 d[8], a[8], sp, sr, pc, fc, vbr, status;
|
|
void *InterruptAcknowledge;
|
|
void *Reset, *Bkpt;
|
|
};
|
|
|
|
|
|
/*****************************************************************************
|
|
* Functions and External Data */
|
|
|
|
#define TURBO68K_ID(ID) \
|
|
\
|
|
extern struct TURBO68K_CONTEXT_68000 ID##turbo68kcontext_68000; \
|
|
extern struct TURBO68K_CONTEXT_68010 ID##turbo68kcontext_68010; \
|
|
\
|
|
TURBO68K_INT32 ID##Turbo68KInit(); \
|
|
TURBO68K_INT32 ID##Turbo68KReset(); \
|
|
TURBO68K_INT32 ID##Turbo68KRun(TURBO68K_INT32); \
|
|
TURBO68K_INT32 ID##Turbo68KProcessInterrupts(); \
|
|
TURBO68K_INT32 ID##Turbo68KInterrupt(TURBO68K_INT32, TURBO68K_UINT32); \
|
|
TURBO68K_INT32 ID##Turbo68KCancelInterrupt(TURBO68K_INT32); \
|
|
\
|
|
TURBO68K_UINT32 ID##Turbo68KReadPC(); \
|
|
\
|
|
void ID##Turbo68KSetFetch(void *, TURBO68K_INT32); \
|
|
void ID##Turbo68KSetPCFetch(void *, TURBO68K_INT32); \
|
|
void ID##Turbo68KSetReadByte(void *, TURBO68K_INT32); \
|
|
void ID##Turbo68KSetReadWord(void *, TURBO68K_INT32); \
|
|
void ID##Turbo68KSetReadLong(void *, TURBO68K_INT32); \
|
|
void ID##Turbo68KSetWriteByte(void *, TURBO68K_INT32); \
|
|
void ID##Turbo68KSetWriteWord(void *, TURBO68K_INT32); \
|
|
void ID##Turbo68KSetWriteLong(void *, TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetFetch(TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetPCFetch(TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetReadByte(TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetReadWord(TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetReadLong(TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetWriteByte(TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetWriteWord(TURBO68K_INT32); \
|
|
void *ID##Turbo68KGetWriteLong(TURBO68K_INT32); \
|
|
\
|
|
TURBO68K_UINT8 *ID##Turbo68KFetchPtr(TURBO68K_UINT32); \
|
|
TURBO68K_UINT8 ID##Turbo68KReadByte(TURBO68K_UINT32); \
|
|
TURBO68K_UINT16 ID##Turbo68KReadWord(TURBO68K_UINT32); \
|
|
TURBO68K_UINT32 ID##Turbo68KReadLong(TURBO68K_UINT32); \
|
|
void ID##Turbo68KWriteByte(TURBO68K_UINT32, TURBO68K_UINT8); \
|
|
void ID##Turbo68KWriteWord(TURBO68K_UINT32, TURBO68K_UINT16);\
|
|
void ID##Turbo68KWriteLong(TURBO68K_UINT32, TURBO68K_UINT32);\
|
|
\
|
|
void ID##Turbo68KSetContext(void *); \
|
|
void ID##Turbo68KGetContext(void *); \
|
|
TURBO68K_UINT32 ID##Turbo68KGetContextSize(); \
|
|
\
|
|
void ID##Turbo68KClearCycles(); \
|
|
void ID##Turbo68KFreeTimeSlice(); \
|
|
TURBO68K_INT32 ID##Turbo68KGetElapsedCycles(); \
|
|
|
|
TURBO68K_ID( ); /* default identifiers begin with nothing */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _TURBO68K_H_ */
|