| 
									
										
										
										
											2011-04-24 01:14:00 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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; | 
					
						
							| 
									
										
										
										
											2011-06-27 23:10:51 +00:00
										 |  |  |     void            *Debug; | 
					
						
							| 
									
										
										
										
											2011-04-24 01:14:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							| 
									
										
										
										
											2011-06-27 23:10:51 +00:00
										 |  |  |     void            *Debug; | 
					
						
							| 
									
										
										
										
											2011-04-24 01:14:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*****************************************************************************
 | 
					
						
							|  |  |  | * 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_ */
 |