Skip to content
This repository was archived by the owner on Sep 24, 2025. It is now read-only.

Commit 70c55a3

Browse files
committed
Add register readmode as command line argument option for FPGASID configuru
1 parent 9ffcb64 commit 70c55a3

File tree

7 files changed

+102
-7
lines changed

7 files changed

+102
-7
lines changed

vice/src/arch/shared/hwsiddrv/us-unixwin-device.c

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
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;
7070
static uint8_t sidbuf[0x20 * US_MAXSID];
7171

7272
static 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)
154167
int 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+
230263
static void usbsid_alarm_handler(CLOCK offset, void *data)
231264
{
232265
CLOCK cycles = (usid_alarm_clk + offset) - usid_main_clk;

vice/src/arch/shared/hwsiddrv/us-unixwin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ unsigned int us_device_available(void);
5656

5757
void us_set_audio(int val);
5858

59+
void us_set_readmode(int val);
60+
5961
void us_device_state_read(int chipno, struct sid_us_snapshot_state_s *sid_state);
6062

6163
void us_device_state_write(int chipno, struct sid_us_snapshot_state_s *sid_state);

vice/src/arch/shared/hwsiddrv/usbsid-unixwin-drv.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ void usbsid_drv_set_audio(int val)
108108
}
109109
}
110110

111+
void usbsid_drv_set_readmode(int val)
112+
{
113+
if (use_us_device) {
114+
us_set_readmode(val);
115+
}
116+
}
117+
111118
void usbsid_drv_state_read(int chipno, struct sid_us_snapshot_state_s *sid_state)
112119
{
113120
if (use_us_device) {

vice/src/sid/sid-cmdline-options.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,16 @@ static const cmdline_option_t hardsid_cmdline_options[] =
237237
};
238238
#endif
239239

240+
#ifdef HAVE_USBSID
241+
static const cmdline_option_t usbsid_cmdline_options[] =
242+
{
243+
{ "-usbsidreadmode", SET_RESOURCE, CMDLINE_ATTRIB_NEED_ARGS,
244+
NULL, NULL, "SidUSBSIDReadMode", NULL,
245+
"<1 or 0>", "Enable USBSID read mode (disables cycled writing & digiplay)" },
246+
CMDLINE_LIST_END
247+
};
248+
#endif
249+
240250
static cmdline_option_t stereo_cmdline_options[] =
241251
{
242252
{ "-sidextra", SET_RESOURCE, CMDLINE_ATTRIB_NEED_ARGS,
@@ -573,6 +583,12 @@ int sid_cmdline_options_init(int sid_type)
573583
}
574584
#endif
575585

586+
#ifdef HAVE_USBSID
587+
if (cmdline_register_options(usbsid_cmdline_options) < 0) {
588+
return -1;
589+
}
590+
#endif
591+
576592
#ifdef HAVE_HARDSID
577593
if (hardsid_available()) {
578594
if (cmdline_register_options(hardsid_cmdline_options) < 0) {

vice/src/sid/sid-resources.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ static int sid_engine;
8787
static int sid_hardsid_main;
8888
static int sid_hardsid_right;
8989
#endif
90+
#ifdef HAVE_USBSID
91+
static int sid_usbsid_readmode;
92+
#endif
9093

9194
static int set_sid_engine(int set_engine, void *param)
9295
{
@@ -363,6 +366,16 @@ static int set_sid_hardsid_right(int val, void *param)
363366
}
364367
#endif
365368

369+
#ifdef HAVE_USBSID
370+
static int set_sid_usbsid_main(int val, void *param)
371+
{
372+
sid_usbsid_readmode = (unsigned int)val;
373+
usbsid_set_readmode(sid_usbsid_readmode);
374+
375+
return 0;
376+
}
377+
#endif
378+
366379

367380
#ifdef HAVE_RESID
368381
static int sid_enabled = 1;
@@ -446,6 +459,14 @@ static const resource_int_t hardsid_resources_int[] = {
446459
};
447460
#endif
448461

462+
#ifdef HAVE_USBSID
463+
static const resource_int_t usbsid_resources_int[] = {
464+
{ "SidUSBSIDReadMode", 0, RES_EVENT_NO, NULL,
465+
&sid_usbsid_readmode, set_sid_usbsid_main, NULL },
466+
RESOURCE_INT_LIST_END
467+
};
468+
#endif
469+
449470

450471
static const resource_int_t stereo_resources_int[] = {
451472
{ "SidStereo", 0, RES_EVENT_SAME, NULL,
@@ -486,6 +507,12 @@ int sid_common_resources_init(void)
486507
}
487508
#endif
488509

510+
#ifdef HAVE_USBSID
511+
if (resources_register_int(usbsid_resources_int) < 0) {
512+
return -1;
513+
}
514+
#endif
515+
489516
return resources_register_int(common_resources_int);
490517
}
491518

vice/src/sid/usbsid.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#define usbsid_drv_store(addr, val, chipno) printf("[USBSID] usbsid_drv_store addr:%02x val:%02x chip:%d\n", addr, val, chipno)
5656
#define usbsid_drv_state_read(chipno, sid_state) printf("[USBSID] usbsid_drv_state_read chip:%d sid_state:%p\n", chipno, sid_state)
5757
#define usbsid_drv_state_write(chipno, sid_state) printf("[USBSID] usbsid_drv_state_write chip:%d sid_state:%p\n", chipno, sid_state)
58+
#define usbsid_drv_set_readmode(val) printf("[USBSID] usbsid_drv_set_readmode read_mode:%p\n", val)
5859

5960
#endif
6061

@@ -148,6 +149,13 @@ void usbsid_set_audio(int val)
148149
}
149150
}
150151

152+
void usbsid_set_readmode(int val)
153+
{
154+
if (!usbsid_is_open) {
155+
usbsid_drv_set_readmode(val);
156+
}
157+
}
158+
151159
/* ---------------------------------------------------------------------*/
152160

153161
void usbsid_state_read(int chipno, struct sid_us_snapshot_state_s *sid_state)

vice/src/usbsid.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void usbsid_store(uint16_t addr, uint8_t val, int chipno);
4242
void usbsid_set_machine_parameter(long cycles_per_sec);
4343
int usbsid_available(void);
4444
void usbsid_set_audio(int val);
45+
void usbsid_set_readmode(int val);
4546

4647
int usbsid_drv_open(void);
4748
int usbsid_drv_close(void);
@@ -51,6 +52,7 @@ void usbsid_drv_store(uint16_t addr, uint8_t val, int chipno);
5152
void usbsid_drv_set_machine_parameter(long cycles_per_sec);
5253
int usbsid_drv_available(void);
5354
void usbsid_drv_set_audio(int val);
55+
void usbsid_drv_set_readmode(int val);
5456

5557
void usbsid_state_read(int chipno, struct sid_us_snapshot_state_s *sid_state);
5658
void usbsid_state_write(int chipno, struct sid_us_snapshot_state_s *sid_state);

0 commit comments

Comments
 (0)