initial import
[picodrive.git] / platform / gp2x / 940.c
1 #include "940shared.h"\r
2 \r
3 /* this code assumes that we live @ 0x3000000 bank */\r
4 //static volatile unsigned short *gp2x_memregs = (void *) 0x0xbd000000;\r
5 //static volatile unsigned long  *gp2x_memregl = (void *) 0x0xbd000000;\r
6 \r
7 static _940_data_t *shared_data = (_940_data_t *) 0x100000;\r
8 static _940_ctl_t  *shared_ctl  = (_940_ctl_t *)  0x200000;\r
9 YM2612 *ym2612_940;\r
10 int *mix_buffer;\r
11 \r
12 // from init.s\r
13 void wait_irq(void);\r
14 void spend_cycles(int c);\r
15 void cache_clean(void);\r
16 void cache_clean_flush(void);\r
17 \r
18 //      asm volatile ("mov r0, #0" ::: "r0");\r
19 //      asm volatile ("mcr p15, 0, r0, c7, c6,  0" ::: "r0"); /* flush dcache */\r
20 //      asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0"); /* drain write buffer */\r
21 \r
22 void Main940(int startvector)\r
23 {\r
24         ym2612_940 = &shared_data->ym2612;\r
25         mix_buffer = shared_data->mix_buffer;\r
26 \r
27         // debug\r
28         shared_ctl->vstarts[startvector]++;\r
29         asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0");\r
30 \r
31         /* unmask IRQs */\r
32 \r
33         for (;; shared_ctl->loopc++)\r
34         {\r
35 /*\r
36                 while (!shared_ctl->busy)\r
37                 {\r
38                         //shared_ctl->waitc++;\r
39                         spend_cycles(256);\r
40                 }\r
41 */\r
42                 if (!shared_ctl->busy)\r
43                 {\r
44                         wait_irq();\r
45                 }\r
46 \r
47                 switch (shared_ctl->job)\r
48                 {\r
49                         case JOB940_YM2612INIT:\r
50                                 shared_ctl->writebuff0[0] = shared_ctl->writebuff1[0] = 0xffff;\r
51                                 YM2612Init_(shared_ctl->baseclock, shared_ctl->rate);\r
52                                 break;\r
53 \r
54                         case JOB940_YM2612RESETCHIP:\r
55                                 YM2612ResetChip_();\r
56                                 break;\r
57 \r
58                         case JOB940_PICOSTATELOAD:\r
59                                 YM2612PicoStateLoad_();\r
60                                 break;\r
61 \r
62                         case JOB940_YM2612UPDATEONE: {\r
63                                 int i, dw, *wbuff;\r
64                                 if (shared_ctl->writebuffsel == 1) {\r
65                                         wbuff = (int *) shared_ctl->writebuff1;\r
66                                 } else {\r
67                                         wbuff = (int *) shared_ctl->writebuff0;\r
68                                 }\r
69 \r
70                                 /* playback all writes */\r
71                                 for (i = 2048/2; i > 0; i--) {\r
72                                         UINT16 d;\r
73                                         dw = *wbuff++;\r
74                                         d = dw;\r
75                                         if (d == 0xffff) break;\r
76                                         YM2612Write_(d >> 8, d);\r
77                                         d = (dw>>16);\r
78                                         if (d == 0xffff) break;\r
79                                         YM2612Write_(d >> 8, d);\r
80                                 }\r
81 \r
82                                 YM2612UpdateOne_(0, shared_ctl->length, shared_ctl->stereo);\r
83 //                              cache_clean_flush();\r
84                                 cache_clean();\r
85 //                              asm volatile ("mov r0, #0" ::: "r0");\r
86 //                              asm volatile ("mcr p15, 0, r0, c7, c10, 4" ::: "r0"); /* drain write buffer, should be done on nonbuffered write */\r
87                                 break;\r
88                         }\r
89                 }\r
90 \r
91                 shared_ctl->busy = 0;\r
92         }\r
93 }\r