|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * OS specific functions ! 5: * ! 6: * (c) 1995 Bernd Schmidt ! 7: * (c) 1996 Marcus Sundberg ! 8: */ ! 9: ! 10: #include "sysconfig.h" ! 11: #include "sysdeps.h" ! 12: ! 13: #include "config.h" ! 14: #include "options.h" ! 15: #include "memory.h" ! 16: #include "custom.h" ! 17: #include "os.h" ! 18: #include "events.h" ! 19: ! 20: #ifndef DONT_WANT_SOUND ! 21: static void sample16_handler(void); ! 22: static void sample8_handler(void); ! 23: #endif ! 24: ! 25: int joystickpresent = 0; ! 26: ! 27: #ifdef HAVE_LINUX_JOYSTICK_H ! 28: ! 29: static int js0; ! 30: ! 31: struct JS_DATA_TYPE jscal; ! 32: ! 33: void read_joystick(UWORD *dir, int *button) ! 34: { ! 35: static int minx = MAXINT, maxx = MININT, ! 36: miny = MAXINT, maxy = MININT; ! 37: int left = 0, right = 0, top = 0, bot = 0; ! 38: struct JS_DATA_TYPE buffer; ! 39: int len; ! 40: ! 41: *dir = 0; ! 42: *button = 0; ! 43: if (!joystickpresent) ! 44: return; ! 45: ! 46: len = read(js0, &buffer, sizeof(buffer)); ! 47: if (len != sizeof(buffer)) ! 48: return; ! 49: ! 50: if (buffer.x < minx) minx = buffer.x; ! 51: if (buffer.y < miny) miny = buffer.y; ! 52: if (buffer.x > maxx) maxx = buffer.x; ! 53: if (buffer.y > maxy) maxy = buffer.y; ! 54: ! 55: if (buffer.x < (minx + (maxx-minx)/3)) ! 56: left = 1; ! 57: else if (buffer.x > (minx + 2*(maxx-minx)/3)) ! 58: right = 1; ! 59: ! 60: if (buffer.y < (miny + (maxy-miny)/3)) ! 61: top = 1; ! 62: else if (buffer.y > (miny + 2*(maxy-miny)/3)) ! 63: bot = 1; ! 64: ! 65: if (left) top = !top; ! 66: if (right) bot = !bot; ! 67: *dir = bot | (right << 1) | (top << 8) | (left << 9); ! 68: *button = (buffer.buttons & 3) != 0; ! 69: } ! 70: ! 71: void init_joystick(void) ! 72: { ! 73: js0 = open("/dev/js0", O_RDONLY); ! 74: if (js0 < 0) ! 75: return; ! 76: joystickpresent = 1; ! 77: } ! 78: ! 79: void close_joystick(void) ! 80: { ! 81: if (joystickpresent) ! 82: close(js0); ! 83: } ! 84: ! 85: #elif defined(__DOS__) ! 86: ! 87: void read_joystick(UWORD *dir, int *button) ! 88: { ! 89: static int minx = MAXINT, maxx = MININT, ! 90: miny = MAXINT, maxy = MININT; ! 91: int left = 0, right = 0, top = 0, bot = 0; ! 92: char JoyPort; ! 93: int laps, JoyX, JoyY; ! 94: ! 95: *dir = 0; ! 96: *button = 0; ! 97: if (!joystickpresent) ! 98: return; ! 99: ! 100: JoyX = 0; ! 101: JoyY = 0; ! 102: laps = 0; ! 103: __asm__ __volatile__("cli"); ! 104: outportb(0x201, 0xff); ! 105: do { ! 106: JoyPort = inportb(0x201); ! 107: JoyX = JoyX + (JoyPort & 1); ! 108: JoyY = JoyY + ((JoyPort & 2) >> 1); ! 109: laps++; ! 110: } while(((JoyPort & 3) != 0) && (laps != 65535)); ! 111: __asm__ __volatile__("sti"); ! 112: ! 113: if (JoyX < minx) minx = JoyX; ! 114: if (JoyY < miny) miny = JoyY; ! 115: if (JoyX > maxx) maxx = JoyX; ! 116: if (JoyY > maxy) maxy = JoyY; ! 117: ! 118: if (JoyX < (minx + (maxx-minx)/3)) ! 119: left = 1; ! 120: else if (JoyX > (minx + 2*(maxx-minx)/3)) ! 121: right = 1; ! 122: ! 123: if (JoyY < (miny + (maxy-miny)/3)) ! 124: top = 1; ! 125: else if (JoyY > (miny + 2*(maxy-miny)/3)) ! 126: bot = 1; ! 127: ! 128: if (left) top = !top; ! 129: if (right) bot = !bot; ! 130: *dir = bot | (right << 1) | (top << 8) | (left << 9); ! 131: *button = ((~JoyPort) & 48) != 0; ! 132: } ! 133: ! 134: void init_joystick(void) ! 135: { ! 136: int laps = 0; ! 137: char JoyPort; ! 138: __asm__ __volatile__("cli"); ! 139: outportb(0x201, 0xff); ! 140: do { ! 141: JoyPort = inportb(0x201); ! 142: laps++; ! 143: } while(((JoyPort & 3) != 0) && (laps != 65535)); ! 144: __asm__ __volatile__("sti"); ! 145: if (laps != 65535) ! 146: joystickpresent = 1; ! 147: } ! 148: ! 149: void close_joystick(void) ! 150: { ! 151: } ! 152: ! 153: #else ! 154: void read_joystick(UWORD *dir, int *button) ! 155: { ! 156: *dir = 0; ! 157: *button = 0; ! 158: } ! 159: ! 160: void init_joystick(void) ! 161: { ! 162: } ! 163: ! 164: void close_joystick(void) ! 165: { ! 166: } ! 167: ! 168: #endif ! 169: ! 170: int sound_available = 0; ! 171: static long count = 0; ! 172: ! 173: struct audio_channel_data audio_channel[4]; ! 174: ! 175: /* The buffer is too large... */ ! 176: static UWORD buffer[44100], *bufpt; ! 177: ! 178: static ULONG data; ! 179: ! 180: int sound_table[256][64]; ! 181: static int smplcnt = 0; ! 182: static int dspbits = 16, freq_divisor = 1; ! 183: static int sndbufsize; ! 184: ! 185: static void init_sound_table16(void) ! 186: { ! 187: int i,j; ! 188: ! 189: for (i = 0; i < 256; i++) ! 190: for (j = 0; j < 64; j++) ! 191: sound_table[i][j] = j * (BYTE)i; ! 192: } ! 193: ! 194: static void init_sound_table8(void) ! 195: { ! 196: int i,j; ! 197: ! 198: for (i = 0; i < 256; i++) ! 199: for (j = 0; j < 64; j++) ! 200: sound_table[i][j] = (j * (BYTE)i) / 256; ! 201: } ! 202: ! 203: static int exact_log2(int v) ! 204: { ! 205: int l = 0; ! 206: while ((v >>= 1) != 0) ! 207: l++; ! 208: return l; ! 209: } ! 210: ! 211: #ifdef LINUX_SOUND ! 212: ! 213: #include <sys/ioctl.h> ! 214: #include <sys/soundcard.h> ! 215: ! 216: static int sfd; ! 217: static int have_sound; ! 218: ! 219: int init_sound (void) ! 220: { ! 221: int tmp; ! 222: int rate; ! 223: ! 224: unsigned long formats; ! 225: ! 226: sfd = open ("/dev/dsp", O_WRONLY); ! 227: have_sound = !(sfd < 0); ! 228: if (!have_sound) { ! 229: return 0; ! 230: } ! 231: ! 232: ioctl (sfd, SNDCTL_DSP_GETFMTS, &formats); ! 233: ! 234: if (sound_desired_bsiz < 128 || sound_desired_bsiz > 16384) { ! 235: fprintf(stderr, "Sound buffer size %d out of range.\n", sound_desired_bsiz); ! 236: sound_desired_bsiz = 8192; ! 237: } ! 238: ! 239: tmp = 0x00040000 + exact_log2(sound_desired_bsiz); ! 240: ioctl (sfd, SNDCTL_DSP_SETFRAGMENT, &tmp); ! 241: ioctl (sfd, SNDCTL_DSP_GETBLKSIZE, &sndbufsize); ! 242: ! 243: dspbits = sound_desired_bits; ! 244: ioctl(sfd, SNDCTL_DSP_SAMPLESIZE, &dspbits); ! 245: ioctl(sfd, SOUND_PCM_READ_BITS, &dspbits); ! 246: if (dspbits != sound_desired_bits) { ! 247: fprintf(stderr, "Can't use sound with %d bits\n", sound_desired_bits); ! 248: return 0; ! 249: } ! 250: ! 251: tmp = 0; ! 252: ioctl(sfd, SNDCTL_DSP_STEREO, &tmp); ! 253: ! 254: rate = sound_desired_freq; ! 255: ioctl(sfd, SNDCTL_DSP_SPEED, &rate); ! 256: ioctl(sfd, SOUND_PCM_READ_RATE, &rate); ! 257: /* Some soundcards have a bit of tolerance here. */ ! 258: if (rate < sound_desired_freq * 90 / 100 || rate > sound_desired_freq * 110 / 100) { ! 259: fprintf(stderr, "Can't use sound with desired frequency %d\n", sound_desired_freq); ! 260: return 0; ! 261: } ! 262: ! 263: eventtab[ev_sample].evtime = (long)maxhpos * maxvpos * 50 / rate; ! 264: ! 265: if (dspbits == 16) { ! 266: /* Will this break horribly on Linux/Alpha? Possible... */ ! 267: if (!(formats & AFMT_S16_LE)) ! 268: return 0; ! 269: init_sound_table16 (); ! 270: eventtab[ev_sample].handler = sample16_handler; ! 271: } else { ! 272: if (!(formats & AFMT_U8)) ! 273: return 0; ! 274: init_sound_table8 (); ! 275: eventtab[ev_sample].handler = sample8_handler; ! 276: } ! 277: sound_available = 1; ! 278: printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d bytes\n", ! 279: dspbits, rate, sndbufsize); ! 280: bufpt = buffer; ! 281: smplcnt = 0; ! 282: return 1; ! 283: } ! 284: ! 285: static void flush_sound_buffer(void) ! 286: { ! 287: write(sfd, buffer, sndbufsize); ! 288: bufpt = buffer; ! 289: } ! 290: ! 291: #elif defined(AF_SOUND) ! 292: ! 293: #include <AF/AFlib.h> ! 294: ! 295: static AFAudioConn *aud; ! 296: static AC ac; ! 297: static long aftime; ! 298: static int rate; ! 299: ! 300: static int have_sound; ! 301: ! 302: int init_sound (void) ! 303: { ! 304: AFSetACAttributes attributes; ! 305: AFDeviceDescriptor *aDev; ! 306: int device; ! 307: ! 308: aud = AFOpenAudioConn(NULL); ! 309: have_sound = !(aud == NULL); ! 310: if (!have_sound) { ! 311: return 0; ! 312: } ! 313: ! 314: for(device = 0; device < ANumberOfAudioDevices(aud); device++) { ! 315: aDev = AAudioDeviceDescriptor(aud, device); ! 316: rate = aDev->playSampleFreq; ! 317: sndbufsize = (rate / 8) * 4; ! 318: if(aDev->inputsFromPhone == 0 ! 319: && aDev->outputsToPhone == 0 ! 320: && aDev->playNchannels == 1) ! 321: break; ! 322: } ! 323: if (device == ANumberOfAudioDevices(aud)) { ! 324: return 0; ! 325: } ! 326: ! 327: dspbits = 16; ! 328: attributes.type = LIN16; ! 329: ac = AFCreateAC(aud, device, ACEncodingType, &attributes); ! 330: aftime = AFGetTime(ac); ! 331: ! 332: init_sound_table16 (); ! 333: eventtab[ev_sample].handler = sample16_handler; ! 334: eventtab[ev_sample].evtime = (long)maxhpos * maxvpos * 50 / rate; ! 335: ! 336: bufpt = buffer; ! 337: smplcnt = 0; ! 338: sound_available = 1; ! 339: printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d bytes\n", dspbits, rate, sndbufsize); ! 340: return 1; ! 341: } ! 342: ! 343: static void flush_sound_buffer(void) ! 344: { ! 345: long size = (char *)bufpt - (char *)buffer; ! 346: if (AFGetTime(ac) > aftime) ! 347: aftime = AFGetTime(ac); ! 348: AFPlaySamples(ac, aftime, size, (unsigned char*) buffer); ! 349: aftime += size / 2; ! 350: bufpt = buffer; ! 351: } ! 352: ! 353: #elif defined(__mac__) ! 354: ! 355: #include <Sound.h> ! 356: ! 357: static SndChannelPtr newChannel; ! 358: static ExtSoundHeader theSndBuffer; ! 359: static SndCommand theCmd; ! 360: ! 361: /* The buffer is too large... */ ! 362: static UWORD buffer0[44100], buffer1[44100], *bufpt; ! 363: ! 364: static int have_sound; ! 365: static int nextbuf=0; ! 366: static Boolean sFlag=true; ! 367: ! 368: int init_sound (void) ! 369: { ! 370: if (SndNewChannel(&newChannel, sampledSynth, initMono, NULL)) ! 371: return 0; ! 372: sndbufsize = 44100; ! 373: init_sound_table8 (); ! 374: smplcnt = 0; ! 375: bufpt = buffer0; ! 376: sound_available = 1; ! 377: return 1; ! 378: } ! 379: ! 380: static void flush_sound_buffer(void) ! 381: { ! 382: bufpt = buffer0; ! 383: ! 384: theSndBuffer.samplePtr = (Ptr)buffer0; ! 385: theSndBuffer.numChannels = 1; ! 386: theSndBuffer.sampleRate = 0xac440000; ! 387: theSndBuffer.encode = extSH; ! 388: theSndBuffer.numFrames = sndbufsize; ! 389: theSndBuffer.sampleSize = 8; ! 390: theCmd.param1 = 0; ! 391: theCmd.param2 = (long)&theSndBuffer; ! 392: theCmd.cmd = bufferCmd; ! 393: SndDoCommand(newChannel, &theCmd, false); ! 394: } ! 395: ! 396: #elif defined(__DOS__) ! 397: ! 398: #include "dos-sb.h" ! 399: ! 400: void (*SND_Write)(void *buf, unsigned long size); // Pointer to function that plays data on card ! 401: int dos_dsprate = 1; // 0 for 44100 - 1 for 22050 ! 402: int dos_dspbits = 16; ! 403: ! 404: int init_sound (void) ! 405: { ! 406: int rate; ! 407: ! 408: dspbits = sound_desired_bits; ! 409: rate = sound_desired_freq; ! 410: if (rate == 22050) ! 411: dos_dsprate = 1; ! 412: else if (rate == 44100) ! 413: dos_dsprate = 0; ! 414: else { ! 415: fprintf(stderr, "Can't use sample rate %d!\n", rate); ! 416: return 0; ! 417: } ! 418: ! 419: if (SB_DetectInitSound(&dspbits, &dos_dsprate, &sndbufsize)); ! 420: else if (0/*OTHER_CARD_DETECT_ROUTINE*/); ! 421: else ! 422: return 0; ! 423: ! 424: eventtab[ev_sample].evtime = (long)maxhpos * maxvpos * 50 / rate; ! 425: ! 426: if (dspbits == 16) { ! 427: init_sound_table16 (); ! 428: eventtab[ev_sample].handler = sample16_handler; ! 429: } else { ! 430: init_sound_table8 (); ! 431: eventtab[ev_sample].handler = sample8_handler; ! 432: } ! 433: sound_available = 1; ! 434: printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d bytes\n", ! 435: dspbits, rate, sndbufsize); ! 436: bufpt = buffer; ! 437: smplcnt = 0; ! 438: return 1; ! 439: } ! 440: ! 441: static void flush_sound_buffer(void) ! 442: { ! 443: SND_Write(buffer, sndbufsize); ! 444: bufpt = buffer; ! 445: } ! 446: ! 447: #elif defined(SOLARIS_SOUND) ! 448: ! 449: #include <sys/audioio.h> ! 450: ! 451: static int sfd; ! 452: static int have_sound; ! 453: ! 454: int init_sound (void) ! 455: { ! 456: int rate; ! 457: ! 458: struct audio_info sfd_info; ! 459: ! 460: sfd = open("/dev/audio", O_WRONLY); ! 461: have_sound = !(sfd <0); ! 462: if (!have_sound) { ! 463: return 0; ! 464: } ! 465: ! 466: rate = sound_desired_freq; ! 467: dspbits = sound_desired_bits; ! 468: AUDIO_INITINFO(&sfd_info); /* 44100Hz, mono, 16Bit, linear */ ! 469: sfd_info.play.sample_rate = rate; ! 470: sfd_info.play.channels = 1; ! 471: sfd_info.play.precision = dspbits; ! 472: sfd_info.play.encoding = AUDIO_ENCODING_LINEAR; ! 473: if (ioctl(sfd, AUDIO_SETINFO, &sfd_info)) { ! 474: fprintf(stderr, "Can't use sample rate %d with %d bits!\n", rate, bits); ! 475: return 0; ! 476: } ! 477: eventtab[ev_sample].evtime = (long)maxhpos * maxvpos * 50 / rate; ! 478: ! 479: if (dspbits == 16) { ! 480: init_sound_table16 (); ! 481: eventtab[ev_sample].handler = sample16_handler; ! 482: } else { ! 483: init_sound_table8 (); ! 484: eventtab[ev_sample].handler = sample8_handler; ! 485: } ! 486: ! 487: bufpt = buffer; ! 488: smplcnt = 0; ! 489: sound_available = 1; ! 490: sndbufsize = dspbits/8 * rate; ! 491: printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d bytes\n", dspbits, rate, sndbufsize); ! 492: return 1; ! 493: } ! 494: ! 495: static void flush_sound_buffer(void) ! 496: { ! 497: write(sfd, buffer, sndbufsize); ! 498: bufpt = buffer; ! 499: } ! 500: ! 501: ! 502: #else ! 503: ! 504: int init_sound (void) ! 505: { ! 506: produce_sound = 0; ! 507: return 1; ! 508: } ! 509: ! 510: static void flush_sound_buffer(void) ! 511: { ! 512: } ! 513: ! 514: #endif ! 515: ! 516: void AUDxDAT(int nr, UWORD v) ! 517: { ! 518: #ifndef DONT_WANT_SOUND ! 519: struct audio_channel_data *cdp = audio_channel + nr; ! 520: cdp->dat = v; ! 521: if (cdp->state == 0 && !(INTREQR() & (0x80 << nr))) { ! 522: cdp->state = 2; ! 523: INTREQ(0x8000 | (0x80 << nr)); ! 524: /* data_written = 2 ???? */ ! 525: eventtab[ev_aud0 + nr].evtime = cycles + cdp->per; ! 526: eventtab[ev_aud0 + nr].oldcycles = cycles; ! 527: eventtab[ev_aud0 + nr].active = 1; ! 528: events_schedule(); ! 529: } ! 530: #endif ! 531: } ! 532: ! 533: #ifndef DONT_WANT_SOUND ! 534: static void sample16_handler(void) ! 535: { ! 536: int nr; ! 537: ULONG data = 0; ! 538: ! 539: eventtab[ev_sample].evtime += cycles - eventtab[ev_sample].oldcycles; ! 540: eventtab[ev_sample].oldcycles = cycles; ! 541: ! 542: if (produce_sound < 2) ! 543: return; ! 544: ! 545: for (nr = 0; nr < 4; nr++) { ! 546: if (!(adkcon & (0x11 << nr))) ! 547: data += sound_table[audio_channel[nr].current_sample][audio_channel[nr].vol]; ! 548: } ! 549: *bufpt++ = data; ! 550: if ((char *)bufpt - (char *)buffer >= sndbufsize) { ! 551: flush_sound_buffer(); ! 552: } ! 553: } ! 554: ! 555: static void sample8_handler(void) ! 556: { ! 557: int nr; ! 558: ULONG data = 0; ! 559: unsigned char *bp = (unsigned char *)bufpt; ! 560: ! 561: eventtab[ev_sample].evtime += cycles - eventtab[ev_sample].oldcycles; ! 562: eventtab[ev_sample].oldcycles = cycles; ! 563: ! 564: if (produce_sound < 2) ! 565: return; ! 566: ! 567: for (nr = 0; nr < 4; nr++) { ! 568: if (!(adkcon & (0x11 << nr))) ! 569: data += sound_table[audio_channel[nr].current_sample][audio_channel[nr].vol]; ! 570: } ! 571: *bp++ = data + 128; ! 572: bufpt = (UWORD *)bp; ! 573: ! 574: if ((char *)bufpt - (char *)buffer >= sndbufsize) { ! 575: flush_sound_buffer(); ! 576: } ! 577: } ! 578: ! 579: static void audio_handler(int nr) ! 580: { ! 581: struct audio_channel_data *cdp = audio_channel + nr; ! 582: ! 583: switch (cdp->state) { ! 584: case 0: ! 585: fprintf(stderr, "Bug in sound code\n"); ! 586: break; ! 587: ! 588: case 1: ! 589: /* We come here at the first hsync after DMA was turned on. */ ! 590: eventtab[ev_aud0 + nr].evtime += maxhpos; ! 591: eventtab[ev_aud0 + nr].oldcycles += maxhpos; ! 592: ! 593: cdp->state = 5; ! 594: INTREQ(0x8000 | (0x80 << nr)); ! 595: if (cdp->wlen != 1) ! 596: cdp->wlen--; ! 597: cdp->nextdat = chipmem_bank.wget(cdp->pt); ! 598: cdp->pt += 2; ! 599: break; ! 600: ! 601: case 5: ! 602: /* We come here at the second hsync after DMA was turned on. */ ! 603: if (produce_sound == 0) ! 604: cdp->per = 65535; ! 605: ! 606: eventtab[ev_aud0 + nr].evtime = cycles + cdp->per; ! 607: eventtab[ev_aud0 + nr].oldcycles = cycles; ! 608: cdp->dat = cdp->nextdat; ! 609: cdp->current_sample = (UBYTE)(cdp->dat >> 8); ! 610: cdp->state = 2; ! 611: { ! 612: int audav = adkcon & (1 << nr); ! 613: int audap = adkcon & (16 << nr); ! 614: int napnav = (!audav && !audap) || audav; ! 615: if (napnav) ! 616: cdp->data_written = 2; ! 617: } ! 618: break; ! 619: ! 620: case 2: ! 621: /* We come here when a 2->3 transition occurs */ ! 622: if (produce_sound == 0) ! 623: cdp->per = 65535; ! 624: ! 625: cdp->current_sample = (UBYTE)(cdp->dat & 0xFF); ! 626: eventtab[ev_aud0 + nr].evtime = cycles + cdp->per; ! 627: eventtab[ev_aud0 + nr].oldcycles = cycles; ! 628: ! 629: cdp->state = 3; ! 630: ! 631: /* Period attachment? */ ! 632: if (adkcon & (0x10 << nr)) { ! 633: if (cdp->intreq2 && cdp->dmaen) ! 634: INTREQ(0x8000 | (0x80 << nr)); ! 635: cdp->intreq2 = 0; ! 636: ! 637: cdp->dat = cdp->nextdat; ! 638: if (cdp->dmaen) ! 639: cdp->data_written = 2; ! 640: if (nr < 3) { ! 641: if (cdp->dat == 0) ! 642: (cdp+1)->per = 65535; ! 643: ! 644: else if (cdp->dat < maxhpos/2 && produce_sound < 3) ! 645: (cdp+1)->per = maxhpos/2; ! 646: else ! 647: (cdp+1)->per = cdp->dat; ! 648: } ! 649: } ! 650: break; ! 651: ! 652: case 3: ! 653: /* We come here when a 3->2 transition occurs */ ! 654: if (produce_sound == 0) ! 655: cdp->per = 65535; ! 656: ! 657: eventtab[ev_aud0 + nr].evtime = cycles + cdp->per; ! 658: eventtab[ev_aud0 + nr].oldcycles = cycles; ! 659: ! 660: if ((INTREQR() & (0x80 << nr)) && !cdp->dmaen) { ! 661: cdp->state = 0; ! 662: cdp->current_sample = 0; ! 663: eventtab[ev_aud0 + nr].active = 0; ! 664: break; ! 665: } else { ! 666: int audav = adkcon & (1 << nr); ! 667: int audap = adkcon & (16 << nr); ! 668: int napnav = (!audav && !audap) || audav; ! 669: cdp->state = 2; ! 670: ! 671: if ((cdp->intreq2 && cdp->dmaen && napnav) ! 672: || (napnav && !cdp->dmaen)) ! 673: INTREQ(0x8000 | (0x80 << nr)); ! 674: cdp->intreq2 = 0; ! 675: ! 676: cdp->dat = cdp->nextdat; ! 677: cdp->current_sample = (UBYTE)(cdp->dat >> 8); ! 678: ! 679: if (cdp->dmaen && napnav) ! 680: cdp->data_written = 2; ! 681: ! 682: /* Volume attachment? */ ! 683: if (audav) { ! 684: if (nr < 3) ! 685: (cdp+1)->vol = cdp->dat; ! 686: } ! 687: } ! 688: break; ! 689: ! 690: default: ! 691: cdp->state = 0; ! 692: eventtab[ev_aud0 + nr].active = 0; ! 693: break; ! 694: } ! 695: } ! 696: ! 697: void aud0_handler(void) ! 698: { ! 699: audio_handler(0); ! 700: } ! 701: void aud1_handler(void) ! 702: { ! 703: audio_handler(1); ! 704: } ! 705: void aud2_handler(void) ! 706: { ! 707: audio_handler(2); ! 708: } ! 709: void aud3_handler(void) ! 710: { ! 711: audio_handler(3); ! 712: } ! 713: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.