fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ibmpc: Add support for a Covox DAC and Disney Sound Source

+713 -7
+15
Makefile.dep
··· 419 419 src/arch/ibmpc/atari-pc.o: src/arch/ibmpc/atari-pc.c \ 420 420 src/arch/ibmpc/atari-pc.h \ 421 421 src/arch/ibmpc/cassette.h \ 422 + src/arch/ibmpc/covox.h \ 422 423 src/arch/ibmpc/ems.h \ 423 424 src/arch/ibmpc/ibmpc.h \ 424 425 src/arch/ibmpc/keyboard.h \ ··· 461 462 462 463 src/arch/ibmpc/cmd.o: src/arch/ibmpc/cmd.c \ 463 464 src/arch/ibmpc/cassette.h \ 465 + src/arch/ibmpc/covox.h \ 464 466 src/arch/ibmpc/ems.h \ 465 467 src/arch/ibmpc/ibmpc.h \ 466 468 src/arch/ibmpc/keyboard.h \ ··· 498 500 src/lib/sysdep.h \ 499 501 src/libini/libini.h 500 502 503 + src/arch/ibmpc/covox.o: src/arch/ibmpc/covox.c \ 504 + src/arch/ibmpc/covox.h \ 505 + src/arch/ibmpc/main.h \ 506 + src/config.h \ 507 + src/drivers/sound/filter.h \ 508 + src/drivers/sound/sound.h 509 + 501 510 src/arch/ibmpc/ems.o: src/arch/ibmpc/ems.c \ 502 511 src/arch/ibmpc/ems.h \ 503 512 src/arch/ibmpc/main.h \ ··· 510 519 511 520 src/arch/ibmpc/hook.o: src/arch/ibmpc/hook.c \ 512 521 src/arch/ibmpc/cassette.h \ 522 + src/arch/ibmpc/covox.h \ 513 523 src/arch/ibmpc/ems.h \ 514 524 src/arch/ibmpc/hook.h \ 515 525 src/arch/ibmpc/ibmpc.h \ ··· 550 560 src/arch/ibmpc/ibmpc.o: src/arch/ibmpc/ibmpc.c \ 551 561 src/arch/ibmpc/atari-pc.h \ 552 562 src/arch/ibmpc/cassette.h \ 563 + src/arch/ibmpc/covox.h \ 553 564 src/arch/ibmpc/ems.h \ 554 565 src/arch/ibmpc/hook.h \ 555 566 src/arch/ibmpc/ibmpc.h \ ··· 604 615 605 616 src/arch/ibmpc/int13.o: src/arch/ibmpc/int13.c \ 606 617 src/arch/ibmpc/cassette.h \ 618 + src/arch/ibmpc/covox.h \ 607 619 src/arch/ibmpc/ems.h \ 608 620 src/arch/ibmpc/ibmpc.h \ 609 621 src/arch/ibmpc/int13.h \ ··· 649 661 650 662 src/arch/ibmpc/m24.o: src/arch/ibmpc/m24.c \ 651 663 src/arch/ibmpc/cassette.h \ 664 + src/arch/ibmpc/covox.h \ 652 665 src/arch/ibmpc/ems.h \ 653 666 src/arch/ibmpc/ibmpc.h \ 654 667 src/arch/ibmpc/keyboard.h \ ··· 686 699 src/arch/ibmpc/main.o: src/arch/ibmpc/main.c \ 687 700 src/arch/ibmpc/cassette.h \ 688 701 src/arch/ibmpc/cmd.h \ 702 + src/arch/ibmpc/covox.h \ 689 703 src/arch/ibmpc/ems.h \ 690 704 src/arch/ibmpc/ibmpc.h \ 691 705 src/arch/ibmpc/keyboard.h \ ··· 729 743 730 744 src/arch/ibmpc/msg.o: src/arch/ibmpc/msg.c \ 731 745 src/arch/ibmpc/cassette.h \ 746 + src/arch/ibmpc/covox.h \ 732 747 src/arch/ibmpc/ems.h \ 733 748 src/arch/ibmpc/ibmpc.h \ 734 749 src/arch/ibmpc/keyboard.h \
+2
src/arch/ibmpc/Makefile.inc
··· 39 39 atari-pc \ 40 40 cassette \ 41 41 cmd \ 42 + covox \ 42 43 ems \ 43 44 hook \ 44 45 ibmpc \ ··· 116 117 117 118 $(rel)/cassette.o: $(rel)/cassette.c 118 119 $(rel)/cmd.o: $(rel)/cmd.c 120 + $(rel)/covox.o: $(rel)/covox.c 119 121 $(rel)/ems.o: $(rel)/ems.c 120 122 $(rel)/hook.o: $(rel)/hook.c 121 123 $(rel)/ibmpc.o: $(rel)/ibmpc.c
+433
src/arch/ibmpc/covox.c
··· 1 + /***************************************************************************** 2 + * pce * 3 + *****************************************************************************/ 4 + 5 + /***************************************************************************** 6 + * File name: src/arch/ibmpc/covox.c * 7 + * Created: 2010-08-14 by Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2010-2019 Hampa Hug <hampa@hampa.ch> * 9 + *****************************************************************************/ 10 + 11 + /***************************************************************************** 12 + * This program is free software. You can redistribute it and / or modify it * 13 + * under the terms of the GNU General Public License version 2 as published * 14 + * by the Free Software Foundation. * 15 + * * 16 + * This program is distributed in the hope that it will be useful, but * 17 + * WITHOUT ANY WARRANTY, without even the implied warranty of * 18 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * 19 + * Public License for more details. * 20 + *****************************************************************************/ 21 + 22 + 23 + #include "main.h" 24 + #include "covox.h" 25 + 26 + #include <stdlib.h> 27 + 28 + #include <drivers/sound/sound.h> 29 + 30 + 31 + #define PC_COVOX_SRATE 7000 32 + 33 + #define PC_COVOX_CLOCK PCE_IBMPC_CLK2 34 + 35 + 36 + #ifndef DEBUG_COVOX 37 + #define DEBUG_COVOX 0 38 + #endif 39 + 40 + 41 + static void pc_covox_flush (pc_covox_t *cov); 42 + 43 + 44 + void pc_covox_init (pc_covox_t *cov) 45 + { 46 + cov->drv = NULL; 47 + 48 + cov->disney = 0; 49 + 50 + cov->playing = 0; 51 + 52 + cov->data_val = 0; 53 + cov->ctrl_val = 0; 54 + 55 + cov->smp = 0; 56 + 57 + cov->fifo_i = 0; 58 + cov->fifo_n = 0; 59 + 60 + cov->timeout_clk = 0; 61 + cov->timeout_val = 0; 62 + 63 + cov->clk = 0; 64 + cov->rem = 0; 65 + 66 + cov->srate = 44100; 67 + 68 + cov->srate_div = 0; 69 + 70 + cov->lowpass_freq = 0; 71 + 72 + snd_iir2_init (&cov->iir); 73 + 74 + cov->buf_cnt = 0; 75 + 76 + pc_covox_set_volume (cov, 500); 77 + } 78 + 79 + void pc_covox_free (pc_covox_t *cov) 80 + { 81 + pc_covox_flush (cov); 82 + 83 + if (cov->drv != NULL) { 84 + snd_close (cov->drv); 85 + } 86 + } 87 + 88 + pc_covox_t *pc_covox_new (void) 89 + { 90 + pc_covox_t *cov; 91 + 92 + if ((cov = malloc (sizeof (pc_covox_t))) == NULL) { 93 + return (NULL); 94 + } 95 + 96 + pc_covox_init (cov); 97 + 98 + return (cov); 99 + } 100 + 101 + void pc_covox_del (pc_covox_t *cov) 102 + { 103 + if (cov != NULL) { 104 + pc_covox_free (cov); 105 + free (cov); 106 + } 107 + } 108 + 109 + 110 + void pc_covox_set_clk_fct (pc_covox_t *cov, void *ext, void *fct) 111 + { 112 + cov->get_clk_ext = ext; 113 + cov->get_clk = fct; 114 + } 115 + 116 + void pc_covox_set_mode (pc_covox_t *cov, unsigned mode) 117 + { 118 + if (mode == 0) { 119 + cov->disney = 0; 120 + } 121 + else { 122 + cov->disney = 1; 123 + } 124 + } 125 + 126 + int pc_covox_set_driver (pc_covox_t *cov, const char *driver, unsigned long srate) 127 + { 128 + if (cov->drv != NULL) { 129 + snd_close (cov->drv); 130 + } 131 + 132 + if ((cov->drv = snd_open (driver)) == NULL) { 133 + return (1); 134 + } 135 + 136 + cov->srate = srate; 137 + 138 + if (snd_set_params (cov->drv, 1, srate, 1)) { 139 + snd_close (cov->drv); 140 + cov->drv = NULL; 141 + return (1); 142 + } 143 + 144 + return (0); 145 + } 146 + 147 + void pc_covox_set_lowpass (pc_covox_t *cov, unsigned long freq) 148 + { 149 + cov->lowpass_freq = freq; 150 + 151 + snd_iir2_set_lowpass (&cov->iir, cov->lowpass_freq, cov->srate); 152 + } 153 + 154 + void pc_covox_set_volume (pc_covox_t *cov, unsigned vol) 155 + { 156 + if (vol > 1000) { 157 + vol = 1000; 158 + } 159 + 160 + cov->vol = (256UL * vol) / 1000; 161 + } 162 + 163 + 164 + static 165 + void pc_covox_play (pc_covox_t *cov, uint16_t *buf, unsigned cnt) 166 + { 167 + if (cov->lowpass_freq > 0) { 168 + snd_iir2_filter (&cov->iir, buf, buf, cnt, 1, 1); 169 + } 170 + 171 + snd_write (cov->drv, buf, cnt); 172 + } 173 + 174 + static 175 + void pc_covox_write (pc_covox_t *cov, uint16_t val, unsigned long cnt) 176 + { 177 + unsigned idx; 178 + 179 + if (cov->drv == NULL) { 180 + return; 181 + } 182 + 183 + idx = cov->buf_cnt; 184 + 185 + while (cnt > 0) { 186 + cov->buf[idx++] = val; 187 + 188 + if (idx >= PC_COVOX_BUF) { 189 + pc_covox_play (cov, cov->buf, idx); 190 + 191 + idx = 0; 192 + } 193 + 194 + cnt -= 1; 195 + } 196 + 197 + cov->buf_cnt = idx; 198 + } 199 + 200 + static 201 + void pc_covox_flush (pc_covox_t *cov) 202 + { 203 + if (cov->buf_cnt == 0) { 204 + return; 205 + } 206 + 207 + pc_covox_play (cov, cov->buf, cov->buf_cnt); 208 + 209 + snd_iir2_reset (&cov->iir); 210 + 211 + cov->buf_cnt = 0; 212 + } 213 + 214 + static inline 215 + uint16_t pc_covox_get_smp (pc_covox_t *cov, unsigned val) 216 + { 217 + unsigned ret; 218 + 219 + ret = cov->vol * ((long) (val & 0xff) - 0x80); 220 + 221 + return (ret & 0xffff); 222 + } 223 + 224 + static 225 + int pc_covox_fifo_add (pc_covox_t *cov, unsigned char val) 226 + { 227 + unsigned idx; 228 + 229 + if (cov->fifo_n >= PC_COVOX_FIFO) { 230 + return (1); 231 + } 232 + 233 + idx = (cov->fifo_i + cov->fifo_n) % PC_COVOX_FIFO; 234 + 235 + cov->fifo[idx] = val; 236 + 237 + cov->fifo_n += 1; 238 + 239 + return (0); 240 + } 241 + 242 + static 243 + int pc_covox_fifo_next (pc_covox_t *cov) 244 + { 245 + long val; 246 + 247 + if (cov->fifo_n == 0) { 248 + cov->smp = 0; 249 + return (1); 250 + } 251 + 252 + val = cov->fifo[cov->fifo_i]; 253 + 254 + cov->smp = pc_covox_get_smp (cov, val); 255 + 256 + cov->fifo_i = (cov->fifo_i + 1) % PC_COVOX_FIFO; 257 + cov->fifo_n -= 1; 258 + 259 + return (0); 260 + } 261 + 262 + static 263 + void pc_covox_on (pc_covox_t *cov) 264 + { 265 + #if DEBUG_COVOX >= 1 266 + pc_log_deb ("covox on\n"); 267 + #endif 268 + 269 + cov->playing = 1; 270 + 271 + cov->timeout_val = cov->data_val; 272 + cov->timeout_clk = 0; 273 + 274 + cov->rem = 0; 275 + 276 + cov->srate_div = 0; 277 + 278 + /* Fill the sound buffer a bit so we don't underrun immediately */ 279 + pc_covox_write (cov, 0, cov->srate / 8); 280 + } 281 + 282 + static 283 + void pc_covox_off (pc_covox_t *cov) 284 + { 285 + #if DEBUG_COVOX >= 1 286 + pc_log_deb ("covox off\n"); 287 + #endif 288 + 289 + cov->playing = 0; 290 + 291 + pc_covox_flush (cov); 292 + } 293 + 294 + static 295 + void pc_covox_check_disney (pc_covox_t *cov) 296 + { 297 + unsigned long clk, cnt, tmp; 298 + 299 + tmp = cov->get_clk (cov->get_clk_ext); 300 + clk = tmp - cov->clk; 301 + cov->clk = tmp; 302 + 303 + if (cov->playing == 0) { 304 + if (cov->fifo_n == 0) { 305 + return; 306 + } 307 + 308 + pc_covox_on (cov); 309 + 310 + pc_covox_fifo_next (cov); 311 + } 312 + 313 + tmp = cov->rem + cov->srate * clk; 314 + cov->rem = tmp % PC_COVOX_CLOCK; 315 + cnt = tmp / PC_COVOX_CLOCK; 316 + 317 + while (cnt > 0) { 318 + pc_covox_write (cov, cov->smp, 1); 319 + 320 + cov->srate_div += PC_COVOX_SRATE; 321 + 322 + while (cov->srate_div >= cov->srate) { 323 + if (pc_covox_fifo_next (cov)) { 324 + cov->timeout_clk += 1; 325 + 326 + if (cov->timeout_clk > (2 * PC_COVOX_SRATE)) { 327 + pc_covox_off (cov); 328 + return; 329 + } 330 + } 331 + else { 332 + cov->timeout_clk = 0; 333 + } 334 + 335 + cov->srate_div -= cov->srate; 336 + } 337 + 338 + cnt -= 1; 339 + } 340 + } 341 + 342 + static 343 + void pc_covox_check_covox (pc_covox_t *cov) 344 + { 345 + unsigned long clk, cnt, tmp; 346 + 347 + tmp = cov->get_clk (cov->get_clk_ext); 348 + clk = tmp - cov->clk; 349 + cov->clk = tmp; 350 + 351 + if (cov->playing == 0) { 352 + if (cov->timeout_val != cov->data_val) { 353 + pc_covox_on (cov); 354 + } 355 + return; 356 + } 357 + else if (cov->timeout_val == cov->data_val) { 358 + cov->timeout_clk += clk; 359 + 360 + if (cov->timeout_clk > (2 * PC_COVOX_CLOCK)) { 361 + pc_covox_off (cov); 362 + return; 363 + } 364 + } 365 + else { 366 + cov->timeout_val = cov->data_val; 367 + cov->timeout_clk = clk; 368 + } 369 + 370 + tmp = cov->rem + cov->srate * clk; 371 + cov->rem = tmp % PC_COVOX_CLOCK; 372 + cnt = tmp / PC_COVOX_CLOCK; 373 + 374 + if (cnt > 0) { 375 + pc_covox_write (cov, cov->smp, cnt); 376 + } 377 + } 378 + 379 + void pc_covox_set_data (pc_covox_t *cov, unsigned char val) 380 + { 381 + if (cov->disney == 0) { 382 + pc_covox_check_covox (cov); 383 + 384 + cov->smp = pc_covox_get_smp (cov, val); 385 + } 386 + 387 + cov->data_val = val; 388 + } 389 + 390 + void pc_covox_set_ctrl (pc_covox_t *cov, unsigned char val) 391 + { 392 + /* SEL */ 393 + if ((cov->ctrl_val ^ val) & val & 0x08) { 394 + pc_covox_fifo_add (cov, cov->data_val); 395 + } 396 + 397 + #if DEBUG_COVOX >= 2 398 + pc_log_deb ("covox: set ctrl: 0x%02x\n", val); 399 + #endif 400 + 401 + cov->ctrl_val = val; 402 + } 403 + 404 + unsigned char pc_covox_get_status (pc_covox_t *cov) 405 + { 406 + unsigned char val; 407 + 408 + val = 0x00; 409 + 410 + if (cov->fifo_n >= PC_COVOX_FIFO) { 411 + /* INIT */ 412 + if (cov->ctrl_val & 0x04) { 413 + /* ACK */ 414 + val |= 0x40; 415 + } 416 + } 417 + 418 + #if DEBUG_COVOX >= 2 419 + pc_log_deb ("covox: get status: 0x%02x\n", val); 420 + #endif 421 + 422 + return (val); 423 + } 424 + 425 + void pc_covox_clock (pc_covox_t *cov, unsigned long cnt) 426 + { 427 + if (cov->disney) { 428 + pc_covox_check_disney (cov); 429 + } 430 + else { 431 + pc_covox_check_covox (cov); 432 + } 433 + }
+95
src/arch/ibmpc/covox.h
··· 1 + /***************************************************************************** 2 + * pce * 3 + *****************************************************************************/ 4 + 5 + /***************************************************************************** 6 + * File name: src/arch/ibmpc/covox.h * 7 + * Created: 2010-08-14 by Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2010-2019 Hampa Hug <hampa@hampa.ch> * 9 + *****************************************************************************/ 10 + 11 + /***************************************************************************** 12 + * This program is free software. You can redistribute it and / or modify it * 13 + * under the terms of the GNU General Public License version 2 as published * 14 + * by the Free Software Foundation. * 15 + * * 16 + * This program is distributed in the hope that it will be useful, but * 17 + * WITHOUT ANY WARRANTY, without even the implied warranty of * 18 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * 19 + * Public License for more details. * 20 + *****************************************************************************/ 21 + 22 + 23 + #ifndef PCE_IBMPC_COVOX_H 24 + #define PCE_IBMPC_COVOX_H 1 25 + 26 + 27 + #include <drivers/sound/sound.h> 28 + 29 + 30 + #define PC_COVOX_BUF 2048 31 + #define PC_COVOX_FIFO 16 32 + 33 + 34 + typedef struct { 35 + sound_drv_t *drv; 36 + 37 + char disney; 38 + 39 + char playing; 40 + 41 + unsigned char data_val; 42 + unsigned char ctrl_val; 43 + 44 + uint16_t smp; 45 + unsigned vol; 46 + 47 + unsigned char fifo[PC_COVOX_FIFO]; 48 + unsigned fifo_i; 49 + unsigned fifo_n; 50 + 51 + uint16_t timeout_val; 52 + unsigned long timeout_clk; 53 + 54 + unsigned long clk; 55 + unsigned long rem; 56 + 57 + unsigned long srate; 58 + 59 + unsigned long srate_div; 60 + 61 + unsigned long lowpass_freq; 62 + sound_iir2_t iir; 63 + 64 + unsigned buf_cnt; 65 + uint16_t buf[PC_COVOX_BUF]; 66 + 67 + void *get_clk_ext; 68 + unsigned long (*get_clk) (void *ext); 69 + } pc_covox_t; 70 + 71 + 72 + void pc_covox_init (pc_covox_t *cov); 73 + void pc_covox_free (pc_covox_t *cas); 74 + 75 + pc_covox_t *pc_covox_new (void); 76 + void pc_covox_del (pc_covox_t *cov); 77 + 78 + void pc_covox_set_clk_fct (pc_covox_t *cov, void *ext, void *fct); 79 + 80 + void pc_covox_set_mode (pc_covox_t *cov, unsigned mode); 81 + 82 + int pc_covox_set_driver (pc_covox_t *cov, const char *driver, unsigned long srate); 83 + 84 + void pc_covox_set_lowpass (pc_covox_t *cov, unsigned long freq); 85 + 86 + void pc_covox_set_volume (pc_covox_t *cov, unsigned vol); 87 + 88 + void pc_covox_set_data (pc_covox_t *cov, unsigned char val); 89 + void pc_covox_set_ctrl (pc_covox_t *cov, unsigned char val); 90 + unsigned char pc_covox_get_status (pc_covox_t *cov); 91 + 92 + void pc_covox_clock (pc_covox_t *cov, unsigned long cnt); 93 + 94 + 95 + #endif
+85 -1
src/arch/ibmpc/ibmpc.c
··· 5 5 /***************************************************************************** 6 6 * File name: src/arch/ibmpc/ibmpc.c * 7 7 * Created: 1999-04-16 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 1999-2017 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 1999-2019 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 920 920 } 921 921 922 922 static 923 + void pc_setup_covox (ibmpc_t *pc, ini_sct_t *ini) 924 + { 925 + const char *driver; 926 + const char *mode; 927 + unsigned volume; 928 + unsigned long srate, lowpass; 929 + unsigned port; 930 + ini_sct_t *sct; 931 + 932 + pc->cov = NULL; 933 + 934 + sct = ini_next_sct (ini, NULL, "covox"); 935 + 936 + if (sct == NULL) { 937 + return; 938 + } 939 + 940 + ini_get_string (sct, "driver", &driver, NULL); 941 + ini_get_string (sct, "mode", &mode, "covox"); 942 + ini_get_uint16 (sct, "parport", &port, 0); 943 + ini_get_uint16 (sct, "volume", &volume, 500); 944 + ini_get_uint32 (sct, "sample_rate", &srate, 44100); 945 + ini_get_uint32 (sct, "lowpass", &lowpass, 0); 946 + 947 + if (strcmp (mode, "none") == 0) { 948 + return; 949 + } 950 + 951 + pce_log_tag (MSG_INF, 952 + "COVOX:", 953 + "parport=%u mode=%s volume=%u srate=%lu lowpass=%lu driver=%s\n", 954 + port, mode, volume, srate, lowpass, 955 + (driver != NULL) ? driver : "<none>" 956 + ); 957 + 958 + if ((port > 3) || (pc->parport[port] == NULL)) { 959 + pce_log (MSG_ERR, "*** no parallel port (%u)\n", port); 960 + return; 961 + } 962 + 963 + pc->cov = pc_covox_new(); 964 + 965 + if (pc->cov == NULL) { 966 + pce_log (MSG_ERR, "*** creating covox failed\n"); 967 + return; 968 + } 969 + 970 + pc_covox_set_clk_fct (pc->cov, pc, pc_get_clock2); 971 + 972 + if (driver != NULL) { 973 + if (pc_covox_set_driver (pc->cov, driver, srate)) { 974 + pce_log (MSG_ERR, 975 + "*** setting sound driver failed (%s)\n", 976 + driver 977 + ); 978 + } 979 + } 980 + 981 + if (strcmp (mode, "covox") == 0) { 982 + pc_covox_set_mode (pc->cov, 0); 983 + } 984 + else if (strcmp (mode, "disney") == 0) { 985 + pc_covox_set_mode (pc->cov, 1); 986 + } 987 + else { 988 + pce_log (MSG_ERR, "*** unknown mode (%s)\n", mode); 989 + } 990 + 991 + pc_covox_set_lowpass (pc->cov, lowpass); 992 + 993 + pc_covox_set_volume (pc->cov, volume); 994 + 995 + parport_set_data_fct (pc->parport[port], pc->cov, pc_covox_set_data); 996 + parport_set_ctrl_fct (pc->parport[port], pc->cov, pc_covox_set_ctrl); 997 + parport_set_status_fct (pc->parport[port], pc->cov, pc_covox_get_status); 998 + } 999 + 1000 + static 923 1001 void pc_setup_terminal (ibmpc_t *pc, ini_sct_t *ini) 924 1002 { 925 1003 pc->trm = ini_get_terminal (ini, par_terminal); ··· 1573 1651 pc_setup_parport (pc, ini); 1574 1652 pc_setup_ems (pc, ini); 1575 1653 pc_setup_xms (pc, ini); 1654 + pc_setup_covox (pc, ini); 1576 1655 1577 1656 pce_load_mem_ini (pc->mem, ini); 1578 1657 ··· 1639 1718 1640 1719 trm_del (pc->trm); 1641 1720 1721 + pc_covox_del (pc->cov); 1642 1722 pc_speaker_free (&pc->spk); 1643 1723 pc_cas_del (pc->cas); 1644 1724 e8237_free (&pc->dma); ··· 2009 2089 } 2010 2090 2011 2091 pc_speaker_clock (&pc->spk, clk); 2092 + 2093 + if (pc->cov != NULL) { 2094 + pc_covox_clock (pc->cov, clk); 2095 + } 2012 2096 2013 2097 for (i = 0; i < 4; i++) { 2014 2098 if (pc->serport[i] != NULL) {
+3 -4
src/arch/ibmpc/ibmpc.h
··· 5 5 /***************************************************************************** 6 6 * File name: src/arch/ibmpc/ibmpc.h * 7 7 * Created: 2001-05-01 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2001-2017 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2001-2019 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 25 25 26 26 27 27 #include "cassette.h" 28 + #include "covox.h" 28 29 #include "ems.h" 29 30 #include "keyboard.h" 30 31 #include "speaker.h" ··· 56 57 #include <lib/brkpt.h> 57 58 58 59 #include <libini/libini.h> 59 - 60 - 61 - 62 60 63 61 64 62 typedef struct ibmpc_t { ··· 81 79 pc_kbd_t kbd; 82 80 pc_cassette_t *cas; 83 81 pc_speaker_t spk; 82 + pc_covox_t *cov; 84 83 85 84 unsigned model; 86 85
+29
src/arch/ibmpc/pce-ibmpc.cfg.in
··· 402 402 } 403 403 404 404 405 + covox { 406 + # Disable the covox DAC 407 + mode = "none" 408 + 409 + # A simple covox DAC 410 + #mode = "covox" 411 + 412 + # Disney sound source 413 + #mode = "disney" 414 + 415 + # The volume in the range [0...1000] 416 + volume = 500 417 + 418 + # Apply a low-pass filter with the specified cut-off 419 + # frequency in Herz. This is separate from the low-pass 420 + # filter in the sound driver. If the frequency is 0, 421 + # the filter is disabled. 422 + lowpass = 3000 423 + 424 + # The sample rate at which sound is sent to the sound driver. 425 + sample_rate = 44100 426 + 427 + # The parallel port 428 + parport = 1 429 + 430 + driver = "wav:wav=covox.wav:lowpass=0:wavfilter=0" 431 + } 432 + 433 + 405 434 # Up to 4 serial ports can be defined 406 435 serial { 407 436 address = 0x3f8 # COM1
+37 -1
src/devices/parport.c
··· 5 5 /***************************************************************************** 6 6 * File name: src/devices/parport.c * 7 7 * Created: 2003-04-29 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2003-2011 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2003-2019 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 42 42 par->control = 0; 43 43 par->data = 0; 44 44 45 + par->set_data_ext = NULL; 46 + par->set_data = NULL; 47 + 48 + par->set_ctrl_ext = NULL; 49 + par->set_ctrl = NULL; 50 + 51 + par->get_status_ext = NULL; 52 + par->get_status = NULL; 53 + 45 54 par->cdrv = NULL; 46 55 } 47 56 ··· 74 83 } 75 84 } 76 85 86 + void parport_set_data_fct (parport_t *par, void *ext, void *fct) 87 + { 88 + par->set_data_ext = ext; 89 + par->set_data = fct; 90 + } 91 + 92 + void parport_set_ctrl_fct (parport_t *par, void *ext, void *fct) 93 + { 94 + par->set_ctrl_ext = ext; 95 + par->set_ctrl = fct; 96 + } 97 + 98 + void parport_set_status_fct (parport_t *par, void *ext, void *fct) 99 + { 100 + par->get_status_ext = ext; 101 + par->get_status = fct; 102 + } 103 + 77 104 mem_blk_t *parport_get_reg (parport_t *par) 78 105 { 79 106 return (&par->port); ··· 120 147 { 121 148 switch (addr) { 122 149 case 0x00: 150 + if (par->set_data != NULL) { 151 + par->set_data (par->set_data_ext, val); 152 + } 123 153 par->data = val; 124 154 break; 125 155 ··· 127 157 break; 128 158 129 159 case 0x02: 160 + if (par->set_ctrl != NULL) { 161 + par->set_ctrl (par->set_ctrl_ext, val); 162 + } 130 163 parport_set_control (par, val); 131 164 break; 132 165 } ··· 144 177 return (par->data); 145 178 146 179 case 0x01: 180 + if (par->get_status != NULL) { 181 + return (par->get_status (par->get_status_ext)); 182 + } 147 183 return (par->status); 148 184 149 185 case 0x02:
+14 -1
src/devices/parport.h
··· 5 5 /***************************************************************************** 6 6 * File name: src/devices/parport.h * 7 7 * Created: 2003-04-29 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2003-2009 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2003-2019 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 48 48 unsigned char control; 49 49 unsigned char data; 50 50 51 + void *set_data_ext; 52 + void (*set_data) (void *ext, unsigned char val); 53 + 54 + void *set_ctrl_ext; 55 + void (*set_ctrl) (void *ext, unsigned char val); 56 + 57 + void *get_status_ext; 58 + unsigned char (*get_status) (void *ext); 59 + 51 60 char_drv_t *cdrv; 52 61 } parport_t; 53 62 ··· 56 65 parport_t *parport_new (unsigned long base); 57 66 void parport_free (parport_t *par); 58 67 void parport_del (parport_t *par); 68 + 69 + void parport_set_data_fct (parport_t *par, void *ext, void *fct); 70 + void parport_set_ctrl_fct (parport_t *par, void *ext, void *fct); 71 + void parport_set_status_fct (parport_t *par, void *ext, void *fct); 59 72 60 73 mem_blk_t *parport_get_reg (parport_t *par); 61 74