Annotation of uae/src/inputdevice.c, revision 1.1

1.1     ! root        1:  /*
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   *
        !             4:   * Input devices
        !             5:   *
        !             6:   * Copyright 1995-2004 Bernd Schmidt
        !             7:   * Copyright 1995 Alessandro Bissacco
        !             8:   * Copyright 2000-2004 Toni Wilen
        !             9:   */
        !            10: 
        !            11: #include "sysconfig.h"
        !            12: #include "sysdeps.h"
        !            13: 
        !            14: #include <ctype.h>
        !            15: #include <assert.h>
        !            16: 
        !            17: #include "config.h"
        !            18: #include "options.h"
        !            19: #include "threaddep/thread.h"
        !            20: #include "uae.h"
        !            21: #include "custom.h"
        !            22: #include "xwin.h"
        !            23: #include "memory.h"
        !            24: #include "newcpu.h"
        !            25: #include "drawing.h"
        !            26: #include "picasso96.h"
        !            27: #include "inputdevice.h"
        !            28: 
        !            29: /* Mouse and joystick emulation */
        !            30: 
        !            31: int buttonstate[3];
        !            32: int mouse_x, mouse_y;
        !            33: int joy0button, joy1button;
        !            34: unsigned int joy0dir, joy1dir;
        !            35: 
        !            36: /* Mousehack stuff */
        !            37: 
        !            38: #define defstepx (1<<16)
        !            39: #define defstepy (1<<16)
        !            40: #define defxoffs 0
        !            41: #define defyoffs 0
        !            42: 
        !            43: static const int docal = 60, xcaloff = 40, ycaloff = 20;
        !            44: static const int calweight = 3;
        !            45: static int lastsampledmx, lastsampledmy;
        !            46: static int lastspr0x,lastspr0y,lastdiffx,lastdiffy,spr0pos,spr0ctl;
        !            47: static int mstepx,mstepy,xoffs=defxoffs,yoffs=defyoffs;
        !            48: static int sprvbfl;
        !            49: 
        !            50: int lastmx, lastmy;
        !            51: int newmousecounters;
        !            52: int ievent_alive = 0;
        !            53: 
        !            54: enum mousestate mousestate;
        !            55: 
        !            56: void mousehack_setdontcare (void)
        !            57: {
        !            58:     if (mousestate == dont_care_mouse)
        !            59:        return;
        !            60: 
        !            61:     write_log ("Don't care mouse mode set\n");
        !            62:     mousestate = dont_care_mouse;
        !            63:     lastspr0x = lastmx; lastspr0y = lastmy;
        !            64:     mstepx = defstepx; mstepy = defstepy;
        !            65: }
        !            66: 
        !            67: void mousehack_setfollow (void)
        !            68: {
        !            69:     if (mousestate == follow_mouse)
        !            70:        return;
        !            71: 
        !            72:     write_log ("Follow sprite mode set\n");
        !            73:     mousestate = follow_mouse;
        !            74:     lastdiffx = lastdiffy = 0;
        !            75:     sprvbfl = 0;
        !            76:     spr0ctl = spr0pos = 0;
        !            77:     mstepx = defstepx; mstepy = defstepy;
        !            78: }
        !            79: 
        !            80: uae_u32 mousehack_helper (void)
        !            81: {
        !            82:     int mousexpos, mouseypos;
        !            83: 
        !            84: #ifdef PICASSO96
        !            85:     if (picasso_on) {
        !            86:        picasso_clip_mouse (&lastmx, &lastmy);
        !            87:        mousexpos = lastmx;
        !            88:        mouseypos = lastmy;
        !            89:     } else
        !            90: #endif
        !            91:     {
        !            92:        /* @@@ This isn't completely right, it doesn't deal with virtual
        !            93:           screen sizes larger than physical very well.  */
        !            94:        if (lastmy >= gfxvidinfo.height)
        !            95:            lastmy = gfxvidinfo.height - 1;
        !            96:        if (lastmy < 0)
        !            97:            lastmy = 0;
        !            98:        if (lastmx < 0)
        !            99:            lastmx = 0;
        !           100:        if (lastmx >= gfxvidinfo.width)
        !           101:            lastmx = gfxvidinfo.width - 1;
        !           102:        mouseypos = coord_native_to_amiga_y (lastmy) << 1;
        !           103:        mousexpos = coord_native_to_amiga_x (lastmx);
        !           104:     }
        !           105: 
        !           106:     switch (m68k_dreg (regs, 0)) {
        !           107:     case 0:
        !           108:        return ievent_alive ? -1 : needmousehack ();
        !           109:     case 1:
        !           110:        ievent_alive = 10;
        !           111:        return mousexpos;
        !           112:     case 2:
        !           113:        return mouseypos;
        !           114:     }
        !           115:     return 0;
        !           116: }
        !           117: 
        !           118: void togglemouse (void)
        !           119: {
        !           120:     switch (mousestate) {
        !           121:      case dont_care_mouse: mousehack_setfollow (); break;
        !           122:      case follow_mouse: mousehack_setdontcare (); break;
        !           123:      default: break; /* Nnnnnghh! */
        !           124:     }
        !           125: }
        !           126: 
        !           127: STATIC_INLINE int adjust (int val)
        !           128: {
        !           129:     if (val > 127)
        !           130:        return 127;
        !           131:     else if (val < -127)
        !           132:        return -127;
        !           133:     return val;
        !           134: }
        !           135: 
        !           136: void do_mouse_hack (void)
        !           137: {
        !           138:     int spr0x = ((spr0pos & 0xff) << 2) | ((spr0ctl & 1) << 1);
        !           139:     int spr0y = ((spr0pos >> 8) | ((spr0ctl & 4) << 6)) << 1;
        !           140:     int diffx, diffy;
        !           141: 
        !           142:     if (ievent_alive > 0) {
        !           143:        mouse_x = mouse_y = 0;
        !           144:        return;
        !           145:     }
        !           146:     switch (mousestate) {
        !           147:     case normal_mouse:
        !           148:        diffx = lastmx - lastsampledmx;
        !           149:        diffy = lastmy - lastsampledmy;
        !           150:        if (!newmousecounters) {
        !           151:            if (diffx > 127) diffx = 127;
        !           152:            if (diffx < -127) diffx = -127;
        !           153:            mouse_x += diffx;
        !           154:            if (diffy > 127) diffy = 127;
        !           155:            if (diffy < -127) diffy = -127;
        !           156:            mouse_y += diffy;
        !           157:        }
        !           158:        lastsampledmx += diffx; lastsampledmy += diffy;
        !           159:        break;
        !           160: 
        !           161:     case dont_care_mouse:
        !           162:        diffx = adjust (((lastmx - lastspr0x) * mstepx) >> 16);
        !           163:        diffy = adjust (((lastmy - lastspr0y) * mstepy) >> 16);
        !           164:        lastspr0x = lastmx; lastspr0y = lastmy;
        !           165:        mouse_x += diffx; mouse_y += diffy;
        !           166:        break;
        !           167: 
        !           168:     case follow_mouse:
        !           169:        if (sprvbfl && sprvbfl-- > 1) {
        !           170:            int mousexpos, mouseypos;
        !           171: 
        !           172:            if ((lastdiffx > docal || lastdiffx < -docal)
        !           173:                && lastspr0x != spr0x
        !           174:                && spr0x > plfstrt*4 + 34 + xcaloff
        !           175:                && spr0x < plfstop*4 - xcaloff)
        !           176:            {
        !           177:                int val = (lastdiffx << 16) / (spr0x - lastspr0x);
        !           178:                if (val >= 0x8000)
        !           179:                    mstepx = (mstepx * (calweight - 1) + val) / calweight;
        !           180:            }
        !           181:            if ((lastdiffy > docal || lastdiffy < -docal)
        !           182:                && lastspr0y != spr0y
        !           183:                && spr0y > plffirstline + ycaloff
        !           184:                && spr0y < plflastline - ycaloff)
        !           185:            {
        !           186:                int val = (lastdiffy << 16) / (spr0y - lastspr0y);
        !           187:                if (val >= 0x8000)
        !           188:                    mstepy = (mstepy * (calweight - 1) + val) / calweight;
        !           189:            }
        !           190:            if (lastmy >= gfxvidinfo.height)
        !           191:                lastmy = gfxvidinfo.height-1;
        !           192:            mouseypos = coord_native_to_amiga_y (lastmy) << 1;
        !           193:            mousexpos = coord_native_to_amiga_x (lastmx);
        !           194:            diffx = adjust ((((mousexpos + xoffs - spr0x) & ~1) * mstepx) >> 16);
        !           195:            diffy = adjust ((((mouseypos + yoffs - spr0y) & ~1) * mstepy) >> 16);
        !           196:            lastspr0x = spr0x; lastspr0y = spr0y;
        !           197:            lastdiffx = diffx; lastdiffy = diffy;
        !           198:            mouse_x += diffx; mouse_y += diffy;
        !           199:        }
        !           200:        break;
        !           201:        
        !           202:     default:
        !           203:        abort ();
        !           204:     }
        !           205: }
        !           206: 
        !           207: void mousehack_handle (int ctl, int pos)
        !           208: {
        !           209:     if (!sprvbfl && ((pos & 0xff) << 2) > 2 * DISPLAY_LEFT_SHIFT) {
        !           210:        spr0ctl = ctl;
        !           211:        spr0pos = pos;
        !           212:        sprvbfl = 2;
        !           213:     }
        !           214: }
        !           215: 
        !           216: uae_u16 potgo_value;
        !           217: 
        !           218: void POTGO (uae_u16 v)
        !           219: {
        !           220:     potgo_value = v;
        !           221: }
        !           222: 
        !           223: uae_u16 POTGOR (void)
        !           224: {
        !           225:     uae_u16 v = (potgo_value | (potgo_value >> 1)) & 0x5500;
        !           226: 
        !           227:     v |= (~potgo_value & 0xAA00) >> 1;
        !           228: 
        !           229:     if (JSEM_ISMOUSE (0, &currprefs)) {
        !           230:        if (buttonstate[2])
        !           231:            v &= 0xFBFF;
        !           232: 
        !           233:        if (buttonstate[1])
        !           234:            v &= 0xFEFF;
        !           235:     } else if (JSEM_ISJOY0 (0, &currprefs) || JSEM_ISJOY1 (0, &currprefs)) {
        !           236:        if (joy0button & 2) v &= 0xfbff;
        !           237:        if (joy0button & 4) v &= 0xfeff;
        !           238:     }
        !           239: 
        !           240:     if (JSEM_ISJOY0 (1, &currprefs) || JSEM_ISJOY1 (1, &currprefs)) {
        !           241:        if (joy1button & 2) v &= 0xbfff;
        !           242:        if (joy1button & 4) v &= 0xefff;
        !           243:     }
        !           244: 
        !           245:     return v;
        !           246: }
        !           247: 
        !           248: uae_u16 POT0DAT (void)
        !           249: {
        !           250:     static uae_u16 cnt = 0;
        !           251:     if (JSEM_ISMOUSE (0, &currprefs)) {
        !           252:        if (buttonstate[2])
        !           253:            cnt = ((cnt + 1) & 0xFF) | (cnt & 0xFF00);
        !           254:        if (buttonstate[1])
        !           255:            cnt += 0x100;
        !           256:     }
        !           257: 
        !           258:     return cnt;
        !           259: }
        !           260: uae_u16 JOY0DAT (void)
        !           261: {
        !           262:     if (JSEM_ISMOUSE (0, &currprefs)) {
        !           263:        do_mouse_hack ();
        !           264:        return ((uae_u8)mouse_x) + ((uae_u16)mouse_y << 8);
        !           265:     }
        !           266:     return joy0dir;
        !           267: }
        !           268: uae_u16 JOY1DAT (void)
        !           269: {
        !           270:     if (JSEM_ISMOUSE (1, &currprefs)) {
        !           271:        do_mouse_hack ();
        !           272:        return ((uae_u8)mouse_x) + ((uae_u16)mouse_y << 8);
        !           273:     }
        !           274:     return joy1dir;
        !           275: }
        !           276: void JOYTEST (uae_u16 v)
        !           277: {
        !           278:     if (JSEM_ISMOUSE (0, &currprefs)) {
        !           279:        mouse_x = v & 0xFC;
        !           280:        mouse_y = (v >> 8) & 0xFC;
        !           281:     }
        !           282: }

unix.superglobalmegacorp.com

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