From 00497e980f1e07052ae1b28f41c0d18c3ec097dc Mon Sep 17 00:00:00 2001 From: sparky4 Date: Mon, 29 Jun 2015 02:16:00 -0500 Subject: [PATCH] major changes~ ^^ it works~ modified: 16.LIB modified: GFX.LIB modified: inputest.exe modified: src/inputest.c modified: src/lib/16_in.c modified: src/lib/16_in.h --- 16.LIB | Bin 76800 -> 76800 bytes GFX.LIB | Bin 27136 -> 27136 bytes inputest.exe | Bin 35680 -> 35323 bytes src/inputest.c | 32 ++----- src/lib/16_in.c | 249 +++++++++++++++++++++++++++--------------------- src/lib/16_in.h | 71 ++++++-------- 6 files changed, 177 insertions(+), 175 deletions(-) diff --git a/16.LIB b/16.LIB index 4899d50af9a6051789d77e3befb67055b6d227f2..266271d9885120353d2fc3f383cb8f9d8a046de1 100644 GIT binary patch delta 13411 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 XwyxdjH`~G!>GzxC%x~}{`YZikxOD?Y diff --git a/GFX.LIB b/GFX.LIB index 8eac230995b237105220429997f900b802b27acf..1ad504e23391d1dc08965a3b2d13fadd4c26cad5 100644 GIT binary patch delta 51 zcmZp;!q{+yaf5&ptHzrNp{bKMga>R?n9aD!WwkJ?7EmO4^M-H(9#%adGae`@y(onZ E03qZQm;e9( delta 51 zcmZp;!q{+yaf5&ptHi|#p%W%=2oKn(Fq?6c%W7d(IiN__<_+NnJgf>pW(QDGdQl1+ E03b;em;e9( diff --git a/inputest.exe b/inputest.exe index 52f08c514095d2efa8bf13aeedead497773c618a..91329f9cd34490015f1e145e40c71f670ff06541 100644 GIT binary patch delta 17149 zcmb_@d013O)_2{7+fB2G0s;yMF1RZwqDCbmn1{-EO)u^F7b^$Jac4 z`_!*aojP^u)T!-q@n>R(Dtcxwa|oHtz#`Zl*3~s$W_rfzq8Q6y+NTOXXYsv*?_hy3 zqs-Wgk&JbKXInI5wiw1v;T!yX*#5si!6%qx6$`!JG+mkGKOb>WWIGqNl zJr@<>(h=79!(ZL{LC@;n<&8Vt5 z_Ibs7yg9ayavWJgWBx^jxnf$LmUbP<+Wrg^F0F>Zd)yI?dA%vORAFviV}1pgvNV}N z)<))O>?m+dXzWs?#aejV~5GntFhyubq0+~YHZKg^0`ZHPJd20 zuAus+{0k@?#Z__3U41VonuzUCaCdq0`9;}Zm$yt1%HPUh{uR+p@96hsT=iaAvLr({ zz*xC*`SN8;mwen=F`pYcc4y`For|uwjA#B&qt#L3)$-fklFlq&skpQ9mbc`NujHmb ztIJn;^YmAzzj{p?S$Xs9SDRa3ReUA4r~J{;irL506EnwnVZw8T02E_9iHxy?y&C{#?V#WlNX0R?LHiTBfsu zNsRhhH~3msvkpAI^aRBh3%+Q>O0ad3A<2H%Be$M$%Uh4QqT#b&bh;z<2`iViW*@<$ zvtr)-MPT!`p1yecqUSYf`1!YARnA__IU^j;dC#{(ZefihQ~mEn`c_2eoXL65TNFpg z3cdf2fD{c%;E?Fw3n*5D`f$kL|4F2`sPD>3(z^@tu`-b}s7l$9MWlI??vt(>BGgi$)R95un$~*+<&reU+W3FXp_L zbEf?CSKe#>qON@cgjFu{a5Hn$H0H-)=v2NY928jd$tmeq6z3rCg*{i5)87im-}*%K z$^Ks$rU}fY-+IKYWWU!gX8)tG{hUAP&X#|;6o2)d-R)w|kr$JdoX^|Q0fo)ml9i?o z(HXntJ=ZnwdH?-gyW20fM;uq;6d`D-g&uUtr(2G=rZ#qnG;C8auCg0DB%=F)9^BX= z6P*k?xv?XH=>DLi8#@$tWMh6RR2H*8Z(b3-va*#T7jK0t1v*4f<@)2>AhNLihX2|B zrJ5PSRVUcsdn;S#Enb-E{pQU^mVM-Kn)2fF%8Sn_i_>-6FP^@1q@>y;KV2D}U^2k88JWMr|GJQ0eH>-ryuYb*8$D*+Xuq1WYz1pU}XOp3XJWsE%yrL z{^*FNcSLw#Hh2F=B3in-+9NkbV8SAIY(5T)s%IjniQW#ik742fjQ-)*Fr8f6EgWxN z9JzhVAi25Jz)eYGSFJW=L_RGYY!r4KfBQ3ary3?9H!wEN{(#YX8N~Y_ z+~0!>Q>>p+O&)UDfM9^1aFA)@^(1x}#0K3xUK1G!Nt?N(!gjyk+C>s5NN(@@yrPvf zP|2$|UFg1G*+i{u6v}3jI>;()|F+q4YUQ%!t=%r=J=$D(=biLZVwP`Wmd_)4*WUJS z>h!i+Z^Y!k7$RbY2Q~s^JU-J)0efstj7F%Waggcixt_9BO}|U zoOVPZ{?s^N#9Lw_MLkDmEA}FFPkzG>3jbDy9^720R^4!<6PiAJl zI7!ZG&YCQ%hhwTe%j6x(3fcD;-@7js$r)LdvKNKljMX2GQ$~KgkKK5=DZd1|Cbyi6 z*;^v-h@C0#y$?UL|1UREsd}WTx-@fMvexov%)1?hfBaBi}E3 zefr5vB_^xbXSDmqia6ad=1@w;^tOD z-u2h(nvb`?UC_P<13NfOFO_u8TjV|J{nWow2TzqMm$rJ_yx09>J3-C&^}VC)=~PZA z+ap+p|Anjmg*r7dezq9hsV<4H6kb)|h+i@6vht>1@ue@4eSMe7<$IXUpThQDQ}+0k zy;qdIoywle%HFHW-aG1)gsI}Q;(-kbqlJWP3Pz{UdTD@I;cfMv@+JBAM5t5y6i;Ew zi4v^0Zx-ofjDl+2Z6pQOI7=tI*)PF+)_cu++dotB9&4fj!Wq2RkSqJ2?5!T^ldA4Z zTqb;}M)kcn`KHpp?=7WuzWCCMZFPK-D%?JBA}LJ}r^l+_ zCjUWwXXq%;JwJ5y-4W5%cUOe>{H4dfo9{i=oj!GG?ROQJz8bTdwC3GAimZuup>%YdNszljCj8|`0C?r_}N-0^F5PQQM_1l8K_XM*R+ z{)zowO>FWQm^&K9UJ_l?Pm~%SV_1FqZ{9vIwttx{*whUJh6_dN-T{M!&1%~Kmk_N^ z%a|#)7}RYUZwN0PxHof{Bz8t0unrz9WG;=G*45>fE-k*}tGu$khFd$#jJ~J+?c$?jpgeVf0mk`wNeS}w$@Swm~Y3sLIhLohZ7d0E4txF_X!21 zSgc`@W?YJu+?#@sbL6n1+biqT{JbI&KU=h)_wybUC&>q``ivoN16zj=194#Cv<-rKDnG$9kPXM4HV1#>*#tI`O=eTrGY%u%*?+MY z*e}_Cv){8nutV%HJI3B+ZR`W~5j)L3VdvQA>`V3)yUeb!o2-*DAwn<+u|m9%B=i?D zg~7sbVT_O~Fi94~?&E?wL>0BNV4S+LK!0HV^mrk@J1dTzNIsE#G5cb+`pbfntPOpT zlW{Ydo~A^4qJ^lXR|3)hlY(bLZLS(O!y&eeQ@6|*7_lIiu}t-q8G|C+d5o=4&w@H# zz}SDQ9iSd6W^9u>sBlokty0D$_2@nEYGq-Z*iouB6lO)}W-{g=FlH?dP&9=_WrKRK z@QScseW@tTvmUq*gNIHsFjjA}+L*uuVtzu7gL^RXCz)-6$x(yT7@>AM^otWv6P{&Y z;yG)PW1EYVWgQ+#Y$~%*Z4>dwKXcJG5gm-DG9Pr|Ju8;2$jMvbbX2WS=N3l`3)L0H zr-i50F(rfXtSA|pwO?Yac)hEl%4C~ksy92CBz-1Lh0x?i;VTF_D+rR|Y4wGYfhok= zgHLP%-}FO*I&o&Y=U1Sk1j;Y8SDVqXjE&5J9R#b*=`y*PoF|mcF;=)t4wt!_iP-}W zp+KHcXliiIvRBnIF(-()9bAGqZs7ZzWtPe5(va~S(R3nhNHi3VQ~oS?pz+|4!pID? zib_(e8ii756S>xIt!6q_vXxX5YVmxBKUtjUM1nV$M9;0OzTdoIk-3U0NKlA9N~m6E zcT}^N(X=@6H{sk>bsn^#dL4LAi3gCAEK>6V&qjd~BT67vQ1XP;ZkNk$%O)FW4b*@f zGJyuT8(4Si>&zAx6SbD-2@Y$`8YFWAjMesaHYQF$3hjr2PT4XQLs z;CgQW%ZPaxKtgh!fS@+pYFk1|RDvZ4ETxJyz_rFouv`IZc zU|_r_fKip4X=)Du9Qk2@yUw*_789rUgq8xD(GyxSlZi#$kY~eelw1m|gkxy*eTdsG zYgH{7!-_U0i`4iL8_5Dfp0Fk>Mp`4lXth<@Z5C?{JB}i=X$mNZ zStd0ey)pcg@4wSQz(=1%ZlUI@|!SXGLFIjJW(Lw=a(5G1#stc%~mnI`1^SbY%y3t3ym^HR6<>kxWf)_Ur>uN8`TmWRM{OuQ~K%N9^Sh?x?z z>;g4bGD#ztWjDw*(oX=s3hG(uL&@?Ah}S`AR*%ND0vf0Od-lMo7bH>sk-BFvB?@C4 zW|!N636fjG5`{uvNp~QkS#SpgRLmJvBFbg|ZvtE>6eCZUElvV5KBF3R#-faUUo;Aj@U4KN6EQ&ZQ<&uR?c0DM^fIcLa+;~==JljjcbJSQLJ3_TlA z#SJ?Rd@ssx%a*Ai{vaRH>fc7CX$s;i0vc2mW)}uICQ%F)AvO<_6*4g|k!o04*=;U|y$%AW4t$Dk@1lf;I@1QT!{}naMmkQQ za%}++5^P`aH0CzA0F|)B!%z*%8;Ye5h&MoR^Q{V*Zzk__f7SZJ z2qL(VGT_; z=m^TR9K_=rg(ib$;RoWTaTF2g&cZsg$$<&VSw!ojpiU6pOUM1=77F}Ri9!@@7M#5T zg=I;-xFF3Fr_1I{aROPfO|vP)j|5*^VD08a5t}wDcxQc)JWL?s2h_sY~NYj6;x0HZr)wd!vTjqiMR4+s_ z%W}$%OhbHwxc8BOQPm}j1{OaW`Ano1fyjYu?t047+OK&O*+X+4*Mf&w-il-v~%0>4SRz<}u4hT3K`DG;fy;(R$(q^KOlKRNvRFC+#$Q%EuAaPiZg7=%q ze{n6!u%qN|7K|DNRkbrr*t!HAO#Uu%mVrCiOt9XHEHhY2L3BmlYp@Ihp%_vOmUs}+ zhG+w`3pYThgpVQnhsmR zR&MYaEL%W4V0eI}Hwzc2Fh!x@Sn-rO7dp*|D-G^Y{8M%rKIBsFGA0$Yd;t-vq0M0V z3y5DDeyIsIVJFT7M+W-n$5Qnl8d9S)KdLsvkzkQp)g#(ezL{zhs%Y3kN*z`6pK4x( zI{suxjItO(Tr~($mP!!U4PB%H8uw;UhhPuEL3)G$IW=lzK!YmUrNWM$uTbYIfw5=;>$C^#5lLUtb&ReYCZ5^TAHlG#x+xRiO=l5-OUr98Nr2}OZvUM`8M z4G5?;bIty5ij_mmeNi+^GS-QySY$s{mn|DC{9E-bJB`DJdCMoujlF)?OWn16guJ!a z%e~Y?%kPnX*DFQ+VR?SvKlbVqXX%82FZa69%hCbj1_*Wbis5pL1(QCFQO6pS#B(v~ zOk>*61=M3=RXw^IJBah$Vx0A+x;i6y0A!tyQFj+e)FZ2KeH*YLb6KE7NMj8$ zVpi9z$N9juK6_FgG2RL`4cMf-^=Q>bniI)196`xZVI`}LHD=dZa}^c+g~q5px+*C_ ztH0Xl?9TmFtoqwksVlS$Yc95_`-6gw#Cb{`iXbo zI;(4q5qZ$FxVQS9X-L5ORdgyAXp%8hrf@c3#-0w7Y_(Zk4wubI(%s})B)tl~3iq%f zia_$tyI>1P_l3lkltIXR2w{@v^$;9Fdr_>^)GjGOjT$cn@E{rl*#?ZGVEWHa zCMM@%nGa6#p(?jywWF5FQ$tY2f`Y>PXU$#A<;ZVb6cbLO-=Y(>r>g-M}&tk=fMP3xjn$=KPUp>oe1G+36Ew8DkV@4)V3ZZsq zy~p%`9ZF8_0a|T@(OxZJ8!%GPmZyZEnH6iSI3HtKVZMRmlsbzIo*`F;7>ydr*pM*J zYP-{Eu3^%8PpD6e=2ieRV#GWe#)*zbNUEXGAkoQkzyZitj0M2qZ!dSlFevc?%SH6( zu4$}jfNRouixV)NK?fv|Ul|KLoL#<#01^xrLHn^?;cD1dQ@d7$waaQ>&E)lnDFGu{ zG#gzHi$!xA%r+eJm`(LgCVv-}QAizFjVyJEDF#>JMg%)Vsk|H}-@GeI<&9&w$_P2R zrNN=asD5Y*ZzB1C5sQc_G;nyRft(T6%m^!tnB*W!9tpA$Pzt8-ZbUCYkeS@=D>rAt$VZMDW4e7@MZ0b=<)?_V0+bj;VnG~AbH|Sv;LN(n8v7nOM z0Y6YPYSQLwr7bRVT^*Ia9W2ceG-q*Gb1Y7?xt6$QCUx7`-GGQ^Hm-JCEZAN$X-ks& zculhB8E|lW^D>Y#G)#^a;Rc6-kR-p2=oxU|GN*P_*uxcE_B#7IGk2M1lLI0H7=#vu z3B|#z*-=e{M0zDz9sWT2LTOT8<1jhPm9)*w`3U2m=~x5FWf*b3L1 zXkA>Eq4BG~vBrAV1`=$Y!-~PV&WhzOB;&LnobLxSEhrmAu?`K3@O5tI8ZuyBR<~g+ zguyJuVSLr3f`dsJ7~EP{6xqw>ESR5wTB>NkQ+x#zF4DFRRj1V@r3F`$^;mt52o}O> zayF&a2kR07U1+N}*W1iyJ_YO#F$Q7iF*QsNFq5`NLX5M`^#v4pO<2P)X*+x~;3~+# zeT|thjN9&ITa5#UMOZpQh)4Q6Etj>40jrqWg$;Ae>t<8zMWZT4cMGDcNso+OK|OOUeq&W#|=41GVgAklkpcsn0@PczdiGWlx!+u~x0Ab-6YW zYkGFK`WkpwAFZo$+3We_Qm7j3NdY&ty6h$@y((DR4FHw=DwrmQyCh-6xf`@KP>@T5 zz-J0GiOp`d)L`(F{EOfW%qDiD)7{XZ{@b3Qtxk$dN{!kck;zX6W(Arp2&aQKOV6lR zzuM}oUR^~CCK>NA(Xil?OPRB1MqveGt}qRV7w0m35MB%FYP34*S7Y)vRm*57Q+G6^ z>Xl$8>}yC4t(hiFVk|dITwPtjS`k=F@!^QDt=a4SAQAxh`x?P1Cs-^E>(D?ktyDu0 z(4=VV22WrsZ8Ua|gr5ZY0vHTEBuuXdDM*r)+d_OC!`SXIv@FgIHa@SUj}K_V5pWfT z#ElTwAXb=Z6Cz~>`HUJyiyrvwQ-N+$uRWMtra7V$TSO``I#_}L*f%GbHX1p=@zMc$cY~Ps<0#t4}x*#WUm8mmGrd}0imtk^r zH((61Vzm$+mW@^LAhPWjxoWyA$r6~moF*6dmgotAwpt0<07GN?>7G(dbq#AwtIfnI z?+&eTjRgVxMySvKTMK6b|q(5c#VdQ%A*0aN5E|=U9%!Tcp*wRrNkb*-=nKPtvHU>`THMqe+MLZ zAg*1x(WM%|`IsOA7hQA-7DTjrNk$h|fIQG8a8cgiDI4fx8d7zyK1wGN8KzB!lf@ zbOnGkj_m0}Pm!HWRIjeD^k6@L1bsvi%46O-BJP)Djs(v%s5eEi99aLTfo#8&C7c4! zVj)i1FP#r?YI08Ej6f6{VXtFCwj7dE1TIvG_#|tU(awwhjWdIO0?>YmQuKLU3P5bU z+WVot84xau6lZ(Ma2o#U%_*uqUe>Eeo8n_0?oV8FP>ur|j_lFz6UvVTx{p-f~q-h+Xqhf~FJ@HBiT7N;}b?9w8Z$@wRca6z0Z}SA5^)l9% z3-fb?pXuU)Zu6G-n5Hxm@8Tjxa2_^*kmooea%2QY)}vDq8@LJ;9N}+)vOVCuh@5y? zR8Kz?Kl0B!?*(4IAD*PAW)?DyW|qHkewn1}Ycr_6ehKQeN0MV+;t4vsVyq9Z{6mh= zAr)SI;uYNF$YqXf0s0pD0__JykXF^VpyFj-LCo`+Q~{kLkxW=H@m-G4*$|_DcEme3 zkf46KF)?xZK;ot29LA2~dl}z&bzWm)%xgS{4sRHn!!AZ`zv0MJV~8_`OO3(Fku1`l4gJrN9FEWi z4euIqWHCo*C&pMl_kwRZLYpC21>fuV^1jwDg*LKya;$1=OxEq@iF9>mV~Xw=rwi5J zHm2w=b9z;_dg_s6eLD8PXhpVqwJ|xfgeUlpf>Fp?#LYes)TvNs6}-Z^zN1QmF$Xk# zvhfw!Ii63u0?c6eQUKGO`z9zFZ8U!8VlOR=wB9EZ6S9pXw3KJe$(w$NBeX`xT_Z=n z8j?e-dck1|l!gc44s@ur(Mytk0Q}nNK8mr^RN0ZBL z@Wer02z9Vec_E@gAFX+t&=a!wcg}egnN)=q9B#o}n*YY2Z)A~Hq>TQnp53OLz^LBL z^S*E~N$(&nizzoK-GKNvV?5 zUy=qCrFoMjES8?yIs$L7AKp4z7^MDVYlQlBJk7UQMOo024uGUN}HE_yb_OJ~?n>0>rP+VAOw z-}saaDYAb`vZRlflmXJFq*3#r*N}|ljI`urDKbe??#(EZez9?=bV*8@DoGP1rT@U$ zGgl3pDMi*whI>a#$w^YpTq&(ein_ljp(wE^VOHYwEe={?q8iWpgxF(Frq8~_^+&m;x-FK@zd z>GB4&d64u-JUxG|#3M6JitHsxk7uCS)XY(t(ov1+uo9m=EE_F@jEDhg(o2BHq1ZVk zJ`ow{Bq?f8F||k<1S9qzoSd4lAYpjgsI;_EgHzMe$|ohjBlf{b`l;`38-(S}fy>)g z34Nx^f)GD0DykQb@rSY0URWbEZ%<7xN#yX*=(2cvK|g}g?}+#Sulk^OM6x9csop{# b43Rc4NP5w*rNB@Yf8Yb}6N2oW$=Lq^MGULv delta 18070 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 diff --git a/src/inputest.c b/src/inputest.c index d4a3d44c..98815cc6 100644 --- a/src/inputest.c +++ b/src/inputest.c @@ -28,32 +28,16 @@ void main(int argc, char *argv[]) { player_t player[MaxPlayers]; - inconfig in; - //word i=0; - in.KbdDefs[0].button0 = 0x1d; - in.KbdDefs[0].button1 = 0x38; - //in.KbdDefs[0].upleft = 0x47; - in.KbdDefs[0].up = 0x48; - //in.KbdDefs[0].upright = 0x49; - in.KbdDefs[0].left = 0x4b; - in.KbdDefs[0].right = 0x4d; - //in.KbdDefs[0].downleft = 0x4f; - in.KbdDefs[0].down = 0x50; - //in.KbdDefs[0].downright = 0x51; - - if(IN_Startup(&in)) + IN_Startup(); + IN_Default(0,&player,ctrl_Joystick); + //while(!IN_KeyDown(sc_Escape)) + while(!IN_KeyDown(sc_Escape)) { - IN_Default(0,&player,ctrl_Joystick, &in); - while(!in.Keyboard[sc_Escape]) - { - IN_ReadControl(0,&player, &in); - //printf("%u\n", in.Keyboard[sc_Escape]); - //printf("i=%u\n", i); - printf(""); - //i++; - } - IN_Shutdown(&in); + IN_ReadControl(0,&player); + //printf("%u\n", IN_KeyDown(sc_Escape)); + //printf("%u\n", IN_qb(sc_Escape)); } + IN_Shutdown(); //printf("%u\n", in.Keyboard[sc_Escape]); } diff --git a/src/lib/16_in.c b/src/lib/16_in.c index 48e62c52..6d8c1aba 100644 --- a/src/lib/16_in.c +++ b/src/lib/16_in.c @@ -38,6 +38,32 @@ #include "src/lib/16_in.h" +/* +============================================================================= + + GLOBAL VARIABLES + +============================================================================= +*/ +struct inconfig +{ + boolean MousePresent; + boolean JoysPresent[MaxJoys]; + boolean JoyPadPresent[MaxPads]; + boolean Keyboard[NumCodes]; + boolean Paused; + char LastASCII; + ScanCode LastScan; + + KeyboardDef KbdDefs[MaxKbds];// = {0x1d,0x38,/*0x47,*/0x48,/*0x49,*/0x4b,0x4d,/*0x4f,*/0x50/*,0x51*/}; + JoystickDef JoyDefs[MaxJoys]; + JoypadDef JoypadDefs[MaxPads]; +} inpu; + +//struct inconfig in; + +//inpu.KbdDefs = {0x1d,0x38,/*0x47,*/0x48,/*0x49,*/0x4b,0x4d,/*0x4f,*/0x50/*,0x51*/}; + /* ============================================================================= @@ -45,9 +71,21 @@ ============================================================================= */ + #ifdef __cplusplus /* Function must be declared C style */ extern "C" { -#endif +#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 @@ -118,15 +156,7 @@ static Direction DirTable[] = // Quick lookup for total direction dir_West, dir_None, dir_East, //dir_Soutinest, dir_South//,dir_SouthEast - }; - -static boolean IN_Started; -static boolean CapsLock; -static ScanCode CurCode,LastCode; - -static void (*INL_KeyHook)(void); -static void interrupt (*OldKeyVect)(void); -static char *ParmStringsIN[] = {"nojoys","nomouse",nil}; + }; #ifdef __cplusplus } #endif @@ -138,7 +168,7 @@ static char *ParmStringsIN[] = {"nojoys","nomouse",nil}; // /////////////////////////////////////////////////////////////////////////// void interrupt -INL_KeyService(inconfig *in) +INL_KeyService() { static boolean special; byte k,c; @@ -153,7 +183,7 @@ static boolean special; if (k == 0xe0) // Special key prefix special = true; else if (k == 0xe1) // Handle Pause key - in->Paused = true; + inpu.Paused = true; else { if (k & 0x80) // Break code @@ -162,13 +192,13 @@ static boolean special; // DEBUG - handle special keys: ctl-alt-delete, print scrn - in->Keyboard[k] = false; + inpu.Keyboard[k] = false; } else // Make code { - LastCode = CurCode; - CurCode = in->LastScan = k; - in->Keyboard[k] = true; + inst.LastCode = inst.CurCode; + inst.CurCode = inpu.LastScan = k; + inpu.Keyboard[k] = true; if (special) c = SpecialNames[k]; @@ -176,25 +206,25 @@ static boolean special; { if (k == sc_CapsLock) { - CapsLock ^= true; + inst.CapsLock ^= true; // DEBUG - make caps lock light work } - if (in->Keyboard[sc_LShift] || in->Keyboard[sc_RShift]) // If shifted + if (inpu.Keyboard[sc_LShift] || inpu.Keyboard[sc_RShift]) // If shifted { c = ShiftNames[k]; - if ((c >= 'A') && (c <= 'Z') && CapsLock) + if ((c >= 'A') && (c <= 'Z') && inst.CapsLock) c += 'a' - 'A'; } else { c = ASCIINames[k]; - if ((c >= 'a') && (c <= 'z') && CapsLock) + if ((c >= 'a') && (c <= 'z') && inst.CapsLock) c -= 'a' - 'A'; } } if (c) - in->LastASCII = c; + inpu.LastASCII = c; } special = false; @@ -203,7 +233,7 @@ static boolean special; if (INL_KeyHook && !special) INL_KeyHook(); #ifdef TESTKEYIN - printf("%c %x %u\n", c, k, in->Keyboard[k]); + printf("%c %x %u\n", c, k, inpu.Keyboard[k]); #endif outp(0x20,0x20); } @@ -335,7 +365,7 @@ done: // /////////////////////////////////////////////////////////////////////////// static void -INL_GetJoyDelta(word joy,int *dx,int *dy,boolean adaptive, inconfig *in) +INL_GetJoyDelta(word joy,int *dx,int *dy,boolean adaptive) { word x,y; dword time; @@ -344,7 +374,7 @@ INL_GetJoyDelta(word joy,int *dx,int *dy,boolean adaptive, inconfig *in) static dword lasttime; IN_GetJoyAbs(joy,&x,&y); - def = in->JoyDefs + joy; + def = inpu.JoyDefs + joy; if (x < def->threshMinX) { @@ -453,11 +483,11 @@ IN_GetJoyButtonsDB(word joy) // /////////////////////////////////////////////////////////////////////////// static void -INL_StartKbd(inconfig *in) +INL_StartKbd() { INL_KeyHook = 0; // Clear key hook - IN_ClearKeysDown(in); + IN_ClearKeysDown(); OldKeyVect = _dos_getvect(KeyInt); _dos_setvect(KeyInt,INL_KeyService); @@ -508,11 +538,11 @@ INL_ShutMouse(void) // INL_SetJoyScale() - Sets up scaling values for the specified joystick // static void -INL_SetJoyScale(word joy, inconfig *in) +INL_SetJoyScale(word joy) { JoystickDef *def; - def = &(in->JoyDefs[joy]); + 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); @@ -526,12 +556,12 @@ INL_SetJoyScale(word joy, inconfig *in) // /////////////////////////////////////////////////////////////////////////// void -IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy, inconfig *in) +IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy) { word d,r; JoystickDef *def; - def = &(in->JoyDefs[joy]); + def = &(inpu.JoyDefs[joy]); def->joyMinX = minx; def->joyMaxX = maxx; @@ -547,7 +577,7 @@ IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy, inconfig *in) def->threshMinY = ((r / 2) - d) + miny; def->threshMaxY = ((r / 2) + d) + miny; - INL_SetJoyScale(joy, in); + INL_SetJoyScale(joy); } /////////////////////////////////////////////////////////////////////////// @@ -557,7 +587,7 @@ IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy, inconfig *in) // /////////////////////////////////////////////////////////////////////////// static boolean -INL_StartJoy(word joy, inconfig *in) +INL_StartJoy(word joy) { word x,y; @@ -571,7 +601,7 @@ INL_StartJoy(word joy, inconfig *in) return(false); else { - IN_SetupJoy(joy,0,x * 2,0,y * 2, in); + IN_SetupJoy(joy,0,x * 2,0,y * 2); return(true); } } @@ -582,9 +612,9 @@ INL_StartJoy(word joy, inconfig *in) // /////////////////////////////////////////////////////////////////////////// static void -INL_ShutJoy(word joy, inconfig *in) +INL_ShutJoy(word joy) { - in->JoysPresent[joy] = false; + inpu.JoysPresent[joy] = false; } // Public routines @@ -594,16 +624,14 @@ INL_ShutJoy(word joy, inconfig *in) // IN_Startup() - Starts up the Input Mgr // /////////////////////////////////////////////////////////////////////////// -boolean -IN_Startup(inconfig *in) +void +IN_Startup() { boolean checkjoys,checkmouse; word i; - if (IN_Started) - { - return false; - } + if (inst.IN_Started) + return; checkjoys = true; checkmouse = true; @@ -620,14 +648,13 @@ IN_Startup(inconfig *in) } } - INL_StartKbd(in); - in->MousePresent = checkmouse? INL_StartMouse() : false; + INL_StartKbd(); + inpu.MousePresent = checkmouse? INL_StartMouse() : false; for (i = 0;i < MaxJoys;i++) - in->JoysPresent[i] = checkjoys? INL_StartJoy(i, in) : false; + inpu.JoysPresent[i] = checkjoys? INL_StartJoy(i) : false; - IN_Started = true; - return true; + inst.IN_Started = true; } /////////////////////////////////////////////////////////////////////////// @@ -636,16 +663,16 @@ IN_Startup(inconfig *in) // /////////////////////////////////////////////////////////////////////////// void -IN_Default(boolean gotit,player_t *player,ControlType nt, inconfig *in) +IN_Default(boolean gotit,player_t *player,ControlType nt) { if ( (!gotit) - || ((nt == ctrl_Joystick1) && !in->JoysPresent[0]) - || ((nt == ctrl_Joystick2) && !in->JoysPresent[1]) - || ((nt == ctrl_Mouse) && !in->MousePresent) - || ((nt == ctrl_Joypad1) && !in->JoyPadPresent[0]) - || ((nt == ctrl_Joypad2) && !in->JoyPadPresent[1]) + || ((nt == ctrl_Joystick1) && !inpu.JoysPresent[0]) + || ((nt == ctrl_Joystick2) && !inpu.JoysPresent[1]) + || ((nt == ctrl_Mouse) && !inpu.MousePresent) + || ((nt == ctrl_Joypad1) && !inpu.JoyPadPresent[0]) + || ((nt == ctrl_Joypad2) && !inpu.JoyPadPresent[1]) ) nt = ctrl_Keyboard1; IN_SetControlType(0,player,nt); @@ -656,23 +683,20 @@ IN_Default(boolean gotit,player_t *player,ControlType nt, inconfig *in) // IN_Shutdown() - Shuts down the Input Mgr // /////////////////////////////////////////////////////////////////////////// -boolean -IN_Shutdown(inconfig *in) +void +IN_Shutdown() { word i; - if (!IN_Started) - { - return false; - } + if (!inst.IN_Started) + return; INL_ShutMouse(); for (i = 0;i < MaxJoys;i++) - INL_ShutJoy(i, in); + INL_ShutJoy(i); INL_ShutKbd(); - IN_Started = false; - return true; + inst.IN_Started = false; } /////////////////////////////////////////////////////////////////////////// @@ -693,13 +717,13 @@ IN_SetKeyHook(void (*hook)()) // /////////////////////////////////////////////////////////////////////////// void -IN_ClearKeysDown(inconfig *in) +IN_ClearKeysDown() { int i; - in->LastScan = sc_None; - in->LastASCII = key_None; - memset (in->Keyboard,0,sizeof(in->Keyboard)); + inpu.LastScan = sc_None; + inpu.LastASCII = key_None; + memset (inpu.Keyboard,0,sizeof(inpu.Keyboard)); } /////////////////////////////////////////////////////////////////////////// @@ -726,7 +750,7 @@ INL_AdjustCursor(CursorInfo *info,word buttons,int dx,int dy) // /////////////////////////////////////////////////////////////////////////// void -IN_ReadCursor(CursorInfo *info, inconfig *in) +IN_ReadCursor(CursorInfo *info) { word i, buttons; @@ -735,7 +759,7 @@ IN_ReadCursor(CursorInfo *info, inconfig *in) info->x = info->y = 0; info->button0 = info->button1 = false; - if (in->MousePresent) + if (inpu.MousePresent) { buttons = INL_GetMouseButtons(); INL_GetMouseDelta(&dx,&dy); @@ -744,11 +768,11 @@ IN_ReadCursor(CursorInfo *info, inconfig *in) for (i = 0;i < MaxJoys;i++) { - if (!in->JoysPresent[i]) + if (!inpu.JoysPresent[i]) continue; buttons = INL_GetJoyButtons(i); - INL_GetJoyDelta(i,&dx,&dy,true, in); + INL_GetJoyDelta(i,&dx,&dy,true); dx /= 64; dy /= 64; INL_AdjustCursor(info,buttons,dx,dy); @@ -762,7 +786,7 @@ IN_ReadCursor(CursorInfo *info, inconfig *in) // /////////////////////////////////////////////////////////////////////////// void -IN_ReadControl(int playnum,player_t *player, inconfig *in) +IN_ReadControl(int playnum,player_t *player) { boolean realdelta; byte dbyte; @@ -802,7 +826,7 @@ register KeyboardDef *def; { case ctrl_Keyboard1: case ctrl_Keyboard2: - def = &(in->KbdDefs[type - ctrl_Keyboard]); + def = &(inpu.KbdDefs[type - ctrl_Keyboard]); /* if (Keyboard[def->upleft]) mx = motion_Left,my = motion_Up; @@ -813,25 +837,25 @@ register KeyboardDef *def; else if (Keyboard[def->downright]) mx = motion_Right,my = motion_Down;*/ - if (in->Keyboard[def->up]) + if (inpu.Keyboard[def->up]) my = motion_Up; - else if (in->Keyboard[def->down]) + else if (inpu.Keyboard[def->down]) my = motion_Down; - if (in->Keyboard[def->left]) + if (inpu.Keyboard[def->left]) mx = motion_Left; - else if (in->Keyboard[def->right]) + else if (inpu.Keyboard[def->right]) mx = motion_Right; - if (in->Keyboard[def->button0]) + if (inpu.Keyboard[def->button0]) buttons += 1 << 0; - if (in->Keyboard[def->button1]) + 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, in); + INL_GetJoyDelta(type - ctrl_Joystick,&dx,&dy,false); buttons = INL_GetJoyButtons(type - ctrl_Joystick); realdelta = true; break; @@ -1000,13 +1024,13 @@ IN_GetScanName(ScanCode scan) // /////////////////////////////////////////////////////////////////////////// ScanCode -IN_WaitForKey(inconfig *in) +IN_WaitForKey() { ScanCode result; - while (!(result = in->LastScan)) + while (!(result = inpu.LastScan)) ; - in->LastScan = 0; + inpu.LastScan = 0; return(result); } @@ -1017,13 +1041,13 @@ IN_WaitForKey(inconfig *in) // /////////////////////////////////////////////////////////////////////////// char -IN_WaitForASCII(inconfig *in) +IN_WaitForASCII() { char result; - while (!(result = in->LastASCII)) + while (!(result = inpu.LastASCII)) ; - in->LastASCII = '\0'; + inpu.LastASCII = '\0'; return(result); } @@ -1033,13 +1057,13 @@ IN_WaitForASCII(inconfig *in) // /////////////////////////////////////////////////////////////////////////// void -IN_AckBack(inconfig *in) +IN_AckBack() { word i; - while (!in->LastScan) + while (!inpu.LastScan) { - if (in->MousePresent) + if (inpu.MousePresent) { if (INL_GetMouseButtons()) { @@ -1051,7 +1075,7 @@ IN_AckBack(inconfig *in) for (i = 0;i < MaxJoys;i++) { - if (in->JoysPresent[i]) + if (inpu.JoysPresent[i]) { if (IN_GetJoyButtonsDB(i)) { @@ -1063,8 +1087,8 @@ IN_AckBack(inconfig *in) } } - IN_ClearKey(in->LastScan, in); - in->LastScan = sc_None; + IN_ClearKey(inpu.LastScan); + inpu.LastScan = sc_None; } /////////////////////////////////////////////////////////////////////////// @@ -1073,22 +1097,22 @@ IN_AckBack(inconfig *in) // /////////////////////////////////////////////////////////////////////////// void -IN_Ack(inconfig *in) +IN_Ack() { word i; - IN_ClearKey(in->LastScan, in); - in->LastScan = sc_None; + IN_ClearKey(inpu.LastScan); + inpu.LastScan = sc_None; - if (in->MousePresent) + if (inpu.MousePresent) while (INL_GetMouseButtons()) ; for (i = 0;i < MaxJoys;i++) - if (in->JoysPresent[i]) + if (inpu.JoysPresent[i]) while (IN_GetJoyButtonsDB(i)) ; - IN_AckBack(in); + IN_AckBack(); } /////////////////////////////////////////////////////////////////////////// @@ -1098,19 +1122,19 @@ IN_Ack(inconfig *in) // /////////////////////////////////////////////////////////////////////////// boolean -IN_IsUserInput(inconfig *in) +IN_IsUserInput() { boolean result; word i; - result = in->LastScan; + result = inpu.LastScan; - if (in->MousePresent) + if (inpu.MousePresent) if (INL_GetMouseButtons()) result = true; for (i = 0;i < MaxJoys;i++) - if (in->JoysPresent[i]) + if (inpu.JoysPresent[i]) if (INL_GetJoyButtons(i)) result = true; @@ -1126,7 +1150,7 @@ IN_IsUserInput(inconfig *in) // /////////////////////////////////////////////////////////////////////////// boolean -IN_UserInput(dword delay,boolean clear, inconfig *in) +IN_UserInput(dword delay,boolean clear) { dword TimeCount = *clockdw; dword lasttime; @@ -1134,24 +1158,31 @@ IN_UserInput(dword delay,boolean clear, inconfig *in) lasttime = TimeCount; do { - if (IN_IsUserInput(in)) + if (IN_IsUserInput()) { if (clear) - IN_AckBack(in); + IN_AckBack(); return(true); } } while (TimeCount - lasttime < delay); return(false); } -boolean IN_KeyDown(byte code, inconfig *in) +boolean IN_KeyDown(byte code) { - return in->Keyboard[(code)]; + return inpu.Keyboard[code]; } -void IN_ClearKey(byte code, inconfig *in) +void IN_ClearKey(byte code) { - in->Keyboard[code] = false; - if(code == in->LastScan) - in->LastScan = sc_None; + inpu.Keyboard[code] = false; + if(code == inpu.LastScan) + inpu.LastScan = sc_None; } + +boolean IN_qb(byte kee) +{ + printf("%u\n", inpu.Keyboard[kee]); + if(inpu.Keyboard[kee]==true) return 1; + else return 0; +} diff --git a/src/lib/16_in.h b/src/lib/16_in.h index f14e8178..352d87b2 100644 --- a/src/lib/16_in.h +++ b/src/lib/16_in.h @@ -208,69 +208,56 @@ typedef struct ControlType Controls; } player_t; -typedef struct -{ - boolean MousePresent; - boolean JoysPresent[MaxJoys]; - boolean JoyPadPresent[MaxPads]; - boolean Keyboard[NumCodes]; - boolean Paused; - char LastASCII; - ScanCode LastScan; - - KeyboardDef KbdDefs[MaxKbds]; - JoystickDef JoyDefs[MaxJoys]; - JoypadDef JoypadDefs[MaxPads]; -} inconfig; - #ifdef DEMO0 static Demo DemoMode = demo_Off; static byte /*_seg*/ *DemoBuffer; static word DemoOffset,DemoSize; #endif - + +//extern struct inconfig in; extern dword far* clockdw; // Internal routines -void interrupt INL_KeyService(inconfig *in); -void Mouse(int x); +extern void interrupt INL_KeyService(); +extern void Mouse(int x); //static void INL_GetMouseDelta(int *x,int *y); //static word INL_GetMouseButtons(void); -void IN_GetJoyAbs(word joy,word *xp,word *yp); +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); -word IN_GetJoyButtonsDB(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); -void IN_SetupJoy(word joy,word minx,word maxx,word miny,word maxy, inconfig *in); +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); -boolean IN_Startup(inconfig *in); -void IN_Default(boolean gotit,player_t *player,ControlType nt, inconfig *in); -boolean IN_Shutdown(inconfig *in); -void IN_SetKeyHook(void (*hook)()); -void IN_ClearKeysDown(inconfig *in); +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); -void IN_ReadCursor(CursorInfo *info, inconfig *in); -void IN_ReadControl(int playnum,player_t *player, inconfig *in); -void IN_SetControlType(word playnum,player_t *player,ControlType type); +extern void IN_ReadCursor(CursorInfo *info); +extern void IN_ReadControl(int playnum,player_t *player); +extern void IN_SetControlType(word playnum,player_t *player,ControlType type); #if DEMO0 -boolean IN_StartDemoRecord(word bufsize); -void IN_StartDemoPlayback(byte /*__segment*/ *buffer,word bufsize); -void IN_StopDemo(void); -void IN_FreeDemoBuffer(void); +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 -byte *IN_GetScanName(ScanCode scan); -ScanCode IN_WaitForKey(inconfig *in); -char IN_WaitForASCII(inconfig *in); -void IN_AckBack(inconfig *in); -void IN_Ack(inconfig *in); -boolean IN_IsUserInput(inconfig *in); -boolean IN_UserInput(dword delay,boolean clear, inconfig *in); -boolean IN_KeyDown(byte code, inconfig *in); -void IN_ClearKey(byte code, inconfig *in); +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); #endif -- 2.39.5