Annotation of uae/os.c, revision 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:   */
        !             8: 
        !             9: #include <stdio.h>
        !            10: 
        !            11: #ifdef __unix
        !            12: #include <values.h>
        !            13: #include <fcntl.h>
        !            14: #include <unistd.h>
        !            15: #endif
        !            16: 
        !            17: #include "config.h"
        !            18: #include "amiga.h"
        !            19: #include "options.h"
        !            20: #include "memory.h"
        !            21: #include "custom.h"
        !            22: #include "os.h"
        !            23: 
        !            24: #ifdef LINUX_JOYSTICK
        !            25: 
        !            26: #include <linux/joystick.h>
        !            27: 
        !            28: static int js0;
        !            29: static bool joystickpresent = false;
        !            30: 
        !            31: struct JS_DATA_TYPE jscal;
        !            32: 
        !            33: void read_joystick(UWORD *dir, bool *button)
        !            34: {
        !            35:     static int minx = MAXINT, maxx = MININT,
        !            36:                miny = MAXINT, maxy = MININT;
        !            37:     bool left = false, right = false, top = false, bot = false;
        !            38:     struct JS_DATA_TYPE buffer;
        !            39:     int len;
        !            40:     
        !            41:     *dir = 0;
        !            42:     *button = false;
        !            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 = true;
        !            57:     else if (buffer.x > (minx + 2*(maxx-minx)/3))
        !            58:        right = true;
        !            59: 
        !            60:     if (buffer.y < (miny + (maxy-miny)/3))
        !            61:        top = true;
        !            62:     else if (buffer.y > (miny + 2*(maxy-miny)/3))
        !            63:        bot = true;
        !            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 = true;
        !            77: }
        !            78: 
        !            79: void close_joystick(void)
        !            80: {
        !            81:     if (joystickpresent)
        !            82:        close(js0);
        !            83: }
        !            84: #else
        !            85: 
        !            86: void read_joystick(UWORD *dir, bool *button)
        !            87: {
        !            88:     *dir = 0;
        !            89:     *button = false;
        !            90: }
        !            91: 
        !            92: void init_joystick(void)
        !            93: {
        !            94: }
        !            95: 
        !            96: void close_joystick(void)
        !            97: {
        !            98: }
        !            99: #endif
        !           100: 
        !           101: CPTR audlc[4], audpt[4];
        !           102: UWORD audvol[4], audper[4], audlen[4], audwlen[4];
        !           103: int audwper[4];
        !           104: UWORD auddat[4];
        !           105: int audsnum[4];
        !           106: 
        !           107: /* Audio states. This is not an exact representation of the Audio State Machine
        !           108:  * (HRM p. 166), but a simplification. To be honest, I don't completely
        !           109:  * understand that picture yet.
        !           110:  */
        !           111: int audst[4];
        !           112: 
        !           113: #ifdef LINUX_SOUND
        !           114: 
        !           115: #include <sys/soundcard.h>
        !           116: 
        !           117: static const int n_frames = 10;
        !           118: 
        !           119: /* The buffer is too large... */
        !           120: static UWORD buffer[44100], *bufpt;
        !           121: static BYTE snddata[4];
        !           122: 
        !           123: static int frames = 0;
        !           124: static int smplcnt = 0;
        !           125: 
        !           126: static int sfd;
        !           127: static bool have_sound;
        !           128: 
        !           129: bool init_sound (void)
        !           130: {
        !           131:     int tmp;
        !           132:     sfd = open ("/dev/dsp", O_WRONLY);
        !           133:     have_sound = !(sfd < 0);
        !           134:     if (!have_sound) {
        !           135:        return false;
        !           136:     }
        !           137:     
        !           138:     tmp = 16;
        !           139:     ioctl(sfd, SNDCTL_DSP_SAMPLESIZE, &tmp);
        !           140:     
        !           141:     tmp = 0;
        !           142:     ioctl(sfd, SNDCTL_DSP_STEREO, &tmp);
        !           143:     
        !           144:     tmp = 44100;
        !           145:     ioctl(sfd, SNDCTL_DSP_SPEED, &tmp);
        !           146:     
        !           147:     audst[0] = audst[1] = audst[2] = audst[3] = 0;
        !           148:     bufpt = buffer;
        !           149:     frames = n_frames;
        !           150:     smplcnt = 0;
        !           151:     return true;
        !           152: }
        !           153: 
        !           154: static void channel_reload (int c)
        !           155: {
        !           156:     audst[c] = 1;
        !           157:     audpt[c] = audlc[c];
        !           158:     audwper[c] = 0;
        !           159:     audwlen[c] = audlen[c];
        !           160:     audsnum[c] = 1;    
        !           161: }
        !           162: 
        !           163: void do_sound (void)
        !           164: {
        !           165:     smplcnt -= 227;
        !           166:     while (smplcnt < 0) {
        !           167:        int i;
        !           168:        smplcnt += 80;
        !           169:        for(i = 0; i < 4; i++) {
        !           170:            if (dmaen (1<<i)) {
        !           171:                if (audst[i] == 0) {            
        !           172:                    /* DMA was turned on for this channel */
        !           173:                    channel_reload (i);
        !           174:                    continue;
        !           175:                }
        !           176:                
        !           177:                if (audwper[i] <= 0) {
        !           178:                    audwper[i] += audper[i];
        !           179:                    if (audst[i] == 1) {
        !           180:                        /*  Starting a sample, cause interrupt */
        !           181:                        put_word (0xDFF09C, 0x8000 | (0x80 << i));
        !           182:                        audst[i] = 2;
        !           183:                    }
        !           184:                    audsnum[i] ^= 1;
        !           185:                    if (audsnum[i] == 0) {
        !           186:                        auddat[i] = get_word (audpt[i]);
        !           187:                        audpt[i] += 2;
        !           188:                        audwlen[i]--;
        !           189:                        if (audwlen[i] == 0) {
        !           190:                            channel_reload (i);
        !           191:                        }
        !           192:                    }           
        !           193:                }
        !           194:                snddata[i] = audsnum[i] ? auddat[i] : auddat[i] >> 8;
        !           195:                audwper[i] -= 80;               
        !           196:            } else 
        !           197:                audst[i] = snddata[i] = 0;
        !           198:        }
        !           199:        *bufpt++ = (snddata[0] * audvol[0] / 2 + snddata[1] * audvol[1] / 2
        !           200:                    + snddata[2] * audvol[2] / 2 + snddata[3] * audvol[3] / 2);
        !           201:     }
        !           202: }
        !           203: 
        !           204: void flush_sound (void)
        !           205: {
        !           206:     if (--frames == 0) {       
        !           207:        write (sfd, buffer, 2*(bufpt - buffer));
        !           208:        bufpt = buffer;
        !           209:        frames = n_frames;
        !           210:     }
        !           211: }
        !           212: 
        !           213: #else
        !           214: bool init_sound (void)
        !           215: {
        !           216:     return true;
        !           217: }
        !           218: 
        !           219: void do_sound (void)
        !           220: {
        !           221: }
        !           222: 
        !           223: void flush_sound (void)
        !           224: {
        !           225: }
        !           226: #endif
        !           227: 

unix.superglobalmegacorp.com

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