From ee0ae25d3e1c101e0a39253e3d4806cd5afd6e0e Mon Sep 17 00:00:00 2001 From: nattthebear Date: Tue, 4 Jul 2017 09:11:31 -0400 Subject: [PATCH] uzem: Fix some controller stuff: clock activates on rising edge, latch is continuously active whenever high... fixes the detect controllers routine in the official kernel --- .../Consoles/Belogic/Uzem.cs | 6 +- output/dll/uzem.wbx.gz | Bin 15857 -> 15782 bytes waterbox/uzem/avr8.cpp | 97 ++---------------- waterbox/uzem/avr8.h | 3 +- 4 files changed, 13 insertions(+), 93 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Belogic/Uzem.cs b/BizHawk.Emulation.Cores/Consoles/Belogic/Uzem.cs index 49e88752a4..82aae4812b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Belogic/Uzem.cs +++ b/BizHawk.Emulation.Cores/Consoles/Belogic/Uzem.cs @@ -83,7 +83,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Belogic private static int EncodePad(IController c, int p) { - int ret = 0; + int ret = unchecked((int)0xffff0000); int val = 1; int idx = 0; foreach (var s in PadBits) @@ -129,8 +129,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Belogic var ret = new LibUzem.FrameInfo(); if (_mouseEnabled) { - ret.ButtonsP1 = EncodeDelta(controller.GetFloat("P1 X")) << 24 - | EncodeDelta(controller.GetFloat("P1 Y")) << 16 + ret.ButtonsP1 = EncodeDelta(controller.GetFloat("P1 Mouse X")) << 24 + | EncodeDelta(controller.GetFloat("P1 Mouse Y")) << 16 | 0x8000; if (controller.IsPressed("P1 Mouse Left")) ret.ButtonsP1 |= 0x200; diff --git a/output/dll/uzem.wbx.gz b/output/dll/uzem.wbx.gz index a969c60ea3526e46809e9556a4afd1506d361f30..9c37a20e3175d3025b8919ff82a09d99ba56b2e5 100644 GIT binary patch literal 15782 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 literal 15857 zcmVAPDRCPwJz1Fv1$=3VV9X9l0}x81VRW~5*6nK z*#cw(oPPg(Z<3h_si*DfIn6n__rCjo|8|%EF7G9`+`Wo3a2#jEZzRHT8#whRll$=> zCw{y3-_(`++`P-SK{tJuZT3S87h4~D{Lx=L{=g#Zyayh65{9_btY z`1}WQ9zY-U(mLuY{N9s@`+4T@Upz``RiED0otGLb~3UPexFRlWo8b4jO^3eHmJ#SUPkXS6}N>dsx{n-%itbdyqLL=ZomNQXuSU1 zH++FA?>(*0nY`S~$XlqjpMi}DwJ%m)uALV={OCNb{W3Lq&$Ywd#QmTCI9%VSJ3Rcr zRUGF@K_QI_oE$Ry9Uk#nn~_7^NQ?_fE_TSMv+tNYXBMPb zh4uWYqXy359TPqZ8GVo8!7i-#Wy|~l6kR^ulzBmicl94RPR9xBhX@5v>V<-t2GG}o z?rfPOtb9wyk-|o+5pu*`kJ6JVBEG_&Eid9ZA_nl_5kCiu&_9#QD-&|>)I%S?l<6zr zPa2J!t4=42FQ5WkRTr6Zha8aknW$P`8%g3gyW4(+(Ifr_6?tVjOBw>YoN*q@BY1RM znvr@ebC4P=4x~l=%}D8IsAVF19<4pgmUMEhR-ZH2BaUaJ-YN+ti&pa2n!1QR@gR#W zM+m}c1fjsPh>Z5|Rj8Nwy-0zL|S$(z9PTAKdLTPPKB?Sq)Dvp^zSlXCtF$ zZ=?sKkY}X_oshdU5{bBKP*_BT+8_ zjw5sNa}US2z?Bg4=}GcjC@|{Wd?BIgb?_er<-!k<2%6Z=Q3LgYu5d2O9=;n9cU%H7 z+WxK*r`z%Ysw3j4enz#hq9jG##d2W7tH5P0r@Kqe1%Wdoh-6XY_~LHwpe zkm7T08bpg7KLx~a5_#h!8&3>?AEy&X5S4qv$8JRHi5%gl zF}x*J#YZ+gLjkh$wd3)yZ*UM3*B>_d>-y`;T-B-OAZ(sO#@5!DgC23)L1^a35v%*! z@d~GkDnYG7*mgn_$Lt*3Id!}p0}azia)n8z~B2aP97&0%caokt4k6JN+dY|a~=c^m{Pl3Ci!dhlC2n27@g!&bdtZ?;8*&) zs(rc=ySZ4BLqNG|O(^^83=rh6<*BWL=3+VIZ_)dk4Wmk3wK{*Tk($k2Ma`xoqjt4K zA|CMxR8ZjTi7uk1*bLvilXYmzPZ|v@c=G9h45XPNi&IcUxYQYmWjFJ;GpdMj1sK8g zgvKTItI}FPIiRsKM$E#=pn%~r#K=*_qcuA+25f zeN0bkieuiMY!@G?G;lh1s>ve`B5}WF;`j+DlQ@r`!!V&(%@E+pb}P z|F*xqbD!-e=N?0B%I5(5DzkwRa$VNHpoMYZTp&%Ku_Pdi)ym#oB zY?S6w2~{4kCvnbGIj`N{7Mx&0It!eQ6#(4C0Ad#ah)5vF8GO8%*!#_k}5%Q7hD{+?9rZ(yq4u86h8 zIHVzMg0Q~W&AU;b?GFo>AuX68PcrFZ2$`$)qB-D|B8Z(jpE=+bw^UHWjYUeqV8zvH z{P^vKX#7}oR*N6ueXa4sT%pAevdkP8t0Rfe_a6F6h>KlrheKiA-6C8ZZyvtIe{PZ)CGfX4dk{_a@FVqcu9q zo*u+znSF2jSvHkv@7$(+JkvgfX&*txmx-O zc`f}pZWEo@zo0}H#94GGV6Za{I>OJ7!`A$yZpkT+XeUFSKcg8kS~cWUkPLaFA{T%3PtX!JwwbaK1jPthP_`?mDMM6~LvqlLR&ESs zriXD}N4ePSmux;?ILW361<=S}1m14;`)l=}eu)jGIVhL9YE0N``W1sYh<&BMhHosh z+e+=WfYcbwvIVo`QmL^F1-m)m2d)-4Y(l+LB9MvDtSh7}mf00MJ5Hp2cav|nRLqP=oSmaWtlLIpO!A@ULyBh8Y_ z;fvH*-p-Fw=10_tV!N#>(F0iD-fT2LV-+GP&h(9CHh3{@4|!3DR9SV3HqR4Kq{Z)% zKI$6q^ttHb_t^K^;&*&^>*ALTbaW3q31u*hMaK5O=;W}z+UpZnavHn;Cl zIR#~*AmgWuO(bsYlKVaf7D;Zw;YRY)5g^D8Xj5b#8u$n>((>vEDsszicK6}z-kTzJ zH*Y}wk}F)NbYRSMXPk!!Vn%ZoPnQq4>hxLWkWg^mEmjd_xgQdd)sUR5T;EOZ>rG3{ z-rFK>%VyAF%MzCHi;zJKb#@wx@aM!X`18<7w#<*(efeeHn~M053L@6~*p)shy3#lA zV$x^qPFU$z?NV3zu^@!c;-V4zU((lfLf!v@96p3B_F3boXl4Pd(YQ2I>9xjJ6V2~AU^>Fb`$|-P+=#sybj$h^L#g9X6SF3 zSAsmbGaD_kKYOrplRH_DLEz8!D?%2|jq6J!?AdT$yxE=FnFSTT7X)F0V=kt{X2=#| zlK^mb4z4lKIoMw(n2T{3M)zYzm;(qFa&WbhWcIV)GtXx1jQ4Csc`8AA5oA7tSPp-Mws(M&&VD=F7KxE4yT!pswMC-;&JNbW zF+HLS!|napI#~5pyLIpbR4MhxSzGRhVe9cs@h!_c6>V8YZP_iZEhU{#!q)d@x3OC` z8bm;dp?0K3w4)vdmO}&}K|~icCJQKt2c>8^L=P5h6kTH(hAZ^=5G{2j)Tk7+%mKUX z^EXplj-pXpRmyQ~P5E2M4UZj7?R2ITR!=-myHt_?s%@@h!ORIr(uVxhYfQGwHFjHx zyc*~bDL?r+ig zmr#RvfoJM}#Gc%eY*~Dw1agEdNJXsc2?(*XrNXbqGBuQ87_eBitc1lX37N7*VGfKT zL*E|Bj2=wo)hHwOepSNa-F9Rc7<^acl6-;1-mejRE4A3`hiMOzUMSLHuhC@pPL05? zXG^r$3r57=-{6s$(TSnyvY*A?Di(Y1Bg*oC8hdNi*js|wo1(?uNkrF$J>rI9*l(A4 zCvxRNm^qMBtnHl-j$p0bjTz2&Mkbfi7-efk00*Miz@=)Tfi?~``2eX3bA4Gj!D5oS z#b7Zz|05OhUV#pbckKW0=(ZG)UYDx(Vv(kI-UxL$ybDCS=tTzdFl4mSkB52*R>Vx~ zue(Jj_J&^CjxYHNlF$P@lFJ8mdx{LS{?G!(>=2;S$v2`F#Lti^m%d|GEG>$;d^j+i zT7WS_S`jiJ{)&w4HWM!*UTihvbdQ*g=WLSxmMXnx)W>Irt3EDfqQyn3=qW`V`j~Y^ zRCs-lI3Gt9MSVQJBkE&clA1U4JM!@g)yLf+D!owS5w}yZD~jO00aTB;7B#}VO@gcG zn7aP$p!IJUH0p*e*g=TriKmKD#dlHGwxtuG7?T |1(&7k&dO3w5|>_1^AuDYO!+ z3$v~S>oV413K1ROF{VKP&QGLp;W64JtG5h!9)T^XUw%nD<;BP2cFH4FlTLWVV_&Mh zlMXjpP{sk4UPvhYRL@=kcUTY4Q1(!{;aYep4|@hskN6={<=nR{j&4Oc8b_rK^ro0a zQ;BUo3Wi+*8Bx?uVWwWPh0{X_sOf%5-fj*`wsNcjGF{5z@>QlVnPslTZdBbYAE3P_ ztpf<}hk7`#@1FLSy)$At=zXFuw~M?3Do;>?^}78miK-#m`B&>SfUnM7sM%2C_NOVf?I0j>gXs-QwcsDStG6e&mnF&x3x7pT}z` ze(pgT#6KWY4%9F!W=5^pn9kORPe6mD_mF{_>u*~hVhr$ii5ie|Wz6bu1Ib+uxf}3~ zEh0A~{-LJaXXRff$}d!nBmJ#&mc*k2$78}m3mVUvCHvWg4baqOGZvHgzn!#i`l#)D zkPTl~GaK&lX@hk8HQFGpFtI^;osR}-&9`xbl)Rxq>Z7;qkToDWNC#SJkWNCC@|-Hz z0RHeJ5Q=i+Hk2P!%g3oa2W8A&uaEU}o=-iw2Dj1fsZ=|;W+8aQpI)v0xYKKL^z@nq z{v|1B3NX7Z<9uz0SM}uT7O(cT9$RmbOS6RaUs0S;cToU0n=nEk5IZSIaa+#A5G)^= z$Z-FOR9SbFoZ_F}7VR;y3`JR?`w3U=w(=(I;2W_RWKt`S1If*=CBEN*k4;Y+16I_O zSDW}(h%!%=cD-TGcmjHH|cJFW?m>z5lp&BQ!61uAK+b{}B?6E8J)NO2K{@-5J zWPd>(9Yv~qbcAgea!`(L7aD^wh;117EvVi^?^p-Zbu&h@t2WhDtfNgsgq_t%T2ChJ z1(J5}5f;$~p&V@mHIUK!2RVdQm;xAVLNmw#I@m}uZQJ3b&7WoSBW!660_Bsw=%6X& zdaWg@T325LyT%IS|K{=L-mPSM1yXjrdGjzE>piw=q2p=w@^>!i+Ka+nbn}Kg+N9{q z!eJJQ6D2s8;tk>9Ei4Qr0k6zdWqq|JW~(|pjfJ8?pu@j@$be|x(!o~sj-+TXdOtZP z7<~x5a_$ftZdkp~%3Z{i$znX0z z(-`7b;`!4d>chSdYNBD9zIg%=9`e3smIa1^|PPU8`Y4q8Dun^%eE3dRvFi z>!|0-VtTIPay>WoM|$qv&D3*!wy>VNQTgT|8^)h(ZuiOy*H1X&)B7&B_y>^btyhv; z%taAhaS)mI){B~??`Do`efhNwwD51)ayrK>Rb)>MMiYa_%Q*3J`4;hDjL+-#N za@bC==d0LAxKp!>pfDsKk6EyBD3Vl+3iSC;y~%ngveTmGmvn4yn}g_O44gB7`RGCd z{T-xRh|>sqY_DQgXkz@Uabl~B3vAw7e`HYnVI#SiL)Yzh;jZ8E4!3> ze`DLF)a!&6S0mLfrJmau^XB5gjhBCOk!gs|%C)ALS$QSk%6(9XLA4TPZ41cue?2xv zU*`3~=Owm4V{m|Ryg9%Iz`+gR8>AX~YD4TtG6Vj_M>1&}TR)O{Z3FoX_3B452P>JV zzizn9ARX|dgLLPHm_fP?56s4~WaA1ZSe%A(`}f!Ej(6mSj_-Iy&>;We4GDL=AFo&M zcxQnS7W&iBD_IY1snAB>`vD>Y;;Me;vlKT!oKOd>9HJ{)4BsBj7jpA?j#IZ~O1TeJ z3xvEaov=U$28d5U5;{{E+86~71DN#-z||^vE5M!k=?ofFeuh_*i7#tT^6g&MoG$=e z`(8{b!0?*gul0S6ne3mvKdSO);3iG*{yXBz-H#KVvK@&^FE+N)ix_=4(XT?1Xve1Z zb}Rx1Ovok^LVa6JScz&SR6!~(LB&6y0wp-R6fb6|pYH|0Bi>K2->6lV#dtvWE0*D{ zI4-5-poHsFEXdgyF4;H9$u}<>0Bud{I9i~>)fP6T?qnR|3}p1dT_78$Mt2@m0=kPq z%fjm{)U&77LEi+JLA>KUVflahCT! z5ktBrj+AybhLjvHcI)R5Yl;Udi{%{Q9gLQFA?j*pwdt(4A z6GY4*gs~@dI2yw0dOS&KCg-qVM{=q`3DdWAB;gnK95K2A;dL@ zVi1QD5T6j@<5(G+6A&Ikd;&WL@E@S)5${Io=JPA*{;!-aKKh~pU4PAF?0N$car8O* zhPMwY@dNx260oGa{q(%OQ@iQ8`!go0=rc^u(O0!j&+kyJjD`r%J|bFo&~V-S7U~iI zh+1%xQN2WM>P31#qw4q7tB9pkUBjwhr|M&6tonYcE=9HS4|Vf-D^+YH9KV=w^VRCH zRQ(QPzlW-)t80dpsy(bai>fc~XWzh}Xy8X8m6f6VwaA5ny|UOFg-vXQt2GBG$l6X3 zI)$P2NQd%V6nkndq|L1+`suYquSH7Ijv!} z+D=@6$d*5o$S;l)=nV#Xel4l=Mg=}a^hKmn{0$WgL%7mz=_=%2I!c9^LhdYLFgieev+Y! z3B3(ySJ*nyB;-!x*%cF=^ups(sLN*pr@R4#>~|_wdAE@Frh(lYG_RqXgAew_-Q~^) zT746hIueg#i22j~t>Vj#ZQ>6I?EU8&djARW-dn1j&4APbf^mcUkMMdRl&$qKs#mG1 zpJuABjaRL#iBr9a1b3@!Ro$$r4w35n1oZ;yQ^IUH(Tdp;W8MU2-fTj=wI{}eWK_G2viW)r1j*Y5p!oL2p&TYfOP7UI8DkpyKafZfH{w zG_=|OWLL6(H6f1fhWLQ9&MH?3c{O?_{zfKVDUTEXKF~4ZpCIOeZQ@H}#P??6#}LA~ zyA|<}q0Pf)i|XNRgt_imj0vf#2^&5k6SCt?xH{g1bDx0u?7mh7`}A!lylP?bj}Vu3 z#fVQ+#oxumC&h~|{3K5N%fvkEKn(LN9b@jpm`lszn4gVjzLS`pH8IRPImUeSV`BEk zGf$0Y?oG@Yduc0n!n$NJxIScDbK|*ERjw1@O2^~3AA@UUxfV6vZ&ss5-aUG4b&>0p z*HP(g#_ohoOobf8?ZUQ}3t|`05peb9dDoa&CV+iEkt4Zn^mGtQk40P%v21+5&xM~gbP!x3P z5(Aa0pySAtx~RGrqP~Syb?>R59Rxa7sY%)tl{7$=_=2}@7HWaVylpl`$x1A2H6dbw1VCUm_Zzd zbf`EKsZg*(=C48lZ9_DrAVjcK2J6IN#whIUhYUtErEDL;PJBqPqaPCNFj5BFslte+ zh(`#vgTXd1SV0u_o(dzHqOTy>TMYIBgFPRGJ*~osrep>Qwv54k$zTsfVRKa&(Ud2c z3%4`aWCoL>u#qYZG(>qOZ3u()VX&*BFtZ9HnlhEyW?-=M`2;(gufb~b8H{Mk&zRCf z`2^d|U^}C*%_@v&%5!M9RqBuS*LUd-d6&Z@e>xDLypo(L4$symDtq3jWZ9TQ3Nlxb z$ua)uQqke*;&5#@MJn+0M7_h~Wqk5!`lCMjGcQM^I{Nob(W>pM)W3(4=1OyY1)(uxp-)y4+Y^xvDAj$jWI=iVZr&H#7y+Oi_xee8Ypq~EnVppvA(2vHaEq zek<{tiQn9wzX$k{#PVk*@MjW#XX5YNp1&vfk;L*lpvl6VouL=kKxbR`j8+l%M} z5lG@im=Z;>!61+bp}mN{5P>9KM2aMz%aV7a7rvCt7a`;r$3{d72}!YgCr-+=*4YL7 zF-U2Ugw;Fjw)2@ZA?$Jl6N1UG%9rfkYbU`DpZPpQ)NoeJHar&Dtu3knC1k)A_5qZb z0%X7``6Rxx!>0g?@R{;$-sBhYD^GSlc2>5kiFZUZgrsoucu%=Pc zouOrhK5Ckt)=!c{WUtX~EtU7PX-p2$W(e;HvPP9i@?Nu!>T76C|H@G$nM}ZJ%tR8|@9@krIb_2|j?PNn)R$pS#Nn!Ka(J�afng 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 H4vYW*@dM6Y diff --git a/waterbox/uzem/avr8.cpp b/waterbox/uzem/avr8.cpp index 0890cee1d8..0bd517bbee 100644 --- a/waterbox/uzem/avr8.cpp +++ b/waterbox/uzem/avr8.cpp @@ -241,35 +241,6 @@ inline static void store_bit_1(u8 &dest, unsigned int bit, unsigned int value) #define DIS(fmt, ...) #endif -static u8 encode_delta(int d) -{ - u8 result; - if (d < 0) - { - result = 0; - d = -d; - } - else - result = 1; - if (d > 127) - d = 127; - if (!(d & 64)) - result |= 2; - if (!(d & 32)) - result |= 4; - if (!(d & 16)) - result |= 8; - if (!(d & 8)) - result |= 16; - if (!(d & 4)) - result |= 32; - if (!(d & 2)) - result |= 64; - if (!(d & 1)) - result |= 128; - return result; -} - void avr8::spi_calculateClock() { // calculate the number of cycles before the write completes @@ -375,31 +346,20 @@ void avr8::write_io_x(u8 addr, u8 value) break; case (ports::PORTA): - changed = value ^ io[addr]; - went_low = changed & io[addr]; - - if (went_low == (1 << 2)) // LATCH + if ((value & 8) > (io[addr] & 8)) // clock rising { for (int i = 0; i < 2; i++) - { - latched_buttons[i] = buttons[i]; - } + latched_buttons[i] >>= 1; } - else if (went_low == (1 << 3)) // CLOCK + if (value & 4) // latch high { - if (new_input_mode) - PINA = u8((latched_buttons[0] & 1) | ((latched_buttons[1] & 1) << 1)); - latched_buttons[0] >>= 1; - latched_buttons[1] >>= 1; - - if ((latched_buttons[1] < 0xFFFFF) && !new_input_mode) - { - //New input routines detected, switching emulation method - new_input_mode = true; - } + for (int i = 0; i < 2; i++) + latched_buttons[i] = buttons[i]; } - if (!new_input_mode) - PINA = u8((latched_buttons[0] & 1) | ((latched_buttons[1] & 1) << 1)); + PINA = latched_buttons[0] & 1 | latched_buttons[1] << 1 & 2; + + changed = value ^ io[addr]; + went_low = changed & io[addr]; //Uzebox keyboard (always on P2 port) switch (uzeKbState) @@ -1961,45 +1921,6 @@ bool avr8::init_gui() // uzeKbScanCodeQueue.push(...); // keup: uzeKbScanCodeQueue.push(0xf0); uzeKbScanCodeQueue.push(...); -/* resizing the display "top lock" / "left lock" - case SDLK_1: if (left_edge > 0U) { left_edge--; } printf("left=%u\n",left_edge); break; - case SDLK_2: if (left_edge < 2047U - ((VIDEO_DISP_WIDTH * 7U) / 3U)) { left_edge++; } printf("left=%u\n",left_edge); break; - case SDLK_3: scanline_top--; printf("top=%d\n",scanline_top); break; - case SDLK_4: scanline_top++; printf("top=%d\n",scanline_top); break; -*/ - -// soft power switch -// PIND = PIND & ~0b00001100; // press -// PIND |= 0b00001100; // release - -/* - if (pad_mode == SNES_MOUSE) - { - // http://www.repairfaq.org/REPAIR/F_SNES.html - // we always report "low sensitivity" - int mouse_dx, mouse_dy; - u8 mouse_buttons = SDL_GetRelativeMouseState(&mouse_dx,&mouse_dy); - mouse_dx >>= mouse_scale; - mouse_dy >>= mouse_scale; - // clear high bit so we know it's the mouse - buttons[0] = (encode_delta(mouse_dx) << 24) - | (encode_delta(mouse_dy) << 16) | 0x7FFF; - if (mouse_buttons & SDL_BUTTON_LMASK) - buttons[0] &= ~(1<<9); - if (mouse_buttons & SDL_BUTTON_RMASK) - buttons[0] &= ~(1<<8); - // keep mouse centered so it doesn't get stuck on edge of screen. - // ...and immediately consume the bogus motion event it generated. - if (fullscreen) - { - SDL_WarpMouseInWindow(window,400,300); - SDL_GetRelativeMouseState(&mouse_dx,&mouse_dy); - } - } - else - buttons[0] |= 0xFFFF8000; -*/ - #ifdef SPI_DEBUG char ascii(unsigned char ch) { diff --git a/waterbox/uzem/avr8.h b/waterbox/uzem/avr8.h index 0cabfb4bfb..a09141a71f 100644 --- a/waterbox/uzem/avr8.h +++ b/waterbox/uzem/avr8.h @@ -441,7 +441,7 @@ struct avr8 enableSound(true), /*Joystick*/ - new_input_mode(false), lagged(false), + lagged(false), /*Uzekeyboard*/ uzeKbState(0), uzeKbEnabled(false), @@ -551,7 +551,6 @@ struct avr8 // SNES bit order: 0 = B, Y, Select, Start, Up, Down, Left, Right, A, X, L, 11 = R // NES bit order: 0 = A, B, Select, Start, Up, Down, Left, 7 = Right u32 buttons[2], latched_buttons[2]; - bool new_input_mode; bool lagged; /*Uzebox Keyboard*/