From 3adab23aeae005f83ffc52609c6070f07444de9a Mon Sep 17 00:00:00 2001 From: sparky4 Date: Wed, 7 Dec 2016 13:25:48 -0600 Subject: [PATCH] added older 16_in as _6_in for undo w --- DEBUG.16W | 210 -------- HEAP.16W | 47 -- MEMINFO.16W | 0 MMDUMP.16W | Bin 2244 -> 0 bytes bcexmm.exe | Bin 119900 -> 0 bytes data/g.pal | Bin 768 -> 0 bytes joytest.exe | Bin 16558 -> 25472 bytes src/lib/_6_in.c | 1290 +++++++++++++++++++++++++++++++++++++++++++++++ src/lib/_6_in.h | 309 ++++++++++++ 9 files changed, 1599 insertions(+), 257 deletions(-) delete mode 100755 DEBUG.16W delete mode 100755 HEAP.16W delete mode 100755 MEMINFO.16W delete mode 100755 MMDUMP.16W delete mode 100755 bcexmm.exe delete mode 100755 data/g.pal create mode 100755 src/lib/_6_in.c create mode 100755 src/lib/_6_in.h diff --git a/DEBUG.16W b/DEBUG.16W deleted file mode 100755 index 43cf8f7d..00000000 --- a/DEBUG.16W +++ /dev/null @@ -1,210 +0,0 @@ -Seg:0 Size:10201 Owner:0x0 -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 -Seg:27d9 Size:256 Owner:0x1640 -++++ -Seg:299a Size:44 Owner:0x0 -+ -Seg:29c6 Size:256 Owner:0x1432 -++++ -Seg:2ac6 Size:256 Owner:0x1434 -+++++ -Seg:2bc6 Size:256 Owner:0x1436 -++++ -Seg:2cc6 Size:256 Owner:0x1438 -++++ -Seg:2dc6 Size:256 Owner:0x143a -++++ -Seg:2ec6 Size:256 Owner:0x143c -++++ -Seg:2fc6 Size:256 Owner:0x143e -+++++ -Seg:30c6 Size:256 Owner:0x1440 -++++ -Seg:31c6 Size:256 Owner:0x1442 -++++ -Seg:32c6 Size:256 Owner:0x1444 -++++ -Seg:33c6 Size:256 Owner:0x1446 -++++ -Seg:34c6 Size:256 Owner:0x1448 -+++++ -Seg:35c6 Size:256 Owner:0x144a -++++ -Seg:36c6 Size:256 Owner:0x144c -++++ -Seg:37c6 Size:256 Owner:0x144e -++++ -Seg:38c6 Size:256 Owner:0x1450 -++++ -Seg:39c6 Size:256 Owner:0x1452 -+++++ -Seg:3ac6 Size:256 Owner:0x1454 -++++ -Seg:3bc6 Size:256 Owner:0x1456 -++++ -Seg:3cc6 Size:256 Owner:0x1458 -++++ -Seg:3dc6 Size:256 Owner:0x145a -++++ -Seg:3ec6 Size:256 Owner:0x145c -+++++ -Seg:3fc6 Size:256 Owner:0x145e -++++ -Seg:40c6 Size:256 Owner:0x1460 -++++ -Seg:41c6 Size:256 Owner:0x1462 -++++ -Seg:42c6 Size:256 Owner:0x1464 -++++ -Seg:43c6 Size:256 Owner:0x1466 -+++++ -Seg:44c6 Size:256 Owner:0x1468 -++++ -Seg:45c6 Size:256 Owner:0x146a -++++ -Seg:46c6 Size:256 Owner:0x146c -++++ -Seg:47c6 Size:256 Owner:0x146e -++++ -Seg:48c6 Size:256 Owner:0x1470 -+++++ -Seg:49c6 Size:256 Owner:0x1472 -++++ -Seg:4ac6 Size:256 Owner:0x1474 -++++ -Seg:4bc6 Size:256 Owner:0x1476 -++++ -Seg:4cc6 Size:256 Owner:0x1478 -++++ -Seg:4dc6 Size:256 Owner:0x147a -+++++ -Seg:4ec6 Size:256 Owner:0x147c -++++ -Seg:4fc6 Size:256 Owner:0x147e -++++ -Seg:50c6 Size:256 Owner:0x1480 -++++ -Seg:51c6 Size:256 Owner:0x1482 -++++ -Seg:52c6 Size:256 Owner:0x1484 -+++++ -Seg:53c6 Size:256 Owner:0x1486 -++++ -Seg:54c6 Size:256 Owner:0x1488 -++++ -Seg:55c6 Size:256 Owner:0x148a -++++ -Seg:56c6 Size:256 Owner:0x148c -++++ -Seg:57c6 Size:256 Owner:0x148e -+++++ -Seg:58c6 Size:256 Owner:0x1490 -++++ -Seg:59c6 Size:256 Owner:0x1492 -++++ -Seg:5ac6 Size:256 Owner:0x1494 -++++ -Seg:5bc6 Size:256 Owner:0x1496 -++++ -Seg:5cc6 Size:256 Owner:0x1498 -+++++ -Seg:5dc6 Size:256 Owner:0x149a -++++ -Seg:5ec6 Size:256 Owner:0x149c -++++ -Seg:5fc6 Size:256 Owner:0x149e -++++ -Seg:60c6 Size:256 Owner:0x14a0 -++++ -Seg:61c6 Size:256 Owner:0x14a2 -+++++ -Seg:62c6 Size:256 Owner:0x14a4 -++++ -Seg:63c6 Size:256 Owner:0x14a6 -++++ -Seg:64c6 Size:256 Owner:0x14a8 -++++ -Seg:65c6 Size:256 Owner:0x14aa -++++ -Seg:66c6 Size:256 Owner:0x14ac -+++++ -Seg:67c6 Size:256 Owner:0x14ae -++++ -Seg:68c6 Size:256 Owner:0x14b0 -++++ -Seg:69c6 Size:256 Owner:0x14b2 -++++ -Seg:6ac6 Size:256 Owner:0x14b4 -++++ -Seg:6bc6 Size:256 Owner:0x14b6 -+++++ -Seg:6cc6 Size:256 Owner:0x14b8 -++++ -Seg:6dc6 Size:256 Owner:0x14ba -++++ -Seg:6ec6 Size:256 Owner:0x14bc -++++ -Seg:6fc6 Size:256 Owner:0x14be -++++ -Seg:70c6 Size:256 Owner:0x14c0 -+++++ -Seg:71c6 Size:256 Owner:0x14c2 -++++ -Seg:72c6 Size:256 Owner:0x14c4 -++++ -Seg:73c6 Size:256 Owner:0x14c6 -++++ -Seg:74c6 Size:256 Owner:0x14c8 -++++ -Seg:75c6 Size:256 Owner:0x14ca -+++++ -Seg:76c6 Size:256 Owner:0x14cc -++++ -Seg:77c6 Size:256 Owner:0x14ce -++++ -Seg:78c6 Size:256 Owner:0x14d0 -++++ -Seg:79c6 Size:256 Owner:0x14d2 -++++ -Seg:7ac6 Size:256 Owner:0x14d4 -+++++ -Seg:7bc6 Size:256 Owner:0x14d6 -++++ -Seg:7cc6 Size:256 Owner:0x14d8 -++++ -Seg:7dc6 Size:256 Owner:0x14da -++++ -Seg:7ec6 Size:256 Owner:0x14dc -++++ -Seg:7fc6 Size:256 Owner:0x14de -+++++ -Seg:80c6 Size:256 Owner:0x14e0 -++++ -Seg:81c6 Size:256 Owner:0x14e2 -++++ -Seg:82c6 Size:256 Owner:0x14e4 -++++ -Seg:83c6 Size:256 Owner:0x14e6 -++++ -Seg:84c6 Size:256 Owner:0x14e8 -+++++ -Seg:85c6 Size:256 Owner:0x14ea -++++ -Seg:86c6 Size:256 Owner:0x14ec -++++ -Seg:87c6 Size:256 Owner:0x14ee -++++ -Seg:88c6 Size:256 Owner:0x14f0 -++++ -Seg:89c6 Size:256 Owner:0x14f2 -+++++ -Seg:8ac6 Size:256 Owner:0x14f4 -++++ -Seg:8bc6 Size:256 Owner:0x14f6 -++++ -Seg:8cc6 Size:256 Owner:0x14f8 -++++ -Seg:8dc6 Size:273 Owner:0xded0 -+++++ -Seg:b9c6 Size:17977 Owner:0x0 -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \ No newline at end of file diff --git a/HEAP.16W b/HEAP.16W deleted file mode 100755 index 1917e011..00000000 --- a/HEAP.16W +++ /dev/null @@ -1,47 +0,0 @@ - - == default == - - USED block at 29bc0016 of size 66 - USED block at 29bc0058 of size 66 - FREE block at 29bc009a of size 18 - USED block at 29bc00ac of size 136 - USED block at 29bc0134 of size 20 - FREE block at 29bc0148 of size 7860 -OK - end of heap - - == near == - - USED block at 19bbdf06 of size 12 - USED block at 19bbdf12 of size 530 - USED block at 19bbe124 of size 72 - USED block at 19bbe16c of size 20 - USED block at 19bbe180 of size 20 - USED block at 19bbe194 of size 20 - USED block at 19bbe1a8 of size 20 - USED block at 19bbe1bc of size 20 - USED block at 19bbe1d0 of size 7724 -OK - end of heap - - == far == - - USED block at 29bc0016 of size 66 - USED block at 29bc0058 of size 66 - USED block at 29bc009a of size 18 - USED block at 29bc00ac of size 136 - USED block at 29bc0134 of size 20 - USED block at 29bc0148 of size 7860 -OK - end of heap - -Memory Type Total Used Free ----------------- -------- -------- -------- -Default 8166 288 7878 -Near 8438 714 7724 -Far 8166 288 7878 ----------------- -------- -------- -------- -coreleft = 7722 -farcoreleft = 31830 -GetFreeSize = 24128 -GetNearFreeSize = 7724 -GetFarFreeSize = 24128 -memavl = 7722 -stackavail = 31588 diff --git a/MEMINFO.16W b/MEMINFO.16W deleted file mode 100755 index e69de29b..00000000 diff --git a/MMDUMP.16W b/MMDUMP.16W deleted file mode 100755 index 892dcbced1ab8b0f79b025a822f92e8b42ca3cd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2244 zcmZwJJ4!@B6h%>E!N3{3P=kiDt*_8?=qc3ijltndgBZw4ceLOJ_k`~duIuX~eqN8a z`_ubzJHpFz_^XjMvsTv5I$5`B46O7BfXTj(wH7J3W4h2BDMp|{Xm>8P7@JLnzs4tfW@gWf^!pm)$a>7DdWdMCY;-bwGIchbA) zUGy$`7rl$#Mem|_(Yxv0^lo}Ly_?=m@1}Rtd(wN-d(wN-d&-+1-~aM&m#qD`@#Xb* Gt^5FOy|{<~ diff --git a/bcexmm.exe b/bcexmm.exe deleted file mode 100755 index c11e9410f7921c01c97e813a8f41177b1fd6478e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119900 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 F{{yCy`e^_F diff --git a/data/g.pal b/data/g.pal deleted file mode 100755 index 0ecbac33f44529d9701eae8c9b262c7da0f50416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 QcmZQz7zLvtFmgix00RI30RR91 diff --git a/joytest.exe b/joytest.exe index b8072513d71ac755eb4b7f9596826a9aca34facd..49400b1edcd5cb30cb426a1c47b19eff78859692 100755 GIT binary patch literal 25472 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 diff --git a/src/lib/_6_in.c b/src/lib/_6_in.c new file mode 100755 index 00000000..72dcadf5 --- /dev/null +++ b/src/lib/_6_in.c @@ -0,0 +1,1290 @@ +/* Catacomb Apocalypse Source Code + * Copyright (C) 1993-2014 Flat Rock Software + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +// +// ID Engine +// ID_IN.c - Input Manager +// v1.0d1w +// By Jason Blochowiak +// Open Watcom port by sparky4 +// + +// +// This module handles dealing with the various input devices +// +// Depends on: Memory Mgr (for demo recording), Sound Mgr (for timing stuff), +// User Mgr (for command line parms) +// +// Globals: +// LastScan - The keyboard scan code of the last key pressed +// LastASCII - The ASCII value of the last key pressed +// DEBUG - there are more globals +// + +#include "src/lib/16_in.h" + +#ifdef __DEBUG_InputMgr__ +boolean dbg_testkeyin=0,dbg_testcontrolnoisy=0; +#endif + +static word far* clockw= (word far*) 0x046C; /* 18.2hz clock */ + +/* +============================================================================= + + GLOBAL VARIABLES + +============================================================================= +*/ +struct inconfig +{ + boolean MousePresent; + boolean JoysPresent[MaxJoys]; + boolean Keyboard[NumCodes]; + boolean Paused; + char LastASCII; + ScanCode LastScan; + + KeyboardDef KbdDefs[MaxKbds]; + JoystickDef JoyDefs[MaxJoys]; +} inpu; + +//extern inconfig inpu; +//inpu.KbdDefs = {0x1d,0x38,/*0x47,*/0x48,/*0x49,*/0x4b,0x4d,/*0x4f,*/0x50/*,0x51*/}; + +/* +============================================================================= + + LOCAL VARIABLES + +============================================================================= +*/ + +#ifdef __cplusplus /* Function must be declared C style */ +extern "C" { +#endif + +static struct instat { + boolean IN_Started; + boolean CapsLock; + ScanCode CurCode,LastCode; +} inst; + +static void (*INL_KeyHook)(void); +static void interrupt (*OldKeyVect)(void); +static char *ParmStringsIN[] = {"nojoys","nomouse",nil}; + +static byte far ASCIINames[] = // Unshifted ASCII for scan codes + { +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0 ,27 ,'1','2','3','4','5','6','7','8','9','0','-','=',8 ,9 , // 0 + 'q','w','e','r','t','y','u','i','o','p','[',']',13 ,0 ,'a','s', // 1 + 'd','f','g','h','j','k','l',';',39 ,'`',0 ,92 ,'z','x','c','v', // 2 + 'b','n','m',',','.','/',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4 + '2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7 + }, + far ShiftNames[] = // Shifted ASCII for scan codes + { +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0 ,27 ,'!','@','#','$','%','^','&','*','(',')','_','+',8 ,9 , // 0 + 'Q','W','E','R','T','Y','U','I','O','P','{','}',13 ,0 ,'A','S', // 1 + 'D','F','G','H','J','K','L',':',34 ,'~',0 ,'|','Z','X','C','V', // 2 + 'B','N','M','<','>','?',0 ,'*',0 ,' ',0 ,0 ,0 ,0 ,0 ,0 , // 3 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4 + '2','3','0',127,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7 + }, + far SpecialNames[] = // ASCII for 0xe0 prefixed codes + { +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 0 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,13 ,0 ,0 ,0 , // 1 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 2 + 0 ,0 ,0 ,0 ,0 ,'/',0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 3 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 4 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7 + }, + *ScanNames[] = // Scan code names with single chars + { + "?","?","1","2","3","4","5","6","7","8","9","0","-","+","?","?", + "Q","W","E","R","T","Y","U","I","O","P","[","]","|","?","A","S", + "D","F","G","H","J","K","L",";","\"","?","?","?","Z","X","C","V", + "B","N","M",",",".","/","?","?","?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?","\xf","?","-","\x15","5","\x11","+","?", + "\x13","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?" + }, // DEBUG - consolidate these + far ExtScanCodes[] = // Scan codes with >1 char names + { + 1,0xe,0xf,0x1d,0x2a,0x39,0x3a,0x3b,0x3c,0x3d,0x3e, + 0x3f,0x40,0x41,0x42,0x43,0x44,0x57,0x59,0x46,0x1c,0x36, + 0x37,0x38,0x47,0x49,0x4f,0x51,0x52,0x53,0x45,0x48, + 0x50,0x4b,0x4d,0x00 + }, + *ExtScanNames[] = // Names corresponding to ExtScanCodes + { + "Esc","BkSp","Tab","Ctrl","LShft","Space","CapsLk","F1","F2","F3","F4", + "F5","F6","F7","F8","F9","F10","F11","F12","ScrlLk","Enter","RShft", + "PrtSc","Alt","Home","PgUp","End","PgDn","Ins","Del","NumLk","Up", + "Down","Left","Right","" + }; + +static Direction DirTable[] = // Quick lookup for total direction + { + //dir_Nortinest, + dir_North, + dir_West, + dir_None, + dir_East, + dir_South + //dir_NorthEast, + //dir_Soutinest, + //,dir_SouthEast + }; +#ifdef __cplusplus +} +#endif + +// Internal routines + +/////////////////////////////////////////////////////////////////////////// +// +// INL_KeyService() - Handles a keyboard interrupt (key up/down) +// +/////////////////////////////////////////////////////////////////////////// +void interrupt +INL_KeyService() +{ +static boolean special; + byte k,c; + register byte temp; + + k = inp(0x60); // Get the scan code + + // Tell the XT keyboard controller to clear the key + outp(0x61,(temp = inp(0x61)) | 0x80); + outp(0x61,temp); + + if (k == 0xe0) // Special key prefix + special = true; + else if (k == 0xe1) // Handle Pause key + inpu.Paused = true; + else + { + if (k & 0x80) // Break code + { + k &= 0x7f; + +// DEBUG - handle special keys: ctl-alt-delete, print scrn + + inpu.Keyboard[k] = false; + } + else // Make code + { + inst.LastCode = inst.CurCode; + inst.CurCode = inpu.LastScan = k; + inpu.Keyboard[k] = true; + + if (special) + c = SpecialNames[k]; + else + { + if (k == sc_CapsLock) + { + inst.CapsLock ^= true; + // DEBUG - make caps lock light work + } + + if (inpu.Keyboard[sc_LShift] || inpu.Keyboard[sc_RShift]) // If shifted + { + c = ShiftNames[k]; + if ((c >= 'A') && (c <= 'Z') && inst.CapsLock) + c += 'a' - 'A'; + } + else + { + c = ASCIINames[k]; + if ((c >= 'a') && (c <= 'z') && inst.CapsLock) + c -= 'a' - 'A'; + } + } + if (c) + inpu.LastASCII = c; + } + + special = false; + } + + if (INL_KeyHook && !special) + INL_KeyHook(); +#ifdef __DEBUG_InputMgr__ + if(dbg_testkeyin > 0) printf("%c %u [0x%x %u] %u\n", c, c, k, k, inpu.Keyboard[k]); +#endif + outp(0x20,0x20); +} + +void +Mouse(int x) +{ + //union REGS CPURegs; + //x = CPURegs.x.ax; + __asm { + mov ax,x + int MouseInt + } + //int86(MouseInt,&CPURegs,&CPURegs); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_GetMouseDelta() - Gets the amount that the mouse has moved from the +// mouse driver +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_GetMouseDelta(int *x,int *y) +{ + union REGS CPURegs; + Mouse(MDelta); + *x = CPURegs.x.cx; + *y = CPURegs.x.dx; +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_GetMouseButtons() - Gets the status of the mouse buttons from the +// mouse driver +// +/////////////////////////////////////////////////////////////////////////// +static word +INL_GetMouseButtons(void) +{ + union REGS CPURegs; + word buttons; + + Mouse(MButtons); + buttons = CPURegs.x.bx; + return(buttons); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_GetJoyAbs() - Reads the absolute position of the specified joystick +// +/////////////////////////////////////////////////////////////////////////// +void +IN_GetJoyAbs(word joy,word *xp,word *yp) +{ + byte xb,yb, + xs,ys; + word x,y; + + x = y = 0; + xs = joy? 2 : 0; // Find shift value for x axis + xb = 1 << xs; // Use shift value to get x bit mask + ys = joy? 3 : 1; // Do the same for y axis + yb = 1 << ys; + +// Read the absolute joystick values + __asm { + pushf // Save some registers + push si + push di + cli // Make sure an interrupt doesn't screw the timings + + + mov dx,0x201 + in al,dx + out dx,al // Clear the resistors + + mov ah,[xb] // Get masks into registers + mov ch,[yb] + + xor si,si // Clear count registers + xor di,di + xor bh,bh // Clear high byte of bx for later + + push bp // Don't mess up stack frame + mov bp,MaxJoyValue +#ifdef __BORLANDC__ + } +#endif +loo: +#ifdef __BORLANDC__ + __asm { +#endif + in al,dx // Get bits indicating whether all are finished + + dec bp // Check bounding register + jz done // We have a silly value - abort + + mov bl,al // Duplicate the bits + and bl,ah // Mask off useless bits (in [xb]) + add si,bx // Possibly increment count register + mov cl,bl // Save for testing later + + mov bl,al + and bl,ch // [yb] + add di,bx + + add cl,bl + jnz loo // If both bits were 0, drop out +#ifdef __BORLANDC__ + } +#endif +done: +#ifdef __BORLANDC__ + __asm { +#endif + pop bp + + mov cl,[xs] // Get the number of bits to shift + shr si,cl // and shift the count that many times + + mov cl,[ys] + shr di,cl + + mov [x],si // Store the values into the variables + mov [y],di + + pop di + pop si + popf // Restore the registers + } + + *xp = x; + *yp = y; +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_GetJoyDelta() - Returns the relative movement of the specified +// joystick (from +/-127, scaled adaptively) +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_GetJoyDelta(word joy,int *dx,int *dy,boolean adaptive) +{ + word x,y; + word time; + word TimeCount = *clockw; + JoystickDef *def; +static word lasttime; + + IN_GetJoyAbs(joy,&x,&y); + def = inpu.JoyDefs + joy; + + if (x < def->threshMinX) + { + if (x < def->joyMinX) + x = def->joyMinX; + + x = -(x - def->threshMinX); + x *= def->joyMultXL; + x >>= JoyScaleShift; + *dx = (x > 127)? -127 : -x; + } + else if (x > def->threshMaxX) + { + if (x > def->joyMaxX) + x = def->joyMaxX; + + x = x - def->threshMaxX; + x *= def->joyMultXH; + x >>= JoyScaleShift; + *dx = (x > 127)? 127 : x; + } + else + *dx = 0; + + if (y < def->threshMinY) + { + if (y < def->joyMinY) + y = def->joyMinY; + + y = -(y - def->threshMinY); + y *= def->joyMultYL; + y >>= JoyScaleShift; + *dy = (y > 127)? -127 : -y; + } + else if (y > def->threshMaxY) + { + if (y > def->joyMaxY) + y = def->joyMaxY; + + y = y - def->threshMaxY; + y *= def->joyMultYH; + y >>= JoyScaleShift; + *dy = (y > 127)? 127 : y; + } + else + *dy = 0; + + if (adaptive) + { + time = (TimeCount - lasttime) / 2; + if (time) + { + if (time > 8) + time = 8; + *dx *= time; + *dy *= time; + } + } + lasttime = TimeCount; +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_GetJoyButtons() - Returns the button status of the specified +// joystick +// +/////////////////////////////////////////////////////////////////////////// +static word +INL_GetJoyButtons(word joy) +{ +register word result; + + result = inp(0x201); // Get all the joystick buttons + result >>= joy? 6 : 4; // Shift into bits 0-1 + result &= 3; // Mask off the useless bits + result ^= 3; + return(result); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_GetJoyButtonsDB() - Returns the de-bounced button status of the +// specified joystick +// +/////////////////////////////////////////////////////////////////////////// +word +IN_GetJoyButtonsDB(word joy) +{ + word TimeCount = *clockw; + word lasttime; + word result1,result2; + + do + { + result1 = INL_GetJoyButtons(joy); + lasttime = TimeCount; + while(TimeCount == lasttime) + result2 = INL_GetJoyButtons(joy); + } while(result1 != result2); + return(result1); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_StartKbd() - Sets up my keyboard stuff for use +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_StartKbd() +{ + INL_KeyHook = 0; // Clear key hook + + IN_ClearKeysDown(); + + OldKeyVect = _dos_getvect(KeyInt); + _dos_setvect(KeyInt,INL_KeyService); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_ShutKbd() - Restores keyboard control to the BIOS +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_ShutKbd(void) +{ + pokeb(0x40,0x17,peekb(0x40,0x17) & 0xfaf0); // Clear ctrl/alt/shift flags + + _dos_setvect(KeyInt,OldKeyVect); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_StartMouse() - Detects and sets up the mouse +// +/////////////////////////////////////////////////////////////////////////// +static boolean +INL_StartMouse(void) +{ + union REGS CPURegs; + if(_dos_getvect(MouseInt)) + { + Mouse(MReset); + if(CPURegs.x.ax == 0xffff) + return(true); + } + return(false); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_ShutMouse() - Cleans up after the mouse +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_ShutMouse(void) +{ +} + +// +// INL_SetJoyScale() - Sets up scaling values for the specified joystick +// +static void +INL_SetJoyScale(word joy) +{ + JoystickDef *def; + + def = &(inpu.JoyDefs[joy]); + def->joyMultXL = JoyScaleMax / (def->threshMinX - def->joyMinX); + def->joyMultXH = JoyScaleMax / (def->joyMaxX - def->threshMaxX); + def->joyMultYL = JoyScaleMax / (def->threshMinY - def->joyMinY); + def->joyMultYH = JoyScaleMax / (def->joyMaxY - def->threshMaxY); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_SetupJoy() - Sets up thresholding values and calls INL_SetJoyScale() +// to set up scaling values +// +/////////////////////////////////////////////////////////////////////////// +void +IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy) +{ + word d,r; + JoystickDef *def; + + def = &(inpu.JoyDefs[joy]); + + def->joyMinX = minx; + def->joyMaxX = maxx; + r = maxx - minx; + d = r / 3; + def->threshMinX = ((r / 2) - d) + minx; + def->threshMaxX = ((r / 2) + d) + minx; + + def->joyMinY = miny; + def->joyMaxY = maxy; + r = maxy - miny; + d = r / 3; + def->threshMinY = ((r / 2) - d) + miny; + def->threshMaxY = ((r / 2) + d) + miny; + + INL_SetJoyScale(joy); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_StartJoy() - Detects & auto-configures the specified joystick +// The auto-config assumes the joystick is centered +// +/////////////////////////////////////////////////////////////////////////// +static boolean +INL_StartJoy(word joy) +{ + word x,y; + + IN_GetJoyAbs(joy,&x,&y); + + if + ( + ((x == 0) || (x > MaxJoyValue - 10)) + || ((y == 0) || (y > MaxJoyValue - 10)) + ) + return(false); + else + { + IN_SetupJoy(joy,0,x * 2,0,y * 2); + return(true); + } +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_ShutJoy() - Cleans up the joystick stuff +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_ShutJoy(word joy) +{ + inpu.JoysPresent[joy] = false; +} + +// Public routines + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Startup() - Starts up the Input Mgr +// +/////////////////////////////////////////////////////////////////////////// +void +IN_Startup() +{ + boolean checkjoys,checkmouse; + word i; + + if (inst.IN_Started) + return; + + checkjoys = true; + checkmouse = true; + for (i = 1;i < _argc;i++) + { + switch (US_CheckParm(_argv[i],ParmStringsIN)) + { + case 0: + checkjoys = false; + break; + case 1: + checkmouse = false; + break; + } + } + + INL_StartKbd(); + inpu.MousePresent = checkmouse? INL_StartMouse() : false; + + for (i = 0;i < MaxJoys;i++) + inpu.JoysPresent[i] = checkjoys? INL_StartJoy(i) : false; + + inst.IN_Started = true; + +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Default() - Sets up default conditions for the Input Mgr +// +/////////////////////////////////////////////////////////////////////////// +void +IN_Default(boolean gotit,player_t *player,ControlType nt) +{ + int i; + if + ( + (!gotit) + || ((nt == ctrl_Joystick1) && !inpu.JoysPresent[0]) + || ((nt == ctrl_Joystick2) && !inpu.JoysPresent[1]) + || ((nt == ctrl_Mouse) && !inpu.MousePresent) + ) + nt = ctrl_Keyboard1; + inpu.KbdDefs[0].button0 = 0x1c; + inpu.KbdDefs[0].button1 = 0x38; + //in.KbdDefs[0].upleft = 0x47; + inpu.KbdDefs[0].up = 0x48; + //in.KbdDefs[0].upright = 0x49; + inpu.KbdDefs[0].left = 0x4b; + inpu.KbdDefs[0].right = 0x4d; + //in.KbdDefs[0].downleft = 0x4f; + inpu.KbdDefs[0].down = 0x50; + //in.KbdDefs[0].downright = 0x51; + IN_SetControlType(0,player,nt); + for(i=0; i>MaxPlayers;i++) + player[i].d=2; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Shutdown() - Shuts down the Input Mgr +// +/////////////////////////////////////////////////////////////////////////// +void +IN_Shutdown() +{ + word i; + + if (!inst.IN_Started) + return; + + INL_ShutMouse(); + for (i = 0;i < MaxJoys;i++) + INL_ShutJoy(i); + INL_ShutKbd(); + + inst.IN_Started = false; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_SetKeyHook() - Sets the routine that gets called by INL_KeyService() +// everytime a real make/break code gets hit +// +/////////////////////////////////////////////////////////////////////////// +void +IN_SetKeyHook(void (*hook)()) +{ + INL_KeyHook = hook; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_ClearKeyDown() - Clears the keyboard array +// +/////////////////////////////////////////////////////////////////////////// +void +IN_ClearKeysDown() +{ + //int i; + + inpu.LastScan = sc_None; + inpu.LastASCII = key_None; + memset (inpu.Keyboard,0,sizeof(inpu.Keyboard)); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_AdjustCursor() - Internal routine of common code from IN_ReadCursor() +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_AdjustCursor(CursorInfo *info,word buttons,int dx,int dy) +{ + if (buttons & (1 << 0)) + info->button0 = true; + if (buttons & (1 << 1)) + info->button1 = true; + + info->x += dx; + info->y += dy; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_ReadCursor() - Reads the input devices and fills in the cursor info +// struct +// +/////////////////////////////////////////////////////////////////////////// +void +IN_ReadCursor(CursorInfo *info) +{ + word i, + buttons; + int dx,dy; + + info->x = info->y = 0; + info->button0 = info->button1 = false; + + if (inpu.MousePresent) + { + buttons = INL_GetMouseButtons(); + INL_GetMouseDelta(&dx,&dy); + INL_AdjustCursor(info,buttons,dx,dy); + } + + for (i = 0;i < MaxJoys;i++) + { + if (!inpu.JoysPresent[i]) + continue; + + buttons = INL_GetJoyButtons(i); + INL_GetJoyDelta(i,&dx,&dy,true); + dx /= 64; + dy /= 64; + INL_AdjustCursor(info,buttons,dx,dy); + } +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_ReadControl() - Reads the device associated with the specified +// player and fills in the control info struct +// +/////////////////////////////////////////////////////////////////////////// +void near +IN_ReadControl(int pn,player_t *player) +{ + boolean realdelta; +#if DEMO0 + byte dbyte; +#endif + word buttons; + int dx,dy; + Motion mx,my; + ControlType type; + sword conpee; + byte dir=DirTable[2]; +register KeyboardDef *def; + + dx = dy = 0; + mx = my = motion_None; + buttons = 0; + +#if DEMO0 + if (DemoMode == demo_Playback) + { + dbyte = DemoBuffer[DemoOffset + 1]; + my = (dbyte & 3) - 1; + mx = ((dbyte >> 2) & 3) - 1; + buttons = (dbyte >> 4) & 3; + + if (!(--DemoBuffer[DemoOffset])) + { + DemoOffset += 2; + if (DemoOffset >= DemoSize) + DemoMode = demo_PlayDone; + } + + realdelta = false; + } + else if (DemoMode == demo_PlayDone) + Quit("Demo playback exceeded"); + else + { +#endif + switch (type = player[pn].Controls) + { + case ctrl_Keyboard1: + case ctrl_Keyboard2: + def = &(inpu.KbdDefs[type - ctrl_Keyboard]); + +/* if (Keyboard[def->upleft]) + mx = motion_Left,my = motion_Up; + else if (Keyboard[def->upright]) + mx = motion_Right,my = motion_Up; + else if (Keyboard[def->downleft]) + mx = motion_Left,my = motion_Down; + else if (Keyboard[def->downright]) + mx = motion_Right,my = motion_Down;*/ +//TODO: make this into a function that the joystick AND keyboard can use wwww + if(DIRECTIONIFELSE)//(player[pn].info.dir == 2) + { + if(!inpu.Keyboard[def->left] && !inpu.Keyboard[def->right]){ + if((inpu.Keyboard[def->up] && !inpu.Keyboard[def->down])) + my = motion_Up; + if((inpu.Keyboard[def->down] && !inpu.Keyboard[def->up])) + my = motion_Down; + }else if(!inpu.Keyboard[def->up] && !inpu.Keyboard[def->down]){ + if((inpu.Keyboard[def->left] && !inpu.Keyboard[def->right])) + mx = motion_Left; + if((inpu.Keyboard[def->right] && !inpu.Keyboard[def->left])) + mx = motion_Right; + }else{ //2 keys pressed + switch (player[pn].pdir) + { + case 0: + case 4: + if((inpu.Keyboard[def->left] && !inpu.Keyboard[def->right])){ dir = DirTable[1]; }//mx = motion_Left; } + else if((inpu.Keyboard[def->right] && !inpu.Keyboard[def->left])){ dir = DirTable[3]; }//mx = motion_Right; } + break; + case 1: + case 3: + if((inpu.Keyboard[def->up] && !inpu.Keyboard[def->down])){ dir = DirTable[0]; }//my = motion_Up; } + else if((inpu.Keyboard[def->down] && !inpu.Keyboard[def->up])){ dir = DirTable[4]; }//my = motion_Down; } + break; + default: + break; + } +#ifdef __DEBUG_InputMgr__ + //if(dbg_testcontrolnoisy > 0){ printf("dir=%c ", dirchar(dir)); printf("pdir=%c ", dirchar(player[pn].pdir)); } +#endif + } + } + //input from player + if (inpu.Keyboard[def->button0]) + buttons += 1 << 0; + if (inpu.Keyboard[def->button1]) + buttons += 1 << 1; + realdelta = false; + break; + case ctrl_Joystick1: + case ctrl_Joystick2: + INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy,false); + buttons = INL_GetJoyButtons(type - ctrl_Joystick); + realdelta = true; + break; + case ctrl_Mouse: + INL_GetMouseDelta(&dx,&dy); + buttons = INL_GetMouseButtons(); + realdelta = true; + break; + } +#ifdef DEMO0 + } +#endif + + if (realdelta) + { + mx = (dx < 0)? motion_Left : ((dx > 0)? motion_Right : motion_None); + my = (dy < 0)? motion_Up : ((dy > 0)? motion_Down : motion_None); + } + else + { + dx = mx;// * 127; + dy = my;// * 127; + } + + player[pn].info.x = dx; + player[pn].info.xaxis = mx; + player[pn].info.y = dy; + player[pn].info.yaxis = my; + player[pn].info.button0 = buttons & (1 << 0); + player[pn].info.button1 = buttons & (1 << 1); + player[pn].info.button2 = buttons & (1 << 2); + player[pn].info.button3 = buttons & (1 << 3); +// player[pn].info.dir = DirTable[((my + 1) * 3) + (mx + 1)]; + conpee=(((my + 1) * 2) + (mx + 1))-1; + player[pn].info.dir = DirTable[conpee]; + + if(DirTable[conpee]!=2) player[pn].pdir=DirTable[conpee]; + if(player[pn].q==1 &&( dir!=2 || (mx!=motion_None || my!=motion_None))) + { + if(dir==2) player[pn].d = player[pn].info.dir; + else player[pn].d = DirTable[dir]; + } + +#if DEMO0 + if (DemoMode == demo_Record) + { + // Pack the control info into a byte + dbyte = (buttons << 4) | ((mx + 1) << 2) | (my + 1); + + if + ( + (DemoBuffer[DemoOffset + 1] == dbyte) + && (DemoBuffer[DemoOffset] < 255) + ) + (DemoBuffer[DemoOffset])++; + else + { + if (DemoOffset || DemoBuffer[DemoOffset]) + DemoOffset += 2; + + if (DemoOffset >= DemoSize) + Quit("Demo buffer overflow"); + + DemoBuffer[DemoOffset] = 1; + DemoBuffer[DemoOffset + 1] = dbyte; + } + } +#endif +#ifdef __DEBUG_InputMgr__ +if(dbg_testcontrolnoisy > 0) +if(player[pn].info.dir!=2/*(inpu.Keyboard[def->up] || inpu.Keyboard[def->down] || inpu.Keyboard[def->left] || inpu.Keyboard[def->right])*/ || player[pn].q>1) +{ + //printf("b1=%u b2=%u b3=%u b4=%u ", player[pn].info.button0, player[pn].info.button1, player[pn].info.button2, player[pn].info.button3); + //printf("q=%d ", player[pn].q); + //printf("cpee=%c ", dirchar(conpee)); + printf("pdir=%c d=%c dir=%c ", dirchar(player[pn].pdir), dirchar(player[pn].d), dirchar(player[pn].info.dir)); + /*if(realdelta) */printf("dx=%d dy=%d mx=%d my=%d", player[pn].info.x, player[pn].info.y, player[pn].info.xaxis, player[pn].info.yaxis); + //else if(!realdelta) printf("%c%d %c%d %c%d %c%d", dirchar(0), inpu.Keyboard[def->up], dirchar(4), inpu.Keyboard[def->down], dirchar(1), inpu.Keyboard[def->left], dirchar(3), inpu.Keyboard[def->right]); + printf("\n"); +} +#endif +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_SetControlType() - Sets the control type to be used by the specified +// player +// +/////////////////////////////////////////////////////////////////////////// +void +IN_SetControlType(word pn,player_t *player,ControlType type) +{ + // DEBUG - check that requested type is present? + player[pn].Controls = type; +} + +#if DEMO0 +/////////////////////////////////////////////////////////////////////////// +// +// IN_StartDemoRecord() - Starts the demo recording, using a buffer the +// size passed. Returns if the buffer allocation was successful +// +/////////////////////////////////////////////////////////////////////////// +boolean +IN_StartDemoRecord(word bufsize) +{ + if (!bufsize) + return(false); + + MM_GetPtr((memptr *)&DemoBuffer,bufsize); + DemoMode = demo_Record; + DemoSize = bufsize & ~1; + DemoOffset = 0; + DemoBuffer[0] = DemoBuffer[1] = 0; + + return(true); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_StartDemoPlayback() - Plays back the demo pointed to of the given size +// +/////////////////////////////////////////////////////////////////////////// +void +IN_StartDemoPlayback(byte /*__segment*/ *buffer,word bufsize) +{ + DemoBuffer = buffer; + DemoMode = demo_Playback; + DemoSize = bufsize & ~1; + DemoOffset = 0; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_StopDemo() - Turns off demo mode +// +/////////////////////////////////////////////////////////////////////////// +void +IN_StopDemo(void) +{ + if ((DemoMode == demo_Record) && DemoOffset) + DemoOffset += 2; + + DemoMode = demo_Off; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_FreeDemoBuffer() - Frees the demo buffer, if it's been allocated +// +/////////////////////////////////////////////////////////////////////////// +void +IN_FreeDemoBuffer(void) +{ + if (DemoBuffer) + MM_FreePtr((memptr *)&DemoBuffer); +} +#endif + + +/////////////////////////////////////////////////////////////////////////// +// +// IN_GetScanName() - Returns a string containing the name of the +// specified scan code +// +/////////////////////////////////////////////////////////////////////////// +byte * +IN_GetScanName(ScanCode scan) +{ + byte **p; + ScanCode far *s; + + for (s = ExtScanCodes,p = ExtScanNames;*s;p++,s++) + if (*s == scan) + return(*p); + + return(ScanNames[scan]); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_WaitForKey() - Waits for a scan code, then clears LastScan and +// returns the scan code +// +/////////////////////////////////////////////////////////////////////////// +ScanCode +IN_WaitForKey() +{ + ScanCode result; + + while (!(result = inpu.LastScan)) + ; + inpu.LastScan = 0; + return(result); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_WaitForASCII() - Waits for an ASCII char, then clears LastASCII and +// returns the ASCII value +// +/////////////////////////////////////////////////////////////////////////// +char +IN_WaitForASCII() +{ + char result; + + while (!(result = inpu.LastASCII)) + ; + inpu.LastASCII = '\0'; + return(result); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_AckBack() - Waits for either an ASCII keypress or a button press +// +/////////////////////////////////////////////////////////////////////////// +void +IN_AckBack() +{ + word i; + + while (!inpu.LastScan) + { + if (inpu.MousePresent) + { + if (INL_GetMouseButtons()) + { + while (INL_GetMouseButtons()) + ; + return; + } + } + + for (i = 0;i < MaxJoys;i++) + { + if (inpu.JoysPresent[i]) + { + if (IN_GetJoyButtonsDB(i)) + { + while (IN_GetJoyButtonsDB(i)) + ; + return; + } + } + } + } + + IN_ClearKey(inpu.LastScan); + inpu.LastScan = sc_None; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Ack() - Clears user input & then calls IN_AckBack() +// +/////////////////////////////////////////////////////////////////////////// +void +IN_Ack() +{ + word i; + + if (!inst.IN_Started) + return; + + IN_ClearKey(inpu.LastScan); + inpu.LastScan = sc_None; + + if (inpu.MousePresent) + while (INL_GetMouseButtons()) + ; + for (i = 0;i < MaxJoys;i++) + if (inpu.JoysPresent[i]) + while (IN_GetJoyButtonsDB(i)) + ; + + IN_AckBack(); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_IsUserInput() - Returns true if a key has been pressed or a button +// is down +// +/////////////////////////////////////////////////////////////////////////// +boolean +IN_IsUserInput() +{ + boolean result; + word i; + + result = inpu.LastScan; + + if (inpu.MousePresent) + if (INL_GetMouseButtons()) + result = true; + + for (i = 0;i < MaxJoys;i++) + if (inpu.JoysPresent[i]) + if (INL_GetJoyButtons(i)) + result = true; + + return(result); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_UserInput() - Waits for the specified delay time (in ticks) or the +// user pressing a key or a mouse button. If the clear flag is set, it +// then either clears the key or waits for the user to let the mouse +// button up. +// +/////////////////////////////////////////////////////////////////////////// +boolean +IN_UserInput(dword delay,boolean clear) +{ + word TimeCount = *clockw; + word lasttime; + + lasttime = TimeCount; + do + { + if (IN_IsUserInput()) + { + if (clear) + IN_AckBack(); + return(true); + } + } while (TimeCount - lasttime < delay); + return(false); +} + +boolean IN_KeyDown(byte code) +{ + return inpu.Keyboard[code]; +} + +void IN_ClearKey(byte code) +{ + inpu.Keyboard[code] = false; + if(code == inpu.LastScan) + inpu.LastScan = sc_None; + } + +boolean IN_qb(byte kee) +{ +#ifdef __DEBUG_InputMgr__ +// if(dbg_testkeyin > 0) printf("%u\n", inpu.Keyboard[kee]); +#endif + if(inpu.Keyboard[kee]==true) return 1; + else return 0; +} + +//init player! +void IN_initplayer(player_t *player, word pn) +{ + player[pn].x = player[pn].tx*TILEWH; + player[pn].y = player[pn].ty*TILEWH; + player[pn].triggerx = player[pn].tx; + player[pn].triggery = player[pn].ty+1; +/* player[0].info.x = player[0].tx; + player[0].info.xaxis = player[0].tx*TILEWH; + player[0].info.y = player[0].ty; + player[0].info.yaxis = player[0].ty*TILEWH;*/ + player[pn].q=1; + player[pn].d=2; + player[pn].hp=4; + player[pn].speed=4; + player[pn].persist_aniframe=0; + player[pn].spt=(TILEWH/(player[pn].speed)); //speed per tile wwww +} diff --git a/src/lib/_6_in.h b/src/lib/_6_in.h new file mode 100755 index 00000000..eb1650e4 --- /dev/null +++ b/src/lib/_6_in.h @@ -0,0 +1,309 @@ +/* Catacomb Apocalypse Source Code + * Copyright (C) 1993-2014 Flat Rock Software + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +// +// ID Engine +// ID_IN.h - Header file for Input Manager +// v1.0d1w +// By Jason Blochowiak +// Open Watcom port by sparky4 +// + +#ifndef __16_IN__ +#define __16_IN__ + +#include +#include "src/lib/16_head.h" +#include "src/lib/16_timer.h" +#ifdef __WATCOMC__ //borland C BCEXMM.EXE +#include "src/lib/16_dbg.h" +#include "src/lib/16_sprit.h" +//#include "src/lib/bitmap.h" //old format +#endif +#ifdef __DEBUG__ +#define __DEBUG_InputMgr__ +extern boolean dbg_testkeyin,dbg_testcontrolnoisy; +#endif + +//if else for gfxtesting and direction +//player[pn].d == 2 || +//player[pn].d != 2 || +#define DIRECTIONIFELSE (player[pn].info.dir == 2) +//#define NDIRECTIONIFELSE (player[pn].info.dir != 2) + +#define KeyInt 9 // The keyboard ISR number + +// Stuff for the joystick +#define JoyScaleMax 32768 +#define JoyScaleShift 8 +#define MaxJoyValue 5000 + +#define MaxPlayers 4 +#define MaxKbds 2 +#define MaxJoys 2 +#define MaxPads 2 +#define NumCodes 128 + +typedef byte ScanCode; +#define sc_None 0 +#define sc_Bad 0xff +#define sc_Return 0x1c +#define sc_Enter sc_Return +#define sc_Escape 0x01 +#define sc_Space 0x39 +#define sc_BackSpace 0x0e +#define sc_Tab 0x0f +#define sc_Alt 0x38 +#define sc_Control 0x1d +#define sc_CapsLock 0x3a +#define sc_LShift 0x2a +#define sc_RShift 0x36 +#define sc_UpArrow 0x48 +#define sc_DownArrow 0x50 +#define sc_LeftArrow 0x4b +#define sc_RightArrow 0x4d +#define sc_Insert 0x52 +#define sc_Delete 0x53 +#define sc_Home 0x47 +#define sc_End 0x4f +#define sc_PgUp 0x49 +#define sc_PgDn 0x51 +#define sc_F1 0x3b +#define sc_F2 0x3c +#define sc_F3 0x3d +#define sc_F4 0x3e +#define sc_F5 0x3f +#define sc_F6 0x40 +#define sc_F7 0x41 +#define sc_F8 0x42 +#define sc_F9 0x43 +#define sc_F10 0x44 +#define sc_F11 0x57 +#define sc_F12 0x59 + +#define sc_1 0x02 +#define sc_2 0x03 +#define sc_3 0x04 +#define sc_4 0x05 +#define sc_5 0x06 +#define sc_6 0x07 +#define sc_7 0x08 +#define sc_8 0x09 +#define sc_9 0x0a +#define sc_0 0x0b + +#define sc_A 0x1e +#define sc_B 0x30 +#define sc_C 0x2e +#define sc_D 0x20 +#define sc_E 0x12 +#define sc_F 0x21 +#define sc_G 0x22 +#define sc_H 0x23 +#define sc_I 0x17 +#define sc_J 0x24 +#define sc_K 0x25 +#define sc_L 0x26 +#define sc_M 0x32 +#define sc_N 0x31 +#define sc_O 0x18 +#define sc_P 0x19 +#define sc_Q 0x10 +#define sc_R 0x13 +#define sc_S 0x1f +#define sc_T 0x14 +#define sc_U 0x16 +#define sc_V 0x2f +#define sc_W 0x11 +#define sc_X 0x2d +#define sc_Y 0x15 +#define sc_Z 0x2c + +#define key_None 0 +#define key_Return 0x0d +#define key_Enter key_Return +#define key_Escape 0x1b +#define key_Space 0x20 +#define key_BackSpace 0x08 +#define key_Tab 0x09 +#define key_Delete 0x7f + +#define key_LSuper 0x5b +#define key_RSuper 0x5c +#define key_Menu 0x5d + +// Stuff for the mouse +#define MReset 0 +#define MButtons 3 +#define MDelta 11 + +#define MouseInt 0x33 +#ifdef DEMO0 +typedef enum { + demo_Off,demo_Record,demo_Playback,demo_PlayDone + } Demo; +#endif +typedef enum { + //ctrl_None, // MDM (GAMERS EDGE) - added + ctrl_Keyboard, + ctrl_Keyboard1 = ctrl_Keyboard,ctrl_Keyboard2, + ctrl_Joystick, + ctrl_Joystick1 = ctrl_Joystick,ctrl_Joystick2, + ctrl_Mouse, + } ControlType; +typedef enum { + motion_Left = -1,motion_Up = -1, + motion_None = 0, + motion_Right = 1,motion_Down = 1 + } Motion; +typedef enum { + dir_North,//dir_NorthEast, + dir_West,//dir_Nortinest, + dir_None, + dir_East,//,dir_SouthEast, + dir_South,//dir_Soutinest, + } Direction; +typedef struct { + boolean near button0,button1,button2,button3; + int near x,y; + Motion near xaxis,yaxis; + Direction near dir; + } CursorInfo; + +typedef struct { + ScanCode near button0,button1, + //upleft, + up, + down, + left, + right + //upright, + //downleft, + //,downright + ; + } KeyboardDef; +typedef struct { + word near joyMinX,joyMinY, + threshMinX,threshMinY, + threshMaxX,threshMaxY, + joyMaxX,joyMaxY, + joyMultXL,joyMultYL, + joyMultXH,joyMultYH; + } JoystickDef; + +typedef struct +{ + int x; //player exact position on the viewable map + int y; //player exact position on the viewable map + int tx; //player tile position on the viewable map + int ty; //player tile position on the viewable map + int triggerx; //player's trigger box tile position on the viewable map + int triggery; //player's trigger box tile position on the viewable map + int sheetsetx; //NOT USED YET! player sprite sheet set on the image x + int sheetsety; //NOT USED YET! player sprite sheet set on the image y + byte d; //direction to render sprite!! wwww + byte q; //loop variable for anumation and locking the playing to compleate the animation cycle to prevent issues with misalignment www + byte near pdir; //previous direction~ + //byte near kd[2]; //array of arrow key pressed + word speed; //player speed! + word spt; //speed per tile +//0000 planar_buf_t huge *data; //supposively the sprite sheet data +// planar_buf_t data; //supposively the sprite sheet data +////0000---- +#ifdef __WATCOMC__ + struct sprite *spri; //supposively the sprite sheet data + memptr gr; +#endif + bitmap_t *data; //supposively the sprite sheet data//old format + sword hp; //hitpoints of the player + int persist_aniframe; /* gonna be increased to 1 before being used, so 0 is ok for default */ + CursorInfo info; + ControlType Controls; +} player_t; + +/* +============================================================================= + + GLOBAL VARIABLES + +============================================================================= +*/ +/*extern struct inconfig +{ + boolean MousePresent; + boolean JoysPresent[MaxJoys]; + boolean Keyboard[NumCodes]; + boolean Paused; + char LastASCII; + ScanCode LastScan; + + KeyboardDef KbdDefs[MaxKbds]; + JoystickDef JoyDefs[MaxJoys]; +} inpu;*/ + +#ifdef DEMO0 + static Demo DemoMode = demo_Off; + static byte /*_seg*/ *DemoBuffer; + static word DemoOffset,DemoSize; +#endif + +// Internal routines +extern void interrupt INL_KeyService(); +extern void Mouse(int x); +//static void INL_GetMouseDelta(int *x,int *y); +//static word INL_GetMouseButtons(void); +extern void IN_GetJoyAbs(word joy,word *xp,word *yp); +//static void INL_GetJoyDelta(word joy,int *dx,int *dy,boolean adaptive); +//static word INL_GetJoyButtons(word joy); +extern word IN_GetJoyButtonsDB(word joy); +//static void INL_StartKbd(void); +//static void INL_ShutKbd(void); +//static boolean INL_StartMouse(void); +//static void INL_ShutMouse(void); +//static void INL_SetJoyScale(word joy); +extern void IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy); +//static boolean INL_StartJoy(word joy); +//static void INL_ShutJoy(word joy); +extern void IN_Startup(); +extern void IN_Default(boolean gotit,player_t *player,ControlType nt); +extern void IN_Shutdown(); +extern void IN_SetKeyHook(void (*hook)()); +extern void IN_ClearKeysDown(); +//static void INL_AdjustCursor(CursorInfo *info,word buttons,int dx,int dy); +extern void IN_ReadCursor(CursorInfo *info); +extern void near IN_ReadControl(int pn,player_t *player); +extern void IN_SetControlType(word pn,player_t *player,ControlType type); +#if DEMO0 +extern boolean IN_StartDemoRecord(word bufsize); +extern void IN_StartDemoPlayback(byte /*__segment*/ *buffer,word bufsize); +extern void IN_StopDemo(void); +extern void IN_FreeDemoBuffer(void); +#endif +extern byte *IN_GetScanName(ScanCode scan); +extern ScanCode IN_WaitForKey(); +extern char IN_WaitForASCII(); +extern void IN_AckBack(); +extern void IN_Ack(); +extern boolean IN_IsUserInput(); +extern boolean IN_UserInput(dword delay,boolean clear); +extern boolean IN_KeyDown(byte code); +extern void IN_ClearKey(byte code); +extern boolean IN_qb(byte kee); +void IN_initplayer(player_t *player, word pn); + +#endif -- 2.39.2