6666#pragma GCC optimize ("O3")
6767#endif
6868
69- static int rc = -1 , sids_found = -1 , no_sids = -1 , soc_audio = -1 ;
69+ static int rc = -1 , sids_found = -1 , no_sids = -1 , soc_audio = -1 , r_readmode = -1 , readmode = -1 ;
7070static uint8_t sidbuf [0x20 * US_MAXSID ];
7171
7272static CLOCK usid_main_clk ;
@@ -116,7 +116,20 @@ int us_device_open(void)
116116
117117 if (usbsid == NULL ) {
118118 usbsid = create_USBSID ();
119- rc = init_USBSID (usbsid , true, true); /* NOTICE: Digitunes only play with threaded cycles */
119+ if (usbsid ) {
120+ resources_get_int ("SidUSBSIDReadMode" , & r_readmode );
121+ log_message (usbsid_log , "SidUSBSIDReadMode: %d, readmode: %d\r" , r_readmode , readmode );
122+ readmode = r_readmode ;
123+ }
124+ /* NOTICE: Digitunes only play with threaded cycles */
125+ if (readmode == 0 ) {
126+ log_message (usbsid_log , "Starting in normal mode\r" );
127+ rc = init_USBSID (usbsid , true, true); /* threading and cycles enabled */
128+ } else if (readmode == 1 ) {
129+ log_message (usbsid_log , "Starting in read mode\r" );
130+ rc = init_USBSID (usbsid , false, false); /* threading and cycles disabled */
131+ }
132+
120133 if (rc < 0 ) {
121134 return -1 ;
122135 }
@@ -154,9 +167,13 @@ int us_device_close(void)
154167int us_device_read (uint16_t addr , int chipno )
155168{ /* NOTICE: Disabled, unneeded */
156169 if (chipno < US_MAXSID ) {
157- addr = ((addr & 0x1F ) + (chipno * 0x20 ));
158- /* return (uint8_t)sidbuf[addr]; */
159- return 0x0 ;
170+ if (readmode == 1 ) {
171+ uint8_t n_addr = ((addr & 0x1F ) + (chipno * 0x20 ));
172+ sidbuf [addr ] = read_USBSID (usbsid , n_addr );
173+ return sidbuf [addr ];
174+ } else {
175+ return 0x0 ;
176+ }
160177 }
161178 return 0x0 ;
162179}
@@ -181,8 +198,12 @@ void us_device_store(uint16_t addr, uint8_t val, int chipno) /* max chipno = 1 *
181198{
182199 if (chipno < US_MAXSID ) { /* remove 0x20 address limitation */
183200 addr = ((addr & 0x1F ) + (chipno * 0x20 ));
184- uint_fast32_t cycles = us_delay ();
185- writeringcycled_USBSID (usbsid , addr , val , cycles );
201+ if (readmode == 0 ) {
202+ uint_fast32_t cycles = us_delay ();
203+ writeringcycled_USBSID (usbsid , addr , val , cycles );
204+ } else if (readmode == 1 ) {
205+ write_USBSID (usbsid , addr , val );
206+ }
186207 sidbuf [addr ] = val ;
187208 return ;
188209 }
@@ -227,6 +248,18 @@ void us_set_audio(int val)
227248 setstereo_USBSID (usbsid , stereo );
228249}
229250
251+ void us_set_readmode (int val )
252+ {
253+ resources_get_int ("SidUSBSIDReadMode" , & r_readmode );
254+ if (readmode != val ) {
255+ log_message (usbsid_log , "Set read mode from %d to %d (resource: %d)\r" , readmode , val , r_readmode );
256+ readmode = val ;
257+ if (val == 0 ) enablethread_USBSID (usbsid );
258+ if (val == 1 ) disablethread_USBSID (usbsid );
259+ }
260+ return ;
261+ }
262+
230263static void usbsid_alarm_handler (CLOCK offset , void * data )
231264{
232265 CLOCK cycles = (usid_alarm_clk + offset ) - usid_main_clk ;
0 commit comments