|
|
1.1 root 1: /*
2: DSP M56001 emulation
3: Core of DSP emulation
4:
5: (C) 2003-2008 ARAnyM developer team
6:
7: This program is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2 of the License, or
10: (at your option) any later version.
11:
12: This program is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with this program; if not, write to the Free Software
19: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20: */
21:
22: #ifndef DSP_CORE_H
23: #define DSP_CORE_H
24:
25: #include <SDL.h>
26:
27: #ifdef __cplusplus
28: extern "C" {
29: #endif
30:
31: #define DSP_RAMSIZE_MAX (3*64*1024)
32: #define DSP_RAMSIZE_24kB 8192
33: #define DSP_RAMSIZE_96kB 32768
34:
35: extern Uint32 DSP_RAMSIZE;
36:
37: /* Host port, CPU side */
38: #define CPU_HOST_ICR 0x00
39: #define CPU_HOST_CVR 0x01
40: #define CPU_HOST_ISR 0x02
41: #define CPU_HOST_IVR 0x03
42: #define CPU_HOST_TRX0 0x04
43: #define CPU_HOST_TRXH 0x05
44: #define CPU_HOST_TRXM 0x06
45: #define CPU_HOST_TRXL 0x07
46: #define CPU_HOST_RX0 0x04
47: #define CPU_HOST_RXH 0x05
48: #define CPU_HOST_RXM 0x06
49: #define CPU_HOST_RXL 0x07
50: #define CPU_HOST_TXH 0x09
51: #define CPU_HOST_TXM 0x0a
52: #define CPU_HOST_TXL 0x0b
53:
54: #define CPU_HOST_ICR_RREQ 0x00
55: #define CPU_HOST_ICR_TREQ 0x01
56: #define CPU_HOST_ICR_HF0 0x03
57: #define CPU_HOST_ICR_HF1 0x04
58: #define CPU_HOST_ICR_HM0 0x05
59: #define CPU_HOST_ICR_HM1 0x06
60: #define CPU_HOST_ICR_INIT 0x07
61:
62: #define CPU_HOST_CVR_HC 0x07
63:
64: #define CPU_HOST_ISR_RXDF 0x00
65: #define CPU_HOST_ISR_TXDE 0x01
66: #define CPU_HOST_ISR_TRDY 0x02
67: #define CPU_HOST_ISR_HF2 0x03
68: #define CPU_HOST_ISR_HF3 0x04
69: #define CPU_HOST_ISR_DMA 0x06
70: #define CPU_HOST_ISR_HREQ 0x07
71:
72: /* Host port, DSP side, DSP addresses are 0xffc0+value */
73: #define DSP_PBC 0x20 /* Port B control register */
74: #define DSP_PCC 0x21 /* Port C control register */
75: #define DSP_PBDDR 0x22 /* Port B data direction register */
76: #define DSP_PCDDR 0x23 /* Port C data direction register */
77: #define DSP_PBD 0x24 /* Port B data register */
78: #define DSP_PCD 0x25 /* Port C data register */
79: #define DSP_HOST_HCR 0x28 /* Host control register */
80: #define DSP_HOST_HSR 0x29 /* Host status register */
81: #define DSP_HOST_HRX 0x2b /* Host receive register */
82: #define DSP_HOST_HTX 0x2b /* Host transmit register */
83: #define DSP_SSI_CRA 0x2c /* Ssi control register A */
84: #define DSP_SSI_CRB 0x2d /* Ssi control register B */
85: #define DSP_SSI_SR 0x2e /* Ssi status register */
86: #define DSP_SSI_TSR 0x2e /* Ssi time slot register */
87: #define DSP_SSI_RX 0x2f /* Ssi receive register */
88: #define DSP_SSI_TX 0x2f /* Ssi transmit register */
89: #define DSP_BCR 0x3e /* Port A bus control register */
90: #define DSP_IPR 0x3f /* Interrupt priority register */
91:
92: #define DSP_HOST_HCR_HRIE 0x00
93: #define DSP_HOST_HCR_HTIE 0x01
94: #define DSP_HOST_HCR_HCIE 0x02
95: #define DSP_HOST_HCR_HF2 0x03
96: #define DSP_HOST_HCR_HF3 0x04
97:
98: #define DSP_HOST_HSR_HRDF 0x00
99: #define DSP_HOST_HSR_HTDE 0x01
100: #define DSP_HOST_HSR_HCP 0x02
101: #define DSP_HOST_HSR_HF0 0x03
102: #define DSP_HOST_HSR_HF1 0x04
103: #define DSP_HOST_HSR_DMA 0x07
104:
105: #define DSP_SSI_CRA_DC0 0x8
106: #define DSP_SSI_CRA_DC1 0x9
107: #define DSP_SSI_CRA_DC2 0xa
108: #define DSP_SSI_CRA_DC3 0xb
109: #define DSP_SSI_CRA_DC4 0xc
110: #define DSP_SSI_CRA_WL0 0xd
111: #define DSP_SSI_CRA_WL1 0xe
112:
113: #define DSP_SSI_CRB_OF0 0x0
114: #define DSP_SSI_CRB_OF1 0x1
115: #define DSP_SSI_CRB_SCD0 0x2
116: #define DSP_SSI_CRB_SCD1 0x3
117: #define DSP_SSI_CRB_SCD2 0x4
118: #define DSP_SSI_CRB_SCKD 0x5
119: #define DSP_SSI_CRB_SHFD 0x6
120: #define DSP_SSI_CRB_FSL0 0x7
121: #define DSP_SSI_CRB_FSL1 0x8
122: #define DSP_SSI_CRB_SYN 0x9
123: #define DSP_SSI_CRB_GCK 0xa
124: #define DSP_SSI_CRB_MOD 0xb
125: #define DSP_SSI_CRB_TE 0xc
126: #define DSP_SSI_CRB_RE 0xd
127: #define DSP_SSI_CRB_TIE 0xe
128: #define DSP_SSI_CRB_RIE 0xf
129:
130: #define DSP_SSI_SR_IF0 0x0
131: #define DSP_SSI_SR_IF1 0x1
132: #define DSP_SSI_SR_TFS 0x2
133: #define DSP_SSI_SR_RFS 0x3
134: #define DSP_SSI_SR_TUE 0x4
135: #define DSP_SSI_SR_ROE 0x5
136: #define DSP_SSI_SR_TDE 0x6
137: #define DSP_SSI_SR_RDF 0x7
138:
139: #define DSP_INTERRUPT_NONE 0x0
140: #define DSP_INTERRUPT_DISABLED 0x1
141: #define DSP_INTERRUPT_LONG 0x2
142:
143: #define DSP_INTER_RESET 0
144: #define DSP_INTER_STACK_ERROR 1
145: #define DSP_INTER_TRACE 2
146: #define DSP_INTER_SWI 3
147: #define DSP_INTER_IRQA 4
148: #define DSP_INTER_IRQB 5
149: #define DSP_INTER_SSI_RCV_DATA 6
150: #define DSP_INTER_SSI_RCV_DATA_E 7
151: #define DSP_INTER_SSI_TRX_DATA 8
152: #define DSP_INTER_SSI_TRX_DATA_E 9
153: #define DSP_INTER_SCI_RCV_DATA 10
154: #define DSP_INTER_SCI_RCV_DATA_E 11
155: #define DSP_INTER_SCI_TRX_DATA 12
156: #define DSP_INTER_SCI_IDLE_LINE 13
157: #define DSP_INTER_SCI_TIMER 14
158: #define DSP_INTER_NMI 15
159: #define DSP_INTER_HOST_RCV_DATA 16
160: #define DSP_INTER_HOST_TRX_DATA 17
161: #define DSP_INTER_HOST_COMMAND 18
162: #define DSP_INTER_ILLEGAL 31
163:
164: #define DSP_INTER_NMI_MASK 0x8000800F
165: #define DSP_INTER_IRQA_MASK 0x00000010
166: #define DSP_INTER_IRQB_MASK 0x00000020
167: #define DSP_INTER_SSI_MASK 0x000003C0
168: #define DSP_INTER_SCI_MASK 0x00007C00
169: #define DSP_INTER_HOST_MASK 0x00070000
170:
171: #define DSP_INTER_EDGE_MASK 0x8004C00E
172:
173:
174: #define DSP_PRIORITY_LIST_EXIT 32
175: extern const char dsp_inter_priority_list[32];
176: extern const char *dsp_interrupt_name[32];
177:
178:
179: typedef struct dsp_core_ssi_s dsp_core_ssi_t;
180: typedef struct dsp_core_s dsp_core_t;
181:
182: struct dsp_core_ssi_s {
183: Uint16 cra_word_length;
184: Uint32 cra_word_mask;
185: Uint16 cra_frame_rate_divider;
186:
187: Uint16 crb_src_clock;
188: Uint16 crb_shifter;
189: Uint16 crb_synchro;
190: Uint16 crb_mode;
191: Uint16 crb_te;
192: Uint16 crb_re;
193: Uint16 crb_tie;
194: Uint16 crb_rie;
195:
196: Uint32 TX;
197: Uint32 RX;
198: Uint32 transmit_value; /* DSP Transmit --> SSI */
199: Uint32 received_value; /* DSP Receive --> SSI */
200: Uint16 waitFrameTX;
201: Uint16 waitFrameRX;
202: Uint32 dspPlay_handshakeMode_frame;
203: };
204:
205:
206: struct dsp_core_s {
207:
208: /* DSP executing instructions ? */
209: int running;
210:
211: /* DSP DMA variables */
212: int dma_mode;
213: int dma_direction;
214: int dma_request;
215: int dma_address_counter;
216:
217: /* DSP instruction Cycle counter */
218: Uint16 instr_cycle;
219:
220: /* Registers */
221: Uint16 pc;
222: Uint32 registers[64];
223:
224: /* stack[0=ssh], stack[1=ssl] */
225: Uint16 stack[2][16];
226:
227: /* External ram[] (mapped to p:) */
228: Uint32 ramext[DSP_RAMSIZE_MAX];
229:
230: /* rom[0] is x:, rom[1] is y: */
231: Uint32 rom[2][512];
232:
233: /* Internal ram[0] is x:, ram[1] is y:, ram[2] is p: */
234: Uint32 ramint[3][512];
235:
236: /* peripheral space, [x|y]:0xffc0-0xffff */
237: Uint32 periph[2][64];
238: Uint32 dsp_host_htx;
239: Uint32 dsp_host_rtx;
240: Uint16 dsp_host_isr_HREQ;
241:
242:
243: /* host port, CPU side */
244: Uint8 hostport[12];
245:
246: /* SSI */
247: dsp_core_ssi_t ssi;
248:
249: /* Misc */
250: Uint32 loop_rep; /* executing rep ? */
251: Uint32 pc_on_rep; /* True if PC is on REP instruction */
252:
253: /* For bootstrap routine */
254: Uint16 bootstrap_pos;
255:
256: /* Interruptions */
257: Uint16 interrupt_state; /* NONE, FAST or LONG interrupt */
258: Uint16 interrupt_instr_fetch; /* vector of the current interrupt */
259: Uint16 interrupt_save_pc; /* save next pc value before interrupt */
260: Uint16 interrupt_IplToRaise; /* save the IPL level to save in the SR register */
261: Uint16 interrupt_pipeline_count; /* used to prefetch correctly the 2 inter instructions */
262:
263: /* Interruptions new */
264: Uint32 interrupt_status;
265: Uint32 interrupt_enable;
266: Uint32 interrupt_mask;
267: Uint32 interrupt_mask_level[3];
268: Uint32 interrupt_edgetriggered_mask;
269: };
270:
271:
272: /* DSP */
273: extern dsp_core_t dsp_core;
274:
275: /* Emulator call these to init/stop/reset DSP emulation */
276: extern void dsp_core_init(void (*host_interrupt)(int set));
277: extern void dsp_core_shutdown(void);
278: extern void dsp_core_reset(void);
279: extern void dsp_core_start(Uint8 mode);
280:
281: /* host port read/write by emulator, addr is 0-7, not 0xffa200-0xffa207 */
282: extern Uint8 dsp_core_read_host(int addr);
283: extern void dsp_core_write_host(int addr, Uint8 value);
284:
285: /* dsp_cpu call these to read/write host port */
286: extern void dsp_core_hostport_dspread(void);
287: extern void dsp_core_hostport_dspwrite(void);
288:
289: /* dsp_cpu call these to read/write/configure SSI port */
290: extern void dsp_core_ssi_configure(Uint32 address, Uint32 value);
291: extern void dsp_core_ssi_writeTX(Uint32 value);
292: extern void dsp_core_ssi_writeTSR(void);
293: extern Uint32 dsp_core_ssi_readRX(void);
294: extern void dsp_core_ssi_Receive_SC0(void);
295: extern void dsp_core_ssi_Receive_SC1(Uint32 value);
296: extern void dsp_core_ssi_Receive_SC2(Uint32 value);
297: extern void dsp_core_ssi_Receive_SCK(void);
298: extern void dsp_core_setPortCDataRegister(Uint32 value);
299:
300: #ifdef __cplusplus
301: }
302: #endif
303:
304: #endif /* DSP_CORE_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.