From cbd1a853acf0cd2feb3cf359b98d80694dec7ca9 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Fri, 10 Mar 2017 14:00:18 -0600 Subject: [PATCH] __seguse.txt added to show _seg usage also OpenVGMFile needs to be ported to 16_snd.c ][ ca needs huge amounts of work and i should remember what needs to be done soon also i should reverify 16_in.c to make sure it can work with other code of id engine ][ added 1.9 support wwww and fixed 16_vlpal.obj compile error\~ [it was a 8.3 file name extention error it was a simple issue wwww] [going to work on more on 16_in.c] --- DEBUG.16B | 222 +++++------ MEMINFO.16W | 0 MMDUMP.16B | Bin 2550 -> 2550 bytes bcexmm.dsk | Bin 981 -> 981 bytes bcexmm.exe | Bin 109247 -> 112869 bytes bcexmm.prj | Bin 8714 -> 8782 bytes db.exe | Bin 13224 -> 13186 bytes makefile | 8 +- src/0.c | 4 +- src/inntest.c | 28 +- src/inputest.c | 4 +- src/lib/16_in.c | 17 +- src/lib/16_in.h | 58 +-- src/lib/16_in_.c | 269 ++++++------- src/lib/16_in_.h | 103 ++--- src/lib/16_in__.c | 991 ++++++++++++++++++++++++++++++++++++++++++++++ src/lib/16_in__.h | 213 ++++++++++ src/lib/16_tail.c | 8 +- src/lib/16_tdef.h | 12 +- wbuild.sh | 1 + wcpu.exe | Bin 13398 -> 13312 bytes 21 files changed, 1542 insertions(+), 396 deletions(-) create mode 100755 MEMINFO.16W create mode 100755 src/lib/16_in__.c create mode 100755 src/lib/16_in__.h diff --git a/DEBUG.16B b/DEBUG.16B index f476aef7..47d8a9f4 100755 --- a/DEBUG.16B +++ b/DEBUG.16B @@ -1,210 +1,210 @@ -Seg:0 Size:5515 Owner:0x0 -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 -Seg:158b Size:256 Owner:0x2e15 -+++++ -Seg:168b Size:256 Owner:0x2c18 +Seg:0 Size:4884 Owner:0x0 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 +Seg:1314 Size:256 Owner:0x2e31 +++++ +Seg:1414 Size:256 Owner:0x2c34 ++++ -Seg:178b Size:256 Owner:0x2c1a +Seg:1514 Size:256 Owner:0x2c36 ++++ -Seg:188b Size:256 Owner:0x2c1c +Seg:1614 Size:256 Owner:0x2c38 ++++ -Seg:198b Size:256 Owner:0x2c1e -++++ -Seg:1a8b Size:256 Owner:0x2c20 +Seg:1714 Size:256 Owner:0x2c3a +++++ -Seg:1b8b Size:256 Owner:0x2c22 +Seg:1814 Size:256 Owner:0x2c3c ++++ -Seg:1c8b Size:256 Owner:0x2c24 +Seg:1914 Size:256 Owner:0x2c3e ++++ -Seg:1d8b Size:256 Owner:0x2c26 +Seg:1a14 Size:256 Owner:0x2c40 ++++ -Seg:1e9e Size:34 Owner:0x0 -++ -Seg:1ec0 Size:256 Owner:0x2c28 +Seg:1b14 Size:256 Owner:0x2c42 ++++ -Seg:1fc0 Size:256 Owner:0x2c2a +Seg:1c14 Size:256 Owner:0x2c44 ++++++ +Seg:1d14 Size:256 Owner:0x2c46 ++++ -Seg:20c0 Size:256 Owner:0x2c2c +Seg:1e14 Size:256 Owner:0x2c48 ++++ -Seg:21c0 Size:256 Owner:0x2c2e +Seg:1fde Size:34 Owner:0x0 +++ +Seg:2000 Size:256 Owner:0x2c4a ++++ -Seg:22c0 Size:256 Owner:0x2c30 +Seg:2100 Size:256 Owner:0x2c4c ++++ -Seg:23c0 Size:256 Owner:0x2c32 +Seg:2200 Size:256 Owner:0x2c4e ++++ -Seg:24c0 Size:256 Owner:0x2c34 +Seg:2300 Size:256 Owner:0x2c50 ++++ -Seg:25c0 Size:256 Owner:0x2c36 +Seg:2400 Size:256 Owner:0x2c52 ++++ -Seg:26c0 Size:256 Owner:0x2c38 +Seg:2500 Size:256 Owner:0x2c54 ++++ -Seg:27c0 Size:256 Owner:0x2c3a +Seg:2600 Size:256 Owner:0x2c56 ++++ -Seg:28c0 Size:256 Owner:0x2c3c +Seg:2700 Size:256 Owner:0x2c58 ++++ -Seg:29c0 Size:256 Owner:0x2c3e +Seg:2800 Size:256 Owner:0x2c5a ++++ -Seg:2ac0 Size:256 Owner:0x2c40 +Seg:2900 Size:256 Owner:0x2c5c ++++ -Seg:2bc0 Size:256 Owner:0x2c42 +Seg:2a00 Size:256 Owner:0x2c5e ++++ -Seg:2cc0 Size:256 Owner:0x2c44 +Seg:2b00 Size:256 Owner:0x2c60 ++++ -Seg:2dc0 Size:256 Owner:0x2c46 +Seg:2c00 Size:256 Owner:0x2c62 ++++ -Seg:2ec0 Size:256 Owner:0x2c48 +Seg:2d00 Size:256 Owner:0x2c64 ++++ -Seg:2fc0 Size:256 Owner:0x2c4a +Seg:2e00 Size:256 Owner:0x2c66 ++++ -Seg:30c0 Size:256 Owner:0x2c4c +Seg:2f00 Size:256 Owner:0x2c68 ++++ -Seg:31c0 Size:256 Owner:0x2c4e +Seg:3000 Size:256 Owner:0x2c6a ++++ -Seg:32c0 Size:256 Owner:0x2c50 +Seg:3100 Size:256 Owner:0x2c6c ++++ -Seg:33c0 Size:256 Owner:0x2c52 +Seg:3200 Size:256 Owner:0x2c6e ++++ -Seg:34c0 Size:256 Owner:0x2c54 +Seg:3300 Size:256 Owner:0x2c70 ++++ -Seg:35c0 Size:256 Owner:0x2c56 +Seg:3400 Size:256 Owner:0x2c72 ++++ -Seg:36c0 Size:256 Owner:0x2c58 +Seg:3500 Size:256 Owner:0x2c74 ++++ -Seg:37c0 Size:256 Owner:0x2c5a +Seg:3600 Size:256 Owner:0x2c76 ++++ -Seg:38c0 Size:256 Owner:0x2c5c +Seg:3700 Size:256 Owner:0x2c78 ++++ -Seg:39c0 Size:256 Owner:0x2c5e +Seg:3800 Size:256 Owner:0x2c7a ++++ -Seg:3ac0 Size:256 Owner:0x2c60 +Seg:3900 Size:256 Owner:0x2c7c ++++ -Seg:3bc0 Size:256 Owner:0x2c62 +Seg:3a00 Size:256 Owner:0x2c7e ++++ -Seg:3cc0 Size:256 Owner:0x2c64 +Seg:3b00 Size:256 Owner:0x2c80 ++++ -Seg:3dc0 Size:256 Owner:0x2c66 +Seg:3c00 Size:256 Owner:0x2c82 ++++ -Seg:3ec0 Size:256 Owner:0x2c68 +Seg:3d00 Size:256 Owner:0x2c84 ++++ -Seg:3fc0 Size:256 Owner:0x2c6a +Seg:3e00 Size:256 Owner:0x2c86 ++++ -Seg:40c0 Size:256 Owner:0x2c6c +Seg:3f00 Size:256 Owner:0x2c88 ++++ -Seg:41c0 Size:256 Owner:0x2c6e +Seg:4000 Size:256 Owner:0x2c8a ++++ -Seg:42c0 Size:256 Owner:0x2c70 +Seg:4100 Size:256 Owner:0x2c8c ++++ -Seg:43c0 Size:256 Owner:0x2c72 +Seg:4200 Size:256 Owner:0x2c8e ++++ -Seg:44c0 Size:256 Owner:0x2c74 +Seg:4300 Size:256 Owner:0x2c90 ++++ -Seg:45c0 Size:256 Owner:0x2c76 +Seg:4400 Size:256 Owner:0x2c92 ++++ -Seg:46c0 Size:256 Owner:0x2c78 +Seg:4500 Size:256 Owner:0x2c94 ++++ -Seg:47c0 Size:256 Owner:0x2c7a +Seg:4600 Size:256 Owner:0x2c96 ++++ -Seg:48c0 Size:256 Owner:0x2c7c +Seg:4700 Size:256 Owner:0x2c98 ++++ -Seg:49c0 Size:256 Owner:0x2c7e +Seg:4800 Size:256 Owner:0x2c9a ++++ -Seg:4ac0 Size:256 Owner:0x2c80 +Seg:4900 Size:256 Owner:0x2c9c ++++ -Seg:4bc0 Size:256 Owner:0x2c82 +Seg:4a00 Size:256 Owner:0x2c9e ++++ -Seg:4cc0 Size:256 Owner:0x2c84 +Seg:4b00 Size:256 Owner:0x2ca0 ++++ -Seg:4dc0 Size:256 Owner:0x2c86 +Seg:4c00 Size:256 Owner:0x2ca2 ++++ -Seg:4ec0 Size:256 Owner:0x2c88 +Seg:4d00 Size:256 Owner:0x2ca4 ++++ -Seg:4fc0 Size:256 Owner:0x2c8a +Seg:4e00 Size:256 Owner:0x2ca6 ++++ -Seg:50c0 Size:256 Owner:0x2c8c +Seg:4f00 Size:256 Owner:0x2ca8 ++++ -Seg:51c0 Size:256 Owner:0x2c8e +Seg:5000 Size:256 Owner:0x2caa ++++ -Seg:52c0 Size:256 Owner:0x2c90 +Seg:5100 Size:256 Owner:0x2cac ++++ -Seg:53c0 Size:256 Owner:0x2c92 +Seg:5200 Size:256 Owner:0x2cae ++++ -Seg:54c0 Size:256 Owner:0x2c94 +Seg:5300 Size:256 Owner:0x2cb0 ++++ -Seg:55c0 Size:256 Owner:0x2c96 +Seg:5400 Size:256 Owner:0x2cb2 ++++ -Seg:56c0 Size:256 Owner:0x2c98 +Seg:5500 Size:256 Owner:0x2cb4 ++++ -Seg:57c0 Size:256 Owner:0x2c9a +Seg:5600 Size:256 Owner:0x2cb6 ++++ -Seg:58c0 Size:256 Owner:0x2c9c +Seg:5700 Size:256 Owner:0x2cb8 ++++ -Seg:59c0 Size:256 Owner:0x2c9e +Seg:5800 Size:256 Owner:0x2cba ++++ -Seg:5ac0 Size:256 Owner:0x2ca0 +Seg:5900 Size:256 Owner:0x2cbc ++++ -Seg:5bc0 Size:256 Owner:0x2ca2 +Seg:5a00 Size:256 Owner:0x2cbe ++++ -Seg:5cc0 Size:256 Owner:0x2ca4 +Seg:5b00 Size:256 Owner:0x2cc0 ++++ -Seg:5dc0 Size:256 Owner:0x2ca6 +Seg:5c00 Size:256 Owner:0x2cc2 ++++ -Seg:5ec0 Size:256 Owner:0x2ca8 +Seg:5d00 Size:256 Owner:0x2cc4 ++++ -Seg:5fc0 Size:256 Owner:0x2caa +Seg:5e00 Size:256 Owner:0x2cc6 ++++ -Seg:60c0 Size:256 Owner:0x2cac +Seg:5f00 Size:256 Owner:0x2cc8 ++++ -Seg:61c0 Size:256 Owner:0x2cae +Seg:6000 Size:256 Owner:0x2cca ++++ -Seg:62c0 Size:256 Owner:0x2cb0 +Seg:6100 Size:256 Owner:0x2ccc ++++ -Seg:63c0 Size:256 Owner:0x2cb2 +Seg:6200 Size:256 Owner:0x2cce ++++ -Seg:64c0 Size:256 Owner:0x2cb4 +Seg:6300 Size:256 Owner:0x2cd0 ++++ -Seg:65c0 Size:256 Owner:0x2cb6 +Seg:6400 Size:256 Owner:0x2cd2 ++++ -Seg:66c0 Size:256 Owner:0x2cb8 +Seg:6500 Size:256 Owner:0x2cd4 ++++ -Seg:67c0 Size:256 Owner:0x2cba +Seg:6600 Size:256 Owner:0x2cd6 ++++ -Seg:68c0 Size:256 Owner:0x2cbc +Seg:6700 Size:256 Owner:0x2cd8 ++++ -Seg:69c0 Size:256 Owner:0x2cbe +Seg:6800 Size:256 Owner:0x2cda ++++ -Seg:6ac0 Size:256 Owner:0x2cc0 +Seg:6900 Size:256 Owner:0x2cdc ++++ -Seg:6bc0 Size:256 Owner:0x2cc2 +Seg:6a00 Size:256 Owner:0x2cde ++++ -Seg:6cc0 Size:256 Owner:0x2cc4 +Seg:6b00 Size:256 Owner:0x2ce0 ++++ -Seg:6dc0 Size:256 Owner:0x2cc6 +Seg:6c00 Size:256 Owner:0x2ce2 ++++ -Seg:6ec0 Size:256 Owner:0x2cc8 +Seg:6d00 Size:256 Owner:0x2ce4 ++++ -Seg:6fc0 Size:256 Owner:0x2cca +Seg:6e00 Size:256 Owner:0x2ce6 ++++ -Seg:70c0 Size:256 Owner:0x2ccc +Seg:6f00 Size:256 Owner:0x2ce8 ++++ -Seg:71c0 Size:256 Owner:0x2cce +Seg:7000 Size:256 Owner:0x2cea ++++ -Seg:72c0 Size:256 Owner:0x2cd0 +Seg:7100 Size:256 Owner:0x2cec ++++ -Seg:73c0 Size:256 Owner:0x2cd2 +Seg:7200 Size:256 Owner:0x2cee ++++ -Seg:74c0 Size:256 Owner:0x2cd4 +Seg:7300 Size:256 Owner:0x2cf0 ++++ -Seg:75c0 Size:256 Owner:0x2cd6 +Seg:7400 Size:256 Owner:0x2cf2 ++++ -Seg:76c0 Size:256 Owner:0x2cd8 +Seg:7500 Size:256 Owner:0x2cf4 ++++ -Seg:77c0 Size:256 Owner:0x2cda +Seg:7600 Size:256 Owner:0x2cf6 ++++ -Seg:78c0 Size:256 Owner:0x2cdc +Seg:7700 Size:256 Owner:0x2cf8 ++++ -Seg:79c0 Size:256 Owner:0x2cde +Seg:7800 Size:256 Owner:0x2cfa ++++ -Seg:7ac0 Size:273 Owner:0x2bee -+++++ -Seg:9dff Size:25088 Owner:0x0 -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \ No newline at end of file +Seg:7900 Size:273 Owner:0x2c0a +++++ +Seg:9f3f Size:24768 Owner:0x0 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \ No newline at end of file diff --git a/MEMINFO.16W b/MEMINFO.16W new file mode 100755 index 00000000..e69de29b diff --git a/MMDUMP.16B b/MMDUMP.16B index fe3f37d8e8e964a03d22391bad967c12c27c69e1..5053477b0316370f9fd93f47fac7d5a8d1de68a2 100755 GIT binary patch literal 2550 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

ybuKG0E&|W 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 E|9_hBfB*mh delta 45402 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 literal 8714 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 HZf5@rwW>;* diff --git a/makefile b/makefile index 58f4ec18..34621533 100755 --- a/makefile +++ b/makefile @@ -125,8 +125,8 @@ LIBFLAGS=$(WLIBQ) -b -n VGMSNDOBJ = vgmSnd.$(OBJ) 16_snd.$(OBJ) #OLDLIBOBJS=bitmap.$(OBJ) 16render.$(OBJ) GFXLIBOBJS = 16_vl.$(OBJ) 16_vlpal.$(OBJ) 16text.$(OBJ) bakapee.$(OBJ) scroll16.$(OBJ) 16_vrs.$(OBJ) 16_spri.$(OBJ) $(OLDLIBOBJS) -16LIBNOINOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_tail.$(OBJ) 16_head.$(OBJ) 16_dbg.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) 16_wcpu.$(OBJ) 16_timer.$(OBJ) jsmn.$(OBJ) 16_map.$(OBJ) 16text.$(OBJ) 16_enti.$(OBJ) -16LIBOBJS = $(16LIBNOINOBJS) 16_in.$(OBJ) +16LIBNOINOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_tail.$(OBJ) 16_head.$(OBJ) 16_dbg.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) 16_wcpu.$(OBJ) 16_timer.$(OBJ) jsmn.$(OBJ) 16_map.$(OBJ) 16text.$(OBJ) +16LIBOBJS = $(16LIBNOINOBJS) 16_in.$(OBJ) 16_enti.$(OBJ) DOSLIBOBJ = adlib.$(OBJ) 8254.$(OBJ) 8259.$(OBJ) dos.$(OBJ) cpu.$(OBJ) !ifeq DEBUGSERIAL 1 DOSLIBOBJ += 8250.$(OBJ) @@ -243,7 +243,7 @@ fonttest.exe: fonttest.$(OBJ) gfx.lib #fonttes0.exe: fonttes0.$(OBJ) $(16LIB) fontgfx.exe: fontgfx.$(OBJ) gfx.lib $(DOSLIB) inputest.exe: inputest.$(OBJ) $(16LIB) $(DOSLIB) gfx.lib -inntest.exe: inntest.$(OBJ) $(DOSLIB) $(16LIBNOINOBJS) 16_in_.$(OBJ) +inntest.exe: inntest.$(OBJ) $(16LIBNOINOBJS) 16_in__.$(OBJ) #sountest.exe: sountest.$(OBJ) $(16LIB) pcxtest.exe: pcxtest.$(OBJ) gfx.lib $(DOSLIB) $(16LIB) vrstest.exe: vrstest.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) @@ -339,7 +339,7 @@ mapread.$(OBJ):$(SRCLIB)/mapread.c $(SRCLIB)/mapread.h 16_map.$(OBJ):$(SRCLIB)/16_map.c $(SRCLIB)/16_map.h 16_timer.$(OBJ):$(SRCLIB)/16_timer.c $(SRCLIB)/16_timer.h 16_in.$(OBJ): $(SRCLIB)/16_in.c $(SRCLIB)/16_in.h -16_in_.$(OBJ): $(SRCLIB)/16_in_.c $(SRCLIB)/16_in.h +16_in__.$(OBJ): $(SRCLIB)/16_in__.c $(SRCLIB)/16_in.h 16_rf.$(OBJ): $(SRCLIB)/16_rf.c $(SRCLIB)/16_rf.h 16_mm.$(OBJ): $(SRCLIB)/16_mm.c $(SRCLIB)/16_mm.h 16_pm.$(OBJ): $(SRCLIB)/16_pm.c $(SRCLIB)/16_pm.h diff --git a/src/0.c b/src/0.c index ba9ced80..d3c6ba50 100755 --- a/src/0.c +++ b/src/0.c @@ -102,7 +102,7 @@ int main(int argc,char **argv) vrl_lineoffs = vrl1_vgax_genlineoffsets(vrl_header,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header)); if (vrl_lineoffs == NULL) return 1; - IN_Startup(); + IN_Startup(&gvar); IN_Default(0,&gvar.player,ctrl_Keyboard1); EN_initPlayer(&gvar.player, 0, &gvar.video); @@ -302,7 +302,7 @@ if(!noanim) { } } } - IN_Shutdown(); + IN_Shutdown(&gvar); VGAmodeX(0, 1, &gvar); free(vrl_lineoffs); buffer = NULL; diff --git a/src/inntest.c b/src/inntest.c index 1ba8b227..3742f87f 100755 --- a/src/inntest.c +++ b/src/inntest.c @@ -22,8 +22,12 @@ /* input test */ -#include "src/lib/16_in.h" -#include "src/lib/16_tail.h" +#include "src/lib/16_in_.h" + +void probe_dos(){} +void cpu_probe(){} +int probe_vga(){ return 0; } +void VGAmodeX(){} void main(int argc, char *argv[]) @@ -34,23 +38,23 @@ main(int argc, char *argv[]) dbg_testcontrolnoisy=1; start_timer(&gvar); //Startup16(&gvar); - IN_Startup(); + IN_Startup(&gvar); //IN_Default(0,&gvar.player,ctrl_Joystick1); //IN_SetControlType(0,&gvar.player,ctrl_Joystick1); - IN_Default(0,&gvar.player,ctrl_Keyboard1); + IN_Default(0,&gvar.player,ctrl_Keyboard1, &gvar); IN_SetControlType(0,&gvar.player,ctrl_Keyboard1); gvar.player[0].enti.q=1; gvar.player[0].enti.d=2; gvar.player[0].enti.speed=4; -//0000 nibbletest(); -//0000 booleantest(); +//0000 nibbletest(){} +//0000 booleantest(){} //printf("dbg_testkeyin=%u dbg_testcontrolnoisy=%u dbg_nogvar.playerinpu=%u\nloop if this is not responsive then please KILL or reset machine sorry!!\n", dbg_testkeyin, dbg_testcontrolnoisy, dbg_nogvar.playerinpu); - while(!IN_KeyDown(sc_Escape)) + while(!IN_KeyDown(sc_Escape, &gvar)) { //0000 shinkutxt(&gvar); - IN_ReadControl(0, &gvar.player); + IN_ReadControl(0, &gvar.player, &gvar); switch(gvar.player[0].enti.d) { //right movement @@ -87,8 +91,8 @@ main(int argc, char *argv[]) } //printf("%u\n", IN_KeyDown(sc_Escape)); //if( - IN_qb(sc_9);//>0) printf("IN_qb(sc_9)=%u\n", IN_qb(sc_9)); - if(IN_KeyDown(88)) //speed + IN_qb(sc_9, &gvar);//>0) printf("IN_qb(sc_9)=%u\n", IN_qb(sc_9)); + if(IN_KeyDown(88, &gvar)) //speed { switch(gvar.kurokku.fpscap) { @@ -99,10 +103,10 @@ main(int argc, char *argv[]) gvar.kurokku.fpscap=0; break; } - //IN_Ack(); + //IN_Ack(){} } } - IN_Shutdown(); + IN_Shutdown(&gvar); //Shutdown16(&gvar); //printf("%u\n", in.Keyboard[sc_Escape]); printf("inputest.exe "); diff --git a/src/inputest.c b/src/inputest.c index 1ba8b227..6481ad7b 100755 --- a/src/inputest.c +++ b/src/inputest.c @@ -34,7 +34,7 @@ main(int argc, char *argv[]) dbg_testcontrolnoisy=1; start_timer(&gvar); //Startup16(&gvar); - IN_Startup(); + IN_Startup(&gvar); //IN_Default(0,&gvar.player,ctrl_Joystick1); //IN_SetControlType(0,&gvar.player,ctrl_Joystick1); IN_Default(0,&gvar.player,ctrl_Keyboard1); @@ -102,7 +102,7 @@ main(int argc, char *argv[]) //IN_Ack(); } } - IN_Shutdown(); + IN_Shutdown(&gvar); //Shutdown16(&gvar); //printf("%u\n", in.Keyboard[sc_Escape]); printf("inputest.exe "); diff --git a/src/lib/16_in.c b/src/lib/16_in.c index a2b28046..c2550ec7 100755 --- a/src/lib/16_in.c +++ b/src/lib/16_in.c @@ -61,7 +61,6 @@ struct inconfig JoystickDef JoyDefs[MaxJoys]; } inpu; -//extern inconfig inpu; //inpu.KbdDefs = {0x1d,0x38,/*0x47,*/0x48,/*0x49,*/0x4b,0x4d,/*0x4f,*/0x50/*,0x51*/}; /* @@ -150,15 +149,9 @@ static byte far ASCIINames[] = // Unshifted ASCII for scan codes 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 + /*dir_NorthWest, */dir_North,/* dir_NorthEast,*/ + dir_West, dir_None, dir_East, + /*dir_SouthWest, */dir_South/*, dir_SouthEast*/ }; #ifdef __cplusplus } @@ -175,8 +168,8 @@ void interrupt INL_KeyService() { static boolean special; - byte k,c; - register byte temp; + byte k,c, + temp; k = inp(0x60); // Get the scan code diff --git a/src/lib/16_in.h b/src/lib/16_in.h index 4c039165..86980fe8 100755 --- a/src/lib/16_in.h +++ b/src/lib/16_in.h @@ -218,48 +218,48 @@ typedef struct { #endif // Internal routines -extern void interrupt INL_KeyService(); -extern void Mouse(int x); +void interrupt INL_KeyService(); +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); +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); +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); +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(); +void IN_Startup(); +void IN_Default(boolean gotit,player_t *player,ControlType nt); +void IN_Shutdown(); +void IN_SetKeyHook(void (*hook)()); +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(word pn, player_t *player); -extern void IN_SetControlType(word pn,player_t *player,ControlType type); +void IN_ReadCursor(CursorInfo *info); +void near IN_ReadControl(word pn, player_t *player); +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); +boolean IN_StartDemoRecord(word bufsize); +void IN_StartDemoPlayback(byte /*__segment*/ *buffer,word bufsize); +void IN_StopDemo(void); +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); -extern ScanCode IN_GetLastScan(); -extern ScanCode IN_GetCurCode(); +byte *IN_GetScanName(ScanCode scan); +ScanCode IN_WaitForKey(); +char IN_WaitForASCII(); +void IN_AckBack(); +void IN_Ack(); +boolean IN_IsUserInput(); +boolean IN_UserInput(dword delay,boolean clear); +boolean IN_KeyDown(byte code); +void IN_ClearKey(byte code); +boolean IN_qb(byte kee); +ScanCode IN_GetLastScan(); +ScanCode IN_GetCurCode(); #endif diff --git a/src/lib/16_in_.c b/src/lib/16_in_.c index 9b6bc7a9..c04d15aa 100755 --- a/src/lib/16_in_.c +++ b/src/lib/16_in_.c @@ -36,7 +36,7 @@ // DEBUG - there are more globals // -#include "src/lib/16_in.h" +#include "src/lib/16_in_.h" #pragma hdrstop /* @@ -60,6 +60,10 @@ extern "C" { #endif +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 @@ -128,22 +132,11 @@ static byte far ASCIINames[] = // Unshifted ASCII for scan codes 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 + /*dir_NorthWest, */dir_North,/* dir_NorthEast,*/ + dir_West, dir_None, dir_East, + /*dir_SouthWest, */dir_South/*, dir_SouthEast*/ }; -static void (*INL_KeyHook)(void); -static void interrupt (*OldKeyVect)(void); - -static char *ParmStringsIN[] = {"nojoys","nomouse",nil}; - #ifdef __cplusplus } #endif @@ -155,12 +148,12 @@ static char *ParmStringsIN[] = {"nojoys","nomouse",nil}; // INL_KeyService() - Handles a keyboard interrupt (key up/down) // /////////////////////////////////////////////////////////////////////////// -void interrupt -INL_KeyService() +/*static */void interrupt +INL_KeyService(global_game_variables_t *gvar) { static boolean special; - byte k,c; - register byte temp; + byte k,c, + temp; k = inp(0x60); // Get the scan code @@ -171,7 +164,7 @@ static boolean special; if (k == 0xe0) // Special key prefix special = true; else if (k == 0xe1) // Handle Pause key - inpu.Paused = true; + gvar->in.Paused = true; else { if (k & 0x80) // Break code @@ -180,13 +173,13 @@ static boolean special; // DEBUG - handle special keys: ctl-alt-delete, print scrn - inpu.Keyboard[k] = false; + gvar->in.Keyboard[k] = false; } else // Make code { - inst.LastCode = inst.CurCode; - inst.CurCode = inpu.LastScan = k; - inpu.Keyboard[k] = true; + gvar->in.LastCode = gvar->in.CurCode; + gvar->in.CurCode = gvar->in.LastScan = k; + gvar->in.Keyboard[k] = true; if (special) c = SpecialNames[k]; @@ -194,25 +187,25 @@ static boolean special; { if (k == sc_CapsLock) { - inst.CapsLock ^= true; + gvar->in.CapsLock ^= true; // DEBUG - make caps lock light work } - if (inpu.Keyboard[sc_LShift] || inpu.Keyboard[sc_RShift]) // If shifted + if (gvar->in.Keyboard[sc_LShift] || gvar->in.Keyboard[sc_RShift]) // If shifted { c = ShiftNames[k]; - if ((c >= 'A') && (c <= 'Z') && inst.CapsLock) + if ((c >= 'A') && (c <= 'Z') && gvar->in.CapsLock) c += 'a' - 'A'; } else { c = ASCIINames[k]; - if ((c >= 'a') && (c <= 'z') && inst.CapsLock) + if ((c >= 'a') && (c <= 'z') && gvar->in.CapsLock) c -= 'a' - 'A'; } } if (c) - inpu.LastASCII = c; + gvar->in.LastASCII = c; } special = false; @@ -221,7 +214,7 @@ static boolean special; 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]); + if(dbg_testkeyin > 0) printf("%c %u [0x%x %u] %u\n", c, c, k, k, gvar->in.Keyboard[k]); #endif outp(0x20,0x20); } @@ -366,16 +359,16 @@ done: // /////////////////////////////////////////////////////////////////////////// static void -INL_GetJoyDelta(word joy,int *dx,int *dy,boolean adaptive) +INL_GetJoyDelta(word joy,int *dx,int *dy,boolean adaptive, global_game_variables_t *gvar) { word x,y; word time; - word TimeCount = *clockw; + word TimeCount = gvar->kurokku.clock_start; JoystickDef *def; static word lasttime; IN_GetJoyAbs(joy,&x,&y); - def = inpu.JoyDefs + joy; + def = gvar->in.JoyDefs + joy; if (x < def->threshMinX) { @@ -462,9 +455,9 @@ register word result; // /////////////////////////////////////////////////////////////////////////// word -IN_GetJoyButtonsDB(word joy) +IN_GetJoyButtonsDB(word joy, global_game_variables_t *gvar) { - word TimeCount = *clockw; + word TimeCount = gvar->kurokku.clock_start; word lasttime; word result1,result2; @@ -484,12 +477,12 @@ IN_GetJoyButtonsDB(word joy) // /////////////////////////////////////////////////////////////////////////// static void -INL_StartKbd() +INL_StartKbd(global_game_variables_t *gvar) { byte far *lock_key; INL_KeyHook = 0; // Clear key hook - IN_ClearKeysDown(); + IN_ClearKeysDown(gvar); OldKeyVect = _dos_getvect(KeyInt); @@ -545,11 +538,11 @@ INL_ShutMouse(void) // INL_SetJoyScale() - Sets up scaling values for the specified joystick // static void -INL_SetJoyScale(word joy) +INL_SetJoyScale(word joy, global_game_variables_t *gvar) { JoystickDef *def; - def = &(inpu.JoyDefs[joy]); + def = &(gvar->in.JoyDefs[joy]); def->joyMultXL = JoyScaleMax / (def->threshMinX - def->joyMinX); def->joyMultXH = JoyScaleMax / (def->joyMaxX - def->threshMaxX); def->joyMultYL = JoyScaleMax / (def->threshMinY - def->joyMinY); @@ -563,12 +556,12 @@ INL_SetJoyScale(word joy) // /////////////////////////////////////////////////////////////////////////// void -IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy) +IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy, global_game_variables_t *gvar) { word d,r; JoystickDef *def; - def = &(inpu.JoyDefs[joy]); + def = &(gvar->in.JoyDefs[joy]); def->joyMinX = minx; def->joyMaxX = maxx; @@ -584,7 +577,7 @@ IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy) def->threshMinY = ((r / 2) - d) + miny; def->threshMaxY = ((r / 2) + d) + miny; - INL_SetJoyScale(joy); + INL_SetJoyScale(joy, gvar); } /////////////////////////////////////////////////////////////////////////// @@ -594,7 +587,7 @@ IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy) // /////////////////////////////////////////////////////////////////////////// static boolean -INL_StartJoy(word joy) +INL_StartJoy(word joy, global_game_variables_t *gvar) { word x,y; @@ -608,7 +601,7 @@ INL_StartJoy(word joy) return(false); else { - IN_SetupJoy(joy,0,x * 2,0,y * 2); + IN_SetupJoy(joy,0,x * 2,0,y * 2, gvar); return(true); } } @@ -619,9 +612,9 @@ INL_StartJoy(word joy) // /////////////////////////////////////////////////////////////////////////// static void -INL_ShutJoy(word joy) +INL_ShutJoy(word joy, global_game_variables_t *gvar) { - inpu.JoysPresent[joy] = false; + gvar->in.JoysPresent[joy] = false; } // Public routines @@ -632,12 +625,12 @@ INL_ShutJoy(word joy) // /////////////////////////////////////////////////////////////////////////// void -IN_Startup() +IN_Startup(global_game_variables_t *gvar) { boolean checkjoys,checkmouse; word i; - if (inst.IN_Started) + if (gvar->in.IN_Started) return; checkjoys = true; @@ -655,16 +648,16 @@ IN_Startup() } } - INL_StartKbd(); - inpu.MousePresent = checkmouse? INL_StartMouse() : false; + INL_StartKbd(gvar); + gvar->in.MousePresent = checkmouse? INL_StartMouse() : false; for (i = 0;i < MaxJoys;i++) - ININFO_JoysPresent[i] = checkjoys? INL_StartJoy(i) : false; + gvar->in.JoysPresent[i] = checkjoys? INL_StartJoy(i, gvar) : false; - for (i = 0;i < MaxKbds;i++) - ININFO_KbdDefs[i] = {0x1d,0x38,/*0x47,*/0x48,/*0x49,*/0x4b,0x4d,/*0x4f,*/0x50/*,0x51*/}; + //for (i = 0;i < MaxKbds;i++) + // gvar->in.KbdDefs[i] = {0x1d,0x38,/*0x47,*/0x48,/*0x49,*/0x4b,0x4d,/*0x4f,*/0x50/*,0x51*/}; - inst.IN_Started = true; + gvar->in.IN_Started = true; } @@ -674,26 +667,26 @@ IN_Startup() // /////////////////////////////////////////////////////////////////////////// void -IN_Default(boolean gotit,player_t *player,ControlType nt) +IN_Default(boolean gotit,player_t *player,ControlType nt, global_game_variables_t *gvar) { int i; if ( (!gotit) - || ((nt == ctrl_Joystick1) && !inpu.JoysPresent[0]) - || ((nt == ctrl_Joystick2) && !inpu.JoysPresent[1]) - || ((nt == ctrl_Mouse) && !inpu.MousePresent) + || ((nt == ctrl_Joystick1) && !gvar->in.JoysPresent[0]) + || ((nt == ctrl_Joystick2) && !gvar->in.JoysPresent[1]) + || ((nt == ctrl_Mouse) && !gvar->in.MousePresent) ) nt = ctrl_Keyboard1; - ININFO_KbdDefs[0].button0 = 0x1c; - ININFO_KbdDefs[0].button1 = 0x38; + gvar->in.KbdDefs[0].button0 = 0x1c; + gvar->in.KbdDefs[0].button1 = 0x38; //in.KbdDefs[0].upleft = 0x47; - ININFO_KbdDefs[0].up = 0x48; + gvar->in.KbdDefs[0].up = 0x48; //in.KbdDefs[0].upright = 0x49; - ININFO_KbdDefs[0].left = 0x4b; - ININFO_KbdDefs[0].right = 0x4d; + gvar->in.KbdDefs[0].left = 0x4b; + gvar->in.KbdDefs[0].right = 0x4d; //in.KbdDefs[0].downleft = 0x4f; - ININFO_KbdDefs[0].down = 0x50; + gvar->in.KbdDefs[0].down = 0x50; //in.KbdDefs[0].downright = 0x51; IN_SetControlType(0,player,nt); for(i=0; i>MaxPlayers;i++) @@ -706,19 +699,19 @@ IN_Default(boolean gotit,player_t *player,ControlType nt) // /////////////////////////////////////////////////////////////////////////// void -IN_Shutdown() +IN_Shutdown(global_game_variables_t *gvar) { word i; - if (!inst.IN_Started) + if (!gvar->in.IN_Started) return; INL_ShutMouse(); for (i = 0;i < MaxJoys;i++) - INL_ShutJoy(i); + INL_ShutJoy(i, gvar); INL_ShutKbd(); - inst.IN_Started = false; + gvar->in.IN_Started = false; } /////////////////////////////////////////////////////////////////////////// @@ -739,13 +732,13 @@ IN_SetKeyHook(void (*hook)()) // /////////////////////////////////////////////////////////////////////////// void -IN_ClearKeysDown() +IN_ClearKeysDown(global_game_variables_t *gvar) { //int i; - inpu.LastScan = sc_None; - inpu.LastASCII = key_None; - memset (inpu.Keyboard,0,sizeof(inpu.Keyboard)); + gvar->in.LastScan = sc_None; + gvar->in.LastASCII = key_None; + memset (gvar->in.Keyboard,0,sizeof(gvar->in.Keyboard)); } /////////////////////////////////////////////////////////////////////////// @@ -772,7 +765,7 @@ INL_AdjustCursor(CursorInfo *info,word buttons,int dx,int dy) // /////////////////////////////////////////////////////////////////////////// void -IN_ReadCursor(CursorInfo *info) +IN_ReadCursor(CursorInfo *info, global_game_variables_t *gvar) { word i, buttons; @@ -781,7 +774,7 @@ IN_ReadCursor(CursorInfo *info) info->x = info->y = 0; info->button0 = info->button1 = false; - if (inpu.MousePresent) + if (gvar->in.MousePresent) { buttons = INL_GetMouseButtons(); INL_GetMouseDelta(&dx,&dy); @@ -790,11 +783,11 @@ IN_ReadCursor(CursorInfo *info) for (i = 0;i < MaxJoys;i++) { - if (!inpu.JoysPresent[i]) + if (!gvar->in.JoysPresent[i]) continue; buttons = INL_GetJoyButtons(i); - INL_GetJoyDelta(i,&dx,&dy,true); + INL_GetJoyDelta(i,&dx,&dy,true, gvar); dx /= 64; dy /= 64; INL_AdjustCursor(info,buttons,dx,dy); @@ -808,7 +801,7 @@ IN_ReadCursor(CursorInfo *info) // /////////////////////////////////////////////////////////////////////////// void near -IN_ReadControl(word pn, player_t *player) +IN_ReadControl(word pn, player_t *player, global_game_variables_t *gvar) { boolean realdelta; #if DEMO0 @@ -852,7 +845,7 @@ register KeyboardDef *def; { case ctrl_Keyboard1: case ctrl_Keyboard2: - def = &(ININFO_KbdDefs[type - ctrl_Keyboard]); + def = &(gvar->in.KbdDefs[type - ctrl_Keyboard]); /* if (Keyboard[def->upleft]) mx = motion_Left,my = motion_Up; @@ -865,28 +858,28 @@ register KeyboardDef *def; //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])) + if(!gvar->in.Keyboard[def->left] && !gvar->in.Keyboard[def->right]){ + if((gvar->in.Keyboard[def->up] && !gvar->in.Keyboard[def->down])) my = motion_Up; - if((inpu.Keyboard[def->down] && !inpu.Keyboard[def->up])) + if((gvar->in.Keyboard[def->down] && !gvar->in.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])) + }else if(!gvar->in.Keyboard[def->up] && !gvar->in.Keyboard[def->down]){ + if((gvar->in.Keyboard[def->left] && !gvar->in.Keyboard[def->right])) mx = motion_Left; - if((inpu.Keyboard[def->right] && !inpu.Keyboard[def->left])) + if((gvar->in.Keyboard[def->right] && !gvar->in.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; } + if((gvar->in.Keyboard[def->left] && !gvar->in.Keyboard[def->right])){ dir = DirTable[1]; }//mx = motion_Left; } + else if((gvar->in.Keyboard[def->right] && !gvar->in.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; } + if((gvar->in.Keyboard[def->up] && !gvar->in.Keyboard[def->down])){ dir = DirTable[0]; }//my = motion_Up; } + else if((gvar->in.Keyboard[def->down] && !gvar->in.Keyboard[def->up])){ dir = DirTable[4]; }//my = motion_Down; } break; default: break; @@ -897,15 +890,15 @@ register KeyboardDef *def; } } //input from player - if (inpu.Keyboard[def->button0]) + if (gvar->in.Keyboard[def->button0]) buttons += 1 << 0; - if (inpu.Keyboard[def->button1]) + if (gvar->in.Keyboard[def->button1]) buttons += 1 << 1; realdelta = false; break; case ctrl_Joystick1: case ctrl_Joystick2: - INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy,false); + INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy,false, gvar); buttons = INL_GetJoyButtons(type - ctrl_Joystick); realdelta = true; break; @@ -976,14 +969,14 @@ register KeyboardDef *def; #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].enti.q>1) +if(player[pn].info.dir!=2/*(gvar->in.Keyboard[def->up] || gvar->in.Keyboard[def->down] || gvar->in.Keyboard[def->left] || gvar->in.Keyboard[def->right])*/ || player[pn].enti.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].enti.q); //printf("cpee=%c ", dirchar(conpee)); printf("pdir=%c d=%c dir=%c ", dirchar(player[pn].pdir), dirchar(player[pn].enti.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]); + //else if(!realdelta) printf("%c%d %c%d %c%d %c%d", dirchar(0), gvar->in.Keyboard[def->up], dirchar(4), gvar->in.Keyboard[def->down], dirchar(1), gvar->in.Keyboard[def->left], dirchar(3), gvar->in.Keyboard[def->right]); printf("\n"); } #endif @@ -1092,13 +1085,13 @@ IN_GetScanName(ScanCode scan) // /////////////////////////////////////////////////////////////////////////// ScanCode -IN_WaitForKey() +IN_WaitForKey(global_game_variables_t *gvar) { ScanCode result; - while (!(result = inpu.LastScan)) + while (!(result = gvar->in.LastScan)) ; - inpu.LastScan = 0; + gvar->in.LastScan = 0; return(result); } @@ -1109,13 +1102,13 @@ IN_WaitForKey() // /////////////////////////////////////////////////////////////////////////// char -IN_WaitForASCII() +IN_WaitForASCII(global_game_variables_t *gvar) { char result; - while (!(result = inpu.LastASCII)) + while (!(result = gvar->in.LastASCII)) ; - inpu.LastASCII = '\0'; + gvar->in.LastASCII = '\0'; return(result); } @@ -1125,13 +1118,13 @@ IN_WaitForASCII() // /////////////////////////////////////////////////////////////////////////// void -IN_AckBack() +IN_AckBack(global_game_variables_t *gvar) { word i; - while (!inpu.LastScan) + while (!gvar->in.LastScan) { - if (inpu.MousePresent) + if (gvar->in.MousePresent) { if (INL_GetMouseButtons()) { @@ -1143,11 +1136,11 @@ IN_AckBack() for (i = 0;i < MaxJoys;i++) { - if (inpu.JoysPresent[i]) + if (gvar->in.JoysPresent[i]) { - if (IN_GetJoyButtonsDB(i)) + if (IN_GetJoyButtonsDB(i, gvar)) { - while (IN_GetJoyButtonsDB(i)) + while (IN_GetJoyButtonsDB(i, gvar)) ; return; } @@ -1155,8 +1148,8 @@ IN_AckBack() } } - IN_ClearKey(inpu.LastScan); - inpu.LastScan = sc_None; + IN_ClearKey(gvar->in.LastScan, gvar); + gvar->in.LastScan = sc_None; } /////////////////////////////////////////////////////////////////////////// @@ -1165,25 +1158,25 @@ IN_AckBack() // /////////////////////////////////////////////////////////////////////////// void -IN_Ack() +IN_Ack(global_game_variables_t *gvar) { word i; - if (!inst.IN_Started) + if (!gvar->in.IN_Started) return; - IN_ClearKey(inpu.LastScan); - inpu.LastScan = sc_None; + IN_ClearKey(gvar->in.LastScan, gvar); + gvar->in.LastScan = sc_None; - if (inpu.MousePresent) + if (gvar->in.MousePresent) while (INL_GetMouseButtons()) ; for (i = 0;i < MaxJoys;i++) - if (inpu.JoysPresent[i]) - while (IN_GetJoyButtonsDB(i)) + if (gvar->in.JoysPresent[i]) + while (IN_GetJoyButtonsDB(i, gvar)) ; - IN_AckBack(); + IN_AckBack(gvar); } /////////////////////////////////////////////////////////////////////////// @@ -1193,19 +1186,19 @@ IN_Ack() // /////////////////////////////////////////////////////////////////////////// boolean -IN_IsUserInput() +IN_IsUserInput(global_game_variables_t *gvar) { boolean result; word i; - result = inpu.LastScan; + result = gvar->in.LastScan; - if (inpu.MousePresent) + if (gvar->in.MousePresent) if (INL_GetMouseButtons()) result = true; for (i = 0;i < MaxJoys;i++) - if (inpu.JoysPresent[i]) + if (gvar->in.JoysPresent[i]) if (INL_GetJoyButtons(i)) result = true; @@ -1221,18 +1214,18 @@ IN_IsUserInput() // /////////////////////////////////////////////////////////////////////////// boolean -IN_UserInput(dword delay,boolean clear) +IN_UserInput(dword delay,boolean clear, global_game_variables_t *gvar) { - word TimeCount = *clockw; + word TimeCount = gvar->kurokku.clock_start; word lasttime; lasttime = TimeCount; do { - if (IN_IsUserInput()) + if (IN_IsUserInput(gvar)) { if (clear) - IN_AckBack(); + IN_AckBack(gvar); return(true); } } while (TimeCount - lasttime < delay); @@ -1249,10 +1242,10 @@ IN_UserInput(dword delay,boolean clear) =================== */ -byte IN_MouseButtons (void) +byte IN_MouseButtons (global_game_variables_t *gvar) { union REGS CPURegs; - if (inpu.MousePresent) + if (gvar->in.MousePresent) { Mouse(MButtons); return CPURegs.x.bx; @@ -1281,12 +1274,12 @@ byte IN_JoyButtons (void) return joybits; } -boolean IN_KeyDown(byte code) +boolean IN_KeyDown(byte code, global_game_variables_t *gvar) { #ifdef __DEBUG_InputMgr__ if(!dbg_nointest) #endif - return inpu.Keyboard[code]; + return gvar->in.Keyboard[code]; #ifdef __DEBUG_InputMgr__ else if(dbg_nointest && kbhit()) @@ -1296,28 +1289,28 @@ boolean IN_KeyDown(byte code) #endif } -void IN_ClearKey(byte code) +void IN_ClearKey(byte code, global_game_variables_t *gvar) { - inpu.Keyboard[code] = false; - if(code == inpu.LastScan) - inpu.LastScan = sc_None; + gvar->in.Keyboard[code] = false; + if(code == gvar->in.LastScan) + gvar->in.LastScan = sc_None; } -boolean IN_qb(byte kee) +boolean IN_qb(byte kee, global_game_variables_t *gvar) { #ifdef __DEBUG_InputMgr__ - if(dbg_testkeyin) printf("%u\n", inpu.Keyboard[kee]); + if(dbg_testkeyin) printf("%u\n", gvar->in.Keyboard[kee]); #endif - if(inpu.Keyboard[kee]==true) return 1; + if(gvar->in.Keyboard[kee]==true) return 1; else return 0; } -ScanCode IN_GetLastScan() +ScanCode IN_GetLastScan(global_game_variables_t *gvar) { - return inpu.LastScan; + return gvar->in.LastScan; } -ScanCode IN_GetCurCode() +ScanCode IN_GetCurCode(global_game_variables_t *gvar) { - return inst.CurCode; + return gvar->in.CurCode; } diff --git a/src/lib/16_in_.h b/src/lib/16_in_.h index 39519c20..f84b3a46 100755 --- a/src/lib/16_in_.h +++ b/src/lib/16_in_.h @@ -202,37 +202,7 @@ typedef struct { 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~ - word speed; //player speed! - word spt; //speed per tile -#ifdef __WATCOMC__ - struct sprite *spri; //supposively the sprite sheet data - memptr gr; - entity_t *ent; -#endif - bitmap_t *data; //supposively the sprite sheet data//old format - bitmap_t bmp; - 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; -//newer vars - int dx, dy, delta; //TODO: what is this? ^^ -} player_t;*/ + } JoystickDef;*/ /* ============================================================================= @@ -241,19 +211,6 @@ typedef struct ============================================================================= */ -/*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; @@ -261,48 +218,48 @@ typedef struct #endif // Internal routines -extern void interrupt INL_KeyService(); -extern void Mouse(int x); +//void interrupt INL_KeyService(global_game_variables_t *gvar); +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); +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); +word IN_GetJoyButtonsDB(word joy, global_game_variables_t *gvar); //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); +void IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy, global_game_variables_t *gvar); //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(); +void IN_Startup(global_game_variables_t *gvar); +void IN_Default(boolean gotit,player_t *player,ControlType nt, global_game_variables_t *gvar); +void IN_Shutdown(global_game_variables_t *gvar); +void IN_SetKeyHook(void (*hook)()); +void IN_ClearKeysDown(global_game_variables_t *gvar); //static void INL_AdjustCursor(CursorInfo *info,word buttons,int dx,int dy); -extern void IN_ReadCursor(CursorInfo *info); -extern void near IN_ReadControl(word pn, player_t *player); -extern void IN_SetControlType(word pn,player_t *player,ControlType type); +void IN_ReadCursor(CursorInfo *info, global_game_variables_t *gvar); +void near IN_ReadControl(word pn, player_t *player, global_game_variables_t *gvar); +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); +boolean IN_StartDemoRecord(word bufsize); +void IN_StartDemoPlayback(byte /*__segment*/ *buffer,word bufsize); +void IN_StopDemo(void); +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); -extern ScanCode IN_GetLastScan(); -extern ScanCode IN_GetCurCode(); +byte *IN_GetScanName(ScanCode scan); +ScanCode IN_WaitForKey(global_game_variables_t *gvar); +char IN_WaitForASCII(global_game_variables_t *gvar); +void IN_AckBack(global_game_variables_t *gvar); +void IN_Ack(global_game_variables_t *gvar); +boolean IN_IsUserInput(global_game_variables_t *gvar); +boolean IN_UserInput(dword delay,boolean clear, global_game_variables_t *gvar); +boolean IN_KeyDown(byte code, global_game_variables_t *gvar); +void IN_ClearKey(byte code, global_game_variables_t *gvar); +boolean IN_qb(byte kee, global_game_variables_t *gvar); +ScanCode IN_GetLastScan(global_game_variables_t *gvar); +ScanCode IN_GetCurCode(global_game_variables_t *gvar); #endif diff --git a/src/lib/16_in__.c b/src/lib/16_in__.c new file mode 100755 index 00000000..2534af75 --- /dev/null +++ b/src/lib/16_in__.c @@ -0,0 +1,991 @@ +// +// 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" +#pragma hdrstop + +#define KeyInt 9 // The keyboard ISR number + +// +// mouse constants +// +#define MReset 0 +#define MButtons 3 +#define MDelta 11 + +#define MouseInt 0x33 +#define Mouse(x) _AX = x,geninterrupt(MouseInt) + +// +// joystick constants +// +#define JoyScaleMax 32768 +#define JoyScaleShift 8 +#define MaxJoyValue 5000 + +/* +============================================================================= + + GLOBAL VARIABLES + +============================================================================= +*/ + +// +// configuration variables +// +boolean MousePresent; +boolean JoysPresent[MaxJoys]; +boolean JoyPadPresent; + + +// Global variables + boolean Keyboard[NumCodes]; + boolean Paused; + char LastASCII; + ScanCode LastScan; + + KeyboardDef KbdDefs = {{0x1d,0x38,0x47,0x48,0x49,0x4b,0x4d,0x4f,0x50,0x51}}; + JoystickDef JoyDefs[MaxJoys]; + ControlType Controls[MaxPlayers]; + + dword MouseDownCount; + + Demo DemoMode = demo_Off; + byte _seg *DemoBuffer; + word DemoOffset,DemoSize; + +/* +============================================================================= + + LOCAL VARIABLES + +============================================================================= +*/ +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 + }; + + +static boolean IN_Started; +static boolean CapsLock; +static ScanCode CurCode,LastCode; + +static Direction DirTable[] = // Quick lookup for total direction + { + dir_NorthWest, dir_North, dir_NorthEast, + dir_West, dir_None, dir_East, + dir_SouthWest, dir_South, dir_SouthEast + }; + +static void (*INL_KeyHook)(void); +static void interrupt (*OldKeyVect)(void); + +static char *ParmStrings[] = {"nojoys","nomouse",nil}; + +// Internal routines + +/////////////////////////////////////////////////////////////////////////// +// +// INL_KeyService() - Handles a keyboard interrupt (key up/down) +// +/////////////////////////////////////////////////////////////////////////// +static void interrupt +INL_KeyService(void) +{ +static boolean special; + byte k,c, + temp; + int i; + + k = inp(0x60); // Get the scan code + + // Tell the XT keyboard controller to clear the key + outportb(0x61,(temp = inp(0x61)) | 0x80); + outportb(0x61,temp); + + if (k == 0xe0) // Special key prefix + special = true; + else if (k == 0xe1) // Handle Pause key + Paused = true; + else + { + if (k & 0x80) // Break code + { + k &= 0x7f; + +// DEBUG - handle special keys: ctl-alt-delete, print scrn + + Keyboard[k] = false; + } + else // Make code + { + LastCode = CurCode; + CurCode = LastScan = k; + Keyboard[k] = true; + + if (special) + c = SpecialNames[k]; + else + { + if (k == sc_CapsLock) + { + CapsLock ^= true; + // DEBUG - make caps lock light work + } + + if (Keyboard[sc_LShift] || Keyboard[sc_RShift]) // If shifted + { + c = ShiftNames[k]; + if ((c >= 'A') && (c <= 'Z') && CapsLock) + c += 'a' - 'A'; + } + else + { + c = ASCIINames[k]; + if ((c >= 'a') && (c <= 'z') && CapsLock) + c -= 'a' - 'A'; + } + } + if (c) + LastASCII = c; + } + + special = false; + } + + if (INL_KeyHook && !special) + INL_KeyHook(); + outportb(0x20,0x20); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_GetMouseDelta() - Gets the amount that the mouse has moved from the +// mouse driver +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_GetMouseDelta(int *x,int *y) +{ + Mouse(MDelta); + *x = _CX; + *y = _DX; +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_GetMouseButtons() - Gets the status of the mouse buttons from the +// mouse driver +// +/////////////////////////////////////////////////////////////////////////// +static word +INL_GetMouseButtons(void) +{ + word buttons; + + Mouse(MButtons); + buttons = _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 +asm push si +asm push di +asm cli // Make sure an interrupt doesn't screw the timings + + +asm mov dx,0x201 +asm in al,dx +asm out dx,al // Clear the resistors + +asm mov ah,[xb] // Get masks into registers +asm mov ch,[yb] + +asm xor si,si // Clear count registers +asm xor di,di +asm xor bh,bh // Clear high byte of bx for later + +asm push bp // Don't mess up stack frame +asm mov bp,MaxJoyValue + +loop: +asm in al,dx // Get bits indicating whether all are finished + +asm dec bp // Check bounding register +asm jz done // We have a silly value - abort + +asm mov bl,al // Duplicate the bits +asm and bl,ah // Mask off useless bits (in [xb]) +asm add si,bx // Possibly increment count register +asm mov cl,bl // Save for testing later + +asm mov bl,al +asm and bl,ch // [yb] +asm add di,bx + +asm add cl,bl +asm jnz loop // If both bits were 0, drop out + +done: +asm pop bp + +asm mov cl,[xs] // Get the number of bits to shift +asm shr si,cl // and shift the count that many times + +asm mov cl,[ys] +asm shr di,cl + +asm mov [x],si // Store the values into the variables +asm mov [y],di + +asm pop di +asm pop si +asm popf // Restore the registers + + *xp = x; + *yp = y; +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_GetJoyDelta() - Returns the relative movement of the specified +// joystick (from +/-127) +// +/////////////////////////////////////////////////////////////////////////// +void INL_GetJoyDelta(word joy,int *dx,int *dy) +{ + word x,y; + dword time; + JoystickDef *def; +static dword lasttime; + + IN_GetJoyAbs(joy,&x,&y); + def = 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; + + 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) +{ + dword 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(void) +{ + INL_KeyHook = NULL; // no key hook routine + + IN_ClearKeysDown(); + + OldKeyVect = getvect(KeyInt); + setvect(KeyInt,INL_KeyService); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_ShutKbd() - Restores keyboard control to the BIOS +// +/////////////////////////////////////////////////////////////////////////// +static void +INL_ShutKbd(void) +{ + poke(0x40,0x17,peek(0x40,0x17) & 0xfaf0); // Clear ctrl/alt/shift flags + + setvect(KeyInt,OldKeyVect); +} + +/////////////////////////////////////////////////////////////////////////// +// +// INL_StartMouse() - Detects and sets up the mouse +// +/////////////////////////////////////////////////////////////////////////// +static boolean +INL_StartMouse(void) +{ +#if 0 + if (getvect(MouseInt)) + { + Mouse(MReset); + if (_AX == 0xffff) + return(true); + } + return(false); +#endif + union REGS regs; + unsigned char far *vector; + + + if ((vector=MK_FP(peek(0,0x33*4+2),peek(0,0x33*4)))==NULL) + return false; + + if (*vector == 207) + return false; + + Mouse(MReset); + return true; +} + +/////////////////////////////////////////////////////////////////////////// +// +// 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 = &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 = &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) +{ + JoysPresent[joy] = false; +} + + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Startup() - Starts up the Input Mgr +// +/////////////////////////////////////////////////////////////////////////// +void +IN_Startup(void) +{ + boolean checkjoys,checkmouse; + word i; + + if (IN_Started) + return; + + checkjoys = true; + checkmouse = true; + for (i = 1;i < _argc;i++) + { + switch (US_CheckParm(_argv[i],ParmStrings)) + { + case 0: + checkjoys = false; + break; + case 1: + checkmouse = false; + break; + } + } + + INL_StartKbd(); + MousePresent = checkmouse? INL_StartMouse() : false; + + for (i = 0;i < MaxJoys;i++) + JoysPresent[i] = checkjoys? INL_StartJoy(i) : false; + + IN_Started = true; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Default() - Sets up default conditions for the Input Mgr +// +/////////////////////////////////////////////////////////////////////////// +void +IN_Default(boolean gotit,ControlType in) +{ + if + ( + (!gotit) + || ((in == ctrl_Joystick1) && !JoysPresent[0]) + || ((in == ctrl_Joystick2) && !JoysPresent[1]) + || ((in == ctrl_Mouse) && !MousePresent) + ) + in = ctrl_Keyboard1; + IN_SetControlType(0,in); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Shutdown() - Shuts down the Input Mgr +// +/////////////////////////////////////////////////////////////////////////// +void +IN_Shutdown(void) +{ + word i; + + if (!IN_Started) + return; + + INL_ShutMouse(); + for (i = 0;i < MaxJoys;i++) + INL_ShutJoy(i); + INL_ShutKbd(); + + 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_ClearKeysDown() - Clears the keyboard array +// +/////////////////////////////////////////////////////////////////////////// +void +IN_ClearKeysDown(void) +{ + int i; + + LastScan = sc_None; + LastASCII = key_None; + memset (Keyboard,0,sizeof(Keyboard)); +} + + +/////////////////////////////////////////////////////////////////////////// +// +// IN_ReadControl() - Reads the device associated with the specified +// player and fills in the control info struct +// +/////////////////////////////////////////////////////////////////////////// +void +IN_ReadControl(int player,CursorInfo *info) +{ + boolean realdelta; + byte dbyte; + word buttons; + int dx,dy; + Motion mx,my; + ControlType type; +register KeyboardDef *def; + + dx = dy = 0; + mx = my = motion_None; + buttons = 0; + + 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 + { + switch (type = Controls[player]) + { + case ctrl_Keyboard: + def = &KbdDefs; + + 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; + + if (Keyboard[def->up]) + my = motion_Up; + else if (Keyboard[def->down]) + my = motion_Down; + + if (Keyboard[def->left]) + mx = motion_Left; + else if (Keyboard[def->right]) + mx = motion_Right; + + if (Keyboard[def->button0]) + buttons += 1 << 0; + if (Keyboard[def->button1]) + buttons += 1 << 1; + realdelta = false; + break; + case ctrl_Joystick1: + case ctrl_Joystick2: + INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy); + buttons = INL_GetJoyButtons(type - ctrl_Joystick); + realdelta = true; + break; + case ctrl_Mouse: + INL_GetMouseDelta(&dx,&dy); + buttons = INL_GetMouseButtons(); + realdelta = true; + break; + } + } + + 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; + } + + info->x = dx; + info->xaxis = mx; + info->y = dy; + info->yaxis = my; + info->button0 = buttons & (1 << 0); + info->button1 = buttons & (1 << 1); + info->button2 = buttons & (1 << 2); + info->button3 = buttons & (1 << 3); + info->dir = DirTable[((my + 1) * 3) + (mx + 1)]; + + 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; + } + } +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_SetControlType() - Sets the control type to be used by the specified +// player +// +/////////////////////////////////////////////////////////////////////////// +void +IN_SetControlType(int player,ControlType type) +{ + // DEBUG - check that requested type is present? + Controls[player] = type; +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_WaitForKey() - Waits for a scan code, then clears LastScan and +// returns the scan code +// +/////////////////////////////////////////////////////////////////////////// +ScanCode +IN_WaitForKey(void) +{ + ScanCode result; + + while (!(result = LastScan)) + ; + LastScan = 0; + return(result); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_WaitForASCII() - Waits for an ASCII char, then clears LastASCII and +// returns the ASCII value +// +/////////////////////////////////////////////////////////////////////////// +char +IN_WaitForASCII(void) +{ + char result; + + while (!(result = LastASCII)) + ; + LastASCII = '\0'; + return(result); +} + +/////////////////////////////////////////////////////////////////////////// +// +// IN_Ack() - waits for a button or key press. If a button is down, upon +// calling, it must be released for it to be recognized +// +/////////////////////////////////////////////////////////////////////////// + +boolean btnstate[8]; + +void IN_StartAck(void) +{ + unsigned i,buttons; + +// +// get initial state of everything +// + IN_ClearKeysDown(); + memset (btnstate,0,sizeof(btnstate)); + + buttons = IN_JoyButtons () << 4; + if (MousePresent) + buttons |= IN_MouseButtons (); + + for (i=0;i<8;i++,buttons>>=1) + if (buttons&1) + btnstate[i] = true; +} + + +boolean IN_CheckAck (void) +{ + unsigned i,buttons; + +// +// see if something has been pressed +// + if (LastScan) + return true; + + buttons = IN_JoyButtons () << 4; + if (MousePresent) + buttons |= IN_MouseButtons (); + + for (i=0;i<8;i++,buttons>>=1) + if ( buttons&1 ) + { + if (!btnstate[i]) + return true; + } + else + btnstate[i]=false; + + return false; +} + + +void IN_Ack (void) +{ + IN_StartAck (); + + while (!IN_CheckAck ()) + ; +} + + +/////////////////////////////////////////////////////////////////////////// +// +// 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) +{ + dword lasttime; + + lasttime = TimeCount; + IN_StartAck (); + do + { + if (IN_CheckAck()) + return true; + } while (TimeCount - lasttime < delay); + return(false); +} + +//=========================================================================== + +/* +=================== += += IN_MouseButtons += +=================== +*/ + +byte IN_MouseButtons (void) +{ + if (MousePresent) + { + Mouse(MButtons); + return _BX; + } + else + return 0; +} + + +/* +=================== += += IN_JoyButtons += +=================== +*/ + +byte IN_JoyButtons (void) +{ + unsigned joybits; + + joybits = inp(0x201); // Get all the joystick buttons + joybits >>= 4; // only the high bits are useful + joybits ^= 15; // return with 1=pressed + + return joybits; +} + + diff --git a/src/lib/16_in__.h b/src/lib/16_in__.h new file mode 100755 index 00000000..f493ce6e --- /dev/null +++ b/src/lib/16_in__.h @@ -0,0 +1,213 @@ +// +// 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 "src/lib/16_head.h" + +#ifdef __DEBUG__ +#define __DEBUG_InputMgr__ +#endif + +#define MaxPlayers 4 +#define MaxKbds 2 +#define MaxJoys 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 + +// Stuff for the mouse +#define MReset 0 +#define MButtons 3 +#define MDelta 11 + +#define MouseInt 0x33 +#define Mouse(x) _AX = x,geninterrupt(MouseInt) + +#ifdef DEMO0 +typedef enum { + demo_Off,demo_Record,demo_Playback,demo_PlayDone + } Demo; +#endif +//moved to 16_tdef.h +/*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;*/ + +/* +============================================================================= + + GLOBAL VARIABLES + +============================================================================= +*/ +#ifdef DEMO0 + static Demo DemoMode = demo_Off; + static byte /*_seg*/ *DemoBuffer; + static word DemoOffset,DemoSize; +#endif + +// Function prototypes +#define IN_KeyDown(code) (Keyboard[(code)]) +#define IN_ClearKey(code) {Keyboard[code] = false;\ + if (code == LastScan) LastScan = sc_None;} + +// DEBUG - put names in prototypes +extern void IN_Startup(void),IN_Shutdown(void), + IN_Default(boolean gotit,ControlType in), + IN_SetKeyHook(void (*)()), + IN_ClearKeysDown(void), + IN_ReadCursor(CursorInfo *), + IN_ReadControl(int,CursorInfo *), + IN_SetControlType(int,ControlType), + IN_GetJoyAbs(word joy,word *xp,word *yp), + IN_SetupJoy(word joy,word minx,word maxx, + word miny,word maxy), + IN_StopDemo(void),IN_FreeDemoBuffer(void), + IN_Ack(void),IN_AckBack(void); +extern boolean IN_UserInput(dword delay); +extern char IN_WaitForASCII(void); +extern ScanCode IN_WaitForKey(void); +extern word IN_GetJoyButtonsDB(word joy); +extern byte *IN_GetScanName(ScanCode); + + +byte IN_MouseButtons (void); +byte IN_JoyButtons (void); + +void INL_GetJoyDelta(word joy,int *dx,int *dy); +void IN_StartAck(void); +boolean IN_CheckAck (void); + +#endif diff --git a/src/lib/16_tail.c b/src/lib/16_tail.c index 7b5fdcb4..c1cef87d 100755 --- a/src/lib/16_tail.c +++ b/src/lib/16_tail.c @@ -57,10 +57,10 @@ void Startup16(global_game_variables_t *gvar) return; } // hardware must be VGA or higher! - if (!(vga_state.vga_flags & VGA_IS_VGA)) { - printf("This program requires VGA or higher graphics hardware\n"); - return; - } +// if (!(vga_state.vga_flags & VGA_IS_VGA)) { +// printf("This program requires VGA or higher graphics hardware\n"); +// return; +// } if (_DEBUG_INIT() == 0) { #ifdef DEBUGSERIAL diff --git a/src/lib/16_tdef.h b/src/lib/16_tdef.h index 3aa8e145..504e6731 100755 --- a/src/lib/16_tdef.h +++ b/src/lib/16_tdef.h @@ -261,16 +261,11 @@ typedef struct { joyMultXH,joyMultYH; } JoystickDef; -typedef struct// instat +/*typedef struct// inconfig { boolean IN_Started; boolean CapsLock; ScanCode CurCode,LastCode; -} in_status_t; - -typedef struct// inconfig -{ - in_status_t instat; // // configuration variables // @@ -286,8 +281,7 @@ typedef struct// inconfig KeyboardDef KbdDefs[MaxKbds]; JoystickDef JoyDefs[MaxJoys]; -} in_info_t; -#define ININFO_ gvar->in. +} in_info_t;*/ //========================================================================== @@ -619,7 +613,7 @@ typedef struct loghandle_t handle; //handles for file logging kurokku_t kurokku; //clock struct mminfo_t mm; mminfotype mmi; // mm stuff - in_info_t in; // 16_in info +//++++ in_info_t in; // 16_in info player_t player[MaxPlayers]; // player vars //==== word far* clockw; /* 18.2hz clock */ } global_game_variables_t; diff --git a/wbuild.sh b/wbuild.sh index fa6245cd..17c1b3e3 100755 --- a/wbuild.sh +++ b/wbuild.sh @@ -12,3 +12,4 @@ wmake -h comp #then # rm *.o #fi +####wmake -h inntest.exe diff --git a/wcpu.exe b/wcpu.exe index 75555b8f4ac5243f4dd7f320d6194fee1db70d66..6a5fae4e3fd918f9bbf60ed7c83cc5b9a7215290 100755 GIT binary patch delta 6236 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 H=MwUNIyTBq -- 2.39.5