Annotation of uae/src/os.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.