Annotation of uae/src/od-dos/joystick.c, revision 1.1.1.1

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * Joystick emulation for DOS
                      5:   *
                      6:   * Copyright 1996, 1997 Gustavo Goedert
                      7:   */
                      8: 
                      9: #include "sysconfig.h"
                     10: #include "sysdeps.h"
                     11: 
                     12: #include <dos.h>
                     13: 
                     14: #include "config.h"
                     15: #include "options.h"
                     16: #include "memory.h"
                     17: #include "custom.h"
                     18: #include "joystick.h"
                     19: 
                     20: int HasJoy0 = 0, HasJoy1 = 0;
                     21: int minx0, maxx0, miny0, maxy0;
                     22: int minx1, maxx1, miny1, maxy1;
                     23: 
                     24: void read_joystick(int nr, unsigned int *dir, int *button) {
                     25:     int *minx, *maxx, *miny, *maxy;
                     26:     int left = 0, right = 0, top = 0, bot = 0;
                     27:     char JoyPort;
                     28:     int laps, JoyX, JoyY, XCenter, YCenter, XDelta, YDelta;
                     29: 
                     30:     *dir = 0;
                     31:     *button = 0;
                     32:     if (((nr == 0) && (HasJoy0 == 0)) || ((nr == 1) && (HasJoy1 == 0)))
                     33:        return;
                     34: 
                     35:     JoyX = 0;
                     36:     JoyY = 0;
                     37:     laps = 0;
                     38:     outportb(0x201, 0xff);
                     39:     if (nr == 0) {
                     40:        disable();
                     41:        do {
                     42:            JoyPort = inportb(0x201);
                     43:            if (JoyPort & 1)
                     44:                JoyX++;
                     45:            if (JoyPort & 2)
                     46:                JoyY++;
                     47:            laps++;
                     48:        } while(((JoyPort & 3) != 0) && (laps != 65535));
                     49:        enable();
                     50:        if (laps == 65535) {
                     51:            HasJoy0 = 0;
                     52:            return;
                     53:        }
                     54:        minx = &minx0;
                     55:        maxx = &maxx0;
                     56:        miny = &miny0;
                     57:        maxy = &maxy0;
                     58:     } else {
                     59:        disable();
                     60:        do {
                     61:            JoyPort = inportb(0x201);
                     62:            if (JoyPort & 4)
                     63:                JoyX++;
                     64:            if (JoyPort & 8)
                     65:                JoyY++;
                     66:            laps++;
                     67:        } while(((JoyPort & 12) != 0) && (laps != 65535));
                     68:        enable();
                     69:        if (laps == 65535) {
                     70:            HasJoy1 = 0;
                     71:            return;
                     72:        }
                     73:        minx = &minx1;
                     74:        maxx = &maxx1;
                     75:        miny = &miny1;
                     76:        maxy = &maxy1;
                     77:     }
                     78: 
                     79:     if (JoyX < (*minx)) *minx = JoyX;
                     80:     if (JoyY < (*miny)) *miny = JoyY;
                     81:     if (JoyX > (*maxx)) *maxx = JoyX;
                     82:     if (JoyY > (*maxy)) *maxy = JoyY;
                     83: 
                     84:     XCenter = ((*maxx)+(*minx))/2;
                     85:     YCenter = ((*maxy)+(*miny))/2;
                     86:     XDelta = ((*maxx)-(*minx))/3;
                     87:     YDelta = ((*maxy)-(*miny))/3;
                     88: 
                     89:     if (JoyX < (XCenter-XDelta))
                     90:        left = 1;
                     91:     if (JoyX > (XCenter+XDelta))
                     92:        right = 1;
                     93: 
                     94:     if (JoyY < (YCenter-YDelta))
                     95:        top = 1;
                     96:     if (JoyY > (YCenter+YDelta))
                     97:        bot = 1;
                     98: 
                     99:     if (left) top = !top;
                    100:     if (right) bot = !bot;
                    101:     *dir = bot | (right << 1) | (top << 8) | (left << 9);
                    102: 
                    103:     JoyPort = ~JoyPort;
                    104:     if (nr == 0) {
                    105:        if (JoyPort & 16) *button += 1;
                    106:        if (JoyPort & 32) *button += 2;
                    107:     } else {
                    108:        if (JoyPort & 64) *button += 1;
                    109:        if (JoyPort & 128) *button += 2;
                    110:     }
                    111:     if ((*button) == 3) *button = 4;
                    112: }
                    113: 
                    114: void init_joystick(void) {
                    115:     int laps, JoyX, JoyY;
                    116:     char JoyPort;
                    117: 
                    118:     JoyX = 0;
                    119:     JoyY = 0;
                    120:     laps = 0;
                    121:     disable();
                    122:     outportb(0x201, 0xff);
                    123:     do {
                    124:        JoyPort = inportb(0x201);
                    125:        if (JoyPort & 1)
                    126:            JoyX++;
                    127:        if (JoyPort & 2)
                    128:            JoyY++;
                    129:        laps++;
                    130:     } while(((JoyPort & 3) != 0) && (laps != 65535));
                    131:     enable();
                    132:     if (laps != 65535) {
                    133:        HasJoy0 = 1;
                    134:        minx0 = JoyX - 2*JoyX/3;
                    135:        maxx0 = JoyX + 2*JoyX/3;
                    136:        miny0 = JoyY - 2*JoyY/3;
                    137:        maxy0 = JoyY + 2*JoyY/3;
                    138:     }
                    139: 
                    140:     JoyX = 0;
                    141:     JoyY = 0;
                    142:     laps = 0;
                    143:     disable();
                    144:     outportb(0x201, 0xff);
                    145:     do {
                    146:        JoyPort = inportb(0x201);
                    147:        if (JoyPort & 4)
                    148:            JoyX++;
                    149:        if (JoyPort & 8)
                    150:            JoyY++;
                    151:        laps++;
                    152:     } while(((JoyPort & 12) != 0) && (laps != 65535));
                    153:     enable();
                    154:     if (laps != 65535) {
                    155:        HasJoy1 = 1;
                    156:        minx1 = JoyX - 2*JoyX/3;
                    157:        maxx1 = JoyX + 2*JoyX/3;
                    158:        miny1 = JoyY - 2*JoyY/3;
                    159:        maxy1 = JoyY + 2*JoyY/3;
                    160:     }
                    161: }
                    162: 
                    163: void close_joystick(void) {
                    164: }

unix.superglobalmegacorp.com

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